Add a new bitwise netlink attribute that will be used by shift operations to store the size of the shift. It is not used by boolean operations.
Unified · Split
| @@ -503,6 +503,8 @@ enum nft_bitwise_ops { · 502 unmodified lines | |||
| 503 | * @NFTA_BITWISE_MASK: mask value (NLA_NESTED: nft_data_attributes) | 503 | * @NFTA_BITWISE_MASK: mask value (NLA_NESTED: nft_data_attributes) |
| 504 | * @NFTA_BITWISE_XOR: xor value (NLA_NESTED: nft_data_attributes) | 504 | * @NFTA_BITWISE_XOR: xor value (NLA_NESTED: nft_data_attributes) |
| 505 | * @NFTA_BITWISE_OP: type of operation (NLA_U32: nft_bitwise_ops) | 505 | * @NFTA_BITWISE_OP: type of operation (NLA_U32: nft_bitwise_ops) |
| 506 | * @NFTA_BITWISE_DATA: argument for non-boolean operations | ||
| 507 | * (NLA_NESTED: nft_data_attributes) | ||
| 506 | * | 508 | * |
| 507 | * The bitwise expression performs the following operation: | 509 | * The bitwise expression performs the following operation: |
| 508 | * | 510 | * |
| @@ -524,6 +526,7 @@ enum nft_bitwise_attributes { · 15 unmodified lines | |||
| 524 | NFTA_BITWISE_MASK, | 526 | NFTA_BITWISE_MASK, |
| 525 | NFTA_BITWISE_XOR, | 527 | NFTA_BITWISE_XOR, |
| 526 | NFTA_BITWISE_OP, | 528 | NFTA_BITWISE_OP, |
| 529 | NFTA_BITWISE_DATA, | ||
| 527 | __NFTA_BITWISE_MAX | 530 | __NFTA_BITWISE_MAX |
| 528 | }; | 531 | }; |
| 529 | #define NFTA_BITWISE_MAX (__NFTA_BITWISE_MAX - 1) | 532 | #define NFTA_BITWISE_MAX (__NFTA_BITWISE_MAX - 1) |
| @@ -22,6 +22,7 @@ struct nft_bitwise { · 21 unmodified lines | |||
| 22 | u8 len; | 22 | u8 len; |
| 23 | struct nft_data mask; | 23 | struct nft_data mask; |
| 24 | struct nft_data xor; | 24 | struct nft_data xor; |
| 25 | struct nft_data data; | ||
| 25 | }; | 26 | }; |
| 26 | 27 | ||
| 27 | static void nft_bitwise_eval_bool(u32 *dst, const u32 *src, | 28 | static void nft_bitwise_eval_bool(u32 *dst, const u32 *src, |
| @@ -54,6 +55,7 @@ static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = { · 26 unmodified lines | |||
| 54 | [NFTA_BITWISE_MASK] = { .type = NLA_NESTED }, | 55 | [NFTA_BITWISE_MASK] = { .type = NLA_NESTED }, |
| 55 | [NFTA_BITWISE_XOR] = { .type = NLA_NESTED }, | 56 | [NFTA_BITWISE_XOR] = { .type = NLA_NESTED }, |
| 56 | [NFTA_BITWISE_OP] = { .type = NLA_U32 }, | 57 | [NFTA_BITWISE_OP] = { .type = NLA_U32 }, |
| 58 | [NFTA_BITWISE_DATA] = { .type = NLA_NESTED }, | ||
| 57 | }; | 59 | }; |
| 58 | 60 | ||
| 59 | static int nft_bitwise_init_bool(struct nft_bitwise *priv, | 61 | static int nft_bitwise_init_bool(struct nft_bitwise *priv, |
| @@ -62,6 +64,9 @@ static int nft_bitwise_init_bool(struct nft_bitwise *priv, · 2 unmodified lines | |||
| 62 | struct nft_data_desc d1, d2; | 64 | struct nft_data_desc d1, d2; |
| 63 | int err; | 65 | int err; |
| 64 | 66 | ||
| 67 | if (tb[NFTA_BITWISE_DATA]) | ||
| 68 | return -EINVAL; | ||
| 69 | |||
| 65 | if (!tb[NFTA_BITWISE_MASK] || | 70 | if (!tb[NFTA_BITWISE_MASK] || |
| 66 | !tb[NFTA_BITWISE_XOR]) | 71 | !tb[NFTA_BITWISE_XOR]) |
| 67 | return -EINVAL; | 72 | return -EINVAL; |