Re: [PATCH v2 1/2] 6lowpan: Make a copy of skb's delivered to 6lowpan
From: Eric Dumazet <hidden>
Date: 2012-08-31 07:01:31
Also in:
lkml
On Wed, 2012-08-29 at 22:39 -0400, Alan Ott wrote:
quoted hunk ↗ jump to hunk
Since lowpan_process_data() modifies the skb (by calling skb_pull()), we need our own copy so that it doesn't affect the data received by other protcols (in this case, af_ieee802154). Signed-off-by: Alan Ott <redacted> --- net/ieee802154/6lowpan.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 6a09522..ce33b02 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c@@ -1133,6 +1133,8 @@ static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[]) static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { + struct sk_buff *local_skb; + if (!netif_running(dev)) goto drop;@@ -1144,7 +1146,12 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */ case LOWPAN_DISPATCH_FRAG1: /* first fragment header */ case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */ - lowpan_process_data(skb); + local_skb = skb_copy(skb, GFP_ATOMIC); + if (!local_skb) + goto drop; + lowpan_process_data(local_skb); + + kfree_skb(skb); break; default: break;
Its not clear to me why skb_copy() is needed here.
From patch description, I would say skb_clone() would be enough (and
faster) ?