Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a437d274 authored by Alan Ott's avatar Alan Ott Committed by David S. Miller
Browse files

6lowpan: Make a copy of skb's delivered to 6lowpan



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: default avatarAlan Ott <alan@signal11.us>
Signed-off-by: default avatarDavid S. Miller <davem@tempietto.lan>
parent 1bed966c
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -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,
static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
	struct packet_type *pt, struct net_device *orig_dev)
	struct packet_type *pt, struct net_device *orig_dev)
{
{
	struct sk_buff *local_skb;

	if (!netif_running(dev))
	if (!netif_running(dev))
		goto drop;
		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_IPHC:	/* ipv6 datagram */
	case LOWPAN_DISPATCH_FRAG1:	/* first fragment header */
	case LOWPAN_DISPATCH_FRAG1:	/* first fragment header */
	case LOWPAN_DISPATCH_FRAGN:	/* next fragments headers */
	case LOWPAN_DISPATCH_FRAGN:	/* next fragments headers */
		lowpan_process_data(skb);
		local_skb = skb_clone(skb, GFP_ATOMIC);
		if (!local_skb)
			goto drop;
		lowpan_process_data(local_skb);

		kfree_skb(skb);
		break;
		break;
	default:
	default:
		break;
		break;