|
@@ -36,7 +36,7 @@ lowpan_addr_info *lowpan_skb_priv(const struct sk_buff *skb)
|
|
sizeof(struct lowpan_addr_info));
|
|
sizeof(struct lowpan_addr_info));
|
|
}
|
|
}
|
|
|
|
|
|
-int lowpan_header_create(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
+int lowpan_header_create(struct sk_buff *skb, struct net_device *ldev,
|
|
unsigned short type, const void *_daddr,
|
|
unsigned short type, const void *_daddr,
|
|
const void *_saddr, unsigned int len)
|
|
const void *_saddr, unsigned int len)
|
|
{
|
|
{
|
|
@@ -51,7 +51,7 @@ int lowpan_header_create(struct sk_buff *skb, struct net_device *dev,
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
if (!saddr)
|
|
if (!saddr)
|
|
- saddr = dev->dev_addr;
|
|
|
|
|
|
+ saddr = ldev->dev_addr;
|
|
|
|
|
|
raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8);
|
|
raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8);
|
|
raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8);
|
|
raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8);
|
|
@@ -73,22 +73,21 @@ static struct sk_buff*
|
|
lowpan_alloc_frag(struct sk_buff *skb, int size,
|
|
lowpan_alloc_frag(struct sk_buff *skb, int size,
|
|
const struct ieee802154_hdr *master_hdr)
|
|
const struct ieee802154_hdr *master_hdr)
|
|
{
|
|
{
|
|
- struct net_device *real_dev = lowpan_dev_info(skb->dev)->real_dev;
|
|
|
|
|
|
+ struct net_device *wdev = lowpan_dev_info(skb->dev)->wdev;
|
|
struct sk_buff *frag;
|
|
struct sk_buff *frag;
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
- frag = alloc_skb(real_dev->hard_header_len +
|
|
|
|
- real_dev->needed_tailroom + size,
|
|
|
|
|
|
+ frag = alloc_skb(wdev->hard_header_len + wdev->needed_tailroom + size,
|
|
GFP_ATOMIC);
|
|
GFP_ATOMIC);
|
|
|
|
|
|
if (likely(frag)) {
|
|
if (likely(frag)) {
|
|
- frag->dev = real_dev;
|
|
|
|
|
|
+ frag->dev = wdev;
|
|
frag->priority = skb->priority;
|
|
frag->priority = skb->priority;
|
|
- skb_reserve(frag, real_dev->hard_header_len);
|
|
|
|
|
|
+ skb_reserve(frag, wdev->hard_header_len);
|
|
skb_reset_network_header(frag);
|
|
skb_reset_network_header(frag);
|
|
*mac_cb(frag) = *mac_cb(skb);
|
|
*mac_cb(frag) = *mac_cb(skb);
|
|
|
|
|
|
- rc = dev_hard_header(frag, real_dev, 0, &master_hdr->dest,
|
|
|
|
|
|
+ rc = dev_hard_header(frag, wdev, 0, &master_hdr->dest,
|
|
&master_hdr->source, size);
|
|
&master_hdr->source, size);
|
|
if (rc < 0) {
|
|
if (rc < 0) {
|
|
kfree_skb(frag);
|
|
kfree_skb(frag);
|
|
@@ -123,7 +122,7 @@ lowpan_xmit_fragment(struct sk_buff *skb, const struct ieee802154_hdr *wpan_hdr,
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
static int
|
|
-lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
+lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *ldev,
|
|
const struct ieee802154_hdr *wpan_hdr)
|
|
const struct ieee802154_hdr *wpan_hdr)
|
|
{
|
|
{
|
|
u16 dgram_size, dgram_offset;
|
|
u16 dgram_size, dgram_offset;
|
|
@@ -134,8 +133,8 @@ lowpan_xmit_fragmented(struct sk_buff *skb, struct net_device *dev,
|
|
|
|
|
|
dgram_size = lowpan_uncompress_size(skb, &dgram_offset) -
|
|
dgram_size = lowpan_uncompress_size(skb, &dgram_offset) -
|
|
skb->mac_len;
|
|
skb->mac_len;
|
|
- frag_tag = htons(lowpan_dev_info(dev)->fragment_tag);
|
|
|
|
- lowpan_dev_info(dev)->fragment_tag++;
|
|
|
|
|
|
+ frag_tag = htons(lowpan_dev_info(ldev)->fragment_tag);
|
|
|
|
+ lowpan_dev_info(ldev)->fragment_tag++;
|
|
|
|
|
|
frag_hdr[0] = LOWPAN_DISPATCH_FRAG1 | ((dgram_size >> 8) & 0x07);
|
|
frag_hdr[0] = LOWPAN_DISPATCH_FRAG1 | ((dgram_size >> 8) & 0x07);
|
|
frag_hdr[1] = dgram_size & 0xff;
|
|
frag_hdr[1] = dgram_size & 0xff;
|
|
@@ -188,9 +187,9 @@ err:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
-static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
+static int lowpan_header(struct sk_buff *skb, struct net_device *ldev)
|
|
{
|
|
{
|
|
- struct wpan_dev *wpan_dev = lowpan_dev_info(dev)->real_dev->ieee802154_ptr;
|
|
|
|
|
|
+ struct wpan_dev *wpan_dev = lowpan_dev_info(ldev)->wdev->ieee802154_ptr;
|
|
struct ieee802154_addr sa, da;
|
|
struct ieee802154_addr sa, da;
|
|
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
|
|
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
|
|
struct lowpan_addr_info info;
|
|
struct lowpan_addr_info info;
|
|
@@ -202,7 +201,7 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
|
|
daddr = &info.daddr.u.extended_addr;
|
|
daddr = &info.daddr.u.extended_addr;
|
|
saddr = &info.saddr.u.extended_addr;
|
|
saddr = &info.saddr.u.extended_addr;
|
|
|
|
|
|
- lowpan_header_compress(skb, dev, ETH_P_IPV6, daddr, saddr, skb->len);
|
|
|
|
|
|
+ lowpan_header_compress(skb, ldev, ETH_P_IPV6, daddr, saddr, skb->len);
|
|
|
|
|
|
cb->type = IEEE802154_FC_TYPE_DATA;
|
|
cb->type = IEEE802154_FC_TYPE_DATA;
|
|
|
|
|
|
@@ -227,11 +226,11 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
|
|
cb->ackreq = wpan_dev->ackreq;
|
|
cb->ackreq = wpan_dev->ackreq;
|
|
}
|
|
}
|
|
|
|
|
|
- return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
|
|
|
|
- ETH_P_IPV6, (void *)&da, (void *)&sa, 0);
|
|
|
|
|
|
+ return dev_hard_header(skb, lowpan_dev_info(ldev)->wdev, ETH_P_IPV6,
|
|
|
|
+ (void *)&da, (void *)&sa, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
+netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *ldev)
|
|
{
|
|
{
|
|
struct ieee802154_hdr wpan_hdr;
|
|
struct ieee802154_hdr wpan_hdr;
|
|
int max_single, ret;
|
|
int max_single, ret;
|
|
@@ -245,7 +244,7 @@ netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
if (!skb)
|
|
if (!skb)
|
|
return NET_XMIT_DROP;
|
|
return NET_XMIT_DROP;
|
|
|
|
|
|
- ret = lowpan_header(skb, dev);
|
|
|
|
|
|
+ ret = lowpan_header(skb, ldev);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
kfree_skb(skb);
|
|
kfree_skb(skb);
|
|
return NET_XMIT_DROP;
|
|
return NET_XMIT_DROP;
|
|
@@ -259,13 +258,13 @@ netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
max_single = ieee802154_max_payload(&wpan_hdr);
|
|
max_single = ieee802154_max_payload(&wpan_hdr);
|
|
|
|
|
|
if (skb_tail_pointer(skb) - skb_network_header(skb) <= max_single) {
|
|
if (skb_tail_pointer(skb) - skb_network_header(skb) <= max_single) {
|
|
- skb->dev = lowpan_dev_info(dev)->real_dev;
|
|
|
|
|
|
+ skb->dev = lowpan_dev_info(ldev)->wdev;
|
|
return dev_queue_xmit(skb);
|
|
return dev_queue_xmit(skb);
|
|
} else {
|
|
} else {
|
|
netdev_tx_t rc;
|
|
netdev_tx_t rc;
|
|
|
|
|
|
pr_debug("frame is too big, fragmentation is needed\n");
|
|
pr_debug("frame is too big, fragmentation is needed\n");
|
|
- rc = lowpan_xmit_fragmented(skb, dev, &wpan_hdr);
|
|
|
|
|
|
+ rc = lowpan_xmit_fragmented(skb, ldev, &wpan_hdr);
|
|
|
|
|
|
return rc < 0 ? NET_XMIT_DROP : rc;
|
|
return rc < 0 ? NET_XMIT_DROP : rc;
|
|
}
|
|
}
|