aboutsummaryrefslogtreecommitdiffstats
path: root/tools/net
diff options
context:
space:
mode:
authorMichal Sekletar <msekleta@redhat.com>2015-03-24 09:48:41 -0400
committerDavid S. Miller <davem@davemloft.net>2015-03-24 15:25:15 -0400
commit27cd5452476978283decb19e429e81fc6c71e74b (patch)
treea147d4576190e18580589e6faaf08e1b7050ef2d /tools/net
parentf6bb76cd4d8552bada1e454c291419f893e1af7b (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.l2
-rw-r--r--tools/net/bpf_exp.y11
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
172ldh 175ldh
@@ -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
223ldi 229ldi
@@ -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 ']' {