| 1234567891011121314151617181920212223242526272829 |
- //go:build (darwin || ios || freebsd || openbsd || netbsd) && !e2e_testing
- package overlay
- import (
- "fmt"
- "syscall"
- )
- // StampTunPrefix writes the 4-byte AF_INET / AF_INET6 protocol-family marker into buf[0:4] in place,
- // picking the family from the first byte of the IP packet at buf[4].
- func StampTunPrefix(buf []byte) error {
- if len(buf) < 5 {
- return fmt.Errorf("tun write buffer too small for prefix")
- }
- ipVer := buf[4] >> 4
- buf[0] = 0
- buf[1] = 0
- buf[2] = 0
- switch ipVer {
- case 4:
- buf[3] = syscall.AF_INET
- case 6:
- buf[3] = syscall.AF_INET6
- default:
- return fmt.Errorf("unable to determine IP version from packet")
- }
- return nil
- }
|