]> git.karo-electronics.de Git - linux-beck.git/blobdiff - net/mac802154/iface.c
Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetoot...
[linux-beck.git] / net / mac802154 / iface.c
index 8afe26d729710021c3707d815bdd2bebb994fc96..7079cd32a7ad201265cf730027dda07254e622aa 100644 (file)
@@ -461,7 +461,7 @@ static int mac802154_header_create(struct sk_buff *skb,
 
        hdr.dest.pan_id = wpan_dev->pan_id;
        hdr.dest.mode = IEEE802154_ADDR_LONG;
-       memcpy(&hdr.dest.extended_addr, daddr, IEEE802154_EXTENDED_ADDR_LEN);
+       ieee802154_be64_to_le64(&hdr.dest.extended_addr, daddr);
 
        hdr.source.pan_id = hdr.dest.pan_id;
        hdr.source.mode = IEEE802154_ADDR_LONG;
@@ -469,8 +469,7 @@ static int mac802154_header_create(struct sk_buff *skb,
        if (!saddr)
                hdr.source.extended_addr = wpan_dev->extended_addr;
        else
-               memcpy(&hdr.source.extended_addr, saddr,
-                      IEEE802154_EXTENDED_ADDR_LEN);
+               ieee802154_be64_to_le64(&hdr.source.extended_addr, saddr);
 
        hlen = ieee802154_hdr_push(skb, &hdr);
        if (hlen < 0)
@@ -496,8 +495,7 @@ mac802154_header_parse(const struct sk_buff *skb, unsigned char *haddr)
        }
 
        if (hdr.source.mode == IEEE802154_ADDR_LONG) {
-               memcpy(haddr, &hdr.source.extended_addr,
-                      IEEE802154_EXTENDED_ADDR_LEN);
+               ieee802154_le64_to_be64(haddr, &hdr.source.extended_addr);
                return IEEE802154_EXTENDED_ADDR_LEN;
        }
 
@@ -537,9 +535,29 @@ static void ieee802154_if_setup(struct net_device *dev)
        dev->addr_len           = IEEE802154_EXTENDED_ADDR_LEN;
        memset(dev->broadcast, 0xff, IEEE802154_EXTENDED_ADDR_LEN);
 
-       dev->hard_header_len    = MAC802154_FRAME_HARD_HEADER_LEN;
-       dev->needed_tailroom    = 2 + 16; /* FCS + MIC */
-       dev->mtu                = IEEE802154_MTU;
+       /* Let hard_header_len set to IEEE802154_MIN_HEADER_LEN. AF_PACKET
+        * will not send frames without any payload, but ack frames
+        * has no payload, so substract one that we can send a 3 bytes
+        * frame. The xmit callback assumes at least a hard header where two
+        * bytes fc and sequence field are set.
+        */
+       dev->hard_header_len    = IEEE802154_MIN_HEADER_LEN - 1;
+       /* The auth_tag header is for security and places in private payload
+        * room of mac frame which stucks between payload and FCS field.
+        */
+       dev->needed_tailroom    = IEEE802154_MAX_AUTH_TAG_LEN +
+                                 IEEE802154_FCS_LEN;
+       /* The mtu size is the payload without mac header in this case.
+        * We have a dynamic length header with a minimum header length
+        * which is hard_header_len. In this case we let mtu to the size
+        * of maximum payload which is IEEE802154_MTU - IEEE802154_FCS_LEN -
+        * hard_header_len. The FCS which is set by hardware or ndo_start_xmit
+        * and the minimum mac header which can be evaluated inside driver
+        * layer. The rest of mac header will be part of payload if greater
+        * than hard_header_len.
+        */
+       dev->mtu                = IEEE802154_MTU - IEEE802154_FCS_LEN -
+                                 dev->hard_header_len;
        dev->tx_queue_len       = 300;
        dev->flags              = IFF_NOARP | IFF_BROADCAST;
 }
@@ -617,7 +635,8 @@ ieee802154_if_add(struct ieee802154_local *local, const char *name,
        if (!ndev)
                return ERR_PTR(-ENOMEM);
 
-       ndev->needed_headroom = local->hw.extra_tx_headroom;
+       ndev->needed_headroom = local->hw.extra_tx_headroom +
+                               IEEE802154_MAX_HEADER_LEN;
 
        ret = dev_alloc_name(ndev, ndev->name);
        if (ret < 0)