diff --git a/configs/olimex-stm32-e407/uros_6lowpan/defconfig b/configs/olimex-stm32-e407/uros_6lowpan/defconfig index cee4662d31..0c1edcc7b4 100644 --- a/configs/olimex-stm32-e407/uros_6lowpan/defconfig +++ b/configs/olimex-stm32-e407/uros_6lowpan/defconfig @@ -18,26 +18,13 @@ CONFIG_ARCH_BUTTONS=y CONFIG_ARCH_CHIP_STM32=y CONFIG_ARCH_CHIP_STM32F407ZG=y CONFIG_ARCH_STACKDUMP=y -CONFIG_BOARDCTL_USBDEVCTRL=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_BOARD_LOOPSPERMSEC=16717 CONFIG_BUILTIN=y CONFIG_C99_BOOL8=y -CONFIG_CDCACM=y -CONFIG_CDCACM_CONSOLE=y CONFIG_CLOCK_MONOTONIC=y -CONFIG_DEBUG_ERROR=y -CONFIG_DEBUG_FEATURES=y -CONFIG_DEBUG_INFO=y -CONFIG_DEBUG_NET=y -CONFIG_DEBUG_NET_ERROR=y -CONFIG_DEBUG_NET_INFO=y -CONFIG_DEBUG_NET_WARN=y -CONFIG_DEBUG_WARN=y -CONFIG_DEBUG_WIRELESS=y -CONFIG_DEBUG_WIRELESS_ERROR=y -CONFIG_DEBUG_WIRELESS_INFO=y -CONFIG_DEBUG_WIRELESS_WARN=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y CONFIG_DRIVERS_IEEE802154=y CONFIG_DRIVERS_WIRELESS=y CONFIG_FS_PROCFS=y @@ -49,15 +36,18 @@ CONFIG_IEEE802154_MACDEV=y CONFIG_IEEE802154_MRF24J40=y CONFIG_IEEE802154_NETDEV=y CONFIG_INTELHEX_BINARY=y -CONFIG_IOB_BUFSIZE=128 -CONFIG_IOB_NBUFFERS=32 -CONFIG_IOB_NCHAINS=16 +CONFIG_IOB_BUFSIZE=256 +CONFIG_IOB_NBUFFERS=16 +CONFIG_IOB_NOTIFIER=y +CONFIG_IOB_NOTIFIER_DIV=1 +CONFIG_IRQCHAIN=y CONFIG_LIBC_FLOATINGPOINT=y CONFIG_LIBM=y CONFIG_LIB_BOARDCTL=y CONFIG_MAC802154_NTXDESC=32 CONFIG_MAX_TASKS=16 CONFIG_MAX_WDOGPARMS=2 +CONFIG_MM_FILL_ALLOCATIONS=y CONFIG_MM_REGIONS=2 CONFIG_NET=y CONFIG_NETDEVICES=y @@ -66,25 +56,23 @@ CONFIG_NETDEV_LATEINIT=y CONFIG_NETDEV_PHY_IOCTL=y CONFIG_NETDEV_STATISTICS=y CONFIG_NETDEV_WIRELESS_IOCTL=y -CONFIG_NETUTILS_TELNETD=y CONFIG_NET_6LOWPAN=y -CONFIG_NET_6LOWPAN_COMPRESSION_THRESHOLD=500 +CONFIG_NET_6LOWPAN_COMPRESSION_THRESHOLD=580 CONFIG_NET_6LOWPAN_EXTENDEDADDR=y +CONFIG_NET_6LOWPAN_MAX_MACTRANSMITS=1 +CONFIG_NET_6LOWPAN_PKTSIZE=600 +CONFIG_NET_6LOWPAN_REASS_STATIC=y CONFIG_NET_BROADCAST=y -CONFIG_NET_ICMPv6=y -CONFIG_NET_ICMPv6_AUTOCONF=y -CONFIG_NET_ICMPv6_NEIGHBOR=y -CONFIG_NET_ICMPv6_ROUTER=y -CONFIG_NET_ICMPv6_SOCKET=y +CONFIG_NET_GUARDSIZE=128 CONFIG_NET_IPv6=y +CONFIG_NET_NACTIVESOCKETS=2 CONFIG_NET_PROMISCUOUS=y CONFIG_NET_ROUTE=y CONFIG_NET_SOCKOPTS=y CONFIG_NET_STATISTICS=y -CONFIG_NET_TCP=y -CONFIG_NET_TCPBACKLOG=y -CONFIG_NET_TCP_WRITE_BUFFERS=y CONFIG_NET_UDP=y +CONFIG_NET_UDP_CONNS=16 +CONFIG_NET_UDP_NWRBCHAINS=16 CONFIG_NET_UDP_WRITE_BUFFERS=y CONFIG_NFILE_DESCRIPTORS=8 CONFIG_NFILE_STREAMS=8 @@ -92,6 +80,7 @@ CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_LINELEN=64 CONFIG_NSH_READLINE=y +CONFIG_NSOCKET_DESCRIPTORS=2 CONFIG_PREALLOC_MQ_MSGS=4 CONFIG_PREALLOC_TIMERS=4 CONFIG_PREALLOC_WDOGS=16 @@ -107,19 +96,18 @@ CONFIG_START_DAY=6 CONFIG_START_MONTH=12 CONFIG_START_YEAR=2011 CONFIG_STM32_JTAG_SW_ENABLE=y -CONFIG_STM32_OTGFS=y CONFIG_STM32_PWR=y CONFIG_STM32_SPI1=y CONFIG_STM32_USART3=y CONFIG_SYSTEM_NSH=y -CONFIG_SYSTEM_PING6=y CONFIG_SYSTEM_SYSTEM=y CONFIG_UCLIBCXX=y +CONFIG_UDP_READAHEAD_NOTIFIER=y CONFIG_UROS=y CONFIG_UROS_6LOWPAN_EXAMPLE=y CONFIG_USART3_RXBUFSIZE=128 +CONFIG_USART3_SERIAL_CONSOLE=y CONFIG_USART3_TXBUFSIZE=512 -CONFIG_USBDEV=y CONFIG_USER_ENTRYPOINT="nsh_main" CONFIG_WIRELESS=y CONFIG_WIRELESS_IEEE802154=y diff --git a/net/sixlowpan/sixlowpan_framelist.c b/net/sixlowpan/sixlowpan_framelist.c index 2d7ecbe03a..6b469d5798 100644 --- a/net/sixlowpan/sixlowpan_framelist.c +++ b/net/sixlowpan/sixlowpan_framelist.c @@ -119,18 +119,20 @@ ****************************************************************************/ static int sixlowpan_compress_ipv6hdr(FAR const struct ipv6_hdr_s *ipv6hdr, + FAR uint32_t *headersz, FAR uint8_t *fptr) { /* Indicate the IPv6 dispatch and length */ +#if 0 fptr[g_frame_hdrlen] = SIXLOWPAN_DISPATCH_IPV6; g_frame_hdrlen += SIXLOWPAN_IPV6_HDR_LEN; +#endif /* Copy the IPv6 header and adjust pointers */ - memcpy(&fptr[g_frame_hdrlen], ipv6hdr, IPv6_HDRLEN); - g_frame_hdrlen += IPv6_HDRLEN; - g_uncomp_hdrlen += IPv6_HDRLEN; + /* Returne the size of the header */ + *headersz = IPv6_HDRLEN; return COMPRESS_HDR_INLINE; } @@ -170,7 +172,7 @@ static uint16_t sixlowpan_protosize(FAR const struct ipv6_hdr_s *ipv6hdr, #ifdef CONFIG_NET_UDP case IP_PROTO_UDP: - protosize = UDP_HDRLEN; + protosize = UDP_HDRLEN; // 8 bytes break; #endif @@ -383,6 +385,7 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, uint16_t pktlen; uint16_t paysize; uint16_t outlen = 0; + uint32_t ipv6_header_len = 0; uint8_t protosize; int ret; @@ -443,21 +446,23 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, #endif /* Pre-calculate frame header length. */ - + /* 21 for my case */ framer_hdrlen = sixlowpan_frame_hdrlen(radio, &meta); if (framer_hdrlen < 0) { /* Failed to determine the size of the header failed. */ nerr("ERROR: sixlowpan_frame_hdrlen() failed: %d\n", framer_hdrlen); + iob_free(iob); return framer_hdrlen; } /* This sill be the initial offset into io_data. Valid data begins at * this offset and must be reflected in io_offset. */ - g_frame_hdrlen = framer_hdrlen; + + /* We have to leave some space to the the phy layer to integrate it's sdu */ iob->io_offset = framer_hdrlen; #ifndef CONFIG_NET_6LOWPAN_COMPRESSION_IPv6 @@ -466,8 +471,10 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, /* Try to compress the headers */ #if defined(CONFIG_NET_6LOWPAN_COMPRESSION_HC1) + // TODO need to fix the ipv6 header size ret = sixlowpan_compresshdr_hc1(radio, ipv6, destmac, fptr); #elif defined(CONFIG_NET_6LOWPAN_COMPRESSION_HC06) + // TODO need to fix the ipv6 header size ret = sixlowpan_compresshdr_hc06(radio, ipv6, destmac, fptr); #else # error No compression specified @@ -477,12 +484,10 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, #endif /* !CONFIG_NET_6LOWPAN_COMPRESSION_IPv6 */ { /* Small.. use IPv6 dispatch (no compression) */ - - ret = sixlowpan_compress_ipv6hdr(ipv6, fptr); + ret = sixlowpan_compress_ipv6hdr(ipv6, &ipv6_header_len, fptr); } /* Get the size of any uncompressed protocol headers */ - if (ret == COMPRESS_HDR_INLINE) { protosize = sixlowpan_protosize(ipv6, fptr); @@ -492,15 +497,16 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, /* Get the maximum packet size supported by this radio. */ + /** Should be 127 if IEEE802.14.5 */ ret = sixlowpan_radio_framelen(radio); if (ret < 0) { nerr("ERROR: sixlowpan_radio_framelen() failed: %d\n", ret); + iob_free(iob); return ret; } /* Limit to the maximum size supported by the IOBs */ - if (ret > CONFIG_IOB_BUFSIZE) { ret = CONFIG_IOB_BUFSIZE; @@ -510,10 +516,12 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, * in the payload. */ + /** This is set to 2 */ ret -= SIXLOWPAN_MAC_FCSSIZE; if (ret < MAX_MACHDR || ret > UINT16_MAX) { nerr("ERROR: Invalid frame size: %d\n", ret); + iob_free(iob); return ret; } @@ -523,18 +531,12 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, * We may need to reserve space at the end of the frame for a 2-byte FCS */ - if (buflen > (framelen - g_frame_hdrlen - protosize)) + if (buflen > (framelen - framer_hdrlen - protosize - ipv6_header_len)) { - /* qhead will hold the generated frame list; frames will be - * added at qtail. - */ - FAR struct sixlowpan_reassbuf_s *reass; FAR struct iob_s *qhead; FAR struct iob_s *qtail; - FAR uint8_t *frame1; FAR uint8_t *fragptr; - uint16_t frag1_hdrlen; /* Recover the reassembly buffer from the driver d_buf. */ @@ -555,10 +557,9 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, /* Move HC1/HC06/IPv6 header to make space for the FRAG1 header at the * beginning of the frame. */ - fragptr = fptr + framer_hdrlen; memmove(fragptr + SIXLOWPAN_FRAG1_HDR_LEN, fragptr, - g_frame_hdrlen - framer_hdrlen); + ipv6_header_len); /* Setup up the fragment header. * @@ -575,13 +576,11 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, * bytes for all subsequent headers. */ - pktlen = buflen + g_uncomp_hdrlen + protosize; + pktlen = buflen + ipv6_header_len + protosize; PUTHOST16(fragptr, SIXLOWPAN_FRAG_DISPATCH_SIZE, ((SIXLOWPAN_DISPATCH_FRAG1 << 8) | pktlen)); PUTHOST16(fragptr, SIXLOWPAN_FRAG_TAG, reass->rb_dgramtag); - g_frame_hdrlen += SIXLOWPAN_FRAG1_HDR_LEN; - /* Copy any uncompressed protocol headers that must appear only in th * first fragment. */ @@ -589,19 +588,22 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, if (protosize > 0) { FAR uint8_t *src = (FAR uint8_t *)ipv6 + IPv6_HDRLEN; - memcpy(fptr + g_frame_hdrlen, src, protosize); + + memcpy(fptr + SIXLOWPAN_FRAG1_HDR_LEN + + ipv6_header_len + framer_hdrlen, src, protosize); } /* Copy payload and enqueue. NOTE that the size is a multiple of eight * bytes. */ - paysize = (framelen - g_frame_hdrlen) & ~7; - memcpy(fptr + g_frame_hdrlen + protosize, buf, paysize - protosize); + paysize = (framelen - framer_hdrlen - SIXLOWPAN_FRAG1_HDR_LEN) & ~7; + memcpy(fptr + framer_hdrlen + SIXLOWPAN_FRAG1_HDR_LEN + ipv6_header_len + protosize, + buf, paysize); /* Set outlen to what we already sent from the IP payload */ - iob->io_len = paysize + g_frame_hdrlen; + iob->io_len = paysize + framer_hdrlen + SIXLOWPAN_FRAG1_HDR_LEN; outlen = paysize; ninfo("First fragment: length %d, tag %d\n", @@ -622,113 +624,91 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, iob->io_pktlen = iob->io_len; /* Create following fragments */ + while (outlen < (buflen + protosize + ipv6_header_len)) + { + uint16_t fragn_hdrlen; - frame1 = iob->io_data; - frag1_hdrlen = g_frame_hdrlen; - - while (outlen < (buflen + protosize)) - { - uint16_t fragn_hdrlen; - - /* Allocate an IOB to hold the next fragment, waiting if - * necessary. - */ - - iob = net_ioballoc(false); - DEBUGASSERT(iob != NULL); - - /* Initialize the IOB */ + /* Allocate an IOB to hold the next fragment, waiting if + * necessary. + */ - iob->io_flink = NULL; - iob->io_len = 0; - iob->io_offset = framer_hdrlen; - iob->io_pktlen = 0; - fptr = iob->io_data; + iob = net_ioballoc(false); + DEBUGASSERT(iob != NULL); - /* Copy the HC1/HC06/IPv6 header the frame header from first - * frame, into the correct location after the FRAGN header - * of subsequent frames. - */ + /* Initialize the IOB */ - fragptr = fptr + framer_hdrlen; - memcpy(fragptr + SIXLOWPAN_FRAGN_HDR_LEN, - frame1 + framer_hdrlen + SIXLOWPAN_FRAG1_HDR_LEN, - frag1_hdrlen - framer_hdrlen); - fragn_hdrlen = frag1_hdrlen - SIXLOWPAN_FRAG1_HDR_LEN; + iob->io_flink = NULL; + iob->io_len = 0; + iob->io_offset = framer_hdrlen; + iob->io_pktlen = 0; + fptr = iob->io_data; - /* Setup up the FRAGN header after the frame header. */ + /* Copy the HC1/HC06/IPv6 header the frame header from first + * frame, into the correct location after the FRAGN header + * of subsequent frames. + */ - PUTHOST16(fragptr, SIXLOWPAN_FRAG_DISPATCH_SIZE, - ((SIXLOWPAN_DISPATCH_FRAGN << 8) | pktlen)); - PUTHOST16(fragptr, SIXLOWPAN_FRAG_TAG, reass->rb_dgramtag); - fragptr[SIXLOWPAN_FRAG_OFFSET] = outlen >> 3; + fragptr = fptr + framer_hdrlen; + /* Setup up the FRAGN header after the frame header. */ + PUTHOST16(fragptr, SIXLOWPAN_FRAG_DISPATCH_SIZE, + ((SIXLOWPAN_DISPATCH_FRAGN << 8) | pktlen)); + PUTHOST16(fragptr, SIXLOWPAN_FRAG_TAG, reass->rb_dgramtag); + fragptr[SIXLOWPAN_FRAG_OFFSET] = outlen >> 3; - fragn_hdrlen += SIXLOWPAN_FRAGN_HDR_LEN; + fragn_hdrlen = framer_hdrlen + SIXLOWPAN_FRAGN_HDR_LEN; - /* Copy payload and enqueue. - * - * Check for the last fragment. - */ + /* Copy payload and enqueue. + * + * Check for the last fragment. + */ - paysize = (framelen - fragn_hdrlen) & SIXLOWPAN_DISPATCH_FRAG_MASK; - if (paysize > buflen - outlen + protosize) - { - /* Last fragment, truncate to the correct length */ + paysize = (framelen - fragn_hdrlen) & SIXLOWPAN_DISPATCH_FRAG_MASK; + if (paysize > (buflen + protosize + ipv6_header_len - outlen)) + { + /* Last fragment, truncate to the correct length */ + paysize = buflen + protosize + ipv6_header_len - outlen; + } + // TODO check if here or not ipv6 is included + memcpy(fptr + fragn_hdrlen, buf + (outlen - protosize - ipv6_header_len), paysize); - paysize = buflen - outlen + protosize; - } + /* Set outlen to what we already sent from the IP payload */ - memcpy(fptr + fragn_hdrlen, buf + outlen - protosize, paysize); + iob->io_len = paysize + fragn_hdrlen; + outlen += paysize; - /* Set outlen to what we already sent from the IP payload */ + ninfo("Fragment offset=%d, paysize=%d, rb_dgramtag=%d\n", + outlen >> 3, paysize, reass->rb_dgramtag); - iob->io_len = paysize + fragn_hdrlen; - outlen += paysize; + sixlowpan_dumpbuffer("Outgoing frame", + (FAR const uint8_t *)iob->io_data, + iob->io_len); - ninfo("Fragment offset=%d, paysize=%d, rb_dgramtag=%d\n", - outlen >> 3, paysize, reass->rb_dgramtag); + /* Add the next frame to the tail of the IOB queue */ - sixlowpan_dumpbuffer("Outgoing frame", - (FAR const uint8_t *)iob->io_data, - iob->io_len); + ninfo("Queuing frame io_len=%u io_offset=%u\n", + iob->io_len, iob->io_offset); - /* Add the next frame to the tail of the IOB queue */ + qtail->io_flink = iob; + qtail = iob; - ninfo("Queuing frame io_len=%u io_offset=%u\n", - iob->io_len, iob->io_offset); + /* Keep track of the total amount of data queue */ - qtail->io_flink = iob; - qtail = iob; - - /* Keep track of the total amount of data queue */ - - qhead->io_pktlen += iob->io_len; - } + qhead->io_pktlen += iob->io_len; + } - /* Submit all of the fragments to the MAC. We send all frames back- - * to-back like this to minimize any possible condition where some - * frame which is not a fragment from this sequence from intervening. + /* Submit all of the fragments to the MAC. We send all frames back- + * to-back like this to minimize any possible condition where some + * frame which is not a fragment from this sequence from intervening. */ - for (iob = qhead; iob != NULL; iob = qhead) - { - /* Remove the IOB containing the frame from the list */ - - qhead = iob->io_flink; - iob->io_flink = NULL; - - /* And submit the frame to the MAC */ - - ninfo("Submitting frame\n"); - ret = sixlowpan_frame_submit(radio, &meta, iob); - if (ret < 0) - { - nerr("ERROR: sixlowpan_frame_submit() failed: %d\n", ret); - } - } + ninfo("Submitting frame\n"); + ret = sixlowpan_frame_submit(radio, &meta, qhead); + if (ret < 0) + { + nerr("ERROR: sixlowpan_frame_submit() failed: %d\n", ret); + } /* Update the datagram TAG value */ - reass->rb_dgramtag++; } else @@ -744,13 +724,13 @@ int sixlowpan_queue_frames(FAR struct radio_driver_s *radio, if (protosize > 0) { FAR uint8_t *src = (FAR uint8_t *)ipv6 + IPv6_HDRLEN; - memcpy(fptr + g_frame_hdrlen, src, protosize); + memcpy(fptr + framer_hdrlen + IPv6_HDRLEN, src, protosize); } /* Copy the payload into the frame. */ - memcpy(fptr + g_frame_hdrlen + protosize, buf, buflen); - iob->io_len = buflen + g_frame_hdrlen + protosize; + memcpy(fptr + framer_hdrlen + protosize + ipv6_header_len, buf, buflen); + iob->io_len = buflen + framer_hdrlen + ipv6_header_len + protosize; iob->io_pktlen = iob->io_len; ninfo("Non-fragmented: length %d\n", iob->io_len);