From e61fd2d45b730dc15432afa67f64071f00439485 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Wed, 5 Apr 2017 09:14:28 -0600 Subject: [PATCH] 6loWPAN input: Fix a counting error. Input packet sizes were being calculated a little too big. --- net/sixlowpan/sixlowpan_input.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/net/sixlowpan/sixlowpan_input.c b/net/sixlowpan/sixlowpan_input.c index c279920e41..03a78f3684 100644 --- a/net/sixlowpan/sixlowpan_input.c +++ b/net/sixlowpan/sixlowpan_input.c @@ -225,13 +225,6 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, systime_t elapsed; /* Elapsed time */ #endif /* CONFIG_NET_6LOWPAN_FRAG */ - /* Initialize global data. Locking the network guarantees that we have - * exclusive use of the global values for intermediate calculations. - */ - - g_uncomp_hdrlen = 0; - g_frame_hdrlen = 0; - /* Get a pointer to the payload following the IEEE802.15.4 frame header. */ hdrsize = sixlowpan_recv_hdrlen(iob->io_data); @@ -241,6 +234,15 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, return hdrsize; } + /* Initialize global data. Locking the network guarantees that we have + * exclusive use of the global values for intermediate calculations. + */ + + g_uncomp_hdrlen = 0; + g_frame_hdrlen = hdrsize; + + /* Payload starts after the IEEE802.15.4 header */ + payptr = &iob->io_data[hdrsize]; #ifdef CONFIG_NET_6LOWPAN_FRAG @@ -438,7 +440,7 @@ static int sixlowpan_frame_process(FAR struct ieee802154_driver_s *ieee, /* Process next dispatch and headers */ - hc1 = payptr + g_frame_hdrlen; + hc1 = &iob->io_data[g_frame_hdrlen]; #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC06 if ((hc1[RIME_HC1_DISPATCH] & SIXLOWPAN_DISPATCH_IPHC_MASK) == SIXLOWPAN_DISPATCH_IPHC) @@ -484,21 +486,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 IEEE802.15.4 MAC drivers + /* Copy "payload" from the rime buffer to the IEEE802.15.4 MAC driver's * 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 (g_frame_hdrlen > CONFIG_NET_6LOWPAN_MTU) + g_rime_payloadlen = iob->io_len - g_frame_hdrlen; + if (g_rime_payloadlen > CONFIG_NET_6LOWPAN_MTU) { - nwarn("WARNING: Packet dropped due to header (%u) > packet buffer (%u)\n", - g_frame_hdrlen, CONFIG_NET_6LOWPAN_MTU); + nwarn("WARNING: Packet dropped due to payload (%u) > packet buffer (%u)\n", + g_rime_payloadlen, CONFIG_NET_6LOWPAN_MTU); return OK; } - g_rime_payloadlen = iob->io_len - g_frame_hdrlen; - /* Sanity-check size of incoming packet to avoid buffer overflow */ reqsize = g_uncomp_hdrlen + (uint16_t) (fragoffset << 3) + g_rime_payloadlen;