mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
netfilter: nf_tables: remove register tracking infrastructure
[ Upstream commit6b94d081f8] This facility was disabled in commit9e539c5b6d("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> Stable-dep-of:d07955dd34("netfilter: nft_fib: reject fib expression on the netdev egress hook") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
363e37bebb
commit
7cd3fee7b3
@@ -123,17 +123,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
|
||||
@@ -420,8 +409,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;
|
||||
|
||||
@@ -933,7 +920,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
|
||||
@@ -967,8 +953,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,
|
||||
@@ -1848,20 +1832,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 */
|
||||
|
||||
@@ -36,6 +36,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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -104,7 +104,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,
|
||||
@@ -151,24 +150,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)
|
||||
{
|
||||
@@ -193,7 +174,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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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] = {
|
||||
|
||||
@@ -157,7 +157,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 = {
|
||||
@@ -167,7 +166,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 *
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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] = {
|
||||
|
||||
@@ -226,7 +226,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 = {
|
||||
@@ -236,7 +235,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 *
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -754,58 +754,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
|
||||
*/
|
||||
@@ -9638,16 +9586,9 @@ void nf_tables_trans_destroy_flush_work(void)
|
||||
}
|
||||
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;
|
||||
@@ -9684,15 +9625,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;
|
||||
|
||||
|
||||
@@ -402,61 +402,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,
|
||||
};
|
||||
|
||||
@@ -559,48 +510,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,
|
||||
};
|
||||
|
||||
@@ -637,22 +552,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);
|
||||
|
||||
@@ -177,23 +177,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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -794,14 +794,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[])
|
||||
@@ -844,7 +836,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) {
|
||||
@@ -933,7 +924,6 @@ nft_target_select_ops(const struct nft_ctx *ctx,
|
||||
ops->destroy = nft_target_destroy;
|
||||
ops->dump = nft_target_dump;
|
||||
ops->data = target;
|
||||
ops->reduce = NFT_REDUCE_READONLY;
|
||||
|
||||
if (family == NFPROTO_BRIDGE) {
|
||||
ops->eval = nft_target_eval_bridge;
|
||||
|
||||
@@ -247,7 +247,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 = {
|
||||
|
||||
@@ -301,7 +301,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,
|
||||
};
|
||||
|
||||
@@ -679,29 +679,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)
|
||||
{
|
||||
@@ -736,27 +713,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_RETPOLINE
|
||||
static const struct nft_expr_ops nft_ct_get_fast_ops = {
|
||||
.type = &nft_ct_type,
|
||||
@@ -765,7 +723,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
|
||||
|
||||
@@ -776,7 +733,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
|
||||
@@ -787,7 +743,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
|
||||
|
||||
@@ -857,7 +812,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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -430,7 +430,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 = {
|
||||
|
||||
@@ -701,40 +701,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 = {
|
||||
@@ -743,7 +715,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 = {
|
||||
@@ -752,7 +723,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 = {
|
||||
@@ -761,7 +731,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 = {
|
||||
@@ -770,7 +739,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 = {
|
||||
@@ -779,7 +747,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,
|
||||
};
|
||||
|
||||
static const struct nft_expr_ops nft_exthdr_dccp_ops = {
|
||||
@@ -788,7 +755,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,
|
||||
};
|
||||
|
||||
static const struct nft_expr_ops *
|
||||
|
||||
@@ -168,47 +168,5 @@ 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_AUTHOR("Florian Westphal <fw@strlen.de>");
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -481,7 +481,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 = {
|
||||
|
||||
@@ -228,7 +228,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 = {
|
||||
@@ -238,7 +237,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,
|
||||
};
|
||||
|
||||
@@ -165,16 +165,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)
|
||||
{
|
||||
@@ -195,30 +185,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,
|
||||
@@ -226,7 +192,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 = {
|
||||
@@ -235,7 +200,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 *
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -232,17 +232,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)),
|
||||
@@ -253,7 +242,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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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 {
|
||||
@@ -246,7 +245,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 *
|
||||
|
||||
@@ -136,30 +136,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,
|
||||
@@ -168,7 +144,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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -1008,32 +981,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 *
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -265,7 +265,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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -290,7 +290,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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -258,32 +258,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,
|
||||
@@ -292,7 +266,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 = {
|
||||
|
||||
Reference in New Issue
Block a user