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: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
718cffc4ac
commit
9e49e88958
@ -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 {
|
|||||||
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,
|
|||||||
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 @@ load_b:
|
|||||||
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)
|
|||||||
[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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user