diff options
| author | Daniel Borkmann <dxchgb@gmail.com> | 2012-11-07 15:31:02 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-11-13 18:21:10 -0500 | 
| commit | bf0098f22ca7b59e8844ac6882bbae230d34b98d (patch) | |
| tree | 49fae869dbfb6fd61f989faca3c54431df258958 | |
| parent | 3cbe20412ef4656169e09ea40ec47f973ad99a92 (diff) | |
| download | olio-linux-3.10-bf0098f22ca7b59e8844ac6882bbae230d34b98d.tar.xz olio-linux-3.10-bf0098f22ca7b59e8844ac6882bbae230d34b98d.zip  | |
ARM: net: bpf_jit_32: add VLAN instructions for BPF JIT
This patch is a follow-up for patch "net: filter: add vlan tag access"
to support the new VLAN_TAG/VLAN_TAG_PRESENT accessors in BPF JIT.
Signed-off-by: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Cc: Mircea Gherzan <mgherzan@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: Mircea Gherzan <mgherzan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | arch/arm/net/bpf_jit_32.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 8be702de34f..9af9a690dbd 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c @@ -16,6 +16,7 @@  #include <linux/netdevice.h>  #include <linux/string.h>  #include <linux/slab.h> +#include <linux/if_vlan.h>  #include <asm/cacheflush.h>  #include <asm/hwcap.h> @@ -168,6 +169,8 @@ static inline bool is_load_to_a(u16 inst)  	case BPF_S_ANC_MARK:  	case BPF_S_ANC_PROTOCOL:  	case BPF_S_ANC_RXHASH: +	case BPF_S_ANC_VLAN_TAG: +	case BPF_S_ANC_VLAN_TAG_PRESENT:  	case BPF_S_ANC_QUEUE:  		return true;  	default: @@ -815,6 +818,17 @@ b_epilogue:  			off = offsetof(struct sk_buff, rxhash);  			emit(ARM_LDR_I(r_A, r_skb, off), ctx);  			break; +		case BPF_S_ANC_VLAN_TAG: +		case BPF_S_ANC_VLAN_TAG_PRESENT: +			ctx->seen |= SEEN_SKB; +			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2); +			off = offsetof(struct sk_buff, vlan_tci); +			emit(ARM_LDRH_I(r_A, r_skb, off), ctx); +			if (inst->code == BPF_S_ANC_VLAN_TAG) +				OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx); +			else +				OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx); +			break;  		case BPF_S_ANC_QUEUE:  			ctx->seen |= SEEN_SKB;  			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,  |