bpf_bsd.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // +build darwin dragonfly freebsd netbsd openbsd
  5. // Berkeley packet filter for BSD variants
  6. package unix
  7. import (
  8. "unsafe"
  9. )
  10. func BpfStmt(code, k int) *BpfInsn {
  11. return &BpfInsn{Code: uint16(code), K: uint32(k)}
  12. }
  13. func BpfJump(code, k, jt, jf int) *BpfInsn {
  14. return &BpfInsn{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
  15. }
  16. func BpfBuflen(fd int) (int, error) {
  17. var l int
  18. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGBLEN, uintptr(unsafe.Pointer(&l)))
  19. if err != 0 {
  20. return 0, Errno(err)
  21. }
  22. return l, nil
  23. }
  24. func SetBpfBuflen(fd, l int) (int, error) {
  25. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSBLEN, uintptr(unsafe.Pointer(&l)))
  26. if err != 0 {
  27. return 0, Errno(err)
  28. }
  29. return l, nil
  30. }
  31. func BpfDatalink(fd int) (int, error) {
  32. var t int
  33. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGDLT, uintptr(unsafe.Pointer(&t)))
  34. if err != 0 {
  35. return 0, Errno(err)
  36. }
  37. return t, nil
  38. }
  39. func SetBpfDatalink(fd, t int) (int, error) {
  40. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSDLT, uintptr(unsafe.Pointer(&t)))
  41. if err != 0 {
  42. return 0, Errno(err)
  43. }
  44. return t, nil
  45. }
  46. func SetBpfPromisc(fd, m int) error {
  47. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCPROMISC, uintptr(unsafe.Pointer(&m)))
  48. if err != 0 {
  49. return Errno(err)
  50. }
  51. return nil
  52. }
  53. func FlushBpf(fd int) error {
  54. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCFLUSH, 0)
  55. if err != 0 {
  56. return Errno(err)
  57. }
  58. return nil
  59. }
  60. type ivalue struct {
  61. name [IFNAMSIZ]byte
  62. value int16
  63. }
  64. func BpfInterface(fd int, name string) (string, error) {
  65. var iv ivalue
  66. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGETIF, uintptr(unsafe.Pointer(&iv)))
  67. if err != 0 {
  68. return "", Errno(err)
  69. }
  70. return name, nil
  71. }
  72. func SetBpfInterface(fd int, name string) error {
  73. var iv ivalue
  74. copy(iv.name[:], []byte(name))
  75. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETIF, uintptr(unsafe.Pointer(&iv)))
  76. if err != 0 {
  77. return Errno(err)
  78. }
  79. return nil
  80. }
  81. func BpfTimeout(fd int) (*Timeval, error) {
  82. var tv Timeval
  83. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGRTIMEOUT, uintptr(unsafe.Pointer(&tv)))
  84. if err != 0 {
  85. return nil, Errno(err)
  86. }
  87. return &tv, nil
  88. }
  89. func SetBpfTimeout(fd int, tv *Timeval) error {
  90. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSRTIMEOUT, uintptr(unsafe.Pointer(tv)))
  91. if err != 0 {
  92. return Errno(err)
  93. }
  94. return nil
  95. }
  96. func BpfStats(fd int) (*BpfStat, error) {
  97. var s BpfStat
  98. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGSTATS, uintptr(unsafe.Pointer(&s)))
  99. if err != 0 {
  100. return nil, Errno(err)
  101. }
  102. return &s, nil
  103. }
  104. func SetBpfImmediate(fd, m int) error {
  105. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCIMMEDIATE, uintptr(unsafe.Pointer(&m)))
  106. if err != 0 {
  107. return Errno(err)
  108. }
  109. return nil
  110. }
  111. func SetBpf(fd int, i []BpfInsn) error {
  112. var p BpfProgram
  113. p.Len = uint32(len(i))
  114. p.Insns = (*BpfInsn)(unsafe.Pointer(&i[0]))
  115. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETF, uintptr(unsafe.Pointer(&p)))
  116. if err != 0 {
  117. return Errno(err)
  118. }
  119. return nil
  120. }
  121. func CheckBpfVersion(fd int) error {
  122. var v BpfVersion
  123. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCVERSION, uintptr(unsafe.Pointer(&v)))
  124. if err != 0 {
  125. return Errno(err)
  126. }
  127. if v.Major != BPF_MAJOR_VERSION || v.Minor != BPF_MINOR_VERSION {
  128. return EINVAL
  129. }
  130. return nil
  131. }
  132. func BpfHeadercmpl(fd int) (int, error) {
  133. var f int
  134. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGHDRCMPLT, uintptr(unsafe.Pointer(&f)))
  135. if err != 0 {
  136. return 0, Errno(err)
  137. }
  138. return f, nil
  139. }
  140. func SetBpfHeadercmpl(fd, f int) error {
  141. _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSHDRCMPLT, uintptr(unsafe.Pointer(&f)))
  142. if err != 0 {
  143. return Errno(err)
  144. }
  145. return nil
  146. }