Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools, bpf_asm: simplify parser rule for BPF extensions

We can already use yylval in the lexer for encoding the BPF extension
number, so that the parser rules can be further reduced to a single one
for each B/H/W case.

Signed-off-by: Ray Bellis <ray@isc.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ray Bellis and committed by
David S. Miller
b1d95ae5 0c71de66

+79 -151
+68 -16
tools/net/bpf_exp.l
··· 23 23 #include <stdio.h> 24 24 #include <stdint.h> 25 25 #include <stdlib.h> 26 + #include <string.h> 27 + 28 + #include <linux/filter.h> 26 29 27 30 #include "bpf_exp.yacc.h" 28 31 ··· 82 79 "txa" { return OP_TXA; } 83 80 84 81 "#"?("len") { return K_PKT_LEN; } 85 - "#"?("proto") { return K_PROTO; } 86 - "#"?("type") { return K_TYPE; } 87 - "#"?("poff") { return K_POFF; } 88 - "#"?("ifidx") { return K_IFIDX; } 89 - "#"?("nla") { return K_NLATTR; } 90 - "#"?("nlan") { return K_NLATTR_NEST; } 91 - "#"?("mark") { return K_MARK; } 92 - "#"?("queue") { return K_QUEUE; } 93 - "#"?("hatype") { return K_HATYPE; } 94 - "#"?("rxhash") { return K_RXHASH; } 95 - "#"?("cpu") { return K_CPU; } 96 - "#"?("vlan_tci") { return K_VLAN_TCI; } 97 - "#"?("vlan_pr") { return K_VLAN_AVAIL; } 98 - "#"?("vlan_avail") { return K_VLAN_AVAIL; } 99 - "#"?("vlan_tpid") { return K_VLAN_TPID; } 100 - "#"?("rand") { return K_RAND; } 82 + 83 + "#"?("proto") { 84 + yylval.number = SKF_AD_PROTOCOL; 85 + return extension; 86 + } 87 + "#"?("type") { 88 + yylval.number = SKF_AD_PKTTYPE; 89 + return extension; 90 + } 91 + "#"?("poff") { 92 + yylval.number = SKF_AD_PAY_OFFSET; 93 + return extension; 94 + } 95 + "#"?("ifidx") { 96 + yylval.number = SKF_AD_IFINDEX; 97 + return extension; 98 + } 99 + "#"?("nla") { 100 + yylval.number = SKF_AD_NLATTR; 101 + return extension; 102 + } 103 + "#"?("nlan") { 104 + yylval.number = SKF_AD_NLATTR_NEST; 105 + return extension; 106 + } 107 + "#"?("mark") { 108 + yylval.number = SKF_AD_MARK; 109 + return extension; 110 + } 111 + "#"?("queue") { 112 + yylval.number = SKF_AD_QUEUE; 113 + return extension; 114 + } 115 + "#"?("hatype") { 116 + yylval.number = SKF_AD_HATYPE; 117 + return extension; 118 + } 119 + "#"?("rxhash") { 120 + yylval.number = SKF_AD_RXHASH; 121 + return extension; 122 + } 123 + "#"?("cpu") { 124 + yylval.number = SKF_AD_CPU; 125 + return extension; 126 + } 127 + "#"?("vlan_tci") { 128 + yylval.number = SKF_AD_VLAN_TAG; 129 + return extension; 130 + } 131 + "#"?("vlan_pr") { 132 + yylval.number = SKF_AD_VLAN_TAG_PRESENT; 133 + return extension; 134 + } 135 + "#"?("vlan_avail") { 136 + yylval.number = SKF_AD_VLAN_TAG_PRESENT; 137 + return extension; 138 + } 139 + "#"?("vlan_tpid") { 140 + yylval.number = SKF_AD_VLAN_TPID; 141 + return extension; 142 + } 143 + "#"?("rand") { 144 + yylval.number = SKF_AD_RANDOM; 145 + return extension; 146 + } 101 147 102 148 ":" { return ':'; } 103 149 "," { return ','; }
+11 -135
tools/net/bpf_exp.y
··· 35 35 enum jmp_type { JTL, JFL, JKL }; 36 36 37 37 extern FILE *yyin; 38 + extern int yylineno; 38 39 extern int yylex(void); 39 40 extern void yyerror(const char *str); 40 41 ··· 56 55 %token OP_RET OP_TAX OP_TXA OP_LDXB OP_MOD OP_NEG OP_JNEQ OP_JLT OP_JLE OP_LDI 57 56 %token OP_LDXI 58 57 59 - %token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE 60 - %token K_RXHASH K_CPU K_IFIDX K_VLAN_TCI K_VLAN_AVAIL K_VLAN_TPID K_POFF K_RAND 58 + %token K_PKT_LEN 61 59 62 60 %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' 63 61 64 - %token number label 62 + %token extension number label 65 63 66 64 %type <label> label 65 + %type <number> extension 67 66 %type <number> number 68 67 69 68 %% ··· 126 125 bpf_set_curr_instr(BPF_LD | BPF_B | BPF_IND, 0, 0, $6); } 127 126 | OP_LDB '[' number ']' { 128 127 bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, $3); } 129 - | OP_LDB K_PROTO { 128 + | OP_LDB extension { 130 129 bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 131 - SKF_AD_OFF + SKF_AD_PROTOCOL); } 132 - | OP_LDB K_TYPE { 133 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 134 - SKF_AD_OFF + SKF_AD_PKTTYPE); } 135 - | OP_LDB K_IFIDX { 136 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 137 - SKF_AD_OFF + SKF_AD_IFINDEX); } 138 - | OP_LDB K_NLATTR { 139 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 140 - SKF_AD_OFF + SKF_AD_NLATTR); } 141 - | OP_LDB K_NLATTR_NEST { 142 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 143 - SKF_AD_OFF + SKF_AD_NLATTR_NEST); } 144 - | OP_LDB K_MARK { 145 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 146 - SKF_AD_OFF + SKF_AD_MARK); } 147 - | OP_LDB K_QUEUE { 148 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 149 - SKF_AD_OFF + SKF_AD_QUEUE); } 150 - | OP_LDB K_HATYPE { 151 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 152 - SKF_AD_OFF + SKF_AD_HATYPE); } 153 - | OP_LDB K_RXHASH { 154 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 155 - SKF_AD_OFF + SKF_AD_RXHASH); } 156 - | OP_LDB K_CPU { 157 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 158 - SKF_AD_OFF + SKF_AD_CPU); } 159 - | OP_LDB K_VLAN_TCI { 160 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 161 - SKF_AD_OFF + SKF_AD_VLAN_TAG); } 162 - | OP_LDB K_VLAN_AVAIL { 163 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 164 - SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } 165 - | OP_LDB K_POFF { 166 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 167 - SKF_AD_OFF + SKF_AD_PAY_OFFSET); } 168 - | OP_LDB K_RAND { 169 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 170 - SKF_AD_OFF + SKF_AD_RANDOM); } 171 - | OP_LDB K_VLAN_TPID { 172 - bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, 173 - SKF_AD_OFF + SKF_AD_VLAN_TPID); } 130 + SKF_AD_OFF + $2); } 174 131 ; 175 132 176 133 ldh ··· 138 179 bpf_set_curr_instr(BPF_LD | BPF_H | BPF_IND, 0, 0, $6); } 139 180 | OP_LDH '[' number ']' { 140 181 bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, $3); } 141 - | OP_LDH K_PROTO { 182 + | OP_LDH extension { 142 183 bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 143 - SKF_AD_OFF + SKF_AD_PROTOCOL); } 144 - | OP_LDH K_TYPE { 145 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 146 - SKF_AD_OFF + SKF_AD_PKTTYPE); } 147 - | OP_LDH K_IFIDX { 148 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 149 - SKF_AD_OFF + SKF_AD_IFINDEX); } 150 - | OP_LDH K_NLATTR { 151 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 152 - SKF_AD_OFF + SKF_AD_NLATTR); } 153 - | OP_LDH K_NLATTR_NEST { 154 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 155 - SKF_AD_OFF + SKF_AD_NLATTR_NEST); } 156 - | OP_LDH K_MARK { 157 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 158 - SKF_AD_OFF + SKF_AD_MARK); } 159 - | OP_LDH K_QUEUE { 160 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 161 - SKF_AD_OFF + SKF_AD_QUEUE); } 162 - | OP_LDH K_HATYPE { 163 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 164 - SKF_AD_OFF + SKF_AD_HATYPE); } 165 - | OP_LDH K_RXHASH { 166 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 167 - SKF_AD_OFF + SKF_AD_RXHASH); } 168 - | OP_LDH K_CPU { 169 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 170 - SKF_AD_OFF + SKF_AD_CPU); } 171 - | OP_LDH K_VLAN_TCI { 172 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 173 - SKF_AD_OFF + SKF_AD_VLAN_TAG); } 174 - | OP_LDH K_VLAN_AVAIL { 175 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 176 - SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } 177 - | OP_LDH K_POFF { 178 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 179 - SKF_AD_OFF + SKF_AD_PAY_OFFSET); } 180 - | OP_LDH K_RAND { 181 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 182 - SKF_AD_OFF + SKF_AD_RANDOM); } 183 - | OP_LDH K_VLAN_TPID { 184 - bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, 185 - SKF_AD_OFF + SKF_AD_VLAN_TPID); } 184 + SKF_AD_OFF + $2); } 186 185 ; 187 186 188 187 ldi ··· 155 238 bpf_set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $3); } 156 239 | OP_LD K_PKT_LEN { 157 240 bpf_set_curr_instr(BPF_LD | BPF_W | BPF_LEN, 0, 0, 0); } 158 - | OP_LD K_PROTO { 241 + | OP_LD extension { 159 242 bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 160 - SKF_AD_OFF + SKF_AD_PROTOCOL); } 161 - | OP_LD K_TYPE { 162 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 163 - SKF_AD_OFF + SKF_AD_PKTTYPE); } 164 - | OP_LD K_IFIDX { 165 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 166 - SKF_AD_OFF + SKF_AD_IFINDEX); } 167 - | OP_LD K_NLATTR { 168 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 169 - SKF_AD_OFF + SKF_AD_NLATTR); } 170 - | OP_LD K_NLATTR_NEST { 171 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 172 - SKF_AD_OFF + SKF_AD_NLATTR_NEST); } 173 - | OP_LD K_MARK { 174 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 175 - SKF_AD_OFF + SKF_AD_MARK); } 176 - | OP_LD K_QUEUE { 177 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 178 - SKF_AD_OFF + SKF_AD_QUEUE); } 179 - | OP_LD K_HATYPE { 180 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 181 - SKF_AD_OFF + SKF_AD_HATYPE); } 182 - | OP_LD K_RXHASH { 183 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 184 - SKF_AD_OFF + SKF_AD_RXHASH); } 185 - | OP_LD K_CPU { 186 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 187 - SKF_AD_OFF + SKF_AD_CPU); } 188 - | OP_LD K_VLAN_TCI { 189 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 190 - SKF_AD_OFF + SKF_AD_VLAN_TAG); } 191 - | OP_LD K_VLAN_AVAIL { 192 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 193 - SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } 194 - | OP_LD K_POFF { 195 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 196 - SKF_AD_OFF + SKF_AD_PAY_OFFSET); } 197 - | OP_LD K_RAND { 198 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 199 - SKF_AD_OFF + SKF_AD_RANDOM); } 200 - | OP_LD K_VLAN_TPID { 201 - bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, 202 - SKF_AD_OFF + SKF_AD_VLAN_TPID); } 243 + SKF_AD_OFF + $2); } 203 244 | OP_LD 'M' '[' number ']' { 204 245 bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } 205 246 | OP_LD '[' 'x' '+' number ']' { ··· 651 776 652 777 void yyerror(const char *str) 653 778 { 779 + fprintf(stderr, "error: %s at line %d\n", str, yylineno); 654 780 exit(1); 655 781 }