]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
netfilter: nf_tables: remove register tracking infrastructure
authorFlorian Westphal <fw@strlen.de>
Tue, 24 Feb 2026 20:50:48 +0000 (21:50 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 26 Feb 2026 03:36:26 +0000 (19:36 -0800)
This facility was disabled in commit
9e539c5b6d9c ("netfilter: nf_tables: disable expression reduction infra"),
because not all nft_exprs guarantee they will update the destination
register: some may set NFT_BREAK instead to cancel evaluation of the
rule.

This has been dead code ever since.
There are no plans to salvage this at this time, so remove this.

Signed-off-by: Florian Westphal <fw@strlen.de>
Link: https://patch.msgid.link/20260224205048.4718-10-fw@strlen.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
52 files changed:
include/net/netfilter/nf_tables.h
include/net/netfilter/nft_fib.h
include/net/netfilter/nft_meta.h
net/bridge/netfilter/nft_meta_bridge.c
net/bridge/netfilter/nft_reject_bridge.c
net/ipv4/netfilter/nft_dup_ipv4.c
net/ipv4/netfilter/nft_fib_ipv4.c
net/ipv4/netfilter/nft_reject_ipv4.c
net/ipv6/netfilter/nft_dup_ipv6.c
net/ipv6/netfilter/nft_fib_ipv6.c
net/ipv6/netfilter/nft_reject_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_compat.c
net/netfilter/nft_connlimit.c
net/netfilter/nft_counter.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_fib.c
net/netfilter/nft_fib_inet.c
net/netfilter/nft_fib_netdev.c
net/netfilter/nft_flow_offload.c
net/netfilter/nft_fwd_netdev.c
net/netfilter/nft_hash.c
net/netfilter/nft_immediate.c
net/netfilter/nft_last.c
net/netfilter/nft_limit.c
net/netfilter/nft_log.c
net/netfilter/nft_lookup.c
net/netfilter/nft_masq.c
net/netfilter/nft_meta.c
net/netfilter/nft_nat.c
net/netfilter/nft_numgen.c
net/netfilter/nft_objref.c
net/netfilter/nft_osf.c
net/netfilter/nft_payload.c
net/netfilter/nft_queue.c
net/netfilter/nft_quota.c
net/netfilter/nft_range.c
net/netfilter/nft_redir.c
net/netfilter/nft_reject_inet.c
net/netfilter/nft_reject_netdev.c
net/netfilter/nft_rt.c
net/netfilter/nft_socket.c
net/netfilter/nft_synproxy.c
net/netfilter/nft_tproxy.c
net/netfilter/nft_tunnel.c
net/netfilter/nft_xfrm.c

index 426534a711b07534df614bd98885bcb3d181ecf1..40e8106e71f0504125dbe294dce7e2a1e661486e 100644 (file)
@@ -122,17 +122,6 @@ struct nft_regs {
        };
 };
 
-struct nft_regs_track {
-       struct {
-               const struct nft_expr           *selector;
-               const struct nft_expr           *bitwise;
-               u8                              num_reg;
-       } regs[NFT_REG32_NUM];
-
-       const struct nft_expr                   *cur;
-       const struct nft_expr                   *last;
-};
-
 /* Store/load an u8, u16 or u64 integer to/from the u32 data register.
  *
  * Note, when using concatenations, register allocation happens at 32-bit
@@ -427,8 +416,6 @@ int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp);
 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
 int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
                  const struct nft_expr *expr, bool reset);
-bool nft_expr_reduce_bitwise(struct nft_regs_track *track,
-                            const struct nft_expr *expr);
 
 struct nft_set_ext;
 
@@ -941,7 +928,6 @@ struct nft_offload_ctx;
  *     @destroy_clone: destruction clone function
  *     @dump: function to dump parameters
  *     @validate: validate expression, called during loop detection
- *     @reduce: reduce expression
  *     @gc: garbage collection expression
  *     @offload: hardware offload expression
  *     @offload_action: function to report true/false to allocate one slot or not in the flow
@@ -975,8 +961,6 @@ struct nft_expr_ops {
                                                bool reset);
        int                             (*validate)(const struct nft_ctx *ctx,
                                                    const struct nft_expr *expr);
-       bool                            (*reduce)(struct nft_regs_track *track,
-                                                 const struct nft_expr *expr);
        bool                            (*gc)(struct net *net,
                                              const struct nft_expr *expr);
        int                             (*offload)(struct nft_offload_ctx *ctx,
@@ -1954,20 +1938,4 @@ static inline u64 nft_net_tstamp(const struct net *net)
        return nft_pernet(net)->tstamp;
 }
 
-#define __NFT_REDUCE_READONLY  1UL
-#define NFT_REDUCE_READONLY    (void *)__NFT_REDUCE_READONLY
-
-void nft_reg_track_update(struct nft_regs_track *track,
-                         const struct nft_expr *expr, u8 dreg, u8 len);
-void nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg, u8 len);
-void __nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg);
-
-static inline bool nft_reg_track_cmp(struct nft_regs_track *track,
-                                    const struct nft_expr *expr, u8 dreg)
-{
-       return track->regs[dreg].selector &&
-              track->regs[dreg].selector->ops == expr->ops &&
-              track->regs[dreg].num_reg == 0;
-}
-
 #endif /* _NET_NF_TABLES_H */
index 7370fba844efcf119d22646c3bb54dd6722dbcc5..e0422456f27bcb871945e5808e3fb621956cb630 100644 (file)
@@ -66,6 +66,4 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs,
 void nft_fib_store_result(void *reg, const struct nft_fib *priv,
                          const struct net_device *dev);
 
-bool nft_fib_reduce(struct nft_regs_track *track,
-                   const struct nft_expr *expr);
 #endif
index d602263590fed53d362f280faa6978d22394c49a..f74e63290603d9a9ddd4d2edbfb510ec6826c177 100644 (file)
@@ -43,9 +43,6 @@ void nft_meta_set_destroy(const struct nft_ctx *ctx,
 int nft_meta_set_validate(const struct nft_ctx *ctx,
                          const struct nft_expr *expr);
 
-bool nft_meta_get_reduce(struct nft_regs_track *track,
-                        const struct nft_expr *expr);
-
 struct nft_inner_tun_ctx;
 void nft_meta_inner_eval(const struct nft_expr *expr,
                         struct nft_regs *regs, const struct nft_pktinfo *pkt,
index b7af36bbd30664eb1313c5266c0479751674e254..7763e78abb00af93dde59f402d0c6030dc23935f 100644 (file)
@@ -112,7 +112,6 @@ static const struct nft_expr_ops nft_meta_bridge_get_ops = {
        .eval           = nft_meta_bridge_get_eval,
        .init           = nft_meta_bridge_get_init,
        .dump           = nft_meta_get_dump,
-       .reduce         = nft_meta_get_reduce,
 };
 
 static void nft_meta_bridge_set_eval(const struct nft_expr *expr,
@@ -159,24 +158,6 @@ static int nft_meta_bridge_set_init(const struct nft_ctx *ctx,
        return 0;
 }
 
-static bool nft_meta_bridge_set_reduce(struct nft_regs_track *track,
-                                      const struct nft_expr *expr)
-{
-       int i;
-
-       for (i = 0; i < NFT_REG32_NUM; i++) {
-               if (!track->regs[i].selector)
-                       continue;
-
-               if (track->regs[i].selector->ops != &nft_meta_bridge_get_ops)
-                       continue;
-
-               __nft_reg_track_cancel(track, i);
-       }
-
-       return false;
-}
-
 static int nft_meta_bridge_set_validate(const struct nft_ctx *ctx,
                                        const struct nft_expr *expr)
 {
@@ -202,7 +183,6 @@ static const struct nft_expr_ops nft_meta_bridge_set_ops = {
        .init           = nft_meta_bridge_set_init,
        .destroy        = nft_meta_set_destroy,
        .dump           = nft_meta_set_dump,
-       .reduce         = nft_meta_bridge_set_reduce,
        .validate       = nft_meta_bridge_set_validate,
 };
 
index 1cb5c16e97b7fa493bdae4e1dbebe7ff695e0884..cd2b04236a99ca47fd0e21577075076d94f9d454 100644 (file)
@@ -184,7 +184,6 @@ static const struct nft_expr_ops nft_reject_bridge_ops = {
        .init           = nft_reject_init,
        .dump           = nft_reject_dump,
        .validate       = nft_reject_bridge_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_reject_bridge_type __read_mostly = {
index ef5dd88107ddbbc751584bda0ea376c166eb9d85..d53a65ddbd7b731d00cfbb01119ea062b5cfaadd 100644 (file)
@@ -76,7 +76,6 @@ static const struct nft_expr_ops nft_dup_ipv4_ops = {
        .eval           = nft_dup_ipv4_eval,
        .init           = nft_dup_ipv4_init,
        .dump           = nft_dup_ipv4_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nla_policy nft_dup_ipv4_policy[NFTA_DUP_MAX + 1] = {
index 82af6cd76d13e098c50aa5df53b2a2793aa9e4b2..9d0c6d75109b365ade97de18b9dfd7cbf06b92ba 100644 (file)
@@ -163,7 +163,6 @@ static const struct nft_expr_ops nft_fib4_type_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static const struct nft_expr_ops nft_fib4_ops = {
@@ -173,7 +172,6 @@ static const struct nft_expr_ops nft_fib4_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static const struct nft_expr_ops *
index 6cb213bb7256a8438068f61b8b8fe02a68a285c3..55fc23a8f7a70611ff39af92dd1e2586f6f00aeb 100644 (file)
@@ -45,7 +45,6 @@ static const struct nft_expr_ops nft_reject_ipv4_ops = {
        .init           = nft_reject_init,
        .dump           = nft_reject_dump,
        .validate       = nft_reject_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_reject_ipv4_type __read_mostly = {
index 492a811828a71bf918e53eb91ec4d34ba31c783c..95ec27b3971c11ca6b8568c0ba2c592a5aefc107 100644 (file)
@@ -74,7 +74,6 @@ static const struct nft_expr_ops nft_dup_ipv6_ops = {
        .eval           = nft_dup_ipv6_eval,
        .init           = nft_dup_ipv6_init,
        .dump           = nft_dup_ipv6_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nla_policy nft_dup_ipv6_policy[NFTA_DUP_MAX + 1] = {
index 421036a3605b465eb0ca602a706ce2998454c998..dc375b725b282a6d5f31c059222ccf84b1336b82 100644 (file)
@@ -225,7 +225,6 @@ static const struct nft_expr_ops nft_fib6_type_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static const struct nft_expr_ops nft_fib6_ops = {
@@ -235,7 +234,6 @@ static const struct nft_expr_ops nft_fib6_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static const struct nft_expr_ops *
index 5c61294f410ee1ec00364c159534c46481a72803..ed69c768797ec6f9f0a0c582d25908c298cc18da 100644 (file)
@@ -46,7 +46,6 @@ static const struct nft_expr_ops nft_reject_ipv6_ops = {
        .init           = nft_reject_init,
        .dump           = nft_reject_dump,
        .validate       = nft_reject_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_reject_ipv6_type __read_mostly = {
index 23ef775897a4a332b2af9419a0c41a336161a6c0..c8d5f7e93dfdd2b3f338be0648d8b370412b2665 100644 (file)
@@ -932,58 +932,6 @@ static int nft_delflowtable(struct nft_ctx *ctx,
        return 0;
 }
 
-static void __nft_reg_track_clobber(struct nft_regs_track *track, u8 dreg)
-{
-       int i;
-
-       for (i = track->regs[dreg].num_reg; i > 0; i--)
-               __nft_reg_track_cancel(track, dreg - i);
-}
-
-static void __nft_reg_track_update(struct nft_regs_track *track,
-                                  const struct nft_expr *expr,
-                                  u8 dreg, u8 num_reg)
-{
-       track->regs[dreg].selector = expr;
-       track->regs[dreg].bitwise = NULL;
-       track->regs[dreg].num_reg = num_reg;
-}
-
-void nft_reg_track_update(struct nft_regs_track *track,
-                         const struct nft_expr *expr, u8 dreg, u8 len)
-{
-       unsigned int regcount;
-       int i;
-
-       __nft_reg_track_clobber(track, dreg);
-
-       regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE);
-       for (i = 0; i < regcount; i++, dreg++)
-               __nft_reg_track_update(track, expr, dreg, i);
-}
-EXPORT_SYMBOL_GPL(nft_reg_track_update);
-
-void nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg, u8 len)
-{
-       unsigned int regcount;
-       int i;
-
-       __nft_reg_track_clobber(track, dreg);
-
-       regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE);
-       for (i = 0; i < regcount; i++, dreg++)
-               __nft_reg_track_cancel(track, dreg);
-}
-EXPORT_SYMBOL_GPL(nft_reg_track_cancel);
-
-void __nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg)
-{
-       track->regs[dreg].selector = NULL;
-       track->regs[dreg].bitwise = NULL;
-       track->regs[dreg].num_reg = 0;
-}
-EXPORT_SYMBOL_GPL(__nft_reg_track_cancel);
-
 /*
  * Tables
  */
@@ -10172,16 +10120,9 @@ void nf_tables_trans_destroy_flush_work(struct net *net)
 }
 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work);
 
-static bool nft_expr_reduce(struct nft_regs_track *track,
-                           const struct nft_expr *expr)
-{
-       return false;
-}
-
 static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *chain)
 {
        const struct nft_expr *expr, *last;
-       struct nft_regs_track track = {};
        unsigned int size, data_size;
        void *data, *data_boundary;
        struct nft_rule_dp *prule;
@@ -10218,15 +10159,7 @@ static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *cha
                        return -ENOMEM;
 
                size = 0;
-               track.last = nft_expr_last(rule);
                nft_rule_for_each_expr(expr, last, rule) {
-                       track.cur = expr;
-
-                       if (nft_expr_reduce(&track, expr)) {
-                               expr = track.cur;
-                               continue;
-                       }
-
                        if (WARN_ON_ONCE(data + size + expr->ops->size > data_boundary))
                                return -ENOMEM;
 
index d550910aabec9b6efc7862679382f7ebdccd01f4..a4ff781f334d41f1418bf87815b4f7e4b635d3aa 100644 (file)
@@ -391,61 +391,12 @@ static int nft_bitwise_offload(struct nft_offload_ctx *ctx,
        return 0;
 }
 
-static bool nft_bitwise_reduce(struct nft_regs_track *track,
-                              const struct nft_expr *expr)
-{
-       const struct nft_bitwise *priv = nft_expr_priv(expr);
-       const struct nft_bitwise *bitwise;
-       unsigned int regcount;
-       u8 dreg;
-       int i;
-
-       if (!track->regs[priv->sreg].selector)
-               return false;
-
-       bitwise = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (track->regs[priv->sreg].selector == track->regs[priv->dreg].selector &&
-           track->regs[priv->sreg].num_reg == 0 &&
-           track->regs[priv->dreg].bitwise &&
-           track->regs[priv->dreg].bitwise->ops == expr->ops &&
-           priv->sreg == bitwise->sreg &&
-           priv->sreg2 == bitwise->sreg2 &&
-           priv->dreg == bitwise->dreg &&
-           priv->op == bitwise->op &&
-           priv->len == bitwise->len &&
-           !memcmp(&priv->mask, &bitwise->mask, sizeof(priv->mask)) &&
-           !memcmp(&priv->xor, &bitwise->xor, sizeof(priv->xor)) &&
-           !memcmp(&priv->data, &bitwise->data, sizeof(priv->data))) {
-               track->cur = expr;
-               return true;
-       }
-
-       if (track->regs[priv->sreg].bitwise ||
-           track->regs[priv->sreg].num_reg != 0) {
-               nft_reg_track_cancel(track, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (priv->sreg != priv->dreg) {
-               nft_reg_track_update(track, track->regs[priv->sreg].selector,
-                                    priv->dreg, priv->len);
-       }
-
-       dreg = priv->dreg;
-       regcount = DIV_ROUND_UP(priv->len, NFT_REG32_SIZE);
-       for (i = 0; i < regcount; i++, dreg++)
-               track->regs[dreg].bitwise = expr;
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_bitwise_ops = {
        .type           = &nft_bitwise_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
        .eval           = nft_bitwise_eval,
        .init           = nft_bitwise_init,
        .dump           = nft_bitwise_dump,
-       .reduce         = nft_bitwise_reduce,
        .offload        = nft_bitwise_offload,
 };
 
@@ -548,48 +499,12 @@ static int nft_bitwise_fast_offload(struct nft_offload_ctx *ctx,
        return 0;
 }
 
-static bool nft_bitwise_fast_reduce(struct nft_regs_track *track,
-                                   const struct nft_expr *expr)
-{
-       const struct nft_bitwise_fast_expr *priv = nft_expr_priv(expr);
-       const struct nft_bitwise_fast_expr *bitwise;
-
-       if (!track->regs[priv->sreg].selector)
-               return false;
-
-       bitwise = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (track->regs[priv->sreg].selector == track->regs[priv->dreg].selector &&
-           track->regs[priv->dreg].bitwise &&
-           track->regs[priv->dreg].bitwise->ops == expr->ops &&
-           priv->sreg == bitwise->sreg &&
-           priv->dreg == bitwise->dreg &&
-           priv->mask == bitwise->mask &&
-           priv->xor == bitwise->xor) {
-               track->cur = expr;
-               return true;
-       }
-
-       if (track->regs[priv->sreg].bitwise) {
-               nft_reg_track_cancel(track, priv->dreg, NFT_REG32_SIZE);
-               return false;
-       }
-
-       if (priv->sreg != priv->dreg) {
-               track->regs[priv->dreg].selector =
-                       track->regs[priv->sreg].selector;
-       }
-       track->regs[priv->dreg].bitwise = expr;
-
-       return false;
-}
-
 const struct nft_expr_ops nft_bitwise_fast_ops = {
        .type           = &nft_bitwise_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_bitwise_fast_expr)),
        .eval           = NULL, /* inlined */
        .init           = nft_bitwise_fast_init,
        .dump           = nft_bitwise_fast_dump,
-       .reduce         = nft_bitwise_fast_reduce,
        .offload        = nft_bitwise_fast_offload,
 };
 
@@ -626,22 +541,3 @@ struct nft_expr_type nft_bitwise_type __read_mostly = {
        .maxattr        = NFTA_BITWISE_MAX,
        .owner          = THIS_MODULE,
 };
-
-bool nft_expr_reduce_bitwise(struct nft_regs_track *track,
-                            const struct nft_expr *expr)
-{
-       const struct nft_expr *last = track->last;
-       const struct nft_expr *next;
-
-       if (expr == last)
-               return false;
-
-       next = nft_expr_next(expr);
-       if (next->ops == &nft_bitwise_ops)
-               return nft_bitwise_reduce(track, next);
-       else if (next->ops == &nft_bitwise_fast_ops)
-               return nft_bitwise_fast_reduce(track, next);
-
-       return false;
-}
-EXPORT_SYMBOL_GPL(nft_expr_reduce_bitwise);
index af9206a3afd181f33213e5dac0f9c4b299d63ecf..744878773dac0af0baa8ad95f6b7551d814fbfb9 100644 (file)
@@ -170,23 +170,12 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_byteorder_reduce(struct nft_regs_track *track,
-                                const struct nft_expr *expr)
-{
-       struct nft_byteorder *priv = nft_expr_priv(expr);
-
-       nft_reg_track_cancel(track, priv->dreg, priv->len);
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_byteorder_ops = {
        .type           = &nft_byteorder_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_byteorder)),
        .eval           = nft_byteorder_eval,
        .init           = nft_byteorder_init,
        .dump           = nft_byteorder_dump,
-       .reduce         = nft_byteorder_reduce,
 };
 
 struct nft_expr_type nft_byteorder_type __read_mostly = {
index 2605f43737bc96012c6f90e2fd52fc662a895b8e..b61dc9c3383ee172d7a0da36bc23607aae38dbed 100644 (file)
@@ -190,7 +190,6 @@ static const struct nft_expr_ops nft_cmp_ops = {
        .eval           = nft_cmp_eval,
        .init           = nft_cmp_init,
        .dump           = nft_cmp_dump,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_cmp_offload,
 };
 
@@ -282,7 +281,6 @@ const struct nft_expr_ops nft_cmp_fast_ops = {
        .eval           = NULL, /* inlined */
        .init           = nft_cmp_fast_init,
        .dump           = nft_cmp_fast_dump,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_cmp_fast_offload,
 };
 
@@ -376,7 +374,6 @@ const struct nft_expr_ops nft_cmp16_fast_ops = {
        .eval           = NULL, /* inlined */
        .init           = nft_cmp16_fast_init,
        .dump           = nft_cmp16_fast_dump,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_cmp16_fast_offload,
 };
 
index 08f620311b03f140d26f2931ebddf62db2db89b6..5021a01ba42c23d6325cef66f135d120c407e94c 100644 (file)
@@ -778,14 +778,6 @@ static const struct nfnetlink_subsystem nfnl_compat_subsys = {
 
 static struct nft_expr_type nft_match_type;
 
-static bool nft_match_reduce(struct nft_regs_track *track,
-                            const struct nft_expr *expr)
-{
-       const struct xt_match *match = expr->ops->data;
-
-       return strcmp(match->name, "comment") == 0;
-}
-
 static const struct nft_expr_ops *
 nft_match_select_ops(const struct nft_ctx *ctx,
                     const struct nlattr * const tb[])
@@ -828,7 +820,6 @@ nft_match_select_ops(const struct nft_ctx *ctx,
        ops->dump = nft_match_dump;
        ops->validate = nft_match_validate;
        ops->data = match;
-       ops->reduce = nft_match_reduce;
 
        matchsize = NFT_EXPR_SIZE(XT_ALIGN(match->matchsize));
        if (matchsize > NFT_MATCH_LARGE_THRESH) {
@@ -918,7 +909,6 @@ nft_target_select_ops(const struct nft_ctx *ctx,
        ops->dump = nft_target_dump;
        ops->validate = nft_target_validate;
        ops->data = target;
-       ops->reduce = NFT_REDUCE_READONLY;
 
        if (family == NFPROTO_BRIDGE)
                ops->eval = nft_target_eval_bridge;
index 657764774a2d691d2131e490bc213359de77f36e..47d817983e8133acb28405c15b3c69c608962835 100644 (file)
@@ -258,7 +258,6 @@ static const struct nft_expr_ops nft_connlimit_ops = {
        .destroy_clone  = nft_connlimit_destroy_clone,
        .dump           = nft_connlimit_dump,
        .gc             = nft_connlimit_gc,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_connlimit_type __read_mostly = {
index 169ae93688bcc5d60818d9238342efe64b9bfbeb..3fa6369790f4d5f2b17b207c4bcfa0c5cc9a8911 100644 (file)
@@ -313,7 +313,6 @@ static const struct nft_expr_ops nft_counter_ops = {
        .destroy_clone  = nft_counter_destroy,
        .dump           = nft_counter_dump,
        .clone          = nft_counter_clone,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_counter_offload,
        .offload_stats  = nft_counter_offload_stats,
 };
index 6f2ae7cad73108af9c89a604408efe54bf9699be..b6abd5f8de92fc5d57bdc9b4505d977f2b6ae650 100644 (file)
@@ -698,29 +698,6 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_ct_get_reduce(struct nft_regs_track *track,
-                             const struct nft_expr *expr)
-{
-       const struct nft_ct *priv = nft_expr_priv(expr);
-       const struct nft_ct *ct;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       ct = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->key != ct->key) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-
 static int nft_ct_set_dump(struct sk_buff *skb,
                           const struct nft_expr *expr, bool reset)
 {
@@ -755,27 +732,8 @@ static const struct nft_expr_ops nft_ct_get_ops = {
        .init           = nft_ct_get_init,
        .destroy        = nft_ct_get_destroy,
        .dump           = nft_ct_get_dump,
-       .reduce         = nft_ct_get_reduce,
 };
 
-static bool nft_ct_set_reduce(struct nft_regs_track *track,
-                             const struct nft_expr *expr)
-{
-       int i;
-
-       for (i = 0; i < NFT_REG32_NUM; i++) {
-               if (!track->regs[i].selector)
-                       continue;
-
-               if (track->regs[i].selector->ops != &nft_ct_get_ops)
-                       continue;
-
-               __nft_reg_track_cancel(track, i);
-       }
-
-       return false;
-}
-
 #ifdef CONFIG_MITIGATION_RETPOLINE
 static const struct nft_expr_ops nft_ct_get_fast_ops = {
        .type           = &nft_ct_type,
@@ -784,7 +742,6 @@ static const struct nft_expr_ops nft_ct_get_fast_ops = {
        .init           = nft_ct_get_init,
        .destroy        = nft_ct_get_destroy,
        .dump           = nft_ct_get_dump,
-       .reduce         = nft_ct_set_reduce,
 };
 #endif
 
@@ -795,7 +752,6 @@ static const struct nft_expr_ops nft_ct_set_ops = {
        .init           = nft_ct_set_init,
        .destroy        = nft_ct_set_destroy,
        .dump           = nft_ct_set_dump,
-       .reduce         = nft_ct_set_reduce,
 };
 
 #ifdef CONFIG_NF_CONNTRACK_ZONES
@@ -806,7 +762,6 @@ static const struct nft_expr_ops nft_ct_set_zone_ops = {
        .init           = nft_ct_set_init,
        .destroy        = nft_ct_set_destroy,
        .dump           = nft_ct_set_dump,
-       .reduce         = nft_ct_set_reduce,
 };
 #endif
 
@@ -876,7 +831,6 @@ static const struct nft_expr_ops nft_notrack_ops = {
        .type           = &nft_notrack_type,
        .size           = NFT_EXPR_SIZE(0),
        .eval           = nft_notrack_eval,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_notrack_type __read_mostly = {
index 0573f96ce07913b7581673e7ef59b7809cb598b5..06866799e9463e011460045f63827caf533f72e8 100644 (file)
@@ -80,7 +80,6 @@ static const struct nft_expr_ops nft_dup_netdev_ops = {
        .eval           = nft_dup_netdev_eval,
        .init           = nft_dup_netdev_init,
        .dump           = nft_dup_netdev_dump,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_dup_netdev_offload,
        .offload_action = nft_dup_netdev_offload_action,
 };
index 7807d812966464908b44911b79b8eb2efa097a27..6bff6287e7d5236e21bb777d638db34afa363f4f 100644 (file)
@@ -421,7 +421,6 @@ static const struct nft_expr_ops nft_dynset_ops = {
        .activate       = nft_dynset_activate,
        .deactivate     = nft_dynset_deactivate,
        .dump           = nft_dynset_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 struct nft_expr_type nft_dynset_type __read_mostly = {
index 7eedf4e3ae9c752999e8ea0a4fd14ef2360a4c89..5f01269a49bd1527c56585edaa5a574471314422 100644 (file)
@@ -702,40 +702,12 @@ static int nft_exthdr_dump_strip(struct sk_buff *skb,
        return nft_exthdr_dump_common(skb, priv);
 }
 
-static bool nft_exthdr_reduce(struct nft_regs_track *track,
-                              const struct nft_expr *expr)
-{
-       const struct nft_exthdr *priv = nft_expr_priv(expr);
-       const struct nft_exthdr *exthdr;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       exthdr = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->type != exthdr->type ||
-           priv->op != exthdr->op ||
-           priv->flags != exthdr->flags ||
-           priv->offset != exthdr->offset ||
-           priv->len != exthdr->len) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-
 static const struct nft_expr_ops nft_exthdr_ipv6_ops = {
        .type           = &nft_exthdr_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_exthdr)),
        .eval           = nft_exthdr_ipv6_eval,
        .init           = nft_exthdr_init,
        .dump           = nft_exthdr_dump,
-       .reduce         = nft_exthdr_reduce,
 };
 
 static const struct nft_expr_ops nft_exthdr_ipv4_ops = {
@@ -744,7 +716,6 @@ static const struct nft_expr_ops nft_exthdr_ipv4_ops = {
        .eval           = nft_exthdr_ipv4_eval,
        .init           = nft_exthdr_ipv4_init,
        .dump           = nft_exthdr_dump,
-       .reduce         = nft_exthdr_reduce,
 };
 
 static const struct nft_expr_ops nft_exthdr_tcp_ops = {
@@ -753,7 +724,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_ops = {
        .eval           = nft_exthdr_tcp_eval,
        .init           = nft_exthdr_init,
        .dump           = nft_exthdr_dump,
-       .reduce         = nft_exthdr_reduce,
 };
 
 static const struct nft_expr_ops nft_exthdr_tcp_set_ops = {
@@ -762,7 +732,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_set_ops = {
        .eval           = nft_exthdr_tcp_set_eval,
        .init           = nft_exthdr_tcp_set_init,
        .dump           = nft_exthdr_dump_set,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops nft_exthdr_tcp_strip_ops = {
@@ -771,7 +740,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_strip_ops = {
        .eval           = nft_exthdr_tcp_strip_eval,
        .init           = nft_exthdr_tcp_strip_init,
        .dump           = nft_exthdr_dump_strip,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops nft_exthdr_sctp_ops = {
@@ -780,7 +748,6 @@ static const struct nft_expr_ops nft_exthdr_sctp_ops = {
        .eval           = nft_exthdr_sctp_eval,
        .init           = nft_exthdr_init,
        .dump           = nft_exthdr_dump,
-       .reduce         = nft_exthdr_reduce,
 };
 
 #ifdef CONFIG_NFT_EXTHDR_DCCP
@@ -790,7 +757,6 @@ static const struct nft_expr_ops nft_exthdr_dccp_ops = {
        .eval           = nft_exthdr_dccp_eval,
        .init           = nft_exthdr_dccp_init,
        .dump           = nft_exthdr_dump,
-       .reduce         = nft_exthdr_reduce,
 };
 #endif
 
index 96e02a83c045e21c7fb2983707fd09f698a9b53b..f7dc0e54375f0810c06c9cd54620437d4253372a 100644 (file)
@@ -162,48 +162,6 @@ void nft_fib_store_result(void *reg, const struct nft_fib *priv,
 }
 EXPORT_SYMBOL_GPL(nft_fib_store_result);
 
-bool nft_fib_reduce(struct nft_regs_track *track,
-                   const struct nft_expr *expr)
-{
-       const struct nft_fib *priv = nft_expr_priv(expr);
-       unsigned int len = NFT_REG32_SIZE;
-       const struct nft_fib *fib;
-
-       switch (priv->result) {
-       case NFT_FIB_RESULT_OIF:
-               break;
-       case NFT_FIB_RESULT_OIFNAME:
-               if (priv->flags & NFTA_FIB_F_PRESENT)
-                       len = NFT_REG32_SIZE;
-               else
-                       len = IFNAMSIZ;
-               break;
-       case NFT_FIB_RESULT_ADDRTYPE:
-            break;
-       default:
-               WARN_ON_ONCE(1);
-               break;
-       }
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, len);
-               return false;
-       }
-
-       fib = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->result != fib->result ||
-           priv->flags != fib->flags) {
-               nft_reg_track_update(track, expr, priv->dreg, len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return false;
-}
-EXPORT_SYMBOL_GPL(nft_fib_reduce);
-
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Query routing table from nftables");
 MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
index 666a3741d20b6d61fecb8d2cacfbb5de91d0850e..a88d44e163d19e6a0f547c1069fca3fa9b248153 100644 (file)
@@ -49,7 +49,6 @@ static const struct nft_expr_ops nft_fib_inet_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static struct nft_expr_type nft_fib_inet_type __read_mostly = {
index 9121ec64e918f4252c5864fe4e6dfc04ea50fcb3..3f3478abd8454606b16f1674abb3bb83f35704b7 100644 (file)
@@ -58,7 +58,6 @@ static const struct nft_expr_ops nft_fib_netdev_ops = {
        .init           = nft_fib_init,
        .dump           = nft_fib_dump,
        .validate       = nft_fib_validate,
-       .reduce         = nft_fib_reduce,
 };
 
 static struct nft_expr_type nft_fib_netdev_type __read_mostly = {
index 179d0e59e2b52de84e9c8a342313aff048b81379..32b4281038dd35d3e399d176888cd61ceb01b627 100644 (file)
@@ -225,7 +225,6 @@ static const struct nft_expr_ops nft_flow_offload_ops = {
        .destroy        = nft_flow_offload_destroy,
        .validate       = nft_flow_offload_validate,
        .dump           = nft_flow_offload_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_flow_offload_type __read_mostly = {
index 152a9fb4d23af5b5b3385d5c552d38b8581a8d22..ad48dcd45abea961bd3e3a507bb0c111fa8e6e76 100644 (file)
@@ -218,7 +218,6 @@ static const struct nft_expr_ops nft_fwd_neigh_netdev_ops = {
        .init           = nft_fwd_neigh_init,
        .dump           = nft_fwd_neigh_dump,
        .validate       = nft_fwd_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops nft_fwd_netdev_ops = {
@@ -228,7 +227,6 @@ static const struct nft_expr_ops nft_fwd_netdev_ops = {
        .init           = nft_fwd_netdev_init,
        .dump           = nft_fwd_netdev_dump,
        .validate       = nft_fwd_validate,
-       .reduce         = NFT_REDUCE_READONLY,
        .offload        = nft_fwd_netdev_offload,
        .offload_action = nft_fwd_netdev_offload_action,
 };
index 5d034bbb6913cd4b218e7ccd94e1b405366c3608..1cf41e0a0e0c8c04f97b52811c20b9f7db9c74ae 100644 (file)
@@ -166,16 +166,6 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_jhash_reduce(struct nft_regs_track *track,
-                            const struct nft_expr *expr)
-{
-       const struct nft_jhash *priv = nft_expr_priv(expr);
-
-       nft_reg_track_cancel(track, priv->dreg, sizeof(u32));
-
-       return false;
-}
-
 static int nft_symhash_dump(struct sk_buff *skb,
                            const struct nft_expr *expr, bool reset)
 {
@@ -196,30 +186,6 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_symhash_reduce(struct nft_regs_track *track,
-                              const struct nft_expr *expr)
-{
-       struct nft_symhash *priv = nft_expr_priv(expr);
-       struct nft_symhash *symhash;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, sizeof(u32));
-               return false;
-       }
-
-       symhash = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->offset != symhash->offset ||
-           priv->modulus != symhash->modulus) {
-               nft_reg_track_update(track, expr, priv->dreg, sizeof(u32));
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return false;
-}
-
 static struct nft_expr_type nft_hash_type;
 static const struct nft_expr_ops nft_jhash_ops = {
        .type           = &nft_hash_type,
@@ -227,7 +193,6 @@ static const struct nft_expr_ops nft_jhash_ops = {
        .eval           = nft_jhash_eval,
        .init           = nft_jhash_init,
        .dump           = nft_jhash_dump,
-       .reduce         = nft_jhash_reduce,
 };
 
 static const struct nft_expr_ops nft_symhash_ops = {
@@ -236,7 +201,6 @@ static const struct nft_expr_ops nft_symhash_ops = {
        .eval           = nft_symhash_eval,
        .init           = nft_symhash_init,
        .dump           = nft_symhash_dump,
-       .reduce         = nft_symhash_reduce,
 };
 
 static const struct nft_expr_ops *
index 02ee5fb69871f838bbc9051dd4c718afc8340bd6..37c29947b380b4d85e9cf497b16d08300665c7b7 100644 (file)
@@ -320,17 +320,6 @@ static bool nft_immediate_offload_action(const struct nft_expr *expr)
        return false;
 }
 
-static bool nft_immediate_reduce(struct nft_regs_track *track,
-                                const struct nft_expr *expr)
-{
-       const struct nft_immediate_expr *priv = nft_expr_priv(expr);
-
-       if (priv->dreg != NFT_REG_VERDICT)
-               nft_reg_track_cancel(track, priv->dreg, priv->dlen);
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_imm_ops = {
        .type           = &nft_imm_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_immediate_expr)),
@@ -341,7 +330,6 @@ static const struct nft_expr_ops nft_imm_ops = {
        .destroy        = nft_immediate_destroy,
        .dump           = nft_immediate_dump,
        .validate       = nft_immediate_validate,
-       .reduce         = nft_immediate_reduce,
        .offload        = nft_immediate_offload,
        .offload_action = nft_immediate_offload_action,
 };
index de1b6066bfa856d67bdc9342c2056f667f87cf91..e845779268d3a92bc25c5b6fcfc62d0d0c19bfcf 100644 (file)
@@ -125,7 +125,6 @@ static const struct nft_expr_ops nft_last_ops = {
        .destroy        = nft_last_destroy,
        .clone          = nft_last_clone,
        .dump           = nft_last_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 struct nft_expr_type nft_last_type __read_mostly = {
index 21d26b79b4607279e6fe61591fcaf98f42651aaa..0daeb0b23c20520140c55d817daa71921901e4e9 100644 (file)
@@ -243,7 +243,6 @@ static const struct nft_expr_ops nft_limit_pkts_ops = {
        .destroy        = nft_limit_pkts_destroy,
        .clone          = nft_limit_pkts_clone,
        .dump           = nft_limit_pkts_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static void nft_limit_bytes_eval(const struct nft_expr *expr,
@@ -299,7 +298,6 @@ static const struct nft_expr_ops nft_limit_bytes_ops = {
        .dump           = nft_limit_bytes_dump,
        .clone          = nft_limit_bytes_clone,
        .destroy        = nft_limit_bytes_destroy,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops *
index bf01cf8a8907b5281f39948a1c14d576accf085c..da0c0d1c9cea2883d69293bec2074181f837791c 100644 (file)
@@ -235,7 +235,6 @@ static const struct nft_expr_ops nft_log_ops = {
        .init           = nft_log_init,
        .destroy        = nft_log_destroy,
        .dump           = nft_log_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_log_type __read_mostly = {
index fc2d7c5d83c8ecc1a9b21097d64a7dea54779aef..e4e6190275429a3856891160bd697a5fdb632eb2 100644 (file)
@@ -266,17 +266,6 @@ static int nft_lookup_validate(const struct nft_ctx *ctx,
        return 0;
 }
 
-static bool nft_lookup_reduce(struct nft_regs_track *track,
-                             const struct nft_expr *expr)
-{
-       const struct nft_lookup *priv = nft_expr_priv(expr);
-
-       if (priv->set->flags & NFT_SET_MAP)
-               nft_reg_track_cancel(track, priv->dreg, priv->set->dlen);
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_lookup_ops = {
        .type           = &nft_lookup_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_lookup)),
@@ -287,7 +276,6 @@ static const struct nft_expr_ops nft_lookup_ops = {
        .destroy        = nft_lookup_destroy,
        .dump           = nft_lookup_dump,
        .validate       = nft_lookup_validate,
-       .reduce         = nft_lookup_reduce,
 };
 
 struct nft_expr_type nft_lookup_type __read_mostly = {
index 868bd4d7355553fb0bb7d0b767aa900fedb29f8a..2b01128737a3a8ab31166a0e672b43d280e7d23f 100644 (file)
@@ -143,7 +143,6 @@ static const struct nft_expr_ops nft_masq_ipv4_ops = {
        .destroy        = nft_masq_ipv4_destroy,
        .dump           = nft_masq_dump,
        .validate       = nft_masq_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_masq_ipv4_type __read_mostly = {
@@ -171,7 +170,6 @@ static const struct nft_expr_ops nft_masq_ipv6_ops = {
        .destroy        = nft_masq_ipv6_destroy,
        .dump           = nft_masq_dump,
        .validate       = nft_masq_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_masq_ipv6_type __read_mostly = {
@@ -213,7 +211,6 @@ static const struct nft_expr_ops nft_masq_inet_ops = {
        .destroy        = nft_masq_inet_destroy,
        .dump           = nft_masq_dump,
        .validate       = nft_masq_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_masq_inet_type __read_mostly = {
index 05cd1e6e6a2f61227a521d5363c165f915b3bbbc..983158274c68dc6626032e6f55afc452c4be443f 100644 (file)
@@ -742,60 +742,16 @@ static int nft_meta_get_offload(struct nft_offload_ctx *ctx,
        return 0;
 }
 
-bool nft_meta_get_reduce(struct nft_regs_track *track,
-                        const struct nft_expr *expr)
-{
-       const struct nft_meta *priv = nft_expr_priv(expr);
-       const struct nft_meta *meta;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       meta = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->key != meta->key ||
-           priv->dreg != meta->dreg) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-EXPORT_SYMBOL_GPL(nft_meta_get_reduce);
-
 static const struct nft_expr_ops nft_meta_get_ops = {
        .type           = &nft_meta_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_meta)),
        .eval           = nft_meta_get_eval,
        .init           = nft_meta_get_init,
        .dump           = nft_meta_get_dump,
-       .reduce         = nft_meta_get_reduce,
        .validate       = nft_meta_get_validate,
        .offload        = nft_meta_get_offload,
 };
 
-static bool nft_meta_set_reduce(struct nft_regs_track *track,
-                               const struct nft_expr *expr)
-{
-       int i;
-
-       for (i = 0; i < NFT_REG32_NUM; i++) {
-               if (!track->regs[i].selector)
-                       continue;
-
-               if (track->regs[i].selector->ops != &nft_meta_get_ops)
-                       continue;
-
-               __nft_reg_track_cancel(track, i);
-       }
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_meta_set_ops = {
        .type           = &nft_meta_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_meta)),
@@ -803,7 +759,6 @@ static const struct nft_expr_ops nft_meta_set_ops = {
        .init           = nft_meta_set_init,
        .destroy        = nft_meta_set_destroy,
        .dump           = nft_meta_set_dump,
-       .reduce         = nft_meta_set_reduce,
        .validate       = nft_meta_set_validate,
 };
 
index 6e21f72c5b5741c89f01a27606d947d718c6ddb6..e32cd9fbc7c2ec33f9bf82f2d30182607e1152a7 100644 (file)
@@ -320,7 +320,6 @@ static const struct nft_expr_ops nft_nat_ops = {
        .destroy        = nft_nat_destroy,
        .dump           = nft_nat_dump,
        .validate       = nft_nat_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_nat_type __read_mostly = {
@@ -351,7 +350,6 @@ static const struct nft_expr_ops nft_nat_inet_ops = {
        .destroy        = nft_nat_destroy,
        .dump           = nft_nat_dump,
        .validate       = nft_nat_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_inet_nat_type __read_mostly = {
index bd058babfc820c00bf9014114ccddb8481037eaf..06e87dfd76e741cec4db159b34a72a2f499f4327 100644 (file)
@@ -84,16 +84,6 @@ err:
        return err;
 }
 
-static bool nft_ng_inc_reduce(struct nft_regs_track *track,
-                                const struct nft_expr *expr)
-{
-       const struct nft_ng_inc *priv = nft_expr_priv(expr);
-
-       nft_reg_track_cancel(track, priv->dreg, NFT_REG32_SIZE);
-
-       return false;
-}
-
 static int nft_ng_dump(struct sk_buff *skb, enum nft_registers dreg,
                       u32 modulus, enum nft_ng_types type, u32 offset)
 {
@@ -178,16 +168,6 @@ static int nft_ng_random_dump(struct sk_buff *skb,
                           priv->offset);
 }
 
-static bool nft_ng_random_reduce(struct nft_regs_track *track,
-                                const struct nft_expr *expr)
-{
-       const struct nft_ng_random *priv = nft_expr_priv(expr);
-
-       nft_reg_track_cancel(track, priv->dreg, NFT_REG32_SIZE);
-
-       return false;
-}
-
 static struct nft_expr_type nft_ng_type;
 static const struct nft_expr_ops nft_ng_inc_ops = {
        .type           = &nft_ng_type,
@@ -196,7 +176,6 @@ static const struct nft_expr_ops nft_ng_inc_ops = {
        .init           = nft_ng_inc_init,
        .destroy        = nft_ng_inc_destroy,
        .dump           = nft_ng_inc_dump,
-       .reduce         = nft_ng_inc_reduce,
 };
 
 static const struct nft_expr_ops nft_ng_random_ops = {
@@ -205,7 +184,6 @@ static const struct nft_expr_ops nft_ng_random_ops = {
        .eval           = nft_ng_random_eval,
        .init           = nft_ng_random_init,
        .dump           = nft_ng_random_dump,
-       .reduce         = nft_ng_random_reduce,
 };
 
 static const struct nft_expr_ops *
index 1a62e384766a76c80a189488ef570c34bd9b28c4..633cce69568f137f28bad81d4be9dea65427b4e7 100644 (file)
@@ -123,7 +123,6 @@ static const struct nft_expr_ops nft_objref_ops = {
        .deactivate     = nft_objref_deactivate,
        .dump           = nft_objref_dump,
        .validate       = nft_objref_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 struct nft_objref_map {
@@ -245,7 +244,6 @@ static const struct nft_expr_ops nft_objref_map_ops = {
        .destroy        = nft_objref_map_destroy,
        .dump           = nft_objref_map_dump,
        .validate       = nft_objref_map_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops *
index 1c0b493ef0a994ffc093e27b86e75bbc699d5949..39ccd67ed265ab53a5529292ac826ca9fbe498e3 100644 (file)
@@ -127,30 +127,6 @@ static int nft_osf_validate(const struct nft_ctx *ctx,
        return nft_chain_validate_hooks(ctx->chain, hooks);
 }
 
-static bool nft_osf_reduce(struct nft_regs_track *track,
-                          const struct nft_expr *expr)
-{
-       struct nft_osf *priv = nft_expr_priv(expr);
-       struct nft_osf *osf;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, NFT_OSF_MAXGENRELEN);
-               return false;
-       }
-
-       osf = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->flags != osf->flags ||
-           priv->ttl != osf->ttl) {
-               nft_reg_track_update(track, expr, priv->dreg, NFT_OSF_MAXGENRELEN);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return false;
-}
-
 static struct nft_expr_type nft_osf_type;
 static const struct nft_expr_ops nft_osf_op = {
        .eval           = nft_osf_eval,
@@ -159,7 +135,6 @@ static const struct nft_expr_ops nft_osf_op = {
        .dump           = nft_osf_dump,
        .type           = &nft_osf_type,
        .validate       = nft_osf_validate,
-       .reduce         = nft_osf_reduce,
 };
 
 static struct nft_expr_type nft_osf_type __read_mostly = {
index b0214418f75acd97f949b75f64382a76cc7fa865..973d56af03ff2a49c0a2bbaa35a12f8ed2ba7355 100644 (file)
@@ -250,31 +250,6 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_payload_reduce(struct nft_regs_track *track,
-                              const struct nft_expr *expr)
-{
-       const struct nft_payload *priv = nft_expr_priv(expr);
-       const struct nft_payload *payload;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       payload = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->base != payload->base ||
-           priv->offset != payload->offset ||
-           priv->len != payload->len) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-
 static bool nft_payload_offload_mask(struct nft_offload_reg *reg,
                                     u32 priv_len, u32 field_len)
 {
@@ -578,7 +553,6 @@ static const struct nft_expr_ops nft_payload_ops = {
        .eval           = nft_payload_eval,
        .init           = nft_payload_init,
        .dump           = nft_payload_dump,
-       .reduce         = nft_payload_reduce,
        .offload        = nft_payload_offload,
 };
 
@@ -588,7 +562,6 @@ const struct nft_expr_ops nft_payload_fast_ops = {
        .eval           = nft_payload_eval,
        .init           = nft_payload_init,
        .dump           = nft_payload_dump,
-       .reduce         = nft_payload_reduce,
        .offload        = nft_payload_offload,
 };
 
@@ -1012,32 +985,12 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_payload_set_reduce(struct nft_regs_track *track,
-                                  const struct nft_expr *expr)
-{
-       int i;
-
-       for (i = 0; i < NFT_REG32_NUM; i++) {
-               if (!track->regs[i].selector)
-                       continue;
-
-               if (track->regs[i].selector->ops != &nft_payload_ops &&
-                   track->regs[i].selector->ops != &nft_payload_fast_ops)
-                       continue;
-
-               __nft_reg_track_cancel(track, i);
-       }
-
-       return false;
-}
-
 static const struct nft_expr_ops nft_payload_set_ops = {
        .type           = &nft_payload_type,
        .size           = NFT_EXPR_SIZE(sizeof(struct nft_payload_set)),
        .eval           = nft_payload_set_eval,
        .init           = nft_payload_set_init,
        .dump           = nft_payload_set_dump,
-       .reduce         = nft_payload_set_reduce,
 };
 
 static const struct nft_expr_ops *
index 344fe311878fe0357a595262b82023a462d4f468..8eb13a02942ed3cdabd1588a0e0b1117f93e8ca5 100644 (file)
@@ -191,7 +191,6 @@ static const struct nft_expr_ops nft_queue_ops = {
        .init           = nft_queue_init,
        .dump           = nft_queue_dump,
        .validate       = nft_queue_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops nft_queue_sreg_ops = {
@@ -201,7 +200,6 @@ static const struct nft_expr_ops nft_queue_sreg_ops = {
        .init           = nft_queue_sreg_init,
        .dump           = nft_queue_sreg_dump,
        .validate       = nft_queue_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static const struct nft_expr_ops *
index cb6c0e04ff6755cfd36e21f31358c11814d96c31..bb3cf3d16e79bcb7bc2b73dafb6750fc68180fb0 100644 (file)
@@ -266,7 +266,6 @@ static const struct nft_expr_ops nft_quota_ops = {
        .destroy        = nft_quota_destroy,
        .clone          = nft_quota_clone,
        .dump           = nft_quota_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_quota_type __read_mostly = {
index ea382f7bbd78dbcedf4cd85ad4459cf1d06bf50e..cbb02644b836267c189b08471d42c8d21d059b86 100644 (file)
@@ -138,7 +138,6 @@ static const struct nft_expr_ops nft_range_ops = {
        .eval           = nft_range_eval,
        .init           = nft_range_init,
        .dump           = nft_range_dump,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 struct nft_expr_type nft_range_type __read_mostly = {
index 95eedad85c835c3eb10c38fe0e0369b82a200d0e..58ae802db8f52d5c5d644900446057fe9fd5920c 100644 (file)
@@ -146,7 +146,6 @@ static const struct nft_expr_ops nft_redir_ipv4_ops = {
        .destroy        = nft_redir_ipv4_destroy,
        .dump           = nft_redir_dump,
        .validate       = nft_redir_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_redir_ipv4_type __read_mostly = {
@@ -174,7 +173,6 @@ static const struct nft_expr_ops nft_redir_ipv6_ops = {
        .destroy        = nft_redir_ipv6_destroy,
        .dump           = nft_redir_dump,
        .validate       = nft_redir_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_redir_ipv6_type __read_mostly = {
@@ -203,7 +201,6 @@ static const struct nft_expr_ops nft_redir_inet_ops = {
        .destroy        = nft_redir_inet_destroy,
        .dump           = nft_redir_dump,
        .validate       = nft_redir_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_redir_inet_type __read_mostly = {
index 49020e67304ad721c6600a137e36b610f1d56236..dcae83ddc32e58cc47bf1c01b9bfaae3c3df7753 100644 (file)
@@ -79,7 +79,6 @@ static const struct nft_expr_ops nft_reject_inet_ops = {
        .init           = nft_reject_init,
        .dump           = nft_reject_dump,
        .validate       = nft_reject_inet_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_reject_inet_type __read_mostly = {
index 2558ce1505d9890981bcb24961ade0c71a8ce4b1..b53e81e4ca75dbb80c0450404b71e8f965fc9670 100644 (file)
@@ -158,7 +158,6 @@ static const struct nft_expr_ops nft_reject_netdev_ops = {
        .init           = nft_reject_init,
        .dump           = nft_reject_dump,
        .validate       = nft_reject_netdev_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_reject_netdev_type __read_mostly = {
index dc50b9a5bd6888fad40b354f301cefcf09b8ab0d..ad527f3596c03a84917aa2b406c1c5dc76bc7670 100644 (file)
@@ -195,7 +195,6 @@ static const struct nft_expr_ops nft_rt_get_ops = {
        .init           = nft_rt_get_init,
        .dump           = nft_rt_get_dump,
        .validate       = nft_rt_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 struct nft_expr_type nft_rt_type __read_mostly = {
index 36affbb697c2fd56d51fe89b709ce98a21442467..c55a1310226a43e8d52bf305ceb5448c8e94b874 100644 (file)
@@ -249,31 +249,6 @@ static int nft_socket_dump(struct sk_buff *skb,
        return 0;
 }
 
-static bool nft_socket_reduce(struct nft_regs_track *track,
-                             const struct nft_expr *expr)
-{
-       const struct nft_socket *priv = nft_expr_priv(expr);
-       const struct nft_socket *socket;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       socket = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->key != socket->key ||
-           priv->dreg != socket->dreg ||
-           priv->level != socket->level) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-
 static int nft_socket_validate(const struct nft_ctx *ctx,
                               const struct nft_expr *expr)
 {
@@ -296,7 +271,6 @@ static const struct nft_expr_ops nft_socket_ops = {
        .init           = nft_socket_init,
        .dump           = nft_socket_dump,
        .validate       = nft_socket_validate,
-       .reduce         = nft_socket_reduce,
 };
 
 static struct nft_expr_type nft_socket_type __read_mostly = {
index b71ef18b0e8c87e8ca32200e7aaaecee89ce922c..8e452a8749693f4e51aa3a31ee0ebfa8a04bb24a 100644 (file)
@@ -292,7 +292,6 @@ static const struct nft_expr_ops nft_synproxy_ops = {
        .dump           = nft_synproxy_dump,
        .type           = &nft_synproxy_type,
        .validate       = nft_synproxy_validate,
-       .reduce         = NFT_REDUCE_READONLY,
 };
 
 static struct nft_expr_type nft_synproxy_type __read_mostly = {
index 50481280abd2658b757829732eb51f5efd9fca95..f2101af8c867f4cf461c9bd9d43a74ee07033572 100644 (file)
@@ -331,7 +331,6 @@ static const struct nft_expr_ops nft_tproxy_ops = {
        .init           = nft_tproxy_init,
        .destroy        = nft_tproxy_destroy,
        .dump           = nft_tproxy_dump,
-       .reduce         = NFT_REDUCE_READONLY,
        .validate       = nft_tproxy_validate,
 };
 
index a12486ae089d6f38badd1b904f7670a3ef3bae80..f5cadba91417ae5cf3c666398eee493ae016204b 100644 (file)
@@ -124,31 +124,6 @@ nla_put_failure:
        return -1;
 }
 
-static bool nft_tunnel_get_reduce(struct nft_regs_track *track,
-                                 const struct nft_expr *expr)
-{
-       const struct nft_tunnel *priv = nft_expr_priv(expr);
-       const struct nft_tunnel *tunnel;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       tunnel = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->key != tunnel->key ||
-           priv->dreg != tunnel->dreg ||
-           priv->mode != tunnel->mode) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return false;
-}
-
 static struct nft_expr_type nft_tunnel_type;
 static const struct nft_expr_ops nft_tunnel_get_ops = {
        .type           = &nft_tunnel_type,
@@ -156,7 +131,6 @@ static const struct nft_expr_ops nft_tunnel_get_ops = {
        .eval           = nft_tunnel_get_eval,
        .init           = nft_tunnel_get_init,
        .dump           = nft_tunnel_get_dump,
-       .reduce         = nft_tunnel_get_reduce,
 };
 
 static struct nft_expr_type nft_tunnel_type __read_mostly = {
index 3210cfc966ab24d97d177301fd96d3a7ee730953..7ffe6a2690d13d6cfa066645da7a9ce1ba6ca0d6 100644 (file)
@@ -259,32 +259,6 @@ static int nft_xfrm_validate(const struct nft_ctx *ctx, const struct nft_expr *e
        return nft_chain_validate_hooks(ctx->chain, hooks);
 }
 
-static bool nft_xfrm_reduce(struct nft_regs_track *track,
-                           const struct nft_expr *expr)
-{
-       const struct nft_xfrm *priv = nft_expr_priv(expr);
-       const struct nft_xfrm *xfrm;
-
-       if (!nft_reg_track_cmp(track, expr, priv->dreg)) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       xfrm = nft_expr_priv(track->regs[priv->dreg].selector);
-       if (priv->key != xfrm->key ||
-           priv->dreg != xfrm->dreg ||
-           priv->dir != xfrm->dir ||
-           priv->spnum != xfrm->spnum) {
-               nft_reg_track_update(track, expr, priv->dreg, priv->len);
-               return false;
-       }
-
-       if (!track->regs[priv->dreg].bitwise)
-               return true;
-
-       return nft_expr_reduce_bitwise(track, expr);
-}
-
 static struct nft_expr_type nft_xfrm_type;
 static const struct nft_expr_ops nft_xfrm_get_ops = {
        .type           = &nft_xfrm_type,
@@ -293,7 +267,6 @@ static const struct nft_expr_ops nft_xfrm_get_ops = {
        .init           = nft_xfrm_get_init,
        .dump           = nft_xfrm_get_dump,
        .validate       = nft_xfrm_validate,
-       .reduce         = nft_xfrm_reduce,
 };
 
 static struct nft_expr_type nft_xfrm_type __read_mostly = {