diff --git a/configs/b-l475e-iot01a/spirit-6lowpan/defconfig b/configs/b-l475e-iot01a/spirit-6lowpan/defconfig index f155d83a389..54a4f4039de 100644 --- a/configs/b-l475e-iot01a/spirit-6lowpan/defconfig +++ b/configs/b-l475e-iot01a/spirit-6lowpan/defconfig @@ -43,7 +43,6 @@ CONFIG_LIBM=y CONFIG_MAX_TASKS=16 CONFIG_MAX_WDOGPARMS=2 CONFIG_MM_REGIONS=2 -CONFIG_NET_6LOWPAN_FRAMELEN=94 CONFIG_NET_6LOWPAN=y CONFIG_NET_BROADCAST=y CONFIG_NET_HOSTNAME="B-L475E-IOT01A" diff --git a/configs/b-l475e-iot01a/spirit-starhub/defconfig b/configs/b-l475e-iot01a/spirit-starhub/defconfig index 13cc3d26610..4ac0045dcd6 100644 --- a/configs/b-l475e-iot01a/spirit-starhub/defconfig +++ b/configs/b-l475e-iot01a/spirit-starhub/defconfig @@ -32,7 +32,6 @@ CONFIG_LIBM=y CONFIG_MAX_TASKS=16 CONFIG_MAX_WDOGPARMS=2 CONFIG_MM_REGIONS=2 -CONFIG_NET_6LOWPAN_FRAMELEN=94 CONFIG_NET_6LOWPAN=y CONFIG_NET_BROADCAST=y CONFIG_NET_HOSTNAME="B-L475E-IOT01A" diff --git a/configs/b-l475e-iot01a/spirit-starpoint/defconfig b/configs/b-l475e-iot01a/spirit-starpoint/defconfig index 5f067557dad..0d04285c956 100644 --- a/configs/b-l475e-iot01a/spirit-starpoint/defconfig +++ b/configs/b-l475e-iot01a/spirit-starpoint/defconfig @@ -44,7 +44,6 @@ CONFIG_LIBM=y CONFIG_MAX_TASKS=16 CONFIG_MAX_WDOGPARMS=2 CONFIG_MM_REGIONS=2 -CONFIG_NET_6LOWPAN_FRAMELEN=94 CONFIG_NET_6LOWPAN=y CONFIG_NET_BROADCAST=y CONFIG_NET_HOSTNAME="B-L475E-IOT01A" diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h index 4f317baa5bf..b2c19acfc5e 100644 --- a/net/ieee802154/ieee802154.h +++ b/net/ieee802154/ieee802154.h @@ -76,13 +76,9 @@ #define IEEE802154_MAC_FCSSIZE 2 -/* This, then, is the usable size of the frame... - * REVISIT: Too many frame length definitions - */ +/* This, then, is the usable size of the frame... */ -#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) -# define IEEE802_MAX_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN -#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +#if defined(CONFIG_NET_IEEE802154_FRAMELEN) # define IEEE802_MAX_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN #else # define IEEE802_MAX_FRAMELEN IEEE802154_MAC_STDFRAME diff --git a/net/sixlowpan/Kconfig b/net/sixlowpan/Kconfig index 8722f27a8c1..70620532a5b 100644 --- a/net/sixlowpan/Kconfig +++ b/net/sixlowpan/Kconfig @@ -37,15 +37,6 @@ config NET_6LOWPAN_REASS_STATIC buffers. In that case, only static reassembly buffers are available; when those are exhausted, frames that require reassembly will be lost. -config NET_6LOWPAN_FRAMELEN - int "Max Radio Frame Size" - default 127 - range 1 999999 - ---help--- - Wireless devices use a variety of frame sizes. For IEEE 802.15.4 - radios, this should be 127 bytes. However, some IEEE 802.15.4 - radios may support non-standard frame lengths. - choice prompt "6LoWPAN Compression" default NET_6LOWPAN_COMPRESSION_HC06 diff --git a/net/sixlowpan/README.txt b/net/sixlowpan/README.txt index 7de217530b1..60939d5fd17 100644 --- a/net/sixlowpan/README.txt +++ b/net/sixlowpan/README.txt @@ -93,9 +93,9 @@ Optimal 6LoWPAN Configuration 4. To be compressable, port numbers must be in the range 0xf0b0-0xf0bf, hexadecimal. That is 61616-61631 decimal. -5. IOBs: Must be big enough to hold one IEEE802.15.4 frame (CONFIG_NET_6LOWPAN_FRAMELEN, - typically 127). There must be enough IOBs to decompose the largest IPv6 - packet (CONFIG_NET_6LOWPAN_MTU, default 1294, plus per frame overhead). +5. IOBs: Must be big enough to hold one IEEE802.15.4 frame (typically 127). + There must be enough IOBs to decompose the largest IPv6 packet + (CONFIG_NET_6LOWPAN_MTU, default 1294, plus per frame overhead). Fragmentation Headers --------------------- diff --git a/net/sixlowpan/sixlowpan_framelist.c b/net/sixlowpan/sixlowpan_framelist.c index 93edda8ccac..545bea004a4 100644 --- a/net/sixlowpan/sixlowpan_framelist.c +++ b/net/sixlowpan/sixlowpan_framelist.c @@ -69,24 +69,17 @@ /* Configuration ************************************************************/ -/* A single IOB must be big enough to hold a full frame */ - -#if CONFIG_IOB_BUFSIZE < CONFIG_NET_6LOWPAN_FRAMELEN -# error IOBs must be large enough to hold full IEEE802.14.5 frame -#endif - -/* A IOB must also be big enought to hold the maximum MAC header (25 bytes?) - * plus the FCS and have some amount of space left for the payload. +/* A single IOB must be big enough to hold a full frame. This we have to + * check at run time. A IOB must also be big enough to hold the maximum MAC + * header (25 bytes?) plus the FCS and have some amount of space left for + * the payload. */ -#if CONFIG_NET_6LOWPAN_FRAMELEN < (SIXLOWPAN_MAC_FCSSIZE + 25) -# error CONFIG_NET_6LOWPAN_FRAMELEN too small to hold a IEEE802.14.5 frame +#define MAX_MACHDR 25 /* REVISIT: This is IEEE 802.15.4 specific */ +#if CONFIG_IOB_BUFSIZE < (SIXLOWPAN_MAC_FCSSIZE + MAX_MACHDR) +# error CONFIG_IOB_BUFSIZE too small to hold a IEEE802.14.5 frame #endif -/* We must reserve space at the end of the frame for a 2-byte FCS */ - -#define SIXLOWPAN_FRAMELEN (CONFIG_NET_6LOWPAN_FRAMELEN - SIXLOWPAN_MAC_FCSSIZE) - /* There must be at least enough IOBs to hold the full MTU. Probably still * won't work unless there are a few more. */ @@ -385,6 +378,7 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, FAR uint8_t *fptr; int framer_hdrlen; struct netdev_varaddr_s bcastmac; + uint16_t framelen; uint16_t pktlen; uint16_t paysize; uint16_t outlen = 0; @@ -495,9 +489,40 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, ninfo("Header of length=%u protosize=%u\n", g_frame_hdrlen, protosize); - /* Check if we need to fragment the packet into several frames */ + /* Get the maximum packet size supported by this radio. */ - if (buflen > (SIXLOWPAN_FRAMELEN - g_frame_hdrlen - protosize)) + ret = sixlowpan_radio_framelen(radio); + if (ret < 0) + { + nerr("ERROR: sixlowpan_radio_framelen() failed: %d\n", ret); + return ret; + } + + /* Limit to the maximum size supported by the IOBs */ + + if (ret > CONFIG_IOB_BUFSIZE) + { + ret = CONFIG_IOB_BUFSIZE; + } + + /* Reserve space at the end for any FCS that the hardware may include + * in the payload. + */ + + ret -= SIXLOWPAN_MAC_FCSSIZE; + if (ret < MAX_MACHDR || ret > UINT16_MAX) + { + nerr("ERROR: Invalid frame size: %d\n", ret); + return ret; + } + + framelen = (uint16_t)ret; + + /* Check if we need to fragment the packet into several frames. + * We may need to reserve space at the end of the frame for a 2-byte FCS + */ + + if (buflen > (framelen - g_frame_hdrlen - protosize)) { /* qhead will hold the generated frame list; frames will be * added at qtail. @@ -570,7 +595,7 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, * bytes. */ - paysize = (SIXLOWPAN_FRAMELEN - g_frame_hdrlen) & ~7; + paysize = (framelen - g_frame_hdrlen) & ~7; memcpy(fptr + g_frame_hdrlen + protosize, buf, paysize - protosize); /* Set outlen to what we already sent from the IP payload */ @@ -642,8 +667,7 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, /* Copy payload and enqueue */ /* Check for the last fragment */ - paysize = (SIXLOWPAN_FRAMELEN - fragn_hdrlen) & - SIXLOWPAN_DISPATCH_FRAG_MASK; + paysize = (framelen - fragn_hdrlen) & SIXLOWPAN_DISPATCH_FRAG_MASK; if (paysize > buflen - outlen + protosize) { /* Last fragment, truncate to the correct length */ diff --git a/wireless/ieee802154/mac802154_loopback.c b/wireless/ieee802154/mac802154_loopback.c index 3e08f4a8234..1eabcd1a786 100644 --- a/wireless/ieee802154/mac802154_loopback.c +++ b/wireless/ieee802154/mac802154_loopback.c @@ -89,13 +89,9 @@ # define LO_ADDRSIZE IEEE802154_SADDRSIZE #endif -/* Frame size - * REVISIT: Too many frame length definitions - */ +/* Frame size */ -#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) -# define LO_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN -#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +#if defined(CONFIG_NET_IEEE802154_FRAMELEN) # define LO_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN #else # define LO_FRAMELEN IEEE802154_MAX_PHY_PACKET_SIZE diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c index 6a5bc54d585..4d7f2a9c001 100644 --- a/wireless/ieee802154/mac802154_netdev.c +++ b/wireless/ieee802154/mac802154_netdev.c @@ -105,13 +105,9 @@ # define MACNET_ADDRSIZE IEEE802154_SADDRSIZE #endif -/* Frame size - * REVISIT: Too many frame length definitions - */ +/* Frame size */ -#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) -# define MACNET_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN -#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +#if defined(CONFIG_NET_IEEE802154_FRAMELEN) # define MACNET_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN #else # define MACNET_FRAMELEN IEEE802154_MAX_PHY_PACKET_SIZE diff --git a/wireless/pktradio/pktradio_loopback.c b/wireless/pktradio/pktradio_loopback.c index ca89e6ef494..c9e144eb4d7 100644 --- a/wireless/pktradio/pktradio_loopback.c +++ b/wireless/pktradio/pktradio_loopback.c @@ -97,7 +97,7 @@ /* Fake value for MAC header length */ -#if CONFIG_NET_6LOWPAN_FRAMELEN > 40 +#if CONFIG_IOB_BUFSIZE > 40 # define MAC_HDRLEN 4 #else # define MAC_HDRLEN 0 @@ -961,8 +961,8 @@ static int lo_properties(FAR struct radio_driver_s *netdev, /* General */ - properties->sp_addrlen = CONFIG_PKTRADIO_ADDRLEN; /* Length of an address */ - properties->sp_framelen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ + properties->sp_addrlen = CONFIG_PKTRADIO_ADDRLEN; /* Length of an address */ + properties->sp_framelen = CONFIG_IOB_BUFSIZE; /* Fixed frame length */ /* Multicast address */