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 | 503 | * @NFTA_BITWISE_MASK: mask value (NLA_NESTED: nft_data_attributes) |
| 504 | 504 | * @NFTA_BITWISE_XOR: xor value (NLA_NESTED: nft_data_attributes) |
| 505 | 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 | 509 | * The bitwise expression performs the following operation: |
| 508 | 510 | * |
| @@ -524,6 +526,7 @@ enum nft_bitwise_attributes { · 15 unmodified lines | ||
| 524 | 526 | NFTA_BITWISE_MASK, |
| 525 | 527 | NFTA_BITWISE_XOR, |
| 526 | 528 | NFTA_BITWISE_OP, |
| 529 | + NFTA_BITWISE_DATA, | |
| 527 | 530 | __NFTA_BITWISE_MAX |
| 528 | 531 | }; |
| 529 | 532 | #define NFTA_BITWISE_MAX (__NFTA_BITWISE_MAX - 1) |
| @@ -22,6 +22,7 @@ struct nft_bitwise { · 21 unmodified lines | ||
| 22 | 22 | u8 len; |
| 23 | 23 | struct nft_data mask; |
| 24 | 24 | struct nft_data xor; |
| 25 | + struct nft_data data; | |
| 25 | 26 | }; |
| 26 | 27 | |
| 27 | 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 | 55 | [NFTA_BITWISE_MASK] = { .type = NLA_NESTED }, |
| 55 | 56 | [NFTA_BITWISE_XOR] = { .type = NLA_NESTED }, |
| 56 | 57 | [NFTA_BITWISE_OP] = { .type = NLA_U32 }, |
| 58 | + [NFTA_BITWISE_DATA] = { .type = NLA_NESTED }, | |
| 57 | 59 | }; |
| 58 | 60 | |
| 59 | 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 | 64 | struct nft_data_desc d1, d2; |
| 63 | 65 | int err; |
| 64 | 66 | |
| 67 | + if (tb[NFTA_BITWISE_DATA]) | |
| 68 | + return -EINVAL; | |
| 69 | + | |
| 65 | 70 | if (!tb[NFTA_BITWISE_MASK] || |
| 66 | 71 | !tb[NFTA_BITWISE_XOR]) |
| 67 | 72 | return -EINVAL; |