]> git.itanic.dy.fi Git - linux-stable/commitdiff
netfilter: nftables: add nft_parse_register_load() and use it
authorPablo Neira Ayuso <pablo@netfilter.org>
Sat, 27 May 2023 16:08:01 +0000 (18:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 30 May 2023 11:38:37 +0000 (12:38 +0100)
[ backport of 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
26 files changed:
include/net/netfilter/nf_tables.h
include/net/netfilter/nf_tables_core.h
include/net/netfilter/nft_masq.h
include/net/netfilter/nft_meta.h
include/net/netfilter/nft_redir.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

index 2db486e9724c616e451408c649e734f37702bd1f..70a19b1ea8d45f3525085dec9dc52dd5f2e2bfaa 100644 (file)
@@ -198,7 +198,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 ea5aab568be831d7db6ae68e759a0af05daa880c..4747de40fb0519f81b68066f0a45f2d4420994b8 100644 (file)
@@ -14,9 +14,17 @@ extern struct nft_expr_type nft_range_type;
 int nf_tables_core_module_init(void);
 void nf_tables_core_module_exit(void);
 
+struct nft_bitwise_fast_expr {
+       u32                     mask;
+       u32                     xor;
+       u8                      sreg;
+       enum nft_registers      dreg:8;
+};
+
 struct nft_cmp_fast_expr {
        u32                     data;
-       enum nft_registers      sreg:8;
+       u32                     mask;
+       u8                      sreg;
        u8                      len;
 };
 
@@ -43,7 +51,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 e51ab3815797bef3d1c9377403959cded803e851..e69a8277b70b3005b854d7417d6a232c3a14d0cd 100644 (file)
@@ -4,8 +4,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;
 };
 
 extern const struct nla_policy nft_masq_policy[];
index 5c69e9b0938879a59b37c4438384371b51a03ef4..ee956e6ca02c389b02274514f0eb47a6ca2f4322 100644 (file)
@@ -6,7 +6,7 @@ struct nft_meta {
        enum nft_meta_keys      key:8;
        union {
                enum nft_registers      dreg:8;
-               enum nft_registers      sreg:8;
+               u8              sreg;
        };
 };
 
index 4a970737c03c832fcbe20376cd0b8399dd9a81ff..2b4036c94cb3ee6a35bdcae1ff9cd5d39e688057 100644 (file)
@@ -3,8 +3,8 @@
 #define _NFT_REDIR_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;
 };
 
index 0af3d8df70dd713bbe30d469987bab33c295cf99..157bca240edcedf352c55d792dcaa5217a8f5be2 100644 (file)
@@ -16,8 +16,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,
@@ -43,16 +43,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 d8b5b60b7d5310d0bff6e16f9964b5a91c38a64f..d8bb7c85287cb69c5e19c2abb5a1baf1d9160784 100644 (file)
@@ -16,8 +16,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,
@@ -41,16 +41,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 c683a45b8ae53079001284ebb5bcec1b10c0a801..d363a71addda5c13f9da7368819d3daf0a1aea87 100644 (file)
@@ -5663,7 +5663,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;
@@ -5674,7 +5674,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 fff8073e2a5692c14037a77c5d8151cf0c1bbcb0..12700c85142ee7797311500af87e545e428d3a5f 100644 (file)
@@ -18,7 +18,7 @@
 #include <net/netfilter/nf_tables.h>
 
 struct nft_bitwise {
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        enum nft_registers      dreg:8;
        u8                      len;
        struct nft_data         mask;
@@ -68,8 +68,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 13d4e421a6b33ccc44ff3c70ab6bb9c38d256822..c81d618137ce8b8e2f8c98d451fb5784b560e6cd 100644 (file)
@@ -19,7 +19,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;
@@ -133,14 +133,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 c2945eb3397c8991ae05ea84abb2ba15591cbefb..ad7b300ed911cf39c59dcd05d66076129ab5016a 100644 (file)
@@ -19,7 +19,7 @@
 
 struct nft_cmp_expr {
        struct nft_data         data;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      len;
        enum nft_cmp_ops        op:8;
 };
@@ -79,8 +79,7 @@ static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
                            tb[NFTA_CMP_DATA]);
        BUG_ON(err < 0);
 
-       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;
 
@@ -129,8 +128,7 @@ static int nft_cmp_fast_init(const struct nft_ctx *ctx,
                            tb[NFTA_CMP_DATA]);
        BUG_ON(err < 0);
 
-       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 5e0d367a09882a1a78e15d1f1d6f0eaed7306abe..0480d513bc2d7e448b742bc775a546f8bb074062 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;
        };
 };
 
@@ -578,8 +578,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 2cc1e0ef56e88f0ac960cc4ae891bda7e93da8c8..e862f916efa096a54cee05ea8351fa1c971637bf 100644 (file)
@@ -16,7 +16,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,
@@ -42,8 +42,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 const struct nft_expr_ops nft_dup_netdev_ingress_ops;
index 74e8fdaa34321383ab357380345db9bdc92223cb..f174a66bbc4b76f0992020639ed5442e7e18b425 100644 (file)
@@ -20,8 +20,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;
@@ -163,8 +163,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
                                                tb[NFTA_DYNSET_TIMEOUT])));
        }
 
-       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;
 
@@ -174,8 +174,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 e73a1503e8d7c0e0262cbf4f218cb528361c034f..0aa92b7699b3a2bf8770fdd80688b0e26c1ba52f 100644 (file)
@@ -24,7 +24,7 @@ struct nft_exthdr {
        u8                      len;
        u8                      op;
        enum nft_registers      dreg:8;
-       enum nft_registers      sreg:8;
+       u8                      sreg;
        u8                      flags;
 };
 
@@ -307,11 +307,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_dump_common(struct sk_buff *skb, const struct nft_exthdr *priv)
index ee190fa4dc34700db740fc81a070ea1ea309c40c..c717e3a44247273c0438cee9fd368f63163afa27 100644 (file)
@@ -16,7 +16,7 @@
 #include <net/netfilter/nf_dup_netdev.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,
@@ -43,8 +43,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 const struct nft_expr_ops nft_fwd_netdev_ingress_ops;
index 010a565b4000188e189929593d10000691508ea0..9ae2cb3dadcec8509e626ffae5da166f3410a03e 100644 (file)
@@ -18,7 +18,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;
@@ -85,7 +85,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);
@@ -96,6 +95,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;
@@ -110,8 +113,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 4fcbe51e88c762cfdbff0006407ce4a05c660600..c7b37b10dcaa407171966ebc334a20d1bf87063a 100644 (file)
@@ -20,7 +20,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;
@@ -76,8 +76,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 6ac03d4266c9038cb4ffd3de412a216b769d07a1..712a187983e6e916fa8b8e75112d5cecfeb61cb1 100644 (file)
@@ -53,19 +53,15 @@ 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 c71184d4eac1b5d95f33337f1e0f2b087444fa05..185c7e26609d44bd234b1d075a12ee74f683ea6b 100644 (file)
@@ -374,8 +374,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 04dd813ed77551e725213efedd98e14996d58c55..c3f6c41823ec01c871976e14c166ecb668786b9c 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;
@@ -160,18 +160,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 {
@@ -181,19 +178,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 5deb997db9bbb9529cb6b29f9a8298cda459844e..8ad0be6c53fd3715329d4aeba3857887aa426a96 100644 (file)
@@ -97,7 +97,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;
 };
 
@@ -138,8 +138,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 5732b32ab9320075f3dd92a223eed537c9d02074..6c5312fecac5c5e864f87bbe667a77deb71fb891 100644 (file)
@@ -338,7 +338,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]));
@@ -369,7 +368,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 98613658d4ac5ce359e946efca4c93d9df216817..de5f1bda9d6f1dd60e3303e055418bdc6d30c72f 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,
@@ -114,8 +114,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 cedb96c3619fa991395602dff1363314d3de13ea..658d68522013ef5c960e455c915243b3286fc349 100644 (file)
@@ -18,7 +18,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;
 };
@@ -80,8 +80,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 1e66538bf0ff24e3286ec6312e4d593c6197bd9b..723e07a5640c2b31aaa56beb5047ba56a4371a03 100644 (file)
@@ -49,19 +49,15 @@ 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 {