From fdf706a3a9ca41880aa6c88d202ec064cba3b8cf Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 4 Apr 2017 13:52:02 -0600 Subject: [PATCH] 6loWPAN: Additional fixes related to buffer offsets primarily. --- net/sixlowpan/sixlowpan_framelist.c | 24 +++++++++++++----------- net/sixlowpan/sixlowpan_input.c | 19 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/net/sixlowpan/sixlowpan_framelist.c b/net/sixlowpan/sixlowpan_framelist.c index 7275f21ac37..f1e1250b553 100644 --- a/net/sixlowpan/sixlowpan_framelist.c +++ b/net/sixlowpan/sixlowpan_framelist.c @@ -234,6 +234,19 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, ninfo("Sending packet length %d\n", buflen); + /* Pre-calculate frame header length. */ + + framer_hdrlen = sixlowpan_send_hdrlen(ieee, ieee->i_panid); + if (framer_hdrlen < 0) + { + /* Failed to determine the size of the header failed. */ + + nerr("ERROR: sixlowpan_send_hdrlen() failed: %d\n", framer_hdrlen); + return framer_hdrlen; + } + + g_frame_hdrlen = framer_hdrlen; + #ifndef CONFIG_NET_6LOWPAN_COMPRESSION_IPv6 if (buflen >= CONFIG_NET_6LOWPAN_COMPRESSION_THRESHOLD) { @@ -259,17 +272,6 @@ int sixlowpan_queue_frames(FAR struct ieee802154_driver_s *ieee, rimeaddr_copy(&g_pktaddrs[PACKETBUF_ADDR_RECEIVER], destmac); - /* Pre-calculate frame header length. */ - - framer_hdrlen = sixlowpan_send_hdrlen(ieee, ieee->i_panid); - if (framer_hdrlen < 0) - { - /* Failed to determine the size of the header failed. */ - - nerr("ERROR: sixlowpan_send_hdrlen() failed: %d\n", framer_hdrlen); - return framer_hdrlen; - } - /* Check if we need to fragment the packet into several frames */ if ((int)buflen - (int)g_uncomp_hdrlen > diff --git a/net/sixlowpan/sixlowpan_input.c b/net/sixlowpan/sixlowpan_input.c index 5d0eaa58697..616a464ea95 100644 --- a/net/sixlowpan/sixlowpan_input.c +++ b/net/sixlowpan/sixlowpan_input.c @@ -461,7 +461,7 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, if (hc1[RIME_HC1_DISPATCH] == SIXLOWPAN_DISPATCH_IPV6) { ninfo("IPV6 Dispatch\n"); - g_frame_hdrlen += SIXLOWPAN_IPV6_HDR_LEN; + g_frame_hdrlen += SIXLOWPAN_IPV6_HDR_LEN; /* Put uncompressed IP header in d_buf. */ @@ -469,7 +469,7 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, /* Update g_uncomp_hdrlen and g_frame_hdrlen. */ - g_frame_hdrlen += IPv6_HDRLEN; + g_frame_hdrlen += IPv6_HDRLEN; g_uncomp_hdrlen += IPv6_HDRLEN; } else @@ -484,19 +484,20 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, copypayload: #endif /* CONFIG_NET_6LOWPAN_FRAG */ - /* Copy "payload" from the rime buffer to the d_buf. If this frame is a - * first fragment or not part of a fragmented packet, we have already - * copied the compressed headers, g_uncomp_hdrlen and g_frame_hdrlen are - * non-zerio, fragoffset is. + /* Copy "payload" from the rime buffer to the IEEE802.15.4 MAC drivers + * d_buf. If this frame is a first fragment or not part of a fragmented + * packet, we have already copied the compressed headers, g_uncomp_hdrlen + * and g_frame_hdrlen are non-zerio, fragoffset is. */ - if (ieee->i_dev.d_len < g_frame_hdrlen) + if (g_frame_hdrlen > CONFIG_NET_6LOWPAN_MTU) { - ninfo("SIXLOWPAN: packet dropped due to header > total packet\n"); + nwarn("WARNING: Packet dropped due to header (%u) > packet buffer (%u)\n", + g_frame_hdrlen, CONFIG_NET_6LOWPAN_MTU); return OK; } - g_rime_payloadlen = ieee->i_dev.d_len - g_frame_hdrlen; + g_rime_payloadlen = iob->io_len - g_frame_hdrlen; /* Sanity-check size of incoming packet to avoid buffer overflow */