diff options
author | Michal Sekletar <msekleta@redhat.com> | 2015-03-24 09:48:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-24 15:25:15 -0400 |
commit | 27cd5452476978283decb19e429e81fc6c71e74b (patch) | |
tree | a147d4576190e18580589e6faaf08e1b7050ef2d /tools/net | |
parent | f6bb76cd4d8552bada1e454c291419f893e1af7b (diff) |
filter: introduce SKF_AD_VLAN_TPID BPF extension
If vlan offloading takes place then vlan header is removed from frame
and its contents, both vlan_tci and vlan_proto, is available to user
space via TPACKET interface. However, only vlan_tci can be used in BPF
filters.
This commit introduces a new BPF extension. It makes possible to load
the value of vlan_proto (vlan TPID) to register A. Support for classic
BPF and eBPF is being added, analogous to skb->protocol.
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: Michal Sekletar <msekleta@redhat.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Reviewed-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'tools/net')
-rw-r--r-- | tools/net/bpf_exp.l | 2 | ||||
-rw-r--r-- | tools/net/bpf_exp.y | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/tools/net/bpf_exp.l b/tools/net/bpf_exp.l index 833a96611da6..c83af3fb77de 100644 --- a/tools/net/bpf_exp.l +++ b/tools/net/bpf_exp.l | |||
@@ -92,6 +92,8 @@ 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 | "#"?("vlan_avail") { return K_VLANP; } | ||
96 | "#"?("vlan_tpid") { return K_VLANTPID; } | ||
95 | "#"?("rand") { return K_RAND; } | 97 | "#"?("rand") { return K_RAND; } |
96 | 98 | ||
97 | ":" { return ':'; } | 99 | ":" { return ':'; } |
diff --git a/tools/net/bpf_exp.y b/tools/net/bpf_exp.y index e6306c51c26f..f8332749b44c 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 K_RAND | 59 | %token K_RXHASH K_CPU K_IFIDX K_VLANT K_VLANP K_VLANTPID K_POFF K_RAND |
60 | 60 | ||
61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' | 61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' |
62 | 62 | ||
@@ -167,6 +167,9 @@ ldb | |||
167 | | OP_LDB K_RAND { | 167 | | OP_LDB K_RAND { |
168 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | 168 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, |
169 | SKF_AD_OFF + SKF_AD_RANDOM); } | 169 | SKF_AD_OFF + SKF_AD_RANDOM); } |
170 | | OP_LDB K_VLANTPID { | ||
171 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
172 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | ||
170 | ; | 173 | ; |
171 | 174 | ||
172 | ldh | 175 | ldh |
@@ -218,6 +221,9 @@ ldh | |||
218 | | OP_LDH K_RAND { | 221 | | OP_LDH K_RAND { |
219 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | 222 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, |
220 | SKF_AD_OFF + SKF_AD_RANDOM); } | 223 | SKF_AD_OFF + SKF_AD_RANDOM); } |
224 | | OP_LDH K_VLANTPID { | ||
225 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
226 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | ||
221 | ; | 227 | ; |
222 | 228 | ||
223 | ldi | 229 | ldi |
@@ -274,6 +280,9 @@ ld | |||
274 | | OP_LD K_RAND { | 280 | | OP_LD K_RAND { |
275 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | 281 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, |
276 | SKF_AD_OFF + SKF_AD_RANDOM); } | 282 | SKF_AD_OFF + SKF_AD_RANDOM); } |
283 | | OP_LD K_VLANTPID { | ||
284 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
285 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | ||
277 | | OP_LD 'M' '[' number ']' { | 286 | | OP_LD 'M' '[' number ']' { |
278 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } | 287 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } |
279 | | OP_LD '[' 'x' '+' number ']' { | 288 | | OP_LD '[' 'x' '+' number ']' { |