Commit 9e49e889 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller

filter: add XOR instruction for use with X/K

SKF_AD_ALU_XOR_X has been added a while ago, but as an 'ancillary'
operation that is invoked through a negative offset in K within BPF
load operations. Since BPF_MOD has recently been added, BPF_XOR should
also be part of the common ALU operations. Removing SKF_AD_ALU_XOR_X
might not be an option since this is exposed to user space.
Signed-off-by: default avatarDaniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 718cffc4
...@@ -75,6 +75,7 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ ...@@ -75,6 +75,7 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */
#define BPF_RSH 0x70 #define BPF_RSH 0x70
#define BPF_NEG 0x80 #define BPF_NEG 0x80
#define BPF_MOD 0x90 #define BPF_MOD 0x90
#define BPF_XOR 0xa0
#define BPF_JA 0x00 #define BPF_JA 0x00
#define BPF_JEQ 0x10 #define BPF_JEQ 0x10
...@@ -204,6 +205,8 @@ enum { ...@@ -204,6 +205,8 @@ enum {
BPF_S_ALU_AND_X, BPF_S_ALU_AND_X,
BPF_S_ALU_OR_K, BPF_S_ALU_OR_K,
BPF_S_ALU_OR_X, BPF_S_ALU_OR_X,
BPF_S_ALU_XOR_K,
BPF_S_ALU_XOR_X,
BPF_S_ALU_LSH_K, BPF_S_ALU_LSH_K,
BPF_S_ALU_LSH_X, BPF_S_ALU_LSH_X,
BPF_S_ALU_RSH_K, BPF_S_ALU_RSH_K,
......
...@@ -187,6 +187,13 @@ unsigned int sk_run_filter(const struct sk_buff *skb, ...@@ -187,6 +187,13 @@ unsigned int sk_run_filter(const struct sk_buff *skb,
case BPF_S_ALU_OR_K: case BPF_S_ALU_OR_K:
A |= K; A |= K;
continue; continue;
case BPF_S_ANC_ALU_XOR_X:
case BPF_S_ALU_XOR_X:
A ^= X;
continue;
case BPF_S_ALU_XOR_K:
A ^= K;
continue;
case BPF_S_ALU_LSH_X: case BPF_S_ALU_LSH_X:
A <<= X; A <<= X;
continue; continue;
...@@ -334,9 +341,6 @@ unsigned int sk_run_filter(const struct sk_buff *skb, ...@@ -334,9 +341,6 @@ unsigned int sk_run_filter(const struct sk_buff *skb,
case BPF_S_ANC_CPU: case BPF_S_ANC_CPU:
A = raw_smp_processor_id(); A = raw_smp_processor_id();
continue; continue;
case BPF_S_ANC_ALU_XOR_X:
A ^= X;
continue;
case BPF_S_ANC_NLATTR: { case BPF_S_ANC_NLATTR: {
struct nlattr *nla; struct nlattr *nla;
...@@ -483,6 +487,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) ...@@ -483,6 +487,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
[BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X, [BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X,
[BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K, [BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K,
[BPF_ALU|BPF_OR|BPF_X] = BPF_S_ALU_OR_X, [BPF_ALU|BPF_OR|BPF_X] = BPF_S_ALU_OR_X,
[BPF_ALU|BPF_XOR|BPF_K] = BPF_S_ALU_XOR_K,
[BPF_ALU|BPF_XOR|BPF_X] = BPF_S_ALU_XOR_X,
[BPF_ALU|BPF_LSH|BPF_K] = BPF_S_ALU_LSH_K, [BPF_ALU|BPF_LSH|BPF_K] = BPF_S_ALU_LSH_K,
[BPF_ALU|BPF_LSH|BPF_X] = BPF_S_ALU_LSH_X, [BPF_ALU|BPF_LSH|BPF_X] = BPF_S_ALU_LSH_X,
[BPF_ALU|BPF_RSH|BPF_K] = BPF_S_ALU_RSH_K, [BPF_ALU|BPF_RSH|BPF_K] = BPF_S_ALU_RSH_K,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment