Source file
src/syscall/bpf_bsd.go
Documentation: syscall
1
2
3
4
5
6
7
8
9
10 package syscall
11
12 import (
13 "unsafe"
14 )
15
16
17 func BpfStmt(code, k int) *BpfInsn {
18 return &BpfInsn{Code: uint16(code), K: uint32(k)}
19 }
20
21
22 func BpfJump(code, k, jt, jf int) *BpfInsn {
23 return &BpfInsn{Code: uint16(code), Jt: uint8(jt), Jf: uint8(jf), K: uint32(k)}
24 }
25
26
27 func BpfBuflen(fd int) (int, error) {
28 var l int
29 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGBLEN, uintptr(unsafe.Pointer(&l)))
30 if err != 0 {
31 return 0, Errno(err)
32 }
33 return l, nil
34 }
35
36
37 func SetBpfBuflen(fd, l int) (int, error) {
38 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSBLEN, uintptr(unsafe.Pointer(&l)))
39 if err != 0 {
40 return 0, Errno(err)
41 }
42 return l, nil
43 }
44
45
46 func BpfDatalink(fd int) (int, error) {
47 var t int
48 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGDLT, uintptr(unsafe.Pointer(&t)))
49 if err != 0 {
50 return 0, Errno(err)
51 }
52 return t, nil
53 }
54
55
56 func SetBpfDatalink(fd, t int) (int, error) {
57 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSDLT, uintptr(unsafe.Pointer(&t)))
58 if err != 0 {
59 return 0, Errno(err)
60 }
61 return t, nil
62 }
63
64
65 func SetBpfPromisc(fd, m int) error {
66 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCPROMISC, uintptr(unsafe.Pointer(&m)))
67 if err != 0 {
68 return Errno(err)
69 }
70 return nil
71 }
72
73
74 func FlushBpf(fd int) error {
75 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCFLUSH, 0)
76 if err != 0 {
77 return Errno(err)
78 }
79 return nil
80 }
81
82 type ivalue struct {
83 name [IFNAMSIZ]byte
84 value int16
85 }
86
87
88 func BpfInterface(fd int, name string) (string, error) {
89 var iv ivalue
90 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGETIF, uintptr(unsafe.Pointer(&iv)))
91 if err != 0 {
92 return "", Errno(err)
93 }
94 return name, nil
95 }
96
97
98 func SetBpfInterface(fd int, name string) error {
99 var iv ivalue
100 copy(iv.name[:], []byte(name))
101 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETIF, uintptr(unsafe.Pointer(&iv)))
102 if err != 0 {
103 return Errno(err)
104 }
105 return nil
106 }
107
108
109 func BpfTimeout(fd int) (*Timeval, error) {
110 var tv Timeval
111 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGRTIMEOUT, uintptr(unsafe.Pointer(&tv)))
112 if err != 0 {
113 return nil, Errno(err)
114 }
115 return &tv, nil
116 }
117
118
119 func SetBpfTimeout(fd int, tv *Timeval) error {
120 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSRTIMEOUT, uintptr(unsafe.Pointer(tv)))
121 if err != 0 {
122 return Errno(err)
123 }
124 return nil
125 }
126
127
128 func BpfStats(fd int) (*BpfStat, error) {
129 var s BpfStat
130 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGSTATS, uintptr(unsafe.Pointer(&s)))
131 if err != 0 {
132 return nil, Errno(err)
133 }
134 return &s, nil
135 }
136
137
138 func SetBpfImmediate(fd, m int) error {
139 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCIMMEDIATE, uintptr(unsafe.Pointer(&m)))
140 if err != 0 {
141 return Errno(err)
142 }
143 return nil
144 }
145
146
147 func SetBpf(fd int, i []BpfInsn) error {
148 var p BpfProgram
149 p.Len = uint32(len(i))
150 p.Insns = (*BpfInsn)(unsafe.Pointer(&i[0]))
151 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSETF, uintptr(unsafe.Pointer(&p)))
152 if err != 0 {
153 return Errno(err)
154 }
155 return nil
156 }
157
158
159 func CheckBpfVersion(fd int) error {
160 var v BpfVersion
161 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCVERSION, uintptr(unsafe.Pointer(&v)))
162 if err != 0 {
163 return Errno(err)
164 }
165 if v.Major != BPF_MAJOR_VERSION || v.Minor != BPF_MINOR_VERSION {
166 return EINVAL
167 }
168 return nil
169 }
170
171
172 func BpfHeadercmpl(fd int) (int, error) {
173 var f int
174 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCGHDRCMPLT, uintptr(unsafe.Pointer(&f)))
175 if err != 0 {
176 return 0, Errno(err)
177 }
178 return f, nil
179 }
180
181
182 func SetBpfHeadercmpl(fd, f int) error {
183 _, _, err := Syscall(SYS_IOCTL, uintptr(fd), BIOCSHDRCMPLT, uintptr(unsafe.Pointer(&f)))
184 if err != 0 {
185 return Errno(err)
186 }
187 return nil
188 }
189
View as plain text