From: Pablo Neira Ayuso Date: Thu, 3 Nov 2016 09:56:43 +0000 (+0100) Subject: netfilter: handle NF_REPEAT from nf_conntrack_in() X-Git-Tag: v4.14-rc1~1973^2~281^2~29 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08733a0cb7decce40bbbd0331a0449465f13c444;p=platform%2Fkernel%2Flinux-rpi.git netfilter: handle NF_REPEAT from nf_conntrack_in() NF_REPEAT is only needed from nf_conntrack_in() under a very specific case required by the TCP protocol tracker, we can handle this case without returning to the core hook path. Handling of NF_REPEAT from the nf_reinject() is left untouched. Signed-off-by: Pablo Neira Ayuso --- diff --git a/net/netfilter/core.c b/net/netfilter/core.c index bd9272e..de30e08d 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c @@ -322,8 +322,6 @@ int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state, if (ret == 0) ret = -EPERM; return ret; - case NF_REPEAT: - continue; case NF_QUEUE: ret = nf_queue(skb, state, &entry, verdict); if (ret == 1 && entry) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index df2f5a3..de4b8a7 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -1305,7 +1305,7 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum, if (skb->nfct) goto out; } - +repeat: ct = resolve_normal_ct(net, tmpl, skb, dataoff, pf, protonum, l3proto, l4proto, &set_reply, &ctinfo); if (!ct) { @@ -1345,11 +1345,12 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum, nf_conntrack_event_cache(IPCT_REPLY, ct); out: if (tmpl) { - /* Special case: we have to repeat this hook, assign the - * template again to this packet. We assume that this packet - * has no conntrack assigned. This is used by nf_ct_tcp. */ + /* Special case: TCP tracker reports an attempt to reopen a + * closed/aborted connection. We have to go back and create a + * fresh conntrack. + */ if (ret == NF_REPEAT) - skb->nfct = (struct nf_conntrack *)tmpl; + goto repeat; else nf_ct_put(tmpl); } diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c index 31045ef..9b8a028 100644 --- a/net/openvswitch/conntrack.c +++ b/net/openvswitch/conntrack.c @@ -725,12 +725,8 @@ static int __ovs_ct_lookup(struct net *net, struct sw_flow_key *key, skb->nfctinfo = IP_CT_NEW; } - /* Repeat if requested, see nf_iterate(). */ - do { - err = nf_conntrack_in(net, info->family, - NF_INET_PRE_ROUTING, skb); - } while (err == NF_REPEAT); - + err = nf_conntrack_in(net, info->family, + NF_INET_PRE_ROUTING, skb); if (err != NF_ACCEPT) return -ENOENT;