]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
netfilter: bitwise: add helper for initializing boolean operations.
authorJeremy Sowden <jeremy@azazel.net>
Wed, 15 Jan 2020 20:05:52 +0000 (20:05 +0000)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 16 Jan 2020 14:51:58 +0000 (15:51 +0100)
Split the code specific to initializing bitwise boolean operations out
into a separate function.  A similar function will be added later for
shift operations.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nft_bitwise.c

index 6948df7b05870100a29ee410904e3c6ba4feac93..d0cc5f753e52641d8e6e090a267d505ae8a2c5fd 100644 (file)
@@ -45,20 +45,53 @@ static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = {
        [NFTA_BITWISE_OP]       = { .type = NLA_U32 },
 };
 
+static int nft_bitwise_init_bool(struct nft_bitwise *priv,
+                                const struct nlattr *const tb[])
+{
+       struct nft_data_desc d1, d2;
+       int err;
+
+       if (!tb[NFTA_BITWISE_MASK] ||
+           !tb[NFTA_BITWISE_XOR])
+               return -EINVAL;
+
+       err = nft_data_init(NULL, &priv->mask, sizeof(priv->mask), &d1,
+                           tb[NFTA_BITWISE_MASK]);
+       if (err < 0)
+               return err;
+       if (d1.type != NFT_DATA_VALUE || d1.len != priv->len) {
+               err = -EINVAL;
+               goto err1;
+       }
+
+       err = nft_data_init(NULL, &priv->xor, sizeof(priv->xor), &d2,
+                           tb[NFTA_BITWISE_XOR]);
+       if (err < 0)
+               goto err1;
+       if (d2.type != NFT_DATA_VALUE || d2.len != priv->len) {
+               err = -EINVAL;
+               goto err2;
+       }
+
+       return 0;
+err2:
+       nft_data_release(&priv->xor, d2.type);
+err1:
+       nft_data_release(&priv->mask, d1.type);
+       return err;
+}
+
 static int nft_bitwise_init(const struct nft_ctx *ctx,
                            const struct nft_expr *expr,
                            const struct nlattr * const tb[])
 {
        struct nft_bitwise *priv = nft_expr_priv(expr);
-       struct nft_data_desc d1, d2;
        u32 len;
        int err;
 
        if (!tb[NFTA_BITWISE_SREG] ||
            !tb[NFTA_BITWISE_DREG] ||
-           !tb[NFTA_BITWISE_LEN]  ||
-           !tb[NFTA_BITWISE_MASK] ||
-           !tb[NFTA_BITWISE_XOR])
+           !tb[NFTA_BITWISE_LEN])
                return -EINVAL;
 
        err = nft_parse_u32_check(tb[NFTA_BITWISE_LEN], U8_MAX, &len);
@@ -90,29 +123,12 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,
                priv->op = NFT_BITWISE_BOOL;
        }
 
-       err = nft_data_init(NULL, &priv->mask, sizeof(priv->mask), &d1,
-                           tb[NFTA_BITWISE_MASK]);
-       if (err < 0)
-               return err;
-       if (d1.type != NFT_DATA_VALUE || d1.len != priv->len) {
-               err = -EINVAL;
-               goto err1;
-       }
-
-       err = nft_data_init(NULL, &priv->xor, sizeof(priv->xor), &d2,
-                           tb[NFTA_BITWISE_XOR]);
-       if (err < 0)
-               goto err1;
-       if (d2.type != NFT_DATA_VALUE || d2.len != priv->len) {
-               err = -EINVAL;
-               goto err2;
+       switch(priv->op) {
+       case NFT_BITWISE_BOOL:
+               err = nft_bitwise_init_bool(priv, tb);
+               break;
        }
 
-       return 0;
-err2:
-       nft_data_release(&priv->xor, d2.type);
-err1:
-       nft_data_release(&priv->mask, d1.type);
        return err;
 }