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

Commit cefdb801 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann
Browse files

bluetooth: 6lowpan: use lowpan dispatch helpers



This patch adds a check if the dataroom of skb contains a dispatch value
by checking if skb->len != 0. This patch also change the dispatch
evaluation by the recently introduced helpers for checking the common
6LoWPAN dispatch values for IPv6 and IPHC header.

There was also a forgotten else branch which should drop the packet if
no matching dispatch is available.

Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Acked-by: default avatarJukka Rissanen <jukka.rissanen@linux.intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 71cd2aa5
Loading
Loading
Loading
Loading
+27 −30
Original line number Diff line number Diff line
@@ -314,15 +314,17 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
	if (!netif_running(dev))
		goto drop;

	if (dev->type != ARPHRD_6LOWPAN)
	if (dev->type != ARPHRD_6LOWPAN || !skb->len)
		goto drop;

	skb_reset_network_header(skb);

	skb = skb_share_check(skb, GFP_ATOMIC);
	if (!skb)
		goto drop;

	/* check that it's our buffer */
	if (skb->data[0] == LOWPAN_DISPATCH_IPV6) {
	if (lowpan_is_ipv6(*skb_network_header(skb))) {
		/* Copy the packet so that the IPv6 header is
		 * properly aligned.
		 */
@@ -334,7 +336,6 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
		local_skb->protocol = htons(ETH_P_IPV6);
		local_skb->pkt_type = PACKET_HOST;

		skb_reset_network_header(local_skb);
		skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));

		if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) {
@@ -347,9 +348,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,

		consume_skb(local_skb);
		consume_skb(skb);
	} else {
		switch (skb->data[0] & 0xe0) {
		case LOWPAN_DISPATCH_IPHC:	/* ipv6 datagram */
	} else if (lowpan_is_iphc(*skb_network_header(skb))) {
		local_skb = skb_clone(skb, GFP_ATOMIC);
		if (!local_skb)
			goto drop;
@@ -375,10 +374,8 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,

		consume_skb(local_skb);
		consume_skb(skb);
			break;
		default:
			break;
		}
	} else {
		goto drop;
	}

	return NET_RX_SUCCESS;