diff --git a/configs/sim/pf_ieee802154/defconfig b/configs/sim/pf_ieee802154/defconfig index a10f742ee19..9ed5a30ad51 100644 --- a/configs/sim/pf_ieee802154/defconfig +++ b/configs/sim/pf_ieee802154/defconfig @@ -2,7 +2,6 @@ # CONFIG_MMCSD_SPI is not set # CONFIG_NET_ETHERNET is not set # CONFIG_NET_IPv4 is not set -# CONFIG_NET_UDP_CHECKSUMS is not set # CONFIG_NSH_CMDOPT_DF_H is not set # CONFIG_SIM_NETDEV is not set CONFIG_ARCH_BOARD_SIM=y @@ -23,29 +22,10 @@ CONFIG_DEBUG_FEATURES=y CONFIG_DEBUG_SYMBOLS=y CONFIG_DISABLE_POLL=y CONFIG_DRIVERS_WIRELESS=y -CONFIG_EXAMPLES_NETTEST_DAEMON_STACKSIZE=4096 -CONFIG_EXAMPLES_NETTEST_LOOPBACK=y -CONFIG_EXAMPLES_NETTEST_SERVER_PORTNO=61616 -CONFIG_EXAMPLES_NETTEST_SERVERIPv6ADDR_1=0xfe80 -CONFIG_EXAMPLES_NETTEST_SERVERIPv6ADDR_6=0x00ff -CONFIG_EXAMPLES_NETTEST_SERVERIPv6ADDR_7=0xfe00 -CONFIG_EXAMPLES_NETTEST_SERVERIPv6ADDR_8=0xcda9 -CONFIG_EXAMPLES_NETTEST_STACKSIZE1=4096 -CONFIG_EXAMPLES_NETTEST=y CONFIG_EXAMPLES_NSH=y CONFIG_EXAMPLES_PFIEEE802154_STACKSIZE1=8192 CONFIG_EXAMPLES_PFIEEE802154_STACKSIZE2=8192 CONFIG_EXAMPLES_PFIEEE802154=y -CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_1=0xfe80 -CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_6=0x00ff -CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_7=0xfe00 -CONFIG_EXAMPLES_UDPBLASTER_HOSTIPv6_8=0x1034 -CONFIG_EXAMPLES_UDPBLASTER_STACKSIZE=8192 -CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_1=0xfe80 -CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_6=0x00ff -CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_7=0xfe00 -CONFIG_EXAMPLES_UDPBLASTER_TARGETIPv6_8=0xa9cd -CONFIG_EXAMPLES_UDPBLASTER=y CONFIG_EXPERIMENTAL=y CONFIG_FAT_LCNAMES=y CONFIG_FAT_LFN=y @@ -64,24 +44,13 @@ CONFIG_MTD_AT24XX=y CONFIG_MTD_AT25=y CONFIG_MTD_CONFIG=y CONFIG_MTD=y -CONFIG_NET_6LOWPAN_TCP_RECVWNDO=102 -CONFIG_NET_6LOWPAN=y -CONFIG_NET_BROADCAST=y CONFIG_NET_HOSTNAME="SAMV71-XULT" CONFIG_NET_IEEE802154=y -CONFIG_NET_IEEE802154_NCONNS=4 -CONFIG_NET_IPv6=y CONFIG_NET_SOCKOPTS=y CONFIG_NET_STATISTICS=y -CONFIG_NET_TCP_WRITE_BUFFERS=y -CONFIG_NET_TCP=y -CONFIG_NET_TCPBACKLOG=y -CONFIG_NET_UDP=y CONFIG_NET=y -CONFIG_NETDB_DNSCLIENT=y CONFIG_NETDEV_PHY_IOCTL=y CONFIG_NETDEV_STATISTICS=y -CONFIG_NETDEV_TELNET=y CONFIG_NETDEVICES=y CONFIG_NFILE_DESCRIPTORS=8 CONFIG_NFILE_STREAMS=8 diff --git a/include/nuttx/net/netdev.h b/include/nuttx/net/netdev.h index 5ab2058c685..ac30990ce05 100644 --- a/include/nuttx/net/netdev.h +++ b/include/nuttx/net/netdev.h @@ -182,7 +182,7 @@ struct netdev_statistics_s }; #endif -#ifdef CONFIG_NET_6LOWPAN +#if defined(CONFIG_NET_6LOWPAN) || defined(CONFIG_NET_IEEE802154) /* This structure is used to represent addresses of varying length. This * structure is used to represent the address assigned to a radio. */ @@ -236,7 +236,9 @@ struct net_driver_s uint16_t d_recvwndo; /* TCP receive window size */ #endif -#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) +#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) || \ + defined(CONFIG_NET_IEEE802154) + /* Link layer address */ union @@ -251,9 +253,9 @@ struct net_driver_s /* The address assigned to an IEEE 802.15.4 or generic packet radio. */ struct netdev_varaddr_s radio; -#endif /* CONFIG_NET_6LOWPAN */ +#endif /* CONFIG_NET_6LOWPAN || CONFIG_NET_IEEE802154 */ } d_mac; -#endif /* CONFIG_NET_ETHERNET || CONFIG_NET_6LOWPAN */ +#endif /* CONFIG_NET_ETHERNET || CONFIG_NET_6LOWPAN || CONFIG_NET_IEEE802154 */ /* Network identity */ diff --git a/include/nuttx/wireless/ieee802154/ieee802154_mac.h b/include/nuttx/wireless/ieee802154/ieee802154_mac.h index df17b3bcd1d..22e26bd07fb 100644 --- a/include/nuttx/wireless/ieee802154/ieee802154_mac.h +++ b/include/nuttx/wireless/ieee802154/ieee802154_mac.h @@ -51,7 +51,7 @@ #include #include -#ifdef CONFIG_NET_6LOWPAN +#if defined(CONFIG_NET_6LOWPAN) || defined(CONFIG_NET_IEEE802154) # include #endif @@ -1581,7 +1581,7 @@ union ieee802154_macarg_u /* To be determined */ /* MAC802154IOC_MLME_CALIBRATE_REQUEST */ }; -#ifdef CONFIG_NET_6LOWPAN +#if defined(CONFIG_NET_6LOWPAN) || defined(CONFIG_NET_IEEE802154) /* For the case of network IOCTLs, the network IOCTL to the MAC network * driver will include a device name like "wpan0" as the destination of * the IOCTL command. diff --git a/net/Kconfig b/net/Kconfig index 615cebee20f..48163d26bfa 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -108,7 +108,7 @@ config NET_GUARDSIZE endmenu # Driver buffer configuration -menu "Data link support" +menu "Link layer support" config NET_USER_DEVFMT bool "User provided devfmt" @@ -125,15 +125,10 @@ config NET_ETHERNET no need to define anything special in the configuration file to use Ethernet -- it is the default). -config NET_6LOWPAN - bool "6LoWPAN support" - default n - select NETDEV_IOCTL - select NET_HAVE_STAR - depends on NET_IPv6 - ---help--- - Enable support for Low power Wireless Personal Area Networking (6LoWPAN) - for IEEE 802.15.4 or other packet radios. +#menu "IEEE 802.15.4" +# depends on WIRELESS_IEEE802154 +# +#endmenu # IEEE 802.15.4 config NET_LOOPBACK bool "Local loopback" @@ -141,7 +136,7 @@ config NET_LOOPBACK ---help--- Add support for the local network loopback device, lo. -config NET_SLIP +menuconfig NET_SLIP bool "SLIP support" default n ---help--- @@ -186,7 +181,7 @@ config SLIP_DEFPRIO endif # NET_SLIP -config NET_TUN +menuconfig NET_TUN bool "TUN Virtual Network Device support" default n select ARCH_HAVE_NETDEV_STATISTICS @@ -262,13 +257,24 @@ config NET_IPv4 ---help--- Build in support for IPv4. -menuconfig NET_IPv6 +config NET_IPv6 bool "IPv6" default n ---help--- Build in support for IPv6. source "net/neighbor/Kconfig" + +menuconfig NET_6LOWPAN + bool "6LoWPAN support" + default n + select NETDEV_IOCTL + select NET_HAVE_STAR + depends on NET_IPv6 + ---help--- + Enable support for Low power Wireless Personal Area Networking (6LoWPAN) + for IEEE 802.15.4 or other packet radios. + source "net/sixlowpan/Kconfig" source "net/ipforward/Kconfig" diff --git a/net/ieee802154/Kconfig b/net/ieee802154/Kconfig index dd153ad7900..531677eeb53 100644 --- a/net/ieee802154/Kconfig +++ b/net/ieee802154/Kconfig @@ -8,7 +8,7 @@ menu "IEEE 802.15.4 socket support" config NET_IEEE802154 bool "IEEE 802.15.4 socket support" default n - depends on NET_IPv6 && WIRELESS_IEEE802154 + depends on WIRELESS_IEEE802154 select NETDEV_IOCTL ---help--- Enable support for raw, IEEE 802.15.4 sockets. diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h index 01f3540e13b..1daa61f48b1 100644 --- a/net/ieee802154/ieee802154.h +++ b/net/ieee802154/ieee802154.h @@ -76,9 +76,19 @@ #define IEEE802154_MAC_FCSSIZE 2 -/* This, then, is the usable size of the frame */ +/* This, then, is the usable size of the frame... + * REVISIT: Too many frame length definitions + */ -#define IEEE802154_FRAMELEN (CONFIG_NET_IEEE802154_FRAMELEN - IEEE802154_MAC_FCSSIZE) +#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) +# define IEEE802_MAX_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN +#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +# define IEEE802_MAX_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN +#else +# define IEEE802_MAX_FRAMELEN IEEE802154_MAC_STDFRAME +#endif + +#define IEEE802154_FRAMELEN (IEEE802_MAX_FRAMELEN - IEEE802154_MAC_FCSSIZE) /**************************************************************************** * Public Type Definitions diff --git a/net/netdev/netdev_register.c b/net/netdev/netdev_register.c index a87942e6481..2f9de8a3856 100644 --- a/net/netdev/netdev_register.c +++ b/net/netdev/netdev_register.c @@ -214,13 +214,15 @@ int netdev_register(FAR struct net_driver_s *dev, enum net_lltype_e lltype) break; #endif -#ifdef CONFIG_NET_6LOWPAN +#if defined(CONFIG_NET_6LOWPAN) || defined(CONFIG_NET_IEEE802154) case NET_LL_IEEE802154: /* IEEE 802.15.4 MAC */ case NET_LL_PKTRADIO: /* Non-IEEE 802.15.4 packet radio */ dev->d_llhdrlen = 0; +#ifdef CONFIG_NET_6LOWPAN dev->d_mtu = CONFIG_NET_6LOWPAN_MTU; #ifdef CONFIG_NET_TCP dev->d_recvwndo = CONFIG_NET_6LOWPAN_TCP_RECVWNDO; +#endif #endif devfmt = NETDEV_WPAN_FORMAT; break; diff --git a/net/sixlowpan/Kconfig b/net/sixlowpan/Kconfig index 1c3da1dc133..cf08eadaf39 100644 --- a/net/sixlowpan/Kconfig +++ b/net/sixlowpan/Kconfig @@ -3,8 +3,7 @@ # see the file kconfig-language.txt in the NuttX tools repository. # -menu "6LoWPAN Configuration" - depends on NET_6LOWPAN +if NET_6LOWPAN config NET_6LOWPAN_FRAG bool "6LoWPAN Fragmentation" @@ -13,15 +12,6 @@ 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 "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 non-standard frame lengths. - choice prompt "6LoWPAN Compression" default NET_6LOWPAN_COMPRESSION_HC06 @@ -200,4 +190,4 @@ config NET_6LOWPAN_DUMPBUFFER of the 6LoWPAN logic. This will generate a large volume of data if selected. -endmenu # 6LoWPAN Configuration +endif # NET_6LOWPAN diff --git a/wireless/ieee802154/Kconfig b/wireless/ieee802154/Kconfig index c5381c7afd3..cf96b166169 100644 --- a/wireless/ieee802154/Kconfig +++ b/wireless/ieee802154/Kconfig @@ -165,7 +165,7 @@ endif # IEEE802154_MACDEV config IEEE802154_NETDEV bool "IEEE802154 6LoWPAN Network Device" default n - depends on NET_6LOWPAN && NET_IPv6 + depends on NET_6LOWPAN || NET_IEEE802154 select ARCH_HAVE_NETDEV_STATISTICS ---help--- Add support for the IEEE802.15.4 6LoWPAN network device built on @@ -224,7 +224,7 @@ endif # IEEE802154_NETDEV config IEEE802154_LOOPBACK bool "IEEE802154 6LoWPAN Loopback" default n - depends on NET_6LOWPAN && NET_IPv6 + depends on NET_6LOWPAN || NET_IEEE802154 select ARCH_HAVE_NETDEV_STATISTICS ---help--- Add support for the IEEE802.15.4 6LoWPAN Loopback test device. diff --git a/wireless/ieee802154/mac802154_loopback.c b/wireless/ieee802154/mac802154_loopback.c index 86b5fd80b69..0c32c4c683d 100644 --- a/wireless/ieee802154/mac802154_loopback.c +++ b/wireless/ieee802154/mac802154_loopback.c @@ -80,6 +80,26 @@ # endif #endif +/* Preferred address size */ + +#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR +# define LO_ADDRSIZE IEEE802154_EADDRSIZE +#else +# define LO_ADDRSIZE IEEE802154_SADDRSIZE +#endif + +/* Frame size + * REVISIT: Too many frame length definitions + */ + +#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) +# define LO_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN +#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +# define LO_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN +#else +# define LO_FRAMELEN IEEE802154_MAX_PHY_PACKET_SIZE +#endif + /* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per second */ #define LO_WDDELAY (1*CLK_TCK) @@ -116,7 +136,9 @@ struct lo_driver_s ****************************************************************************/ static struct lo_driver_s g_loopback; +#ifdef CONFIG_NET_6LOWPAN static uint8_t g_iobuffer[CONFIG_NET_6LOWPAN_MTU + CONFIG_NET_GUARDSIZE]; +#endif static uint8_t g_eaddr[IEEE802154_EADDRSIZE] = { @@ -193,9 +215,10 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) { /* Set the MAC address as the eaddr */ - dev->d_mac.radio.nv_addrlen = NET_6LOWPAN_EADDRSIZE; + dev->d_mac.radio.nv_addrlen = IEEE802154_EADDRSIZE; IEEE802154_EADDRCOPY(dev->d_mac.radio.nv_addr, g_eaddr); +#ifdef CONFIG_NET_IPv6 /* Set the IP address based on the eaddr */ dev->d_ipv6addr[0] = HTONS(0xfe80); @@ -208,14 +231,16 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) dev->d_ipv6addr[7] = (uint16_t)g_eaddr[6] << 8 | (uint16_t)g_eaddr[7]; dev->d_ipv6addr[4] ^= 0x200; } +#endif #else static void lo_addr2ip(FAR struct net_driver_s *dev) { /* Set the MAC address as the saddr */ - dev->d_mac.radio.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + dev->d_mac.radio.nv_addrlen = IEEE802154_SADDRSIZE; IEEE802154_SADDRCOPY(dev->d_mac.radio.nv_addr, g_saddr); +#ifdef CONFIG_NET_IPv6 /* Set the IP address based on the saddr */ dev->d_ipv6addr[0] = HTONS(0xfe80); @@ -227,6 +252,7 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) dev->d_ipv6addr[6] = HTONS(0xfe00); dev->d_ipv6addr[7] = (uint16_t)g_saddr[0] << 8 | (uint16_t)g_saddr[1]; dev->d_ipv6addr[7] ^= 0x200; +#endif } #endif @@ -246,6 +272,7 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) static inline void lo_netmask(FAR struct net_driver_s *dev) { +#ifdef CONFIG_NET_IPv6 dev->d_ipv6netmask[0] = 0xffff; dev->d_ipv6netmask[1] = 0xffff; dev->d_ipv6netmask[2] = 0xffff; @@ -261,6 +288,7 @@ static inline void lo_netmask(FAR struct net_driver_s *dev) dev->d_ipv6netmask[6] = 0xffff; dev->d_ipv6netmask[7] = 0; #endif +#endif } /**************************************************************************** @@ -496,11 +524,11 @@ static int lo_ifup(FAR struct net_driver_s *dev) { FAR struct lo_driver_s *priv = (FAR struct lo_driver_s *)dev->d_private; +#ifdef CONFIG_NET_IPv6 ninfo("Bringing up: IPv6 %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", dev->d_ipv6addr[0], dev->d_ipv6addr[1], dev->d_ipv6addr[2], dev->d_ipv6addr[3], dev->d_ipv6addr[4], dev->d_ipv6addr[5], dev->d_ipv6addr[6], dev->d_ipv6addr[7]); - #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR ninfo(" Node: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x PANID=%02x:%02x\n", dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], @@ -513,6 +541,27 @@ static int lo_ifup(FAR struct net_driver_s *dev) dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], priv->lo_panid[0], priv->lo_panid[1]); #endif +#else + if (dev->d_mac.radio.nv_addrlen == 8) + { + ninfo("Bringing up: Node: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x PANID=%02x:%02x\n", + dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], + dev->d_mac.radio.nv_addr[2], dev->d_mac.radio.nv_addr[3], + dev->d_mac.radio.nv_addr[4], dev->d_mac.radio.nv_addr[5], + dev->d_mac.radio.nv_addr[6], dev->d_mac.radio.nv_addr[7], + priv->lo_panid[0], priv->lo_panid[1]); + } + else if (dev->d_mac.radio.nv_addrlen == 2) + { + ninfo("Bringing up: Node: %02x:%02x PANID=%02x:%02x\n", + dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], + priv->lo_panid[0], priv->lo_panid[1]); + } + else + { + nerr("ERROR: No address assigned\n"); + } +#endif /* Set and activate a timer process */ @@ -934,8 +983,8 @@ static int lo_properties(FAR struct radio_driver_s *netdev, /* General */ - properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ - properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ + properties->sp_addrlen = LO_ADDRSIZE; /* Length of an address */ + properties->sp_pktlen = LO_FRAMELEN; /* Fixed frame length */ /* Multicast address (uses broadcast address) * @@ -952,12 +1001,12 @@ static int lo_properties(FAR struct radio_driver_s *netdev, * (qualified by the destination PANID). */ - properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + properties->sp_mcast.nv_addrlen = IEEE802154_SADDRSIZE; memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN); /* Broadcast address */ - properties->sp_bcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + properties->sp_bcast.nv_addrlen = IEEE802154_SADDRSIZE; memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN); #ifdef CONFIG_NET_STARPOINT @@ -1015,7 +1064,9 @@ int ieee8021514_loopback(void) #ifdef CONFIG_NETDEV_IOCTL dev->d_ioctl = lo_ioctl; /* Handle network IOCTL commands */ #endif +#ifdef CONFIG_NET_6LOWPAN dev->d_buf = g_iobuffer; /* Attach the IO buffer */ +#endif dev->d_private = (FAR void *)priv; /* Used to recover private state from dev */ /* Set the network mask and advertise our MAC-based IP address */ diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c index 654b8020b0e..a47b50e75b9 100644 --- a/wireless/ieee802154/mac802154_netdev.c +++ b/wireless/ieee802154/mac802154_netdev.c @@ -64,7 +64,7 @@ #include "mac802154.h" -#ifdef CONFIG_NET_6LOWPAN +#if defined(CONFIG_NET_6LOWPAN) || defined(CONFIG_NET_IEEE802154) /**************************************************************************** * Pre-processor Definitions @@ -97,6 +97,26 @@ # define CONFIG_IEEE802154_NETDEV_NINTERFACES 1 #endif +/* Preferred address size */ + +#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR +# define MACNET_ADDRSIZE IEEE802154_EADDRSIZE +#else +# define MACNET_ADDRSIZE IEEE802154_SADDRSIZE +#endif + +/* Frame size + * REVISIT: Too many frame length definitions + */ + +#if defined(CONFIG_NET_6LOWPAN_FRAMELEN) +# define MACNET_FRAMELEN CONFIG_NET_6LOWPAN_FRAMELEN +#elif defined(CONFIG_NET_IEEE802154_FRAMELEN) +# define MACNET_FRAMELEN CONFIG_NET_IEEE802154_FRAMELEN +#else +# define MACNET_FRAMELEN IEEE802154_MAX_PHY_PACKET_SIZE +#endif + /* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per second */ #define TXPOLL_WDDELAY (1*CLK_TCK) @@ -252,8 +272,9 @@ static int macnet_advertise(FAR struct net_driver_s *dev) eaddr = arg.getreq.attrval.mac.eaddr; IEEE802154_EADDRCOPY(dev->d_mac.radio.nv_addr, eaddr); - dev->d_mac.radio.nv_addrlen = NET_6LOWPAN_EADDRSIZE; + dev->d_mac.radio.nv_addrlen = IEEE802154_EADDRSIZE; +#ifdef CONFIG_NET_IPv6 /* Set the IP address based on the eaddr */ dev->d_ipv6addr[0] = HTONS(0xfe80); @@ -265,6 +286,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev) dev->d_ipv6addr[6] = (uint16_t)eaddr[4] << 8 | (uint16_t)eaddr[5]; dev->d_ipv6addr[7] = (uint16_t)eaddr[6] << 8 | (uint16_t)eaddr[7]; dev->d_ipv6addr[4] ^= 0x200; +#endif return OK; } @@ -290,8 +312,9 @@ static int macnet_advertise(FAR struct net_driver_s *dev) saddr = arg.getreq.attrval.mac.saddr; IEEE802154_SADDRCOPY(dev->d_mac.radio.nv_addr, saddr); - dev->d_mac.radio.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + dev->d_mac.radio.nv_addrlen = IEEE802154_SADDRSIZE; +#ifdef CONFIG_NET_IPv6 /* Set the IP address based on the saddr */ dev->d_ipv6addr[0] = HTONS(0xfe80); @@ -303,6 +326,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev) dev->d_ipv6addr[6] = HTONS(0xfe00); dev->d_ipv6addr[7] = (uint16_t)saddr[0] << 8 | (uint16_t)saddr[1]; dev->d_ipv6addr[7] ^= 0x200; +#endif return OK; } #endif @@ -324,6 +348,7 @@ static int macnet_advertise(FAR struct net_driver_s *dev) static inline void macnet_netmask(FAR struct net_driver_s *dev) { +#ifdef CONFIG_NET_IPv6 dev->d_ipv6netmask[0] = 0xffff; dev->d_ipv6netmask[1] = 0xffff; dev->d_ipv6netmask[2] = 0xffff; @@ -339,6 +364,7 @@ static inline void macnet_netmask(FAR struct net_driver_s *dev) dev->d_ipv6netmask[6] = 0xffff; dev->d_ipv6netmask[7] = 0; #endif +#endif } /**************************************************************************** @@ -395,6 +421,7 @@ static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, (FAR struct macnet_callback_s *)maccb; FAR struct macnet_driver_s *priv; FAR struct iob_s *iob; + int ret; DEBUGASSERT(cb != NULL && cb->mc_priv != NULL); priv = cb->mc_priv; @@ -412,24 +439,6 @@ static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, DEBUGASSERT(priv != NULL && ind != NULL && ind->frame != NULL); iob = ind->frame; - /* If the frame is not a 6LoWPAN frame, then return an error. The first - * byte following the MAC head at the io_offset should be a valid IPHC - * header. - */ - - if ((iob->io_data[iob->io_offset] & SIXLOWPAN_DISPATCH_NALP_MASK) == - SIXLOWPAN_DISPATCH_NALP) - { - wlwarn("WARNING: Dropped... Not a 6LoWPAN frame: %02x\n", - iob->io_data[iob->io_offset]); - return -EINVAL; - } - - /* Increment statistics */ - - NETDEV_RXPACKETS(&priv->md_dev.r_dev); - NETDEV_RXIPV6(&priv->md_dev.r_dev); - /* Remove the IOB containing the frame. */ ind->frame = NULL; @@ -442,17 +451,40 @@ static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, * frame and return success. */ -#ifndef CONFIG_NET_6LOWPAN - (void)ieee802154_input(&priv->md_dev, iob, (FAR void *)ind); -#else - if (ieee802154_input(&priv->md_dev, iob, (FAR void *)ind) < 0) -#endif + ret = ieee802154_input(&priv->md_dev, iob, (FAR void *)ind); + if (ret < 0) #endif #ifdef CONFIG_NET_6LOWPAN { - (void)sixlowpan_input(&priv->md_dev, iob, (FAR void *)ind); + /* If the frame is not a 6LoWPAN frame, then return an error. The + * first byte following the MAC head at the io_offset should be a + * valid IPHC header. + */ + + if ((iob->io_data[iob->io_offset] & SIXLOWPAN_DISPATCH_NALP_MASK) == + SIXLOWPAN_DISPATCH_NALP) + { + wlwarn("WARNING: Dropped... Not a 6LoWPAN frame: %02x\n", + iob->io_data[iob->io_offset]); + ret = -EINVAL; + } + else + { + ret = sixlowpan_input(&priv->md_dev, iob, (FAR void *)ind); + } } + + if (ret < 0) #endif + { + ind->frame = iob; + return ret; + } + + /* Increment statistics */ + + NETDEV_RXPACKETS(&priv->md_dev.r_dev); + NETDEV_RXIPV6(&priv->md_dev.r_dev); /* sixlowpan_input() will free the IOB, but we must free the struct * ieee802154_data_ind_s container here. @@ -676,6 +708,7 @@ static int macnet_ifup(FAR struct net_driver_s *dev) ret = macnet_advertise(dev); if (ret >= 0) { +#ifdef CONFIG_NET_IPv6 wlinfo("Bringing up: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", dev->d_ipv6addr[0], dev->d_ipv6addr[1], dev->d_ipv6addr[2], dev->d_ipv6addr[3], dev->d_ipv6addr[4], dev->d_ipv6addr[5], @@ -691,6 +724,27 @@ static int macnet_ifup(FAR struct net_driver_s *dev) wlinfo(" Node: %02x:%02x\n", dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1]); #endif +#else + if (dev->d_mac.radio.nv_addrlen == 8) + { + ninfo("Bringing up: Node: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x PANID=%02x:%02x\n", + dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], + dev->d_mac.radio.nv_addr[2], dev->d_mac.radio.nv_addr[3], + dev->d_mac.radio.nv_addr[4], dev->d_mac.radio.nv_addr[5], + dev->d_mac.radio.nv_addr[6], dev->d_mac.radio.nv_addr[7], + priv->lo_panid[0], priv->lo_panid[1]); + } + else if (dev->d_mac.radio.nv_addrlen == 2) + { + ninfo("Bringing up: Node: %02x:%02x PANID=%02x:%02x\n", + dev->d_mac.radio.nv_addr[0], dev->d_mac.radio.nv_addr[1], + priv->lo_panid[0], priv->lo_panid[1]); + } + else + { + nerr("ERROR: No address assigned\n"); + } +#endif /* Set and activate a timer process */ @@ -1081,8 +1135,8 @@ static int macnet_properties(FAR struct radio_driver_s *netdev, /* General */ - properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ - properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ + properties->sp_addrlen = MACNET_ADDRSIZE; /* Length of an address */ + properties->sp_pktlen = MACNET_FRAMELEN; /* Fixed frame length */ /* Multicast address (uses broadcast address) * @@ -1099,12 +1153,12 @@ static int macnet_properties(FAR struct radio_driver_s *netdev, * (qualified by the destination PANID). */ - properties->sp_mcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + properties->sp_mcast.nv_addrlen = IEEE802154_SADDRSIZE; memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN); /* Broadcast address */ - properties->sp_bcast.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + properties->sp_bcast.nv_addrlen = IEEE802154_SADDRSIZE; memset(properties->sp_mcast.nv_addr, 0xff, RADIO_MAX_ADDRLEN); #ifdef CONFIG_NET_STARPOINT @@ -1116,10 +1170,10 @@ static int macnet_properties(FAR struct radio_driver_s *netdev, #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR (void)macnet_coord_eaddr(netdev, properties->sp_hubnode.nv_addr); - properties->sp_hubnode.nv_addrlen = NET_6LOWPAN_EADDRSIZE; + properties->sp_hubnode.nv_addrlen = IEEE802154_EADDRSIZE; #else (void)macnet_coord_saddr(netdev, properties->sp_hubnode.nv_addr); - properties->sp_hubnode.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + properties->sp_hubnode.nv_addrlen = IEEE802154_SADDRSIZE; #endif #endif @@ -1152,7 +1206,9 @@ int mac802154netdev_register(MACHANDLE mac) FAR struct radio_driver_s *radio; FAR struct net_driver_s *dev; FAR struct mac802154_maccb_s *maccb; +#ifdef CONFIG_NET_6LOWPAN FAR uint8_t *pktbuf; +#endif int ret; DEBUGASSERT(mac != NULL); @@ -1168,7 +1224,8 @@ int mac802154netdev_register(MACHANDLE mac) return -ENOMEM; } - /* Allocate a packet buffer (not used by this driver, but need by the +#ifdef CONFIG_NET_6LOWPAN + /* Allocate a packet buffer (not used by this driver, but needed by the * upper networking layer) */ @@ -1179,12 +1236,15 @@ int mac802154netdev_register(MACHANDLE mac) kmm_free(priv); return -ENOMEM; } +#endif /* Initialize the driver structure */ radio = &priv->md_dev; dev = &radio->r_dev; +#ifdef CONFIG_NET_6LOWPAN dev->d_buf = pktbuf; /* Single packet buffer */ +#endif dev->d_ifup = macnet_ifup; /* I/F up (new IP address) callback */ dev->d_ifdown = macnet_ifdown; /* I/F down callback */ dev->d_txavail = macnet_txavail; /* New TX data callback */ @@ -1237,7 +1297,9 @@ int mac802154netdev_register(MACHANDLE mac) /* Free memory and return the error */ +#ifdef CONFIG_NET_6LOWPAN kmm_free(pktbuf); +#endif kmm_free(priv); return ret; }