aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2015-09-28 06:36:26 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-09-30 07:21:32 -0400
commitb40988c438c2405a177ae54ff4baa08c720c296f (patch)
tree255faa1cdb6a7398d61df143b563b42916998c69
parentd58a2fa903c18f97aac30cd3c4c8a378a2c647c4 (diff)
ieee802154: change mtu size behaviour
This patch changes the mtu size of 802.15.4 interfaces. The current setting is the meaning of the maximum transport unit with mac header, which is 127 bytes according 802.15.4. The linux meaning of the mtu size field is the maximum payload of a mac frame. Like in ethernet, which is 1500 bytes. We have dynamic length of mac frames in 802.15.4, this is why we assume the minimum header length which is hard_header_len. This contains fc and sequence fields. These can evaluated by driver layer without additional checks. We currently don't support to set the FCS from userspace, so we need to subtract this from mtu size as well. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--net/ieee802154/socket.c4
-rw-r--r--net/mac802154/iface.c12
-rw-r--r--net/mac802154/tx.c11
3 files changed, 13 insertions, 14 deletions
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c
index be77f211ce87..a548be247e15 100644
--- a/net/ieee802154/socket.c
+++ b/net/ieee802154/socket.c
@@ -273,7 +273,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
273 goto out; 273 goto out;
274 } 274 }
275 275
276 mtu = dev->mtu; 276 mtu = IEEE802154_MTU;
277 pr_debug("name = %s, mtu = %u\n", dev->name, mtu); 277 pr_debug("name = %s, mtu = %u\n", dev->name, mtu);
278 278
279 if (size > mtu) { 279 if (size > mtu) {
@@ -637,7 +637,7 @@ static int dgram_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
637 err = -ENXIO; 637 err = -ENXIO;
638 goto out; 638 goto out;
639 } 639 }
640 mtu = dev->mtu; 640 mtu = IEEE802154_MTU;
641 pr_debug("name = %s, mtu = %u\n", dev->name, mtu); 641 pr_debug("name = %s, mtu = %u\n", dev->name, mtu);
642 642
643 if (size > mtu) { 643 if (size > mtu) {
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c
index 3954bcff70e4..7079cd32a7ad 100644
--- a/net/mac802154/iface.c
+++ b/net/mac802154/iface.c
@@ -547,7 +547,17 @@ static void ieee802154_if_setup(struct net_device *dev)
547 */ 547 */
548 dev->needed_tailroom = IEEE802154_MAX_AUTH_TAG_LEN + 548 dev->needed_tailroom = IEEE802154_MAX_AUTH_TAG_LEN +
549 IEEE802154_FCS_LEN; 549 IEEE802154_FCS_LEN;
550 dev->mtu = IEEE802154_MTU; 550 /* The mtu size is the payload without mac header in this case.
551 * We have a dynamic length header with a minimum header length
552 * which is hard_header_len. In this case we let mtu to the size
553 * of maximum payload which is IEEE802154_MTU - IEEE802154_FCS_LEN -
554 * hard_header_len. The FCS which is set by hardware or ndo_start_xmit
555 * and the minimum mac header which can be evaluated inside driver
556 * layer. The rest of mac header will be part of payload if greater
557 * than hard_header_len.
558 */
559 dev->mtu = IEEE802154_MTU - IEEE802154_FCS_LEN -
560 dev->hard_header_len;
551 dev->tx_queue_len = 300; 561 dev->tx_queue_len = 300;
552 dev->flags = IFF_NOARP | IFF_BROADCAST; 562 dev->flags = IFF_NOARP | IFF_BROADCAST;
553} 563}
diff --git a/net/mac802154/tx.c b/net/mac802154/tx.c
index b205bbec7bdf..3827f359b336 100644
--- a/net/mac802154/tx.c
+++ b/net/mac802154/tx.c
@@ -71,17 +71,6 @@ ieee802154_tx(struct ieee802154_local *local, struct sk_buff *skb)
71 struct net_device *dev = skb->dev; 71 struct net_device *dev = skb->dev;
72 int ret; 72 int ret;
73 73
74 /* This check is for AF_PACKET RAW socket only, which doesn't
75 * know about the FCS which is set here or by hardware. otherwise
76 * it should not occur in any case!
77 *
78 * TODO: This should be handled in AF_PACKET and return -EMSGSIZE.
79 */
80 if (skb->len > IEEE802154_MTU - IEEE802154_FCS_LEN) {
81 netdev_warn(dev, "Frame len above MTU limit. Dropped.\n");
82 goto err_tx;
83 }
84
85 if (!(local->hw.flags & IEEE802154_HW_TX_OMIT_CKSUM)) { 74 if (!(local->hw.flags & IEEE802154_HW_TX_OMIT_CKSUM)) {
86 u16 crc = crc_ccitt(0, skb->data, skb->len); 75 u16 crc = crc_ccitt(0, skb->data, skb->len);
87 76