diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-11-03 10:56:43 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-11-03 11:53:00 +0100 |
commit | 08733a0cb7decce40bbbd0331a0449465f13c444 (patch) | |
tree | 1f206cbeae90d863b468156a5936ca5d265f8b3e /net/netfilter/nf_conntrack_core.c | |
parent | netfilter: merge nf_iterate() into nf_hook_slow() (diff) | |
download | linux-dev-08733a0cb7decce40bbbd0331a0449465f13c444.tar.xz linux-dev-08733a0cb7decce40bbbd0331a0449465f13c444.zip |
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 <pablo@netfilter.org>
Diffstat (limited to 'net/netfilter/nf_conntrack_core.c')
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index df2f5a3901df..de4b8a75f30b 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); } |