mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-07 13:13:57 +08:00
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: Alexander Aring <alex.aring@gmail.com> Acked-by: Jukka Rissanen <jukka.rissanen@linux.intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
71cd2aa53d
commit
cefdb801c8
@ -314,15 +314,17 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
|
|||||||
if (!netif_running(dev))
|
if (!netif_running(dev))
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
if (dev->type != ARPHRD_6LOWPAN)
|
if (dev->type != ARPHRD_6LOWPAN || !skb->len)
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
|
skb_reset_network_header(skb);
|
||||||
|
|
||||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
/* check that it's our buffer */
|
/* 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
|
/* Copy the packet so that the IPv6 header is
|
||||||
* properly aligned.
|
* 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->protocol = htons(ETH_P_IPV6);
|
||||||
local_skb->pkt_type = PACKET_HOST;
|
local_skb->pkt_type = PACKET_HOST;
|
||||||
|
|
||||||
skb_reset_network_header(local_skb);
|
|
||||||
skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
|
skb_set_transport_header(local_skb, sizeof(struct ipv6hdr));
|
||||||
|
|
||||||
if (give_skb_to_upper(local_skb, dev) != NET_RX_SUCCESS) {
|
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(local_skb);
|
||||||
consume_skb(skb);
|
consume_skb(skb);
|
||||||
} else {
|
} else if (lowpan_is_iphc(*skb_network_header(skb))) {
|
||||||
switch (skb->data[0] & 0xe0) {
|
|
||||||
case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */
|
|
||||||
local_skb = skb_clone(skb, GFP_ATOMIC);
|
local_skb = skb_clone(skb, GFP_ATOMIC);
|
||||||
if (!local_skb)
|
if (!local_skb)
|
||||||
goto drop;
|
goto drop;
|
||||||
@ -375,10 +374,8 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
|
|||||||
|
|
||||||
consume_skb(local_skb);
|
consume_skb(local_skb);
|
||||||
consume_skb(skb);
|
consume_skb(skb);
|
||||||
break;
|
} else {
|
||||||
default:
|
goto drop;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NET_RX_SUCCESS;
|
return NET_RX_SUCCESS;
|
||||||
|
Loading…
Reference in New Issue
Block a user