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) |
