From: wenxu <we...@ucloud.cn> Currently add nat mangle action with comparing invert and ori tuple. It is better to check IPS_NAT_MASK flags first to avoid non necessary memcmp for non-NAT conntrack.
Signed-off-by: wenxu <we...@ucloud.cn> --- net/sched/act_ct.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c index c50a86a..d621152 100644 --- a/net/sched/act_ct.c +++ b/net/sched/act_ct.c @@ -198,18 +198,21 @@ static int tcf_ct_flow_table_add_action_nat(struct net *net, struct flow_action *action) { const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; + bool nat = ct->status & IPS_NAT_MASK; struct nf_conntrack_tuple target; nf_ct_invert_tuple(&target, &ct->tuplehash[!dir].tuple); switch (tuple->src.l3num) { case NFPROTO_IPV4: - tcf_ct_flow_table_add_action_nat_ipv4(tuple, target, - action); + if (nat) + tcf_ct_flow_table_add_action_nat_ipv4(tuple, target, + action); break; case NFPROTO_IPV6: - tcf_ct_flow_table_add_action_nat_ipv6(tuple, target, - action); + if (nat) + tcf_ct_flow_table_add_action_nat_ipv6(tuple, target, + action); break; default: return -EOPNOTSUPP; @@ -217,10 +220,14 @@ static int tcf_ct_flow_table_add_action_nat(struct net *net, switch (nf_ct_protonum(ct)) { case IPPROTO_TCP: - tcf_ct_flow_table_add_action_nat_tcp(tuple, target, action); + if (nat) + tcf_ct_flow_table_add_action_nat_tcp(tuple, target, + action); break; case IPPROTO_UDP: - tcf_ct_flow_table_add_action_nat_udp(tuple, target, action); + if (nat) + tcf_ct_flow_table_add_action_nat_udp(tuple, target, + action); break; default: return -EOPNOTSUPP; -- 1.8.3.1