提交 8715fb36 编写于 作者: D David S. Miller

Merge branch '6lowpan'

Alexander Aring says:

====================
This patch series cleanup the 6LoWPAN header creation and extend the use
of skb_*_header functions.

Patch 2/4 fix issues of parsing the mac header. The ieee802.15.4 header
has a dynamic size which depends on frame control bits. This patch replaces the
static mac header len calculation with a dynamic one.
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -654,7 +654,9 @@ static int lowpan_header_create(struct sk_buff *skb, ...@@ -654,7 +654,9 @@ static int lowpan_header_create(struct sk_buff *skb,
head[1] = iphc1; head[1] = iphc1;
skb_pull(skb, sizeof(struct ipv6hdr)); skb_pull(skb, sizeof(struct ipv6hdr));
skb_reset_transport_header(skb);
memcpy(skb_push(skb, hc06_ptr - head), head, hc06_ptr - head); memcpy(skb_push(skb, hc06_ptr - head), head, hc06_ptr - head);
skb_reset_network_header(skb);
lowpan_raw_dump_table(__func__, "raw skb data dump", skb->data, lowpan_raw_dump_table(__func__, "raw skb data dump", skb->data,
skb->len); skb->len);
...@@ -737,7 +739,6 @@ static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr) ...@@ -737,7 +739,6 @@ static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr)
return -ENOMEM; return -ENOMEM;
skb_push(new, sizeof(struct ipv6hdr)); skb_push(new, sizeof(struct ipv6hdr));
skb_reset_network_header(new);
skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr)); skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
new->protocol = htons(ETH_P_IPV6); new->protocol = htons(ETH_P_IPV6);
...@@ -1059,7 +1060,6 @@ lowpan_process_data(struct sk_buff *skb) ...@@ -1059,7 +1060,6 @@ lowpan_process_data(struct sk_buff *skb)
skb = new; skb = new;
skb_push(skb, sizeof(struct udphdr)); skb_push(skb, sizeof(struct udphdr));
skb_reset_transport_header(skb);
skb_copy_to_linear_data(skb, &uh, sizeof(struct udphdr)); skb_copy_to_linear_data(skb, &uh, sizeof(struct udphdr));
lowpan_raw_dump_table(__func__, "raw UDP header dump", lowpan_raw_dump_table(__func__, "raw UDP header dump",
...@@ -1102,17 +1102,6 @@ static int lowpan_set_address(struct net_device *dev, void *p) ...@@ -1102,17 +1102,6 @@ static int lowpan_set_address(struct net_device *dev, void *p)
return 0; return 0;
} }
static int lowpan_get_mac_header_length(struct sk_buff *skb)
{
/*
* Currently long addressing mode is supported only, so the overall
* header size is 21:
* FC SeqNum DPAN DA SA Sec
* 2 + 1 + 2 + 8 + 8 + 0 = 21
*/
return 21;
}
static int static int
lowpan_fragment_xmit(struct sk_buff *skb, u8 *head, lowpan_fragment_xmit(struct sk_buff *skb, u8 *head,
int mlen, int plen, int offset, int type) int mlen, int plen, int offset, int type)
...@@ -1133,12 +1122,15 @@ lowpan_fragment_xmit(struct sk_buff *skb, u8 *head, ...@@ -1133,12 +1122,15 @@ lowpan_fragment_xmit(struct sk_buff *skb, u8 *head,
frag->priority = skb->priority; frag->priority = skb->priority;
/* copy header, MFR and payload */ /* copy header, MFR and payload */
memcpy(skb_put(frag, mlen), skb->data, mlen); skb_put(frag, mlen);
memcpy(skb_put(frag, hlen), head, hlen); skb_copy_to_linear_data(frag, skb_mac_header(skb), mlen);
skb_put(frag, hlen);
skb_copy_to_linear_data_offset(frag, mlen, head, hlen);
if (plen) skb_put(frag, plen);
skb_copy_from_linear_data_offset(skb, offset + mlen, skb_copy_to_linear_data_offset(frag, mlen + hlen,
skb_put(frag, plen), plen); skb_network_header(skb) + offset, plen);
lowpan_raw_dump_table(__func__, " raw fragment dump", frag->data, lowpan_raw_dump_table(__func__, " raw fragment dump", frag->data,
frag->len); frag->len);
...@@ -1152,7 +1144,7 @@ lowpan_skb_fragmentation(struct sk_buff *skb, struct net_device *dev) ...@@ -1152,7 +1144,7 @@ lowpan_skb_fragmentation(struct sk_buff *skb, struct net_device *dev)
int err, header_length, payload_length, tag, offset = 0; int err, header_length, payload_length, tag, offset = 0;
u8 head[5]; u8 head[5];
header_length = lowpan_get_mac_header_length(skb); header_length = skb->mac_len;
payload_length = skb->len - header_length; payload_length = skb->len - header_length;
tag = lowpan_dev_info(dev)->fragment_tag++; tag = lowpan_dev_info(dev)->fragment_tag++;
...@@ -1323,8 +1315,6 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -1323,8 +1315,6 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
/* Pull off the 1-byte of 6lowpan header. */ /* Pull off the 1-byte of 6lowpan header. */
skb_pull(local_skb, 1); 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); lowpan_give_skb_to_devices(local_skb);
......
...@@ -208,6 +208,8 @@ static int mac802154_header_create(struct sk_buff *skb, ...@@ -208,6 +208,8 @@ static int mac802154_header_create(struct sk_buff *skb,
head[1] = fc >> 8; head[1] = fc >> 8;
memcpy(skb_push(skb, pos), head, pos); memcpy(skb_push(skb, pos), head, pos);
skb_reset_mac_header(skb);
skb->mac_len = pos;
return pos; return pos;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册