mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
ieee820154: 6lowpan: dispatch evaluation rework
This patch complete reworks the evaluation of 6lowpan dispatch value by introducing a receive handler mechanism for each dispatch value. A list of changes: - Doing uncompression on-the-fly when FRAG1 is received, this require some special handling for 802.15.4 lltype in generic 6lowpan branch for setting the payload length correct. - Fix dispatch mask for fragmentation. - Add IPv6 dispatch evaluation for FRAG1. - Add skb_unshare for dispatch which might manipulate the skb data buffer. Cc: Jukka Rissanen <[email protected]> Reviewed-by: Stefan Schmidt <[email protected]> Signed-off-by: Alexander Aring <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
This commit is contained in:
parent
f801cf4024
commit
72a5e6bb51
6 changed files with 288 additions and 111 deletions
|
|
@ -366,7 +366,18 @@ lowpan_header_decompress(struct sk_buff *skb, struct net_device *dev,
|
|||
return err;
|
||||
}
|
||||
|
||||
hdr.payload_len = htons(skb->len);
|
||||
switch (lowpan_priv(dev)->lltype) {
|
||||
case LOWPAN_LLTYPE_IEEE802154:
|
||||
if (lowpan_802154_cb(skb)->d_size)
|
||||
hdr.payload_len = htons(lowpan_802154_cb(skb)->d_size -
|
||||
sizeof(struct ipv6hdr));
|
||||
else
|
||||
hdr.payload_len = htons(skb->len);
|
||||
break;
|
||||
default:
|
||||
hdr.payload_len = htons(skb->len);
|
||||
break;
|
||||
}
|
||||
|
||||
pr_debug("skb headroom size = %d, data length = %d\n",
|
||||
skb_headroom(skb), skb->len);
|
||||
|
|
|
|||
|
|
@ -71,7 +71,18 @@ static int udp_uncompress(struct sk_buff *skb, size_t needed)
|
|||
* here, we obtain the hint from the remaining size of the
|
||||
* frame
|
||||
*/
|
||||
uh.len = htons(skb->len + sizeof(struct udphdr));
|
||||
switch (lowpan_priv(skb->dev)->lltype) {
|
||||
case LOWPAN_LLTYPE_IEEE802154:
|
||||
if (lowpan_802154_cb(skb)->d_size)
|
||||
uh.len = htons(lowpan_802154_cb(skb)->d_size -
|
||||
sizeof(struct ipv6hdr));
|
||||
else
|
||||
uh.len = htons(skb->len + sizeof(struct udphdr));
|
||||
break;
|
||||
default:
|
||||
uh.len = htons(skb->len + sizeof(struct udphdr));
|
||||
break;
|
||||
}
|
||||
pr_debug("uncompressed UDP length: src = %d", ntohs(uh.len));
|
||||
|
||||
/* replace the compressed UDP head by the uncompressed UDP
|
||||
|
|
|
|||
Loading…
Reference in a new issue