diff --git a/configs/samv71-xult/netnsh/defconfig b/configs/samv71-xult/netnsh/defconfig index b6512741955..395fe4df825 100644 --- a/configs/samv71-xult/netnsh/defconfig +++ b/configs/samv71-xult/netnsh/defconfig @@ -96,6 +96,7 @@ CONFIG_ARCH="arm" # CONFIG_ARCH_CHIP_LPC2378 is not set # CONFIG_ARCH_CHIP_LPC31XX is not set # CONFIG_ARCH_CHIP_LPC43XX is not set +# CONFIG_ARCH_CHIP_MOXART is not set # CONFIG_ARCH_CHIP_NUC1XX is not set # CONFIG_ARCH_CHIP_SAMA5 is not set # CONFIG_ARCH_CHIP_SAMD is not set @@ -107,7 +108,7 @@ CONFIG_ARCH_CHIP_SAMV7=y # CONFIG_ARCH_CHIP_STM32L4 is not set # CONFIG_ARCH_CHIP_STR71X is not set # CONFIG_ARCH_CHIP_TMS570 is not set -# CONFIG_ARCH_CHIP_MOXART is not set +# CONFIG_ARCH_CHIP_XMC4 is not set # CONFIG_ARCH_ARM7TDMI is not set # CONFIG_ARCH_ARM926EJS is not set # CONFIG_ARCH_ARM920T is not set @@ -457,6 +458,8 @@ CONFIG_SCHED_WAITPID=y # # CONFIG_PTHREAD_MUTEX_TYPES is not set CONFIG_PTHREAD_MUTEX_ROBUST=y +# CONFIG_PTHREAD_MUTEX_UNSAFE is not set +# CONFIG_PTHREAD_MUTEX_BOTH is not set CONFIG_NPTHREAD_KEYS=4 # CONFIG_PTHREAD_CLEANUP is not set # CONFIG_CANCELLATION_POINTS is not set @@ -1160,6 +1163,7 @@ CONFIG_EXAMPLES_NSH=y # CONFIG_EXAMPLES_USBSERIAL is not set # CONFIG_EXAMPLES_WATCHDOG is not set # CONFIG_EXAMPLES_WEBSERVER is not set +# CONFIG_EXAMPLES_XBC_TEST is not set # # File System Utilities diff --git a/include/nuttx/net/sixlowpan.h b/include/nuttx/net/sixlowpan.h index 4887d255f0a..be7f9f1e366 100644 --- a/include/nuttx/net/sixlowpan.h +++ b/include/nuttx/net/sixlowpan.h @@ -50,8 +50,11 @@ ****************************************************************************/ #include + #include +#include + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -223,51 +226,66 @@ (((a)->u16[6]) == 0) && \ (((a)->u8[14]) == 0)) -/* Maximum size of an IEEE802.15.4 frame */ +/* This maximum size of an IEEE802.15.4 frame. Certain, non-standard + * devices may exceed this value, however. + */ -#define SIXLOWPAN_MAC_MAXFRAME 127 +#define SIXLOWPAN_MAC_STDFRAME 127 /**************************************************************************** * Public Types ****************************************************************************/ -/* The header for fragments +/* The device structure for IEEE802.15.4 MAC network device differs from the + * standard Ethernet MAC device structure. The main reason for this + * difference is that fragmentation must be supported. * - * NOTE: We do not define different structures for FRAG1 and FRAGN headers, - * which are different. For FRAG1, the offset field is just not used + * The IEEE802.15.4 MAC does not use the d_buf packet buffer directly. + * Rather, it uses a smaller frame buffer. The packet data is provided to + * the frame buffer each time that the IEEE802.15.4 MAC needs to send + * more data. + * + * This is accomplished by "inheriting" the standard 'struct net_driver_s' + * and appending the frame buffer as well as other metadata needed to + * manage the fragmentation. 'struct ieee802154_driver_s' is cast + * compatible with 'struct net_driver_s' when CONFIG_NET_MULTINIC is not + * defined or when dev->d_lltype == NET_LL_IEEE802154. */ -struct sixlowpan_frag_hdr +struct ieee802154_driver_s { - uint16_t dispatch_size; - uint16_t tag; - uint8_t offset; -}; + /* This definitiona must appear first in the structure definition to + * assure cast compatibility. + */ -/* The HC1 header when HC_UDP is not used - * - * When all fields are compressed and HC_UDP is not used, we use this - * structure. If HC_UDP is used, the ttl is in another spot, and we use the - * sixlowpan_hc1_hc_udp structure - */ + struct net_driver_s i_dev; -struct sixlowpan_hc1hdr_s -{ - uint8_t dispatch; - uint8_t encoding; - uint8_t ttl; -}; + /* IEEE802.15.4 MAC-specific definitions follow. */ -/* HC1 followed by HC_UDP */ + /* The i_frame array is used to hold outgoing frame. When the + * IEEE802.15.4 device polls for new data, the outgoing frame containing + * the next fragment is placed in i_frame. + * + * The network will handle only a single outgong frame at a time. The + * IEEE802.15.4 MAC driver design may be concurrently sending and + * requesting new framesusing break-off fram buffers. That frame buffer + * management must be controlled by the IEEE802.15.4 MAC driver. + * + * Driver provied frame buffers should be 16-bit aligned. + */ -struct sixlowpan_hc1_hcudp_hdr_s -{ - uint8_t dispatch; - uint8_t hc1_encoding; - uint8_t hc_udp_encoding; - uint8_t ttl; - uint8_t ports; - uint16_t udpchksum; + FAR uint8_t *i_frame; + + /* The length of valid data in the i_frame buffer. + * + * When the network device driver calls the network input function, + * i_framelen should be set to zero. If there is frame to be sent + * by the network, i_framelen will be set to indicate the size of + * frame to be sent. The value zero means that there is no frame + * to be sent. + */ + + uint16_t i_framelen; }; /* The structure of a next header compressor. This compressor is provided diff --git a/net/netdev/netdev_register.c b/net/netdev/netdev_register.c index 9a3a01c66d2..4dda608c1ac 100644 --- a/net/netdev/netdev_register.c +++ b/net/netdev/netdev_register.c @@ -230,7 +230,7 @@ int netdev_register(FAR struct net_driver_s *dev, enum net_lltype_e lltype) #ifdef CONFIG_NET_6LOWPAN case NET_LL_IEEE802154: /* IEEE 802.15.4 MAC */ dev->d_llhdrlen = 0; /* REVISIT */ - dev->d_mtu = SIXLOWPAN_MAC_MAXFRAME; + dev->d_mtu = CONFIG_NET_6LOWPAN_FRAMELEN; #ifdef CONFIG_NET_TCP dev->d_recvwndo = CONFIG_NET_6LOWPAN_TCP_RECVWNDO; #endif diff --git a/net/sixlowpan/Kconfig b/net/sixlowpan/Kconfig index 1a3882d1ad3..84cb1c6652e 100644 --- a/net/sixlowpan/Kconfig +++ b/net/sixlowpan/Kconfig @@ -20,6 +20,14 @@ config NET_6LOWPAN_FRAG CONFIG_NET_6LOWPAN_FRAG specifies if 6lowpan fragmentation should be used or not. Fragmentation is on by default. +config NET_6LOWPAN_FRAMELEN + int "IEEE802.15.4 MAC Frame Length" + default 127 + range 127 999999 + ---help--- + Some wireless devices may use non-standard frame lengths. This + setting should never be smaller than 127. + choice prompt "6loWPAN Compression" default NET_6LOWPAN_COMPRESSION_HC06 diff --git a/net/sixlowpan/sixlowpan_send.c b/net/sixlowpan/sixlowpan_send.c index de338945975..b85c685f420 100644 --- a/net/sixlowpan/sixlowpan_send.c +++ b/net/sixlowpan/sixlowpan_send.c @@ -54,6 +54,7 @@ #ifdef CONFIG_NET_6LOWPAN + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -62,11 +63,20 @@ * Name: sixlowpan_send * * Description: - * Process an outgoing UDP or TCP packet. Called from UDP/TCP logic to - * determine if the the packet should be formatted for 6loWPAN output. + * Process an outgoing UDP or TCP packet. Takes an IP packet and formats + * it to be sent on an 802.15.4 network using 6lowpan. Called from common + * UDP/TCP send logic. + * + * The payload data is in the caller 'buf' and is of length 'len'. + * Compressed headers will be added and if necessary the packet is + * fragmented. The resulting packet/fragments are put in dev->d_buf and + * the first frame will be delivered to the 802.15.4 MAC. via ieee->i_frame. + * + * Input Parmeters: * * Input Parameters: - * dev - The IEEE802.15.4 MAC network driver interface. + * dev - The IEEE802.15.4 MAC network driver interface. + * raddr - The MAC address of the destination * * Returned Value: * Ok is returned on success; Othewise a negated errno value is returned. @@ -79,8 +89,10 @@ * ****************************************************************************/ -int sixlowpan_send(FAR struct net_driver_s *dev) +int sixlowpan_send(FAR struct net_driver_s *dev, net_ipv6addr_t raddr) { + FAR struct ieee802154_driver_s *ieee = (FAR struct ieee802154_driver_s *)dev; + net_lock(); /* REVISIT: To be provided */ net_unlock(); @@ -143,6 +155,7 @@ ssize_t psock_6lowpan_tcp_send(FAR struct socket *psock, FAR const void *buf, conn = (FAR struct tcp_conn_s *)psock->s_conn; DEBUGASSERT(conn != NULL); +#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) /* Ignore if not IPv6 domain */ if (conn->domain != PF_INET6) @@ -150,6 +163,7 @@ ssize_t psock_6lowpan_tcp_send(FAR struct socket *psock, FAR const void *buf, nwarn("WARNING: Not IPv6\n"); return (ssize_t)-EPROTOTYPE; } +#endif /* Route outgoing message to the correct device */ @@ -188,7 +202,7 @@ ssize_t psock_6lowpan_tcp_send(FAR struct socket *psock, FAR const void *buf, * packet. */ - ret = sixlowpan_send(dev); + ret = sixlowpan_send(dev, conn->u.ipv6.raddr); if (ret < 0) { nerr("ERROR: sixlowpan_send() failed: %d\n", ret); @@ -251,6 +265,7 @@ ssize_t psock_6lowpan_udp_send(FAR struct socket *psock, FAR const void *buf, conn = (FAR struct udp_conn_s *)psock->s_conn; DEBUGASSERT(conn != NULL); +#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6) /* Ignore if not IPv6 domain */ if (conn->domain != PF_INET6) @@ -258,6 +273,7 @@ ssize_t psock_6lowpan_udp_send(FAR struct socket *psock, FAR const void *buf, nwarn("WARNING: Not IPv6\n"); return (ssize_t)-EPROTOTYPE; } +#endif /* Route outgoing message to the correct device */ @@ -296,7 +312,7 @@ ssize_t psock_6lowpan_udp_send(FAR struct socket *psock, FAR const void *buf, * packet. */ - ret = sixlowpan_send(dev); + ret = sixlowpan_send(dev, conn->u.ipv6.raddr); if (ret < 0) { nerr("ERROR: sixlowpan_send() failed: %d\n", ret);