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

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

6lowpan: Handle uncompressed IPv6 packets over 6LoWPAN



Handle the reception of uncompressed packets (dispatch type = IPv6).

Signed-off-by: default avatarAlan Ott <alan@signal11.us>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0c446212
Loading
Loading
Loading
Loading
+32 −9
Original line number Diff line number Diff line
@@ -1147,6 +1147,28 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
		goto drop;

	/* check that it's our buffer */
	if (skb->data[0] == LOWPAN_DISPATCH_IPV6) {
		/* Copy the packet so that the IPv6 header is
		 * properly aligned.
		 */
		local_skb = skb_copy_expand(skb, NET_SKB_PAD - 1,
					    skb_tailroom(skb), GFP_ATOMIC);
		if (!local_skb)
			goto drop;

		local_skb->protocol = htons(ETH_P_IPV6);
		local_skb->pkt_type = PACKET_HOST;

		/* Pull off the 1-byte of 6lowpan header. */
		skb_pull(local_skb, 1);
		skb_reset_network_header(local_skb);
		skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));

		lowpan_give_skb_to_devices(local_skb);

		kfree_skb(local_skb);
		kfree_skb(skb);
	} else {
		switch (skb->data[0] & 0xe0) {
		case LOWPAN_DISPATCH_IPHC:	/* ipv6 datagram */
		case LOWPAN_DISPATCH_FRAG1:	/* first fragment header */
@@ -1161,6 +1183,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
		default:
			break;
		}
	}

	return NET_RX_SUCCESS;