History

netfilter: don't reset nf_trace in nf_reset()

Commit 130549fe ("netfilter: reset nf_trace in nf_reset") added code to reset nf_trace in nf_reset(). This is wrong and unnecessary. nf_reset() is used in the following cases: - when passing packets up the the socket layer, at which point we want to release all netfilter references that might keep modules pinned while the packet is queued. nf_trace doesn't matter anymore at this point. - when encapsulating or decapsulating IPsec packets. We want to continue tracing these packets after IPsec processing. - when passing packets through virtual network devices. Only devices on that encapsulate in IPv4/v6 matter since otherwise nf_trace is not used anymore. Its not entirely clear whether those packets should be traced after that, however we've always done that. - when passing packets through virtual network devices that make the packet cross network namespace boundaries. This is the only cases where we clearly want to reset nf_trace and is also what the original patch intended to fix. Add a new function nf_reset_trace() and use it in dev_forward_skb() to fix this properly.

Patrick McHardy committed 13 years ago

Commit 124dff01 parent 34e2ed32 files · +5 −0Browse files

Unified · Split

2 files
  1. include/linux/skbuff.h +4 −0
  2. net/core/dev.c +1 −0
include/linux/skbuff.h+4−0
@@ -2641,6 +2641,10 @@ static inline void nf_reset(struct sk_buff *skb) · 2640 unmodified lines
26412641 nf_bridge_put(skb->nf_bridge);
26422642 skb->nf_bridge = NULL;
26432643 #endif
2644+}
2645+
2646+static inline void nf_reset_trace(struct sk_buff *skb)
2647+{
26442648 #if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE)
26452649 skb->nf_trace = 0;
26462650 #endif
net/core/dev.c+1−0
@@ -1639,6 +1639,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) · 1638 unmodified lines
16391639 skb->mark = 0;
16401640 secpath_reset(skb);
16411641 nf_reset(skb);
1642+ nf_reset_trace(skb);
16421643 return netif_rx(skb);
16431644 }
16441645 EXPORT_SYMBOL_GPL(dev_forward_skb);