diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/net/bpf_exp.l | 1 | ||||
-rw-r--r-- | tools/net/bpf_exp.y | 11 | ||||
-rw-r--r-- | tools/net/bpf_jit_disasm.c | 20 | ||||
-rw-r--r-- | tools/testing/selftests/net/Makefile | 8 |
4 files changed, 27 insertions, 13 deletions
diff --git a/tools/net/bpf_exp.l b/tools/net/bpf_exp.l index bf7be77ddd62..833a96611da6 100644 --- a/tools/net/bpf_exp.l +++ b/tools/net/bpf_exp.l | |||
@@ -92,6 +92,7 @@ extern void yyerror(const char *str); | |||
92 | "#"?("cpu") { return K_CPU; } | 92 | "#"?("cpu") { return K_CPU; } |
93 | "#"?("vlan_tci") { return K_VLANT; } | 93 | "#"?("vlan_tci") { return K_VLANT; } |
94 | "#"?("vlan_pr") { return K_VLANP; } | 94 | "#"?("vlan_pr") { return K_VLANP; } |
95 | "#"?("rand") { return K_RAND; } | ||
95 | 96 | ||
96 | ":" { return ':'; } | 97 | ":" { return ':'; } |
97 | "," { return ','; } | 98 | "," { return ','; } |
diff --git a/tools/net/bpf_exp.y b/tools/net/bpf_exp.y index d15efc989ef5..e6306c51c26f 100644 --- a/tools/net/bpf_exp.y +++ b/tools/net/bpf_exp.y | |||
@@ -56,7 +56,7 @@ static void bpf_set_jmp_label(char *label, enum jmp_type type); | |||
56 | %token OP_LDXI | 56 | %token OP_LDXI |
57 | 57 | ||
58 | %token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE | 58 | %token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE |
59 | %token K_RXHASH K_CPU K_IFIDX K_VLANT K_VLANP K_POFF | 59 | %token K_RXHASH K_CPU K_IFIDX K_VLANT K_VLANP K_POFF K_RAND |
60 | 60 | ||
61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' | 61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' |
62 | 62 | ||
@@ -164,6 +164,9 @@ ldb | |||
164 | | OP_LDB K_POFF { | 164 | | OP_LDB K_POFF { |
165 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | 165 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, |
166 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | 166 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } |
167 | | OP_LDB K_RAND { | ||
168 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
169 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
167 | ; | 170 | ; |
168 | 171 | ||
169 | ldh | 172 | ldh |
@@ -212,6 +215,9 @@ ldh | |||
212 | | OP_LDH K_POFF { | 215 | | OP_LDH K_POFF { |
213 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | 216 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, |
214 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | 217 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } |
218 | | OP_LDH K_RAND { | ||
219 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
220 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
215 | ; | 221 | ; |
216 | 222 | ||
217 | ldi | 223 | ldi |
@@ -265,6 +271,9 @@ ld | |||
265 | | OP_LD K_POFF { | 271 | | OP_LD K_POFF { |
266 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | 272 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, |
267 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | 273 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } |
274 | | OP_LD K_RAND { | ||
275 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
276 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
268 | | OP_LD 'M' '[' number ']' { | 277 | | OP_LD 'M' '[' number ']' { |
269 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } | 278 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } |
270 | | OP_LD '[' 'x' '+' number ']' { | 279 | | OP_LD '[' 'x' '+' number ']' { |
diff --git a/tools/net/bpf_jit_disasm.c b/tools/net/bpf_jit_disasm.c index cfe0cdcda3de..c5baf9c591b7 100644 --- a/tools/net/bpf_jit_disasm.c +++ b/tools/net/bpf_jit_disasm.c | |||
@@ -43,8 +43,7 @@ static void get_exec_path(char *tpath, size_t size) | |||
43 | free(path); | 43 | free(path); |
44 | } | 44 | } |
45 | 45 | ||
46 | static void get_asm_insns(uint8_t *image, size_t len, unsigned long base, | 46 | static void get_asm_insns(uint8_t *image, size_t len, int opcodes) |
47 | int opcodes) | ||
48 | { | 47 | { |
49 | int count, i, pc = 0; | 48 | int count, i, pc = 0; |
50 | char tpath[256]; | 49 | char tpath[256]; |
@@ -107,13 +106,13 @@ static void put_klog_buff(char *buff) | |||
107 | } | 106 | } |
108 | 107 | ||
109 | static int get_last_jit_image(char *haystack, size_t hlen, | 108 | static int get_last_jit_image(char *haystack, size_t hlen, |
110 | uint8_t *image, size_t ilen, | 109 | uint8_t *image, size_t ilen) |
111 | unsigned long *base) | ||
112 | { | 110 | { |
113 | char *ptr, *pptr, *tmp; | 111 | char *ptr, *pptr, *tmp; |
114 | off_t off = 0; | 112 | off_t off = 0; |
115 | int ret, flen, proglen, pass, ulen = 0; | 113 | int ret, flen, proglen, pass, ulen = 0; |
116 | regmatch_t pmatch[1]; | 114 | regmatch_t pmatch[1]; |
115 | unsigned long base; | ||
117 | regex_t regex; | 116 | regex_t regex; |
118 | 117 | ||
119 | if (hlen == 0) | 118 | if (hlen == 0) |
@@ -136,7 +135,7 @@ static int get_last_jit_image(char *haystack, size_t hlen, | |||
136 | 135 | ||
137 | ptr = haystack + off - (pmatch[0].rm_eo - pmatch[0].rm_so); | 136 | ptr = haystack + off - (pmatch[0].rm_eo - pmatch[0].rm_so); |
138 | ret = sscanf(ptr, "flen=%d proglen=%d pass=%d image=%lx", | 137 | ret = sscanf(ptr, "flen=%d proglen=%d pass=%d image=%lx", |
139 | &flen, &proglen, &pass, base); | 138 | &flen, &proglen, &pass, &base); |
140 | if (ret != 4) | 139 | if (ret != 4) |
141 | return 0; | 140 | return 0; |
142 | 141 | ||
@@ -162,7 +161,7 @@ static int get_last_jit_image(char *haystack, size_t hlen, | |||
162 | assert(ulen == proglen); | 161 | assert(ulen == proglen); |
163 | printf("%d bytes emitted from JIT compiler (pass:%d, flen:%d)\n", | 162 | printf("%d bytes emitted from JIT compiler (pass:%d, flen:%d)\n", |
164 | proglen, pass, flen); | 163 | proglen, pass, flen); |
165 | printf("%lx + <x>:\n", *base); | 164 | printf("%lx + <x>:\n", base); |
166 | 165 | ||
167 | regfree(®ex); | 166 | regfree(®ex); |
168 | return ulen; | 167 | return ulen; |
@@ -172,8 +171,7 @@ int main(int argc, char **argv) | |||
172 | { | 171 | { |
173 | int len, klen, opcodes = 0; | 172 | int len, klen, opcodes = 0; |
174 | char *kbuff; | 173 | char *kbuff; |
175 | unsigned long base; | 174 | static uint8_t image[32768]; |
176 | uint8_t image[4096]; | ||
177 | 175 | ||
178 | if (argc > 1) { | 176 | if (argc > 1) { |
179 | if (!strncmp("-o", argv[argc - 1], 2)) { | 177 | if (!strncmp("-o", argv[argc - 1], 2)) { |
@@ -189,9 +187,9 @@ int main(int argc, char **argv) | |||
189 | 187 | ||
190 | kbuff = get_klog_buff(&klen); | 188 | kbuff = get_klog_buff(&klen); |
191 | 189 | ||
192 | len = get_last_jit_image(kbuff, klen, image, sizeof(image), &base); | 190 | len = get_last_jit_image(kbuff, klen, image, sizeof(image)); |
193 | if (len > 0 && base > 0) | 191 | if (len > 0) |
194 | get_asm_insns(image, len, base, opcodes); | 192 | get_asm_insns(image, len, opcodes); |
195 | 193 | ||
196 | put_klog_buff(kbuff); | 194 | put_klog_buff(kbuff); |
197 | 195 | ||
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index 750512ba2c88..c7493b8f9b0e 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile | |||
@@ -14,6 +14,12 @@ all: $(NET_PROGS) | |||
14 | run_tests: all | 14 | run_tests: all |
15 | @/bin/sh ./run_netsocktests || echo "sockettests: [FAIL]" | 15 | @/bin/sh ./run_netsocktests || echo "sockettests: [FAIL]" |
16 | @/bin/sh ./run_afpackettests || echo "afpackettests: [FAIL]" | 16 | @/bin/sh ./run_afpackettests || echo "afpackettests: [FAIL]" |
17 | 17 | @if /sbin/modprobe test_bpf ; then \ | |
18 | /sbin/rmmod test_bpf; \ | ||
19 | echo "test_bpf: ok"; \ | ||
20 | else \ | ||
21 | echo "test_bpf: [FAIL]"; \ | ||
22 | exit 1; \ | ||
23 | fi | ||
18 | clean: | 24 | clean: |
19 | $(RM) $(NET_PROGS) | 25 | $(RM) $(NET_PROGS) |