On 5/9/17 3:27 AM, gfree.w...@vip.163.com wrote: > diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c > index ceda586..db88249 100644 > --- a/drivers/net/vrf.c > +++ b/drivers/net/vrf.c > @@ -989,6 +989,7 @@ static u32 vrf_fib_table(const struct net_device *dev) > > static int vrf_rcv_finish(struct net *net, struct sock *sk, struct sk_buff > *skb) > { > + kfree_skb(skb); > return 0; > } > > @@ -998,7 +999,7 @@ static struct sk_buff *vrf_rcv_nfhook(u8 pf, unsigned int > hook, > { > struct net *net = dev_net(dev); > > - if (NF_HOOK(pf, hook, net, NULL, skb, dev, NULL, vrf_rcv_finish) < 0) > + if (nf_hook(pf, hook, net, NULL, skb, dev, NULL, vrf_rcv_finish) != 1) > skb = NULL; /* kfree_skb(skb) handled by nf code */ > > return skb; >
I'm clearly misunderstanding something ... With the current code: - nf_hook returns 1, NF_HOOK invokes vrf_rcv_finish as the okfn, it returns 0, skb passes on. - nf_hook returns 0, vrf_rcv_finish has been called by the nf_hook tree, vrf_rcv_finish returns 0, skb passes on - nf_hook returns < 0, vrf_rcv_finish is not called, skb is freed by netfilter code, vrf_rcv_nfhook returns NULL What am I missing? With the above, if nf_hook returns 1, vrf_rcv_finish is not called.