]> git.itanic.dy.fi Git - linux-stable/commitdiff
netfilter: nftables: add nft_parse_register_load() and use it
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 16 May 2023 14:44:27 +0000 (16:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 30 May 2023 11:44:07 +0000 (12:44 +0100)
4f16d25c68ec844299a4df6ecbb0234eaf88a935 ]

This new function combines the netlink register attribute parser
and the load validation function.

This update requires to replace:

enum nft_registers      sreg:8;

in many of the expression private areas otherwise compiler complains
with:

error: cannot take address of bit-field ‘sreg’

when passing the register field as reference.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
25 files changed:
include/net/netfilter/nf_tables.h
include/net/netfilter/nf_tables_core.h
include/net/netfilter/nft_meta.h
net/ipv4/netfilter/nft_dup_ipv4.c
net/ipv6/netfilter/nft_dup_ipv6.c
net/netfilter/nf_tables_api.c
net/netfilter/nft_bitwise.c
net/netfilter/nft_byteorder.c
net/netfilter/nft_cmp.c
net/netfilter/nft_ct.c
net/netfilter/nft_dup_netdev.c
net/netfilter/nft_dynset.c
net/netfilter/nft_exthdr.c
net/netfilter/nft_fwd_netdev.c
net/netfilter/nft_hash.c
net/netfilter/nft_lookup.c
net/netfilter/nft_masq.c
net/netfilter/nft_meta.c
net/netfilter/nft_nat.c
net/netfilter/nft_objref.c
net/netfilter/nft_payload.c
net/netfilter/nft_queue.c
net/netfilter/nft_range.c
net/netfilter/nft_redir.c
net/netfilter/nft_tproxy.c

index ad2a52a6c478bc62e118f48a1b8610da68128c4c..78181f017681b038a8c2dead936d3f75900bc5f0 100644 (file)
@@ -208,7 +208,7 @@ int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest);
 unsigned int nft_parse_register(const struct nlattr *attr);
 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg);
 
-int nft_validate_register_load(enum nft_registers reg, unsigned int len);
+int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len);
 int nft_validate_register_store(const struct nft_ctx *ctx,
                                enum nft_registers reg,
                                const struct nft_data *data,
index 7281895fa6d999ba1fe2b67cd0ff676cb7fbcc22..c57ecb9e157cd6ec4429a4eca0fa5df9f39315d5 100644 (file)
@@ -25,7 +25,7 @@ void nf_tables_core_module_exit(void);
 
 struct nft_cmp_fast_expr {
        u32                     data;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      len;
 };
 
@@ -58,7 +58,7 @@ struct nft_payload_set {
        enum nft_payload_bases  base:8;
        u8                      offset;
        u8                      len;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      csum_type;
        u8                      csum_offset;
        u8                      csum_flags;
index 07e2fd507963a20ab7b4cc8ab734807e79cb370d..946fa8c83798ed3902155077d8a39c7ee51c8887 100644 (file)
@@ -8,7 +8,7 @@ struct nft_meta {
        enum nft_meta_keys      key:8;
        union {
                enum nft_registers      dreg:8;
-               enum nft_registers      sreg:8;
+               u8              sreg;
        };
 };
 
index abf89b9720940b0ff27b5bf0b4b3eb5c7ba6c13a..330349b5d6a4f85a9ac1922e4d83b64b3c430190 100644 (file)
@@ -13,8 +13,8 @@
 #include <net/netfilter/ipv4/nf_dup_ipv4.h>
 
 struct nft_dup_ipv4 {
-       enum nft_registers      sreg_addr:8;
-       enum nft_registers      sreg_dev:8;
+       u8      sreg_addr;
+       u8      sreg_dev;
 };
 
 static void nft_dup_ipv4_eval(const struct nft_expr *expr,
@@ -40,16 +40,16 @@ static int nft_dup_ipv4_init(const struct nft_ctx *ctx,
        if (tb[NFTA_DUP_SREG_ADDR] == NULL)
                return -EINVAL;
 
-       priv->sreg_addr = nft_parse_register(tb[NFTA_DUP_SREG_ADDR]);
-       err = nft_validate_register_load(priv->sreg_addr, sizeof(struct in_addr));
+       err = nft_parse_register_load(tb[NFTA_DUP_SREG_ADDR], &priv->sreg_addr,
+                                     sizeof(struct in_addr));
        if (err < 0)
                return err;
 
-       if (tb[NFTA_DUP_SREG_DEV] != NULL) {
-               priv->sreg_dev = nft_parse_register(tb[NFTA_DUP_SREG_DEV]);
-               return nft_validate_register_load(priv->sreg_dev, sizeof(int));
-       }
-       return 0;
+       if (tb[NFTA_DUP_SREG_DEV])
+               err = nft_parse_register_load(tb[NFTA_DUP_SREG_DEV],
+                                             &priv->sreg_dev, sizeof(int));
+
+       return err;
 }
 
 static int nft_dup_ipv4_dump(struct sk_buff *skb, const struct nft_expr *expr)
index 2af32200507d0ee069bf1e853ff1e5c228a9701b..c4aa8d27e0401c6e3ad3162895c84deb3f485f85 100644 (file)
@@ -13,8 +13,8 @@
 #include <net/netfilter/ipv6/nf_dup_ipv6.h>
 
 struct nft_dup_ipv6 {
-       enum nft_registers      sreg_addr:8;
-       enum nft_registers      sreg_dev:8;
+       u8      sreg_addr;
+       u8      sreg_dev;
 };
 
 static void nft_dup_ipv6_eval(const struct nft_expr *expr,
@@ -38,16 +38,16 @@ static int nft_dup_ipv6_init(const struct nft_ctx *ctx,
        if (tb[NFTA_DUP_SREG_ADDR] == NULL)
                return -EINVAL;
 
-       priv->sreg_addr = nft_parse_register(tb[NFTA_DUP_SREG_ADDR]);
-       err = nft_validate_register_load(priv->sreg_addr, sizeof(struct in6_addr));
+       err = nft_parse_register_load(tb[NFTA_DUP_SREG_ADDR], &priv->sreg_addr,
+                                     sizeof(struct in6_addr));
        if (err < 0)
                return err;
 
-       if (tb[NFTA_DUP_SREG_DEV] != NULL) {
-               priv->sreg_dev = nft_parse_register(tb[NFTA_DUP_SREG_DEV]);
-               return nft_validate_register_load(priv->sreg_dev, sizeof(int));
-       }
-       return 0;
+       if (tb[NFTA_DUP_SREG_DEV])
+               err = nft_parse_register_load(tb[NFTA_DUP_SREG_DEV],
+                                             &priv->sreg_dev, sizeof(int));
+
+       return err;
 }
 
 static int nft_dup_ipv6_dump(struct sk_buff *skb, const struct nft_expr *expr)
index 7794fa4c669d6a705574090298be73123e258b97..26390fb986215bf7d72c94aa00191e1e63cec7c7 100644 (file)
@@ -7432,7 +7432,7 @@ EXPORT_SYMBOL_GPL(nft_dump_register);
  *     Validate that the input register is one of the general purpose
  *     registers and that the length of the load is within the bounds.
  */
-int nft_validate_register_load(enum nft_registers reg, unsigned int len)
+static int nft_validate_register_load(enum nft_registers reg, unsigned int len)
 {
        if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
                return -EINVAL;
@@ -7443,7 +7443,21 @@ int nft_validate_register_load(enum nft_registers reg, unsigned int len)
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(nft_validate_register_load);
+
+int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len)
+{
+       u32 reg;
+       int err;
+
+       reg = nft_parse_register(attr);
+       err = nft_validate_register_load(reg, len);
+       if (err < 0)
+               return err;
+
+       *sreg = reg;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(nft_parse_register_load);
 
 /**
  *     nft_validate_register_store - validate an expressions' register store
index 10e9d50e4e193fb60c71fba6bb92aaed6bbc969c..850c6b5713b43281a520262f3942a5113e260173 100644 (file)
@@ -16,7 +16,7 @@
 #include <net/netfilter/nf_tables_offload.h>
 
 struct nft_bitwise {
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        enum nft_registers      dreg:8;
        u8                      len;
        struct nft_data         mask;
@@ -65,8 +65,8 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,
 
        priv->len = len;
 
-       priv->sreg = nft_parse_register(tb[NFTA_BITWISE_SREG]);
-       err = nft_validate_register_load(priv->sreg, priv->len);
+       err = nft_parse_register_load(tb[NFTA_BITWISE_SREG], &priv->sreg,
+                                     priv->len);
        if (err < 0)
                return err;
 
index 12bed3f7bbc6de5b5d641cae2e76b35b0450d65a..0960563cd5a19f873dbac184a3116ba8c259e8ba 100644 (file)
@@ -16,7 +16,7 @@
 #include <net/netfilter/nf_tables.h>
 
 struct nft_byteorder {
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        enum nft_registers      dreg:8;
        enum nft_byteorder_ops  op:8;
        u8                      len;
@@ -131,14 +131,14 @@ static int nft_byteorder_init(const struct nft_ctx *ctx,
                return -EINVAL;
        }
 
-       priv->sreg = nft_parse_register(tb[NFTA_BYTEORDER_SREG]);
        err = nft_parse_u32_check(tb[NFTA_BYTEORDER_LEN], U8_MAX, &len);
        if (err < 0)
                return err;
 
        priv->len = len;
 
-       err = nft_validate_register_load(priv->sreg, priv->len);
+       err = nft_parse_register_load(tb[NFTA_BYTEORDER_SREG], &priv->sreg,
+                                     priv->len);
        if (err < 0)
                return err;
 
index ae730dba60c8ec834c090f99561b9dc12e80e6f5..a7c1e7c4381a16fc9d2f2275fc7c5eec9de7c728 100644 (file)
@@ -17,7 +17,7 @@
 
 struct nft_cmp_expr {
        struct nft_data         data;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      len;
        enum nft_cmp_ops        op:8;
 };
@@ -86,8 +86,7 @@ static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
                return err;
        }
 
-       priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]);
-       err = nft_validate_register_load(priv->sreg, desc.len);
+       err = nft_parse_register_load(tb[NFTA_CMP_SREG], &priv->sreg, desc.len);
        if (err < 0)
                return err;
 
@@ -169,8 +168,7 @@ static int nft_cmp_fast_init(const struct nft_ctx *ctx,
        if (err < 0)
                return err;
 
-       priv->sreg = nft_parse_register(tb[NFTA_CMP_SREG]);
-       err = nft_validate_register_load(priv->sreg, desc.len);
+       err = nft_parse_register_load(tb[NFTA_CMP_SREG], &priv->sreg, desc.len);
        if (err < 0)
                return err;
 
index 28991730728b921c89496e94c352012abf2e54a1..edc6b8ae06480ba78fc0e299dbf207e5e09b587d 100644 (file)
@@ -28,7 +28,7 @@ struct nft_ct {
        enum ip_conntrack_dir   dir:8;
        union {
                enum nft_registers      dreg:8;
-               enum nft_registers      sreg:8;
+               u8              sreg;
        };
 };
 
@@ -600,8 +600,7 @@ static int nft_ct_set_init(const struct nft_ctx *ctx,
                }
        }
 
-       priv->sreg = nft_parse_register(tb[NFTA_CT_SREG]);
-       err = nft_validate_register_load(priv->sreg, len);
+       err = nft_parse_register_load(tb[NFTA_CT_SREG], &priv->sreg, len);
        if (err < 0)
                goto err1;
 
index 6007089e1c2f75eda50cb6e2f72c1dcaa5b95869..a5b560ee0337a7a70bfe763a6bf22b4586d8d263 100644 (file)
@@ -14,7 +14,7 @@
 #include <net/netfilter/nf_dup_netdev.h>
 
 struct nft_dup_netdev {
-       enum nft_registers      sreg_dev:8;
+       u8      sreg_dev;
 };
 
 static void nft_dup_netdev_eval(const struct nft_expr *expr,
@@ -40,8 +40,8 @@ static int nft_dup_netdev_init(const struct nft_ctx *ctx,
        if (tb[NFTA_DUP_SREG_DEV] == NULL)
                return -EINVAL;
 
-       priv->sreg_dev = nft_parse_register(tb[NFTA_DUP_SREG_DEV]);
-       return nft_validate_register_load(priv->sreg_dev, sizeof(int));
+       return nft_parse_register_load(tb[NFTA_DUP_SREG_DEV], &priv->sreg_dev,
+                                      sizeof(int));
 }
 
 static int nft_dup_netdev_dump(struct sk_buff *skb, const struct nft_expr *expr)
index 7f9e6c90f7271ebc3677869f607308aa744a8be1..9f064f7b31d6df6f12f90bbe8882c6e818d30d4a 100644 (file)
@@ -16,8 +16,8 @@ struct nft_dynset {
        struct nft_set                  *set;
        struct nft_set_ext_tmpl         tmpl;
        enum nft_dynset_ops             op:8;
-       enum nft_registers              sreg_key:8;
-       enum nft_registers              sreg_data:8;
+       u8                              sreg_key;
+       u8                              sreg_data;
        bool                            invert;
        u64                             timeout;
        struct nft_expr                 *expr;
@@ -177,8 +177,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
                        return err;
        }
 
-       priv->sreg_key = nft_parse_register(tb[NFTA_DYNSET_SREG_KEY]);
-       err = nft_validate_register_load(priv->sreg_key, set->klen);
+       err = nft_parse_register_load(tb[NFTA_DYNSET_SREG_KEY], &priv->sreg_key,
+                                     set->klen);
        if (err < 0)
                return err;
 
@@ -188,8 +188,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
                if (set->dtype == NFT_DATA_VERDICT)
                        return -EOPNOTSUPP;
 
-               priv->sreg_data = nft_parse_register(tb[NFTA_DYNSET_SREG_DATA]);
-               err = nft_validate_register_load(priv->sreg_data, set->dlen);
+               err = nft_parse_register_load(tb[NFTA_DYNSET_SREG_DATA],
+                                             &priv->sreg_data, set->dlen);
                if (err < 0)
                        return err;
        } else if (set->flags & NFT_SET_MAP)
index faa0844c01fb8b895c70c40bab782c378775e63d..f2b36b9c2b53c5d0e6a2f810e4aa87bb2d26c852 100644 (file)
@@ -20,7 +20,7 @@ struct nft_exthdr {
        u8                      len;
        u8                      op;
        enum nft_registers      dreg:8;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      flags;
 };
 
@@ -403,11 +403,11 @@ static int nft_exthdr_tcp_set_init(const struct nft_ctx *ctx,
        priv->type   = nla_get_u8(tb[NFTA_EXTHDR_TYPE]);
        priv->offset = offset;
        priv->len    = len;
-       priv->sreg   = nft_parse_register(tb[NFTA_EXTHDR_SREG]);
        priv->flags  = flags;
        priv->op     = op;
 
-       return nft_validate_register_load(priv->sreg, priv->len);
+       return nft_parse_register_load(tb[NFTA_EXTHDR_SREG], &priv->sreg,
+                                      priv->len);
 }
 
 static int nft_exthdr_ipv4_init(const struct nft_ctx *ctx,
index 3b0dcd170551be91d4e45a412d13de6de585d19e..7730409f6f091126c253021de12d2ad917a1b041 100644 (file)
@@ -18,7 +18,7 @@
 #include <net/ip.h>
 
 struct nft_fwd_netdev {
-       enum nft_registers      sreg_dev:8;
+       u8      sreg_dev;
 };
 
 static void nft_fwd_netdev_eval(const struct nft_expr *expr,
@@ -50,8 +50,8 @@ static int nft_fwd_netdev_init(const struct nft_ctx *ctx,
        if (tb[NFTA_FWD_SREG_DEV] == NULL)
                return -EINVAL;
 
-       priv->sreg_dev = nft_parse_register(tb[NFTA_FWD_SREG_DEV]);
-       return nft_validate_register_load(priv->sreg_dev, sizeof(int));
+       return nft_parse_register_load(tb[NFTA_FWD_SREG_DEV], &priv->sreg_dev,
+                                      sizeof(int));
 }
 
 static int nft_fwd_netdev_dump(struct sk_buff *skb, const struct nft_expr *expr)
@@ -83,8 +83,8 @@ static bool nft_fwd_netdev_offload_action(const struct nft_expr *expr)
 }
 
 struct nft_fwd_neigh {
-       enum nft_registers      sreg_dev:8;
-       enum nft_registers      sreg_addr:8;
+       u8                      sreg_dev;
+       u8                      sreg_addr;
        u8                      nfproto;
 };
 
@@ -162,8 +162,6 @@ static int nft_fwd_neigh_init(const struct nft_ctx *ctx,
            !tb[NFTA_FWD_NFPROTO])
                return -EINVAL;
 
-       priv->sreg_dev = nft_parse_register(tb[NFTA_FWD_SREG_DEV]);
-       priv->sreg_addr = nft_parse_register(tb[NFTA_FWD_SREG_ADDR]);
        priv->nfproto = ntohl(nla_get_be32(tb[NFTA_FWD_NFPROTO]));
 
        switch (priv->nfproto) {
@@ -177,11 +175,13 @@ static int nft_fwd_neigh_init(const struct nft_ctx *ctx,
                return -EOPNOTSUPP;
        }
 
-       err = nft_validate_register_load(priv->sreg_dev, sizeof(int));
+       err = nft_parse_register_load(tb[NFTA_FWD_SREG_DEV], &priv->sreg_dev,
+                                     sizeof(int));
        if (err < 0)
                return err;
 
-       return nft_validate_register_load(priv->sreg_addr, addr_len);
+       return nft_parse_register_load(tb[NFTA_FWD_SREG_ADDR], &priv->sreg_addr,
+                                      addr_len);
 }
 
 static int nft_fwd_neigh_dump(struct sk_buff *skb, const struct nft_expr *expr)
index b836d550b9199513023055ce2fef752ac87cfd17..3b01ad0a02dfe4c067d4ae09ab4c4426d5f7b397 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/jhash.h>
 
 struct nft_jhash {
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        enum nft_registers      dreg:8;
        u8                      len;
        bool                    autogen_seed:1;
@@ -83,7 +83,6 @@ static int nft_jhash_init(const struct nft_ctx *ctx,
        if (tb[NFTA_HASH_OFFSET])
                priv->offset = ntohl(nla_get_be32(tb[NFTA_HASH_OFFSET]));
 
-       priv->sreg = nft_parse_register(tb[NFTA_HASH_SREG]);
        priv->dreg = nft_parse_register(tb[NFTA_HASH_DREG]);
 
        err = nft_parse_u32_check(tb[NFTA_HASH_LEN], U8_MAX, &len);
@@ -94,6 +93,10 @@ static int nft_jhash_init(const struct nft_ctx *ctx,
 
        priv->len = len;
 
+       err = nft_parse_register_load(tb[NFTA_HASH_SREG], &priv->sreg, len);
+       if (err < 0)
+               return err;
+
        priv->modulus = ntohl(nla_get_be32(tb[NFTA_HASH_MODULUS]));
        if (priv->modulus < 1)
                return -ERANGE;
@@ -108,8 +111,7 @@ static int nft_jhash_init(const struct nft_ctx *ctx,
                get_random_bytes(&priv->seed, sizeof(priv->seed));
        }
 
-       return nft_validate_register_load(priv->sreg, len) &&
-              nft_validate_register_store(ctx, priv->dreg, NULL,
+       return nft_validate_register_store(ctx, priv->dreg, NULL,
                                           NFT_DATA_VALUE, sizeof(u32));
 }
 
index 4eb4d076927e4336d0a102657ae6e3f4264a1b58..349591dabb36a4b5ef0852e6ccb270f2b8667083 100644 (file)
@@ -17,7 +17,7 @@
 
 struct nft_lookup {
        struct nft_set                  *set;
-       enum nft_registers              sreg:8;
+       u8                              sreg;
        enum nft_registers              dreg:8;
        bool                            invert;
        struct nft_set_binding          binding;
@@ -73,8 +73,8 @@ static int nft_lookup_init(const struct nft_ctx *ctx,
        if (IS_ERR(set))
                return PTR_ERR(set);
 
-       priv->sreg = nft_parse_register(tb[NFTA_LOOKUP_SREG]);
-       err = nft_validate_register_load(priv->sreg, set->klen);
+       err = nft_parse_register_load(tb[NFTA_LOOKUP_SREG], &priv->sreg,
+                                     set->klen);
        if (err < 0)
                return err;
 
index 39dc94f2491e305f9ef8bdbb91b320dca0b52017..c2f04885347e7f5f2eef5864c3dfec3814a552a3 100644 (file)
@@ -15,8 +15,8 @@
 
 struct nft_masq {
        u32                     flags;
-       enum nft_registers      sreg_proto_min:8;
-       enum nft_registers      sreg_proto_max:8;
+       u8                      sreg_proto_min;
+       u8                      sreg_proto_max;
 };
 
 static const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = {
@@ -54,19 +54,15 @@ static int nft_masq_init(const struct nft_ctx *ctx,
        }
 
        if (tb[NFTA_MASQ_REG_PROTO_MIN]) {
-               priv->sreg_proto_min =
-                       nft_parse_register(tb[NFTA_MASQ_REG_PROTO_MIN]);
-
-               err = nft_validate_register_load(priv->sreg_proto_min, plen);
+               err = nft_parse_register_load(tb[NFTA_MASQ_REG_PROTO_MIN],
+                                             &priv->sreg_proto_min, plen);
                if (err < 0)
                        return err;
 
                if (tb[NFTA_MASQ_REG_PROTO_MAX]) {
-                       priv->sreg_proto_max =
-                               nft_parse_register(tb[NFTA_MASQ_REG_PROTO_MAX]);
-
-                       err = nft_validate_register_load(priv->sreg_proto_max,
-                                                        plen);
+                       err = nft_parse_register_load(tb[NFTA_MASQ_REG_PROTO_MAX],
+                                                     &priv->sreg_proto_max,
+                                                     plen);
                        if (err < 0)
                                return err;
                } else {
index dda1e55d5801a99d73b979dcda209097ae427141..28761430d9ee4521315c17cec5382f9cf6c2faba 100644 (file)
@@ -475,8 +475,7 @@ int nft_meta_set_init(const struct nft_ctx *ctx,
                return -EOPNOTSUPP;
        }
 
-       priv->sreg = nft_parse_register(tb[NFTA_META_SREG]);
-       err = nft_validate_register_load(priv->sreg, len);
+       err = nft_parse_register_load(tb[NFTA_META_SREG], &priv->sreg, len);
        if (err < 0)
                return err;
 
index 0c5bc3c37ecf44f99ac3275de412fc150abbf256..50fbd3c1d9f196471a88d87efbc882e09b9197cf 100644 (file)
 #include <net/ip.h>
 
 struct nft_nat {
-       enum nft_registers      sreg_addr_min:8;
-       enum nft_registers      sreg_addr_max:8;
-       enum nft_registers      sreg_proto_min:8;
-       enum nft_registers      sreg_proto_max:8;
+       u8                      sreg_addr_min;
+       u8                      sreg_addr_max;
+       u8                      sreg_proto_min;
+       u8                      sreg_proto_max;
        enum nf_nat_manip_type  type:8;
        u8                      family;
        u16                     flags;
@@ -154,18 +154,15 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
        priv->family = family;
 
        if (tb[NFTA_NAT_REG_ADDR_MIN]) {
-               priv->sreg_addr_min =
-                       nft_parse_register(tb[NFTA_NAT_REG_ADDR_MIN]);
-               err = nft_validate_register_load(priv->sreg_addr_min, alen);
+               err = nft_parse_register_load(tb[NFTA_NAT_REG_ADDR_MIN],
+                                             &priv->sreg_addr_min, alen);
                if (err < 0)
                        return err;
 
                if (tb[NFTA_NAT_REG_ADDR_MAX]) {
-                       priv->sreg_addr_max =
-                               nft_parse_register(tb[NFTA_NAT_REG_ADDR_MAX]);
-
-                       err = nft_validate_register_load(priv->sreg_addr_max,
-                                                        alen);
+                       err = nft_parse_register_load(tb[NFTA_NAT_REG_ADDR_MAX],
+                                                     &priv->sreg_addr_max,
+                                                     alen);
                        if (err < 0)
                                return err;
                } else {
@@ -175,19 +172,15 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
 
        plen = FIELD_SIZEOF(struct nf_nat_range, min_addr.all);
        if (tb[NFTA_NAT_REG_PROTO_MIN]) {
-               priv->sreg_proto_min =
-                       nft_parse_register(tb[NFTA_NAT_REG_PROTO_MIN]);
-
-               err = nft_validate_register_load(priv->sreg_proto_min, plen);
+               err = nft_parse_register_load(tb[NFTA_NAT_REG_PROTO_MIN],
+                                             &priv->sreg_proto_min, plen);
                if (err < 0)
                        return err;
 
                if (tb[NFTA_NAT_REG_PROTO_MAX]) {
-                       priv->sreg_proto_max =
-                               nft_parse_register(tb[NFTA_NAT_REG_PROTO_MAX]);
-
-                       err = nft_validate_register_load(priv->sreg_proto_max,
-                                                        plen);
+                       err = nft_parse_register_load(tb[NFTA_NAT_REG_PROTO_MAX],
+                                                     &priv->sreg_proto_max,
+                                                     plen);
                        if (err < 0)
                                return err;
                } else {
index 74c61278e6bd32a360daad56d3b357969735664a..7032b80592b20940c2ca354e6b7073c7a74d8f92 100644 (file)
@@ -95,7 +95,7 @@ static const struct nft_expr_ops nft_objref_ops = {
 
 struct nft_objref_map {
        struct nft_set          *set;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        struct nft_set_binding  binding;
 };
 
@@ -137,8 +137,8 @@ static int nft_objref_map_init(const struct nft_ctx *ctx,
        if (!(set->flags & NFT_SET_OBJECT))
                return -EINVAL;
 
-       priv->sreg = nft_parse_register(tb[NFTA_OBJREF_SET_SREG]);
-       err = nft_validate_register_load(priv->sreg, set->klen);
+       err = nft_parse_register_load(tb[NFTA_OBJREF_SET_SREG], &priv->sreg,
+                                     set->klen);
        if (err < 0)
                return err;
 
index 6ed6ccef5e1ad2bb2af1a71066fbd73443f88205..ce670c959a99e48ab973aa94adf01cafdfdfaaf2 100644 (file)
@@ -564,7 +564,6 @@ static int nft_payload_set_init(const struct nft_ctx *ctx,
        priv->base        = ntohl(nla_get_be32(tb[NFTA_PAYLOAD_BASE]));
        priv->offset      = ntohl(nla_get_be32(tb[NFTA_PAYLOAD_OFFSET]));
        priv->len         = ntohl(nla_get_be32(tb[NFTA_PAYLOAD_LEN]));
-       priv->sreg        = nft_parse_register(tb[NFTA_PAYLOAD_SREG]);
 
        if (tb[NFTA_PAYLOAD_CSUM_TYPE])
                csum_type = ntohl(nla_get_be32(tb[NFTA_PAYLOAD_CSUM_TYPE]));
@@ -595,7 +594,8 @@ static int nft_payload_set_init(const struct nft_ctx *ctx,
        }
        priv->csum_type = csum_type;
 
-       return nft_validate_register_load(priv->sreg, priv->len);
+       return nft_parse_register_load(tb[NFTA_PAYLOAD_SREG], &priv->sreg,
+                                      priv->len);
 }
 
 static int nft_payload_set_dump(struct sk_buff *skb, const struct nft_expr *expr)
index 5ece0a6aa8c3c246a0b9f33dbbe3e068bfaa64bc..94a4f0a5a28e46ddac9ac4da6ebb71a23c8840eb 100644 (file)
 static u32 jhash_initval __read_mostly;
 
 struct nft_queue {
-       enum nft_registers      sreg_qnum:8;
-       u16                     queuenum;
-       u16                     queues_total;
-       u16                     flags;
+       u8      sreg_qnum;
+       u16     queuenum;
+       u16     queues_total;
+       u16     flags;
 };
 
 static void nft_queue_eval(const struct nft_expr *expr,
@@ -111,8 +111,8 @@ static int nft_queue_sreg_init(const struct nft_ctx *ctx,
        struct nft_queue *priv = nft_expr_priv(expr);
        int err;
 
-       priv->sreg_qnum = nft_parse_register(tb[NFTA_QUEUE_SREG_QNUM]);
-       err = nft_validate_register_load(priv->sreg_qnum, sizeof(u32));
+       err = nft_parse_register_load(tb[NFTA_QUEUE_SREG_QNUM],
+                                     &priv->sreg_qnum, sizeof(u32));
        if (err < 0)
                return err;
 
index 89efcc5a533d2481127295dbc01a55438fdfbc9c..e4a1c44d7f513ef978e3e5b10e8f171d0c47899e 100644 (file)
@@ -15,7 +15,7 @@
 struct nft_range_expr {
        struct nft_data         data_from;
        struct nft_data         data_to;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      len;
        enum nft_range_ops      op:8;
 };
@@ -86,8 +86,8 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr
                goto err2;
        }
 
-       priv->sreg = nft_parse_register(tb[NFTA_RANGE_SREG]);
-       err = nft_validate_register_load(priv->sreg, desc_from.len);
+       err = nft_parse_register_load(tb[NFTA_RANGE_SREG], &priv->sreg,
+                                     desc_from.len);
        if (err < 0)
                goto err2;
 
index d75de63189b61ca7aa399246939972e87e0eba6c..81a191eb5c368e15e7b77dd960c3d11d44c58426 100644 (file)
@@ -14,8 +14,8 @@
 #include <net/netfilter/nf_tables.h>
 
 struct nft_redir {
-       enum nft_registers      sreg_proto_min:8;
-       enum nft_registers      sreg_proto_max:8;
+       u8                      sreg_proto_min;
+       u8                      sreg_proto_max;
        u16                     flags;
 };
 
@@ -50,19 +50,15 @@ static int nft_redir_init(const struct nft_ctx *ctx,
 
        plen = FIELD_SIZEOF(struct nf_nat_range, min_addr.all);
        if (tb[NFTA_REDIR_REG_PROTO_MIN]) {
-               priv->sreg_proto_min =
-                       nft_parse_register(tb[NFTA_REDIR_REG_PROTO_MIN]);
-
-               err = nft_validate_register_load(priv->sreg_proto_min, plen);
+               err = nft_parse_register_load(tb[NFTA_REDIR_REG_PROTO_MIN],
+                                             &priv->sreg_proto_min, plen);
                if (err < 0)
                        return err;
 
                if (tb[NFTA_REDIR_REG_PROTO_MAX]) {
-                       priv->sreg_proto_max =
-                               nft_parse_register(tb[NFTA_REDIR_REG_PROTO_MAX]);
-
-                       err = nft_validate_register_load(priv->sreg_proto_max,
-                                                        plen);
+                       err = nft_parse_register_load(tb[NFTA_REDIR_REG_PROTO_MAX],
+                                                     &priv->sreg_proto_max,
+                                                     plen);
                        if (err < 0)
                                return err;
                } else {
index a0e30bf4a845c0dc0eb9795dfd02987a61a7df5d..db780b5985abc9b5c75c1fff342f7e059b074e61 100644 (file)
@@ -13,9 +13,9 @@
 #endif
 
 struct nft_tproxy {
-       enum nft_registers      sreg_addr:8;
-       enum nft_registers      sreg_port:8;
-       u8                      family;
+       u8      sreg_addr;
+       u8      sreg_port;
+       u8      family;
 };
 
 static void nft_tproxy_eval_v4(const struct nft_expr *expr,
@@ -254,15 +254,15 @@ static int nft_tproxy_init(const struct nft_ctx *ctx,
        }
 
        if (tb[NFTA_TPROXY_REG_ADDR]) {
-               priv->sreg_addr = nft_parse_register(tb[NFTA_TPROXY_REG_ADDR]);
-               err = nft_validate_register_load(priv->sreg_addr, alen);
+               err = nft_parse_register_load(tb[NFTA_TPROXY_REG_ADDR],
+                                             &priv->sreg_addr, alen);
                if (err < 0)
                        return err;
        }
 
        if (tb[NFTA_TPROXY_REG_PORT]) {
-               priv->sreg_port = nft_parse_register(tb[NFTA_TPROXY_REG_PORT]);
-               err = nft_validate_register_load(priv->sreg_port, sizeof(u16));
+               err = nft_parse_register_load(tb[NFTA_TPROXY_REG_PORT],
+                                             &priv->sreg_port, sizeof(u16));
                if (err < 0)
                        return err;
        }