tun_bsd.go 658 B

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