diff --git a/configs/b-l475e-iot01a/spirit-mac/defconfig b/configs/b-l475e-iot01a/spirit-mac/defconfig index 84b2f3bec22..327845271c1 100644 --- a/configs/b-l475e-iot01a/spirit-mac/defconfig +++ b/configs/b-l475e-iot01a/spirit-mac/defconfig @@ -19,12 +19,22 @@ CONFIG_FS_PROCFS=y CONFIG_HAVE_CXX=y CONFIG_HAVE_CXXINITIALIZE=y CONFIG_INTELHEX_BINARY=y +CONFIG_IOB_BUFSIZE=96 +CONFIG_IOB_NBUFFERS=32 +CONFIG_IOB_NCHAINS=8 +CONFIG_IOB_THROTTLE=0 CONFIG_LIBM=y CONFIG_MAX_TASKS=16 CONFIG_MAX_WDOGPARMS=2 CONFIG_MM_REGIONS=2 CONFIG_NET_6LOWPAN=y +CONFIG_NET_6LOWPAN_FRAMELEN=96 +CONFIG_NET_BROADCAST=y +CONFIG_NET_ICMPv6=y CONFIG_NET_IPv6=y +CONFIG_NET_TCP_WRITE_BUFFERS=y +CONFIG_NET_TCP=y +CONFIG_NET_UDP=y CONFIG_NET=y CONFIG_NETDEV_LATEINIT=y CONFIG_NETDEVICES=y diff --git a/drivers/wireless/ieee802154/mrf24j40/mrf24j40_getset.c b/drivers/wireless/ieee802154/mrf24j40/mrf24j40_getset.c index b3c7406eb34..94d6eab52d6 100644 --- a/drivers/wireless/ieee802154/mrf24j40/mrf24j40_getset.c +++ b/drivers/wireless/ieee802154/mrf24j40/mrf24j40_getset.c @@ -41,6 +41,7 @@ #include +#include #include #include diff --git a/drivers/wireless/spirit/drivers/spirit_netdev.c b/drivers/wireless/spirit/drivers/spirit_netdev.c index 6693db39f54..953d30439ec 100644 --- a/drivers/wireless/spirit/drivers/spirit_netdev.c +++ b/drivers/wireless/spirit/drivers/spirit_netdev.c @@ -129,10 +129,10 @@ struct spirit_driver_s struct sixlowpan_driver_s radio; /* Interface understood by the network */ struct spirit_library_s spirit; /* Spirit library state */ FAR const struct spirit_lower_s *lower; /* Low-level MCU-specific support */ - FAR struct iob_s *txhead; /* Head of pending TX transfers */ - FAR struct iob_s *txtail; /* Tail of pending TX transfers */ - FAR struct iob_s *rxhead; /* Head of completed RX transfers */ - FAR struct iob_s *rxtail; /* Tail of completed RX transfers */ + FAR struct pktradio_metadata_s *txhead; /* Head of pending TX transfers */ + FAR struct pktradio_metadata_s *txtail; /* Tail of pending TX transfers */ + FAR struct pktradio_metadata_s *rxhead; /* Head of completed RX transfers */ + FAR struct pktradio_metadata_s *rxtail; /* Tail of completed RX transfers */ struct work_s hpwork; /* Interrupt continuation work queue support */ struct work_s lpwork; /* Net poll work queue support */ WDOG_ID txpoll; /* TX poll timer */ @@ -189,26 +189,24 @@ static int spirit_ifdown(FAR struct net_driver_s *dev); static void spirit_txavail_work(FAR void *arg); static int spirit_txavail(FAR struct net_driver_s *dev); -#if defined(CONFIG_NET_IGMP) || defined(CONFIG_NET_ICMPv6) +#ifdef CONFIG_NET_IGMP static int spirit_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac); -#ifdef CONFIG_NET_IGMP static int spirit_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac); #endif -#ifdef CONFIG_NET_ICMPv6 -static void spirit_ipv6multicast(FAR struct spirit_driver_s *priv); -#endif -#endif + #ifdef CONFIG_NETDEV_IOCTL static int spirit_ioctl(FAR struct net_driver_s *dev, int cmd, unsigned long arg); #endif + static int spirit_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta); + FAR const void *meta); static int spirit_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist); + FAR const void *meta, FAR struct iob_s *framelist); +static int spirit_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties); /* Initialization */ @@ -458,6 +456,7 @@ errout_with_irqdisable: static int spirit_transmit(FAR struct spirit_driver_s *priv) { FAR struct spirit_library_s *spirit = &priv->spirit; + FAR struct pktradio_metadata_s *pktmeta; FAR struct iob_s *iob; int ret; @@ -468,16 +467,21 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv) spirit_lock(priv); while (priv->txhead != NULL && priv->state == DRIVER_STATE_IDLE) { - /* Remove the IOB from the head of the TX queue */ + /* Remove the contained IOB from the head of the TX queue */ - iob = priv->txhead; - priv->txhead = iob->io_flink; + pktmeta = priv->txhead; + priv->txhead = pktmeta->pm_flink; if (priv->txhead == NULL) { priv->txtail = NULL; } + /* Remove the IOB from metadata container */ + + iob = pktmeta->pm_iob; + pktmeta->pm_iob = NULL; + DEBUGASSERT(iob != NULL); /* Checks if the payload length is supported */ @@ -518,14 +522,13 @@ static int spirit_transmit(FAR struct spirit_driver_s *priv) #ifndef CONFIG_SPIRIT_PROMISCOUS /* Set the destination address */ -#warning Missing logic -#if 0 - ret = spirit_pktcommon_set_txdestaddr(spirit, txdestaddr); + DEBUGASSERT(pktmeta->pm_dest.pa_addrlen == 1); + ret = spirit_pktcommon_set_txdestaddr(spirit, + pktmeta->pm_dest.pa_addr[0]); if (ret < 0) { goto errout_with_iob; } -#endif #endif /* Enable CSMA */ @@ -678,13 +681,65 @@ static int spirit_txpoll_callback(FAR struct net_driver_s *dev) static void sprit_receive_work(FAR void *arg) { FAR struct spirit_driver_s *priv = (FAR struct spirit_driver_s *)arg; + FAR struct pktradio_metadata_s *pktmeta; + FAR struct iob_s *iob; + int ret; DEBUGASSERT(priv != NULL); - net_lock(); -#warning Missing logic - //spirit_receive(priv); - net_unlock(); + /* We need to have exclusive access to the RX queue */ + + spirit_lock(priv); + while (priv->rxhead != NULL) + { + /* Remove the contained IOB from the RX queue */ + + pktmeta = priv->rxhead; + priv->rxhead = pktmeta->pm_flink; + pktmeta->pm_flink = NULL; + + /* Did the RX queue become empty? */ + + if (priv->rxhead == NULL) + { + priv->rxtail = NULL; + } + + spirit_unlock(priv); + + /* Remove the IOB from the container */ + + iob = pktmeta->pm_iob; + pktmeta->pm_iob = NULL; + + /* Send the next frame to the network */ + + wlinfo("Send frame %p to the network: Offset=%u Length=%u\n", + iob, iob->io_offset, iob->io_len); + + net_lock(); + ret = sixlowpan_input(&priv->radio, iob, (FAR void *)pktmeta); + if (ret < 0) + { + nerr("ERROR: sixlowpan_input returned %d\n", ret); + NETDEV_RXERRORS(&priv->radio.r_dev); + NETDEV_ERRORS(&priv->radio.r_dev); + } + + net_unlock(); + + /* sixlowpan_input() will free the IOB, but we must free the struct + * pktradio_metadata_s container here. + */ + + pktradio_metadata_free(pktmeta); + + /* Get exclusive access as needed at the top of the loop */ + + spirit_lock(priv); + } + + spirit_unlock(priv); } /**************************************************************************** @@ -747,6 +802,7 @@ static void spirit_interrupt_work(FAR void *arg) priv->state = DRIVER_STATE_IDLE; NETDEV_RXERRORS(&priv->radio.r_dev); + NETDEV_ERRORS(&priv->radio.r_dev); /* Send any pending packets */ @@ -761,6 +817,7 @@ static void spirit_interrupt_work(FAR void *arg) priv->state = DRIVER_STATE_IDLE; NETDEV_TXERRORS(&priv->radio.r_dev); + NETDEV_ERRORS(&priv->radio.r_dev); /* Send any pending packets */ @@ -810,9 +867,12 @@ static void spirit_interrupt_work(FAR void *arg) if (irqstatus.IRQ_RX_DATA_READY != 0) { + FAR struct pktradio_metadata_s *pktmeta; FAR struct iob_s *iob; uint8_t count; + NETDEV_RXPACKETS(&priv->radio.r_dev); + /* Check the packet size */ count = spirit_fifo_get_rxcount(spirit); @@ -821,10 +881,7 @@ static void spirit_interrupt_work(FAR void *arg) wlwarn("WARNING: Packet too large... dropping\n"); DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO)); priv->state = DRIVER_STATE_IDLE; - - /* Send any pending packets */ - - spirit_schedule_transmit_work(priv); + NETDEV_RXDROPPED(&priv->radio.r_dev); } else { @@ -836,7 +893,7 @@ static void spirit_interrupt_work(FAR void *arg) iob = iob_alloc(0); if (iob == NULL) { - wlerr("ERROR: Packet too large... dropping\n"); + wlerr("ERROR: Failed to allocate IOB... dropping\n"); DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO)); priv->state = DRIVER_STATE_IDLE; @@ -848,42 +905,67 @@ static void spirit_interrupt_work(FAR void *arg) } else { - /* Read the packet into the I/O buffer */ DEBUGVERIFY(spirit_fifo_read(spirit, iob->io_data, count)); - iob->io_len = spirit_pktbasic_get_rxpktlen(spirit); + iob->io_len = spirit_pktbasic_get_rxpktlen(spirit); + iob->io_offset = 0; + iob->io_pktlen = iob->io_len; + iob->io_flink = NULL; DEBUGVERIFY(spirit_command(spirit, CMD_FLUSHRXFIFO)); priv->state = DRIVER_STATE_IDLE; - NETDEV_RXPACKETS(&priv->radio.r_dev); - - /* Add the IO buffer to the tail of the completed RX transfers */ - - iob->io_flink = priv->rxtail; - priv->rxtail = iob; - - if (priv->rxhead == NULL) - { - priv->rxhead = iob; - } - /* Create the packet meta data and forward to the network. This * must be done on the LP work queue with the network lockes. */ -#warning Missing logic - /* Forward the packet to the network. This must be done on the - * LP work queue with the network locked. - */ + pktmeta = pktradio_metadata_allocate(); + if (pktmeta == NULL) + { + wlerr("ERROR: Failed to allocate metadata... dropping\n"); + NETDEV_RXDROPPED(&priv->radio.r_dev); + iob_free(iob); + } + else + { + /* Get the packet meta data. This consists only of the + * source and destination addresses. + */ - spirit_schedule_receive_work(priv); + pktmeta->pm_iob = iob; - /* Try sending the next packet */ + pktmeta->pm_src.pa_addrlen = 1; + pktmeta->pm_src.pa_addr[0] = + spirit_pktcommon_get_rxsrcaddr(spirit); - spirit_schedule_transmit_work(priv); + pktmeta->pm_dest.pa_addrlen = 1; + pktmeta->pm_dest.pa_addr[0] = + spirit_pktcommon_get_rxsrcaddr(spirit); + + /* Add the contained IOB to the tail of the completed RX + * transfers. + */ + + pktmeta->pm_flink = priv->rxtail; + priv->rxtail = pktmeta; + + if (priv->rxhead == NULL) + { + priv->rxhead = pktmeta; + } + + /* Forward the packet to the network. This must be done + * on the LP work queue with the network locked. + */ + + spirit_schedule_receive_work(priv); + } } + + /* Send any pending packets */ + + spirit_schedule_transmit_work(priv); } } @@ -1206,16 +1288,27 @@ static int spirit_ifup(FAR struct net_driver_s *dev) } #ifndef CONFIG_SPIRIT_PROMISCOUS - /* Instantiate the assigned node address */ + /* Has an address been assigned? If not, we will stick the default + * address which probably is not what you want. + */ -#warning Missing logic -#if 0 - ret = spirit_pktcommon_set_nodeaddress(spirit, node_address); - if (ret < 0) + if (dev->d_mac.sixlowpan.nv_addrlen != 0) { - goto error_with_ifalmostup; + /* Yes.. Instantiate the assigned node address */ + + DEBUGASSERT(dev->d_mac.sixlowpan.nv_addrlen == 1); + + ret = spirit_pktcommon_set_nodeaddress(spirit, + dev->d_mac.sixlowpan.nv_addr[0]); + if (ret < 0) + { + goto error_with_ifalmostup; + } + } + else + { + nwarn("WARNING: No address assigned\n"); } -#endif #endif /* Set and activate a timer process */ @@ -1429,7 +1522,7 @@ static int spirit_txavail(FAR struct net_driver_s *dev) * ****************************************************************************/ -#if defined(CONFIG_NET_IGMP) || defined(CONFIG_NET_ICMPv6) +#ifdef CONFIG_NET_IGMP static int spirit_addmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) { return -ENOSYS; @@ -1459,29 +1552,6 @@ static int spirit_rmmac(FAR struct net_driver_s *dev, FAR const uint8_t *mac) } #endif -/**************************************************************************** - * Name: spirit_ipv6multicast - * - * Description: - * Configure the IPv6 multicast MAC address. - * - * Parameters: - * priv - A reference to the private driver state structure - * - * Returned Value: - * OK on success; Negated errno on failure. - * - * Assumptions: - * - ****************************************************************************/ - -#ifdef CONFIG_NET_ICMPv6 -static void spirit_ipv6multicast(FAR struct spirit_driver_s *priv) -{ - return -ENOSYS; -} -#endif /* CONFIG_NET_ICMPv6 */ - /**************************************************************************** * Name: spirit_ioctl * @@ -1532,7 +1602,8 @@ static int spirit_ioctl(FAR struct net_driver_s *dev, int cmd, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * * Returned Value: * A non-negative MAC headeer length is returned on success; a negated @@ -1544,17 +1615,13 @@ static int spirit_ioctl(FAR struct net_driver_s *dev, int cmd, ****************************************************************************/ static int spirit_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta) + FAR const void *meta) { - FAR struct spirit_driver_s *priv; - DEBUGASSERT(netdev != NULL && netdev->r_dev.d_private != NULL && meta != NULL); - priv = (FAR struct spirit_driver_s *)netdev->r_dev.d_private; - spirit_lock(priv); -#warning Missing logic - spirit_unlock(priv); - return -ENOSYS; + /* There is no header on the Spirit radio payload */ + + return 0; } /**************************************************************************** @@ -1565,7 +1632,8 @@ static int spirit_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * framelist - Head of a list of frames to be transferred. * * Returned Value: @@ -1578,10 +1646,11 @@ static int spirit_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, ****************************************************************************/ static int spirit_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist) + FAR const void *meta, FAR struct iob_s *framelist) { FAR struct spirit_driver_s *priv; + FAR const struct pktradio_metadata_s *metain; + FAR struct pktradio_metadata_s *pktmeta; FAR struct iob_s *iob; wlinfo("Received framelist\n"); @@ -1590,6 +1659,7 @@ static int spirit_req_data(FAR struct sixlowpan_driver_s *netdev, priv = (FAR struct spirit_driver_s *)netdev->r_dev.d_private; DEBUGASSERT(meta != NULL && framelist != NULL); + metain = (FAR const struct pktradio_metadata_s *)meta; /* Add the incoming list of frames to the MAC's outgoing queue */ @@ -1605,17 +1675,46 @@ static int spirit_req_data(FAR struct sixlowpan_driver_s *netdev, framelist = iob->io_flink; iob->io_flink = NULL; - /* Apply the Spirit header to the frame */ -# warning Missing logic + /* Note that there is no header applied to the outgoing payload */ - /* Add the IOB to the queue of outgoing IOBs. */ + DEBUGASSERT(iob->io_offset == 0 && iob->io_len > 0); - iob->io_flink = priv->txtail; - priv->txtail = iob; + /* Allocate a metadata container to hold the IOB. This is just like + * the we got from the network, be we will copy it so that we can + * control the life of the container. + * + * REVISIT: To bad we cound not just simply allocate the structure + * on the network side. But that behavior is incompatible with how + * IEEE 802.15.4 works. + */ + + pktmeta = pktradio_metadata_allocate(); + if (pktmeta == NULL) + { + wlerr("ERROR: Failed to allocate metadata... dropping\n"); + NETDEV_RXDROPPED(&priv->radio.r_dev); + iob_free(iob); + continue; + } + + /* Save the IOB and addressing information in the newly allocated + * container. + */ + + memcpy(&pktmeta->pm_src, &metain->pm_src, + sizeof(struct pktradio_addr_s)); + memcpy(&pktmeta->pm_dest, &metain->pm_dest, + sizeof(struct pktradio_addr_s)); + pktmeta->pm_iob = iob; + + /* Add the IOB container to the queue of outgoing IOBs. */ + + pktmeta->pm_flink = priv->txtail; + priv->txtail = pktmeta; if (priv->txhead == NULL) { - priv->txhead = iob; + priv->txhead = pktmeta; } /* If there are no transmissions or receptions in progress, then start @@ -1629,6 +1728,35 @@ static int spirit_req_data(FAR struct sixlowpan_driver_s *netdev, return OK; } +/**************************************************************************** + * Name: spirit_properties + * + * Description: + * Different packet radios may have different properties. If there are + * multiple packet radios, then those properties have to be queried at + * run time. This information is provided to the 6LoWPAN network via the + * following structure. + * + * Input parameters: + * netdev - The network device to be queried + * properties - Location where radio properities will be returned. + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +static int spirit_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties) +{ + DEBUGASSERT(netdev != NULL && properties != NULL); + + properties->sp_addrlen = 1; /* Length of an address */ + properties->sp_pktlen = CONFIG_SPIRIT_PKTLEN; /* Fixed packet length */ + return OK; +} + /**************************************************************************** * Name: spirit_hw_initialize * @@ -1918,6 +2046,7 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi, radio = &priv->radio; radio->r_get_mhrlen = spirit_get_mhrlen; /* Get MAC header length */ radio->r_req_data = spirit_req_data; /* Enqueue frame for transmission */ + radio->r_properties = spirit_properties; /* Return radio properties */ /* Initialize the common network device fields */ diff --git a/drivers/wireless/spirit/lib/spirit_spi.c b/drivers/wireless/spirit/lib/spirit_spi.c index 604c77a569a..cb223783674 100644 --- a/drivers/wireless/spirit/lib/spirit_spi.c +++ b/drivers/wireless/spirit/lib/spirit_spi.c @@ -45,6 +45,7 @@ * Included Files ******************************************************************************/ +#include #include #include @@ -86,8 +87,8 @@ static void spirit_dump_buffer(FAR const uint8_t *buffer, unsigned int buflen) char outbuf[16*3 + 3]; /* 16 hex bytes + 2 space separator + NUL termination */ FAR char *ptr; unsigned int i; - unsigned int j: - unsigned int maxj: + unsigned int j; + unsigned int maxj; for (i = 0; i < buflen; i += 16) { @@ -100,18 +101,18 @@ static void spirit_dump_buffer(FAR const uint8_t *buffer, unsigned int buflen) ptr = outbuf; for (j = 0; j < maxj; j++) { - if (j = 8) + if (j == 8) { - *outbuf++ = ' '; - *outbuf++ = ' '; + *ptr++ = ' '; + *ptr++ = ' '; } - sprintf(outbuf, "%02x ", *buffer++); - outbuf += 3; + sprintf(ptr, "%02x ", *buffer++); + ptr += 3; } - *outbuf = '\0'; - wlinfo(" %s\n", outbuf) + *ptr = '\0'; + wlinfo(" %s\n", ptr); } } #endif diff --git a/include/nuttx/net/ieee802154.h b/include/nuttx/net/ieee802154.h deleted file mode 100644 index eba830024da..00000000000 --- a/include/nuttx/net/ieee802154.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** - * include/nuttx/net/ieee802154.h - * - * Copyright (C) 2017, Gregory Nutt, all rights reserved - * Author: Gregory Nutt - * - * Derives from Contiki: - * - * Copyright (c) 2008, Swedish Institute of Computer Science. - * All rights reserved. - * Authors: Adam Dunkels - * Nicolas Tsiftes - * Niclas Finne - * Mathilde Durvy - * Julien Abeille - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __INCLUDE_NUTTX_NET_IEEE802154_H -#define __INCLUDE_NUTTX_NET_IEEE802154_H - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include - -#ifdef CONFIG_NET_6LOWPAN - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/* By default, a 2-byte short address is used for the IEEE802.15.4 MAC - * device's link layer address. If CONFIG_NET_6LOWPAN_EXTENDEDADDR - * is selected, then an 8-byte extended address will be used. - */ - -#define NET_6LOWPAN_SADDRSIZE 2 -#define NET_6LOWPAN_EADDRSIZE 8 - -#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR -# define NET_6LOWPAN_ADDRSIZE NET_6LOWPAN_EADDRSIZE -#else -# define NET_6LOWPAN_ADDRSIZE NET_6LOWPAN_SADDRSIZE -#endif - -/* This maximum size of an IEEE802.15.4 frame. Certain, non-standard - * devices may exceed this value, however. - */ - -#define SIXLOWPAN_MAC_STDFRAME 127 - -/* Space for a two byte FCS must be reserved at the end of the frame */ - -#define SIXLOWPAN_MAC_FCSSIZE 2 - -/**************************************************************************** - * Public Types - ****************************************************************************/ - -/* IEEE 802.15.4 address representations */ - -struct sixlowpan_saddr_s -{ - uint8_t u8[NET_6LOWPAN_SADDRSIZE]; -}; - -struct sixlowpan_eaddr_s -{ - uint8_t u8[NET_6LOWPAN_EADDRSIZE]; -}; - -union sixlowpan_anyaddr_u -{ - struct sixlowpan_saddr_s saddr; - struct sixlowpan_eaddr_s eaddr; -}; - -struct sixlowpan_tagaddr_s -{ - bool extended; - union sixlowpan_anyaddr_u u; -}; - -/* Represents the configured address size */ - -struct sixlowpan_addr_s -{ - uint8_t u8[NET_6LOWPAN_ADDRSIZE]; -}; - -/**************************************************************************** - * Public Function Prototypes - ****************************************************************************/ - -#endif /* CONFIG_NET_6LOWPAN */ -#endif /* __INCLUDE_NUTTX_NET_IEEE802154_H */ diff --git a/include/nuttx/net/netdev.h b/include/nuttx/net/netdev.h index bb6c6883994..378e0d34bfd 100644 --- a/include/nuttx/net/netdev.h +++ b/include/nuttx/net/netdev.h @@ -63,14 +63,24 @@ # include #endif -#ifdef CONFIG_NET_6LOWPAN -# include -#endif - /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +/* Determine the largest possible address */ + +#if defined(CONFIG_WIRELESS_IEEE802154) && defined(CONFIG_WIRELESS_PKTRADIO) +# if CONFIG_PKTRADIO_ADDRLEN > 8 +# define RADIO_MAX_ADDRLEN CONFIG_PKTRADIO_ADDRLEN +# else +# define RADIO_MAX_ADDRLEN 8 +# endif +#elif defined(CONFIG_WIRELESS_IEEE802154) +# define RADIO_MAX_ADDRLEN 8 +#else /* if defined(CONFIG_WIRELESS_PKTRADIO) */ +# define RADIO_MAX_ADDRLEN CONFIG_PKTRADIO_ADDRLEN +#endif + /* Helper macros for network device statistics */ #ifdef CONFIG_NETDEV_STATISTICS @@ -172,6 +182,23 @@ struct netdev_statistics_s }; #endif +#ifdef CONFIG_NET_6LOWPAN +/* This structure is used to represent addresses of varying length. This + * structure is used to represent the address assigned to a radio. + */ + +struct netdev_maxaddr_s +{ + uint8_t nm_addr[RADIO_MAX_ADDRLEN]; +}; + +struct netdev_varaddr_s +{ + uint8_t nv_addrlen; + uint8_t nv_addr[RADIO_MAX_ADDRLEN]; +}; +#endif + /* This structure collects information that is specific to a specific network * interface driver. If the hardware platform supports only a single instance * of this structure. @@ -221,13 +248,14 @@ struct net_driver_s struct ether_addr ether; /* Device Ethernet MAC address */ #endif -#ifdef CONFIG_NET_6LOWPAN - /* The address assigned to an IEEE 802.15.4 radio. */ - struct sixlowpan_addr_s ieee802154; /* IEEE 802.15.4 Radio address */ -#endif +#ifdef CONFIG_NET_6LOWPAN + /* The address assigned to an IEEE 802.15.4 or generic packet radio. */ + + struct netdev_varaddr_s sixlowpan; +#endif /* CONFIG_NET_6LOWPAN */ } d_mac; -#endif +#endif /* CONFIG_NET_ETHERNET || CONFIG_NET_6LOWPAN */ /* Network identity */ @@ -438,11 +466,9 @@ int ipv6_input(FAR struct net_driver_s *dev); #ifdef CONFIG_NET_6LOWPAN struct sixlowpan_driver_s; /* See sixlowpan.h */ -struct ieee802154_data_ind_s; /* See ieee8021454_mac.h */ -struct iob_s; /* See iob.h */ +struct iob_s; /* See iob.h */ int sixlowpan_input(FAR struct sixlowpan_driver_s *ieee, - FAR struct iob_s *framelist, - FAR const struct ieee802154_data_ind_s *ind); + FAR struct iob_s *framelist, FAR const void *metadata); #endif /**************************************************************************** diff --git a/include/nuttx/net/sixlowpan.h b/include/nuttx/net/sixlowpan.h index 70c1f0b29b9..8c56f6cead8 100644 --- a/include/nuttx/net/sixlowpan.h +++ b/include/nuttx/net/sixlowpan.h @@ -57,7 +57,6 @@ #include #include #include -#include #ifdef CONFIG_NET_6LOWPAN @@ -233,6 +232,32 @@ #define SIXLOWPAN_FRAG1_HDR_LEN 4 #define SIXLOWPAN_FRAGN_HDR_LEN 5 +/* IEEE 802.15.4 Definitions ************************************************/ + +/* By default, a 2-byte short address is used for the IEEE802.15.4 MAC + * device's link layer address. If CONFIG_NET_6LOWPAN_EXTENDEDADDR + * is selected, then an 8-byte extended address will be used. + */ + +#define NET_6LOWPAN_SADDRSIZE 2 +#define NET_6LOWPAN_EADDRSIZE 8 + +#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR +# define NET_6LOWPAN_ADDRSIZE NET_6LOWPAN_EADDRSIZE +#else +# define NET_6LOWPAN_ADDRSIZE NET_6LOWPAN_SADDRSIZE +#endif + +/* This maximum size of an IEEE802.15.4 frame. Certain, non-standard + * devices may exceed this value, however. + */ + +#define SIXLOWPAN_MAC_STDFRAME 127 + +/* Space for a two byte FCS must be reserved at the end of the frame */ + +#define SIXLOWPAN_MAC_FCSSIZE 2 + /* Address compressibility test macros **************************************/ /* Check whether we can compress the IID in address 'a' to 16 bits. This is @@ -300,6 +325,18 @@ * Public Types ****************************************************************************/ +/* Different packet radios may have different properties. If there are + * multiple packet radios, then those properties have to be queried at + * run time. This information is provided to the 6LoWPAN network via the + * following structure. + */ + +struct sixlowpan_properties_s +{ + uint8_t sp_addrlen; /* Length of an address */ + uint8_t sp_pktlen; /* Fixed packet/frame size (up to 255) */ +}; + /* The device structure for radio network device differs from the standard * Ethernet MAC device structure. The main reason for this difference is * that fragmentation must be supported. @@ -365,9 +402,7 @@ * outgoing frames in the via a nested calle to the req_data() method. */ -struct ieee802154_frame_meta_s; /* Forward reference */ -struct ieee802154_data_ind_s; /* Forward reference */ -struct iob_s; /* Forward reference */ +struct iob_s; /* Forward reference */ struct sixlowpan_driver_s { @@ -447,7 +482,7 @@ struct sixlowpan_driver_s /* The source MAC address of the fragments being merged */ - struct sixlowpan_tagaddr_s r_fragsrc; + struct netdev_varaddr_s r_fragsrc; /* That time at which reassembly was started. If the elapsed time * exceeds CONFIG_NET_6LOWPAN_MAXAGE, then the reassembly will @@ -466,7 +501,8 @@ struct sixlowpan_driver_s * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to recreate the + * radio MAC header * * Returned Value: * A non-negative MAC headeer length is returned on success; a negated @@ -475,7 +511,7 @@ struct sixlowpan_driver_s **************************************************************************/ CODE int (*r_get_mhrlen)(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta); + FAR const void *meta); /************************************************************************** * Name: r_req_data @@ -484,8 +520,9 @@ struct sixlowpan_driver_s * Requests the transfer of a list of frames to the MAC. * * Input parameters: - * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * netdev - The network device that will mediate the MAC interface + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * framelist - Head of a list of frames to be transferred. * * Returned Value: @@ -495,8 +532,29 @@ struct sixlowpan_driver_s **************************************************************************/ CODE int (*r_req_data)(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist); + FAR const void *meta, FAR struct iob_s *framelist); + + /************************************************************************** + * Name: r_properties + * + * Description: + * Different packet radios may have different properties. If there are + * multiple packet radios, then those properties have to be queried at + * run time. This information is provided to the 6LoWPAN network via the + * following structure. + * + * Input parameters: + * netdev - The network device to be queried + * properties - Location where radio properities will be returned. + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on + * any failure. + * + **************************************************************************/ + + CODE int (*r_properties)(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties); }; /**************************************************************************** @@ -554,9 +612,15 @@ struct sixlowpan_driver_s * framelist - The head of an incoming list of frames. Normally this * would be a single frame. A list may be provided if * appropriate, however. - * ind - Meta data characterizing the received packet. If there are - * multilple frames in the list, this meta data must apply to - * all of the frames! + * metadata - Meta data characterizing the received packet. The specific + * type of this metadata is obfuscated and depends on the + * type of the radio driver. This could be be either + * (1) struct ieee802154_data_ind_s for an IEEE 802.15.4 + * radio, or (2) struct pktradio_metadata_s for a non-standard + * packet radio. + * + * If there are multilple frames in the list, this metadata + * must apply to all of the frames in the list. * * Returned Value: * Ok is returned on success; Othewise a negated errno value is returned. @@ -564,8 +628,7 @@ struct sixlowpan_driver_s ****************************************************************************/ int sixlowpan_input(FAR struct sixlowpan_driver_s *radio, - FAR struct iob_s *framelist, - FAR const struct ieee802154_data_ind_s *ind); + FAR struct iob_s *framelist, FAR const void *metadata); #endif /* CONFIG_NET_6LOWPAN */ #endif /* __INCLUDE_NUTTX_NET_SIXLOWPAN_H */ diff --git a/include/nuttx/wireless/ieee802154/ieee802154_loopback.h b/include/nuttx/wireless/ieee802154/ieee802154_loopback.h index 9a5f3e6b3ee..bd78d5d97c1 100644 --- a/include/nuttx/wireless/ieee802154/ieee802154_loopback.h +++ b/include/nuttx/wireless/ieee802154/ieee802154_loopback.h @@ -1,5 +1,5 @@ /**************************************************************************** - * include/nuttx/net/ieee802154.h + * include/nuttx/net/ieee802154_loopback.h * * Copyright (C) 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt diff --git a/include/nuttx/wireless/pktradio.h b/include/nuttx/wireless/pktradio.h index 90402263aa9..e830e3e65c8 100644 --- a/include/nuttx/wireless/pktradio.h +++ b/include/nuttx/wireless/pktradio.h @@ -45,6 +45,8 @@ #include +#ifdef CONFIG_WIRELESS_PKTRADIO + /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -58,6 +60,8 @@ * Public Types ****************************************************************************/ +struct iob_s; /* Forward reference */ + /* This describes an address used by the packet radio. There is no standard * size for such an address. Hence, it is represented simply as a arry of * bytes. @@ -78,21 +82,10 @@ struct pktradio_metadata_s struct pktradio_metadata_s *pm_flink; /* Supports a singly linked list */ struct pktradio_addr_s pm_src; /* Source of the packet */ struct pktradio_addr_s pm_dest; /* Destination of the packet */ + FAR struct iob_s *pm_iob; /* Contained IOB */ uint8_t pm_pool; /* See PKTRADIO_POOL_* definitions */ }; -/* Different packet radios may have different properties. If there are - * multiple packet radios, then those properties have to be queried at - * run time. This information is provided to the 6LoWPAN network via the - * following structure. - */ - -struct pktradio_properties_s -{ - uint8_t pp_addrlen; /* Length of an address */ - uint8_t pp_pktlen; /* Fixed packet/frame size (up to 255) */ -}; - /**************************************************************************** * Public Data ****************************************************************************/ @@ -166,4 +159,5 @@ FAR struct pktradio_metadata_s *pktradio_metadata_allocate(void); void pktradio_metadata_free(FAR struct pktradio_metadata_s *metadata); +#endif /* CONFIG_WIRELESS_PKTRADIO */ #endif /* __INCLUDE_NUTTX_WIRELESS_PKTRADIO_H */ diff --git a/net/Kconfig b/net/Kconfig index dee46314ef7..f26423ac68c 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -136,6 +136,7 @@ config NET_6LOWPAN default n select NETDEV_MULTINIC if NET_ETHERNET || NET_LOOPBACK || NET_SLIP || NET_TUN select NET_MULTILINK if NET_ETHERNET || NET_LOOPBACK || NET_SLIP || NET_TUN + select NET_MULTILINK if WIRELESS_IEEE802 && WIRELESS_PKTRADIO select NETDEV_IOCTL select NET_HAVE_STAR depends on NET_IPv6 diff --git a/net/devif/ipv6_input.c b/net/devif/ipv6_input.c index 77f60e7375a..81ed9673386 100644 --- a/net/devif/ipv6_input.c +++ b/net/devif/ipv6_input.c @@ -383,6 +383,7 @@ int ipv6_input(FAR struct net_driver_s *dev) /* Not destined for us and not forwardable... drop the packet. */ nwarn("WARNING: Not destined for us; not forwardable... Dropping!\n"); + #ifdef CONFIG_NET_STATISTICS g_netstats.ipv6.drop++; #endif diff --git a/net/neighbor/neighbor.h b/net/neighbor/neighbor.h index bf9a3839d26..5720517fd05 100644 --- a/net/neighbor/neighbor.h +++ b/net/neighbor/neighbor.h @@ -51,7 +51,8 @@ #include #include -#include +#include +#include #ifdef CONFIG_NET_IPv6 @@ -73,17 +74,18 @@ struct neighbor_addr_s { +#ifdef CONFIG_NET_MULTILINK + uint8_t na_lltype; +#endif + uint8_t na_llsize; + union { -#ifdef CONFIG_NET_MULTILINK - uint8_t na_lltype; -#endif - #ifdef CONFIG_NET_ETHERNET - struct ether_addr na_ethernet; + struct ether_addr na_ethernet; #endif #ifdef CONFIG_NET_6LOWPAN - struct sixlowpan_addr_s na_sixlowpan; + struct netdev_maxaddr_s na_sixlowpan; #endif } u; }; diff --git a/net/neighbor/neighbor_add.c b/net/neighbor/neighbor_add.c index 11e67ef5680..4ca80c627d8 100644 --- a/net/neighbor/neighbor_add.c +++ b/net/neighbor/neighbor_add.c @@ -97,7 +97,7 @@ void neighbor_add(FAR net_ipv6addr_t ipaddr, uint8_t lltype, } #ifdef CONFIG_NET_MULTILINK - if (g_neighbors[i].ne_addr.u.na_lltype == lltype && + if (g_neighbors[i].ne_addr.na_lltype == lltype && net_ipv6addr_cmp(g_neighbors[i].ne_ipaddr, ipaddr)) #else if (net_ipv6addr_cmp(g_neighbors[i].ne_ipaddr, ipaddr)) @@ -122,9 +122,12 @@ void neighbor_add(FAR net_ipv6addr_t ipaddr, uint8_t lltype, net_ipv6addr_copy(g_neighbors[oldest_ndx].ne_ipaddr, ipaddr); #ifdef CONFIG_NET_MULTILINK - g_neighbors[oldest_ndx].ne_addr.u.na_lltype = lltype; + g_neighbors[oldest_ndx].ne_addr.na_lltype = lltype; #endif - memcpy(&g_neighbors[oldest_ndx].ne_addr.u, addr, netdev_type_lladdrsize(lltype)); + g_neighbors[oldest_ndx].ne_addr.na_llsize = netdev_type_lladdrsize(lltype); + + memcpy(&g_neighbors[oldest_ndx].ne_addr.u, addr, + g_neighbors[oldest_ndx].ne_addr.na_llsize); /* Dump the contents of the new entry */ diff --git a/net/neighbor/neighbor_dumpentry.c b/net/neighbor/neighbor_dumpentry.c index 78369f09172..6d730f17339 100644 --- a/net/neighbor/neighbor_dumpentry.c +++ b/net/neighbor/neighbor_dumpentry.c @@ -37,6 +37,7 @@ #include +#include #include #include @@ -45,6 +46,69 @@ #ifdef CONFIG_DEBUG_NET_INFO +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/****************************************************************************** + * Name: neibhbor_dump_address + * + * Description: + * Dump a data buffer to the SYSLOG. + * + * Parameters: + * buffer - The buffer to be dumped + * buflen - The length of the buffer in bytes. + * + * Returned Value: + * None + * + ******************************************************************************/ + +static void neibhbor_dump_address(FAR const uint8_t *buffer, unsigned int buflen) +{ + char outbuf[16*3 + 9]; /* 6-byte header header + 16 hex bytes + + * 2 space separator + NUL termination */ + FAR char *ptr; + unsigned int i; + unsigned int j; + unsigned int maxj; + + for (i = 0; i < buflen; i += 16) + { + if (i == 0) + { + ninfo(" at: "); + } + else + { + ninfo(" "); + } + + maxj = 16; + if (i + maxj > buflen) + { + maxj = buflen - i; + } + + ptr = outbuf; + for (j = 0; j < maxj; j++) + { + if (j == 8) + { + *ptr++ = ' '; + *ptr++ = ' '; + } + + sprintf(ptr, "%02x ", *buffer++); + ptr += 3; + } + + *ptr = '\0'; + wlinfo(" %s\n", ptr); + } +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -79,37 +143,20 @@ void neighbor_dumpentry(FAR const char *msg, if (neighbor->ne_addr.u.na_lltype == NET_LL_ETHERNET) #endif { - ninfo(" at: %02x:%02x:%02x:%02x:%02x:%02x\n", - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[0], - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[1], - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[2], - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[3], - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[4], - neighbor->ne_addr.u.na_ethernet.ether_addr_octet[5]); + neibhbor_dump_address(neighbor->ne_addr.u.na_ethernet.ether_addr_octet, + neighbor->ne_addr.na_llsize); } #endif + #ifdef CONFIG_NET_6LOWPAN #ifdef CONFIG_NET_ETHERNET else #endif { -#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR - ninfo(" at: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - neighbor->ne_addr.u.na_sixlowpan.u8[0], - neighbor->ne_addr.u.na_sixlowpan.u8[1], - neighbor->ne_addr.u.na_sixlowpan.u8[2], - neighbor->ne_addr.u.na_sixlowpan.u8[3], - neighbor->ne_addr.u.na_sixlowpan.u8[4], - neighbor->ne_addr.u.na_sixlowpan.u8[5], - neighbor->ne_addr.u.na_sixlowpan.u8[6], - neighbor->ne_addr.u.na_sixlowpan.u8[7]); -#else - ninfo(" at: %02x:%02x\n", - neighbor->ne_addr.u.na_sixlowpan.u8[0], - neighbor->ne_addr.u.na_sixlowpan.u8[1]); + neibhbor_dump_address(neighbor->ne_addr.u.na_sixlowpan.nm_addr, + neighbor->ne_addr.na_llsize); } -#endif -#endif +#endif /* CONFIG_NET_6LOWPAN */ } /**************************************************************************** diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index 4868c6674bb..46d001a7296 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -763,14 +763,17 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd, #ifdef CONFIG_NET_6LOWPAN #ifdef CONFIG_NET_MULTILINK - if (dev->d_lltype == NET_LL_IEEE802154) + if (dev->d_lltype == NET_LL_IEEE802154 || + dev->d_lltype == NET_LL_PKTRADIO) #else if (true) #endif { - req->ifr_hwaddr.sa_family = AF_INETX; - memcpy(req->ifr_hwaddr.sa_data, - dev->d_mac.ieee802154.u8, NET_6LOWPAN_ADDRSIZE); + req->ifr_hwaddr.sa_family = AF_INETX; + memcpy(req->ifr_hwaddr.sa_data, + dev->d_mac.sixlowpan.nv_addr, + dev->d_mac.sixlowpan.nv_addrlen); + ret = OK; } else #endif @@ -802,14 +805,27 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd, #ifdef CONFIG_NET_6LOWPAN #ifdef CONFIG_NET_MULTILINK - if (dev->d_lltype == NET_LL_IEEE802154) + if (dev->d_lltype == NET_LL_IEEE802154 || + dev->d_lltype == NET_LL_PKTRADIO) #else if (true) #endif { - memcpy(dev->d_mac.ieee802154.u8, - req->ifr_hwaddr.sa_data, NET_6LOWPAN_ADDRSIZE); - ret = OK; + FAR struct sixlowpan_driver_s *radio; + struct sixlowpan_properties_s properties; + + /* Get the radio properties */ + + radio = (FAR struct sixlowpan_driver_s *)dev; + DEBUGASSERT(radio->r_properties != NULL); + + ret = radio->r_properties(radio, &properties); + if (ret >= 0) + { + dev->d_mac.sixlowpan.nv_addrlen = properties.sp_addrlen; + memcpy(dev->d_mac.sixlowpan.nv_addr, + req->ifr_hwaddr.sa_data, NET_6LOWPAN_ADDRSIZE); + } } else #endif diff --git a/net/netdev/netdev_lladdrsize.c b/net/netdev/netdev_lladdrsize.c index f3e69d39051..2f59bdae3f3 100644 --- a/net/netdev/netdev_lladdrsize.c +++ b/net/netdev/netdev_lladdrsize.c @@ -46,6 +46,7 @@ #include #include +#include #include "netdev/netdev.h" @@ -80,7 +81,9 @@ int netdev_type_lladdrsize(uint8_t lltype) } else #endif + #ifdef CONFIG_NET_6LOWPAN +#ifdef CONFIG_WIRELESS_IEEE802154 if (lltype == NET_LL_IEEE802154) { /* 6LoWPAN can be configured to use either extended or short @@ -94,7 +97,21 @@ int netdev_type_lladdrsize(uint8_t lltype) #endif } else -#endif +#endif /* CONFIG_WIRELESS_IEEE802154 */ + +#ifdef CONFIG_WIRELESS_PKTRADIO + if (lltype == NET_LL_PKTRADIO) + { + /* REVISIT: This may no be the correct size if there are multiple + * packet radios. In that case, it will be the maxim address size + * amongst all of the radios. + */ + + return CONFIG_PKTRADIO_ADDRLEN; + } + else +#endif /* CONFIG_WIRELESS_PKTRADIO */ +#endif /* CONFIG_NET_6LOWPAN */ { /* Either the link layer type associated with lltype has no address, * or support for that link layer type is not enabled. diff --git a/net/procfs/netdev_statistics.c b/net/procfs/netdev_statistics.c index 729a4fd5446..e0bb7136e02 100644 --- a/net/procfs/netdev_statistics.c +++ b/net/procfs/netdev_statistics.c @@ -162,15 +162,15 @@ static int netprocfs_linklayer(FAR struct netprocfs_file_s *netfile) "%s\tLink encap:6LoWPAN HWaddr " "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", dev->d_ifname, - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], - dev->d_mac.ieee802154.u8[2], dev->d_mac.ieee802154.u8[3], - dev->d_mac.ieee802154.u8[4], dev->d_mac.ieee802154.u8[5], - dev->d_mac.ieee802154.u8[6], dev->d_mac.ieee802154.u8[7]); + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], + dev->d_mac.sixlowpan.nv_addr[2], dev->d_mac.sixlowpan.nv_addr[3], + dev->d_mac.sixlowpan.nv_addr[4], dev->d_mac.sixlowpan.nv_addr[5], + dev->d_mac.sixlowpan.nv_addr[6], dev->d_mac.sixlowpan.nv_addr[7]); #else len += snprintf(&netfile->line[len], NET_LINELEN - len, "%s\tLink encap:6LoWPAN HWaddr %02x:%02x", dev->d_ifname, - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1]); + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1]); #endif } break; @@ -224,16 +224,16 @@ static int netprocfs_linklayer(FAR struct netprocfs_file_s *netfile) "%s\tLink encap:6LoWPAN HWaddr " "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x at %s\n", dev->d_ifname, - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], - dev->d_mac.ieee802154.u8[2], dev->d_mac.ieee802154.u8[3], - dev->d_mac.ieee802154.u8[4], dev->d_mac.ieee802154.u8[5], - dev->d_mac.ieee802154.u8[6], dev->d_mac.ieee802154.u8[7], + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], + dev->d_mac.sixlowpan.nv_addr[2], dev->d_mac.sixlowpan.nv_addr[3], + dev->d_mac.sixlowpan.nv_addr[4], dev->d_mac.sixlowpan.nv_addr[5], + dev->d_mac.sixlowpan.nv_addr[6], dev->d_mac.sixlowpan.nv_addr[7], status); #else len += snprintf(&netfile->line[len], NET_LINELEN - len, "%s\tLink encap:6LoWPAN HWaddr %02x:%02x at %s\n", dev->d_ifname, - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], status); #endif #elif defined(CONFIG_NET_LOOPBACK) diff --git a/net/sixlowpan/sixlowpan_framelist.c b/net/sixlowpan/sixlowpan_framelist.c index e083ae43662..98660833315 100644 --- a/net/sixlowpan/sixlowpan_framelist.c +++ b/net/sixlowpan/sixlowpan_framelist.c @@ -193,6 +193,147 @@ static uint16_t sixlowpan_protosize(FAR const struct ipv6_hdr_s *ipv6hdr, return protosize; } +/**************************************************************************** + * Name: sixlowpan_ieee802154_metadata + * + * Description: + * Create the meta data that describes the IEEE 802.15.4 MAC header. + * + * Input Parameters: + * radio - The radio network driver instance + * destmac - The IEEE802.15.4 MAC address of the destination + * meta - Location to return the final metadata. + * + * Returned value + * OK is returned on success; Othewise a negated errno value is returned. + * + ****************************************************************************/ + +#ifdef CONFIG_WIRELESS_IEEE802154 +static int sixlowpan_ieee802154_metadata(FAR struct sixlowpan_driver_s *radio, + FAR const struct netdev_varaddr_s *destmac, + FAR union sixlowpan_metadata_u *meta) +{ + struct ieee802_txmetadata_s pktmeta; + int ret; + + /* Reset frame meta data */ + + memset(&pktmeta, 0, sizeof(struct ieee802_txmetadata_s)); + pktmeta.xmits = CONFIG_NET_6LOWPAN_MAX_MACTRANSMITS; + + /* Set stream mode for all TCP packets, except FIN packets. */ + +#if 0 /* Currently the frame type is always data */ + if (ipv6->proto == IP_PROTO_TCP) + { + FAR const struct tcp_hdr_s *tcp = + &((FAR const struct ipv6tcp_hdr_s *)ipv6)->tcp; + + if ((tcp->flags & TCP_FIN) == 0 && + (tcp->flags & TCP_CTL) != TCP_ACK) + { + pktmeta.type = FRAME_ATTR_TYPE_STREAM; + } + else if ((tcp->flags & TCP_FIN) == TCP_FIN) + { + pktmeta.type = FRAME_ATTR_TYPE_STREAM_END; + } + } +#endif + + /* Set the source and destination address. The source MAC address + * is a fixed size, determined by a configuration setting. The + * destination MAC address many be either short or extended. + */ + +#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR + pktmeta.sextended = TRUE; + sixlowpan_eaddrcopy(pktmeta.source.nm_addr, + &radio->r_dev.d_mac.sixlowpan.nv_addr); +#else + sixlowpan_saddrcopy(pktmeta.source.nm_addr, + &radio->r_dev.d_mac.sixlowpan.nv_addr); +#endif + + /* Copy the destination node address into the meta data */ + + if (destmac->nv_addrlen == NET_6LOWPAN_EADDRSIZE) + { + pktmeta.dextended = TRUE; + sixlowpan_eaddrcopy(pktmeta.dest.nm_addr, destmac->nv_addr); + } + else + { + DEBUGASSERT(destmac->nv_addrlen == NET_6LOWPAN_SADDRSIZE); + sixlowpan_saddrcopy(pktmeta.dest.nm_addr, destmac->nv_addr); + } + + /* Get the destination PAN ID. + * + * REVISIT: For now I am assuming that the source and destination + * PAN IDs are the same. + */ + + (void)sixlowpan_src_panid(radio, pktmeta.dpanid); + + /* Based on the collected attributes and addresses, construct the MAC meta + * data structure that we need to interface with the IEEE802.15.4 MAC (we + * will update the MSDU payload size when the IOB has been setup). + */ + + ret = sixlowpan_meta_data(radio, &pktmeta, &meta->ieee802154, 0); + if (ret < 0) + { + nerr("ERROR: sixlowpan_meta_data() failed: %d\n", ret); + } + + return ret; +} +#endif + +/**************************************************************************** + * Name: sixlowpan_pktradio_metadata + * + * Description: + * Create the meta data that describes the MAC header for a generic radio. + * + * Input Parameters: + * radio - The radio network driver instance + * destmac - The radio-specific MAC address of the destination + * meta - Location to return the final metadata. + * + * Returned value + * OK is returned on success; Othewise a negated errno value is returned. + * + ****************************************************************************/ + +#ifdef CONFIG_WIRELESS_PKTRADIO +static int sixlowpan_pktradio_metadata(FAR struct sixlowpan_driver_s *radio, + FAR const struct netdev_varaddr_s *destmac, + FAR union sixlowpan_metadata_u *meta) +{ + FAR struct pktradio_metadata_s *pktmeta = &meta->pktradio; + + /* Reset the meta data */ + + memset(&pktmeta, 0, sizeof(struct pktradio_metadata_s)); + + /* Set the source address */ + + pktmeta->pm_src.pa_addrlen = radio->r_dev.d_mac.sixlowpan.nv_addrlen; + memcpy(pktmeta->pm_src.pa_addr, + radio->r_dev.d_mac.sixlowpan.nv_addr, + radio->r_dev.d_mac.sixlowpan.nv_addrlen); + + /* Set the destination address */ + + pktmeta->pm_dest.pa_addrlen = destmac->nv_addrlen; + memcpy(pktmeta->pm_dest.pa_addr, destmac->nv_addr, destmac->nv_addrlen); + return OK; +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -201,9 +342,9 @@ static uint16_t sixlowpan_protosize(FAR const struct ipv6_hdr_s *ipv6hdr, * Name: sixlowpan_queue_frames * * Description: - * Process an outgoing UDP or TCP packet. This function is called from - * send interrupt logic when a TX poll is received. It formats the - * list of frames to be sent by the IEEE802.15.4 MAC driver. + * Process an outgoing UDP, TCP, or ICMPv6 packet. This function is + * called from send interrupt logic when a TX poll is received. It + * formats the list of frames to be sent by the IEEE802.15.4 MAC driver. * * The payload data is in the caller 'buf' and is of length 'buflen'. * Compressed headers will be added and if necessary the packet is @@ -232,14 +373,13 @@ static uint16_t sixlowpan_protosize(FAR const struct ipv6_hdr_s *ipv6hdr, int sixlowpan_queue_frames(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, FAR const void *buf, size_t buflen, - FAR const struct sixlowpan_tagaddr_s *destmac) + FAR const struct netdev_varaddr_s *destmac) { - struct packet_metadata_s pktmeta; - struct ieee802154_frame_meta_s meta; + union sixlowpan_metadata_u meta; FAR struct iob_s *iob; FAR uint8_t *fptr; int framer_hdrlen; - struct sixlowpan_tagaddr_s bcastmac; + struct netdev_varaddr_s bcastmac; uint16_t pktlen; uint16_t paysize; #ifdef CONFIG_NET_6LOWPAN_FRAG @@ -258,38 +398,13 @@ int sixlowpan_queue_frames(FAR struct sixlowpan_driver_s *radio, g_frame_hdrlen = 0; protosize = 0; - /* Reset frame meta data */ - - memset(&pktmeta, 0, sizeof(struct packet_metadata_s)); - pktmeta.xmits = CONFIG_NET_6LOWPAN_MAX_MACTRANSMITS; - - /* Set stream mode for all TCP packets, except FIN packets. */ - -#if 0 /* Currently the frame type is always data */ - if (ipv6->proto == IP_PROTO_TCP) - { - FAR const struct tcp_hdr_s *tcp = - &((FAR const struct ipv6tcp_hdr_s *)ipv6)->tcp; - - if ((tcp->flags & TCP_FIN) == 0 && - (tcp->flags & TCP_CTL) != TCP_ACK) - { - pktmeta.type = FRAME_ATTR_TYPE_STREAM; - } - else if ((tcp->flags & TCP_FIN) == TCP_FIN) - { - pktmeta.type = FRAME_ATTR_TYPE_STREAM_END; - } - } -#endif - /* The destination address will be tagged to each outbound packet. If the * argument destmac is NULL, we are sending a broadcast packet. */ if (destmac == NULL) { - memset(&bcastmac, 0, sizeof(struct sixlowpan_tagaddr_s)); + memset(&bcastmac, 0, sizeof(struct netdev_varaddr_s)); destmac = &bcastmac; } @@ -310,50 +425,24 @@ int sixlowpan_queue_frames(FAR struct sixlowpan_driver_s *radio, ninfo("Sending packet length %d\n", buflen); - /* Set the source and destination address. The source MAC address - * is a fixed size, determined by a configuration setting. The - * destination MAC address many be either short or extended. - */ + /* Get the metadata that describes the MAC header on the packet */ -#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR - pktmeta.sextended = TRUE; - sixlowpan_eaddrcopy(pktmeta.source.eaddr.u8, - &radio->r_dev.d_mac.ieee802154); -#else - sixlowpan_saddrcopy(pktmeta.source.saddr.u8, - &radio->r_dev.d_mac.ieee802154); +#ifdef CONFIG_WIRELESS_IEEE802154 +#ifdef CONFIG_WIRELESS_PKTRADIO + if (radio->r_dev.d_lltype == NET_LL_IEEE802154) #endif - - /* Copy the destination node address into the meta data */ - - if (destmac->extended) { - pktmeta.dextended = TRUE; - sixlowpan_eaddrcopy(pktmeta.dest.eaddr.u8, destmac->u.eaddr.u8); + ret = sixlowpan_ieee802154_metadata(radio, destmac, &meta); } +#endif +#ifdef CONFIG_WIRELESS_PKTRADIO +#ifdef CONFIG_WIRELESS_IEEE802154 else +#endif { - sixlowpan_saddrcopy(pktmeta.dest.saddr.u8, destmac->u.saddr.u8); - } - - /* Get the destination PAN ID. - * - * REVISIT: For now I am assuming that the source and destination - * PAN IDs are the same. - */ - - (void)sixlowpan_src_panid(radio, pktmeta.dpanid); - - /* Based on the collected attributes and addresses, construct the MAC meta - * data structure that we need to interface with the IEEE802.15.4 MAC (we - * will update the MSDU payload size when the IOB has been setup). - */ - - ret = sixlowpan_meta_data(radio, &pktmeta, &meta, 0); - if (ret < 0) - { - nerr("ERROR: sixlowpan_meta_data() failed: %d\n", ret); + ret = sixlowpan_pktradio_metadata(radio, destmac, &meta); } +#endif /* Pre-calculate frame header length. */ diff --git a/net/sixlowpan/sixlowpan_framer.c b/net/sixlowpan/sixlowpan_framer.c index b602e619ac0..4c681a4e8cc 100644 --- a/net/sixlowpan/sixlowpan_framer.c +++ b/net/sixlowpan/sixlowpan_framer.c @@ -150,8 +150,9 @@ static inline bool sixlowpan_eaddrnull(FAR const uint8_t *eaddr) * ****************************************************************************/ +#ifdef CONFIG_WIRELESS_IEEE802154 int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, - FAR const struct packet_metadata_s *pktmeta, + FAR const struct ieee802_txmetadata_s *pktmeta, FAR struct ieee802154_frame_meta_s *meta, uint16_t paylen) { @@ -173,13 +174,13 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, { /* Extended destination address mode */ - rcvrnull = sixlowpan_eaddrnull(pktmeta->dest.eaddr.u8); + rcvrnull = sixlowpan_eaddrnull(pktmeta->dest.nm_addr); } else { /* Short destination address mode */ - rcvrnull = sixlowpan_saddrnull(pktmeta->dest.saddr.u8); + rcvrnull = sixlowpan_saddrnull(pktmeta->dest.nm_addr); } if (rcvrnull) @@ -206,14 +207,14 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, /* Extended destination address mode */ meta->destaddr.mode = IEEE802154_ADDRMODE_EXTENDED; - sixlowpan_eaddrcopy(&meta->destaddr.eaddr, pktmeta->dest.eaddr.u8); + sixlowpan_eaddrcopy(&meta->destaddr.eaddr, pktmeta->dest.nm_addr); } else { /* Short destination address mode */ meta->destaddr.mode = IEEE802154_ADDRMODE_SHORT; - sixlowpan_saddrcopy(&meta->destaddr.saddr, pktmeta->dest.saddr.u8); + sixlowpan_saddrcopy(&meta->destaddr.saddr, pktmeta->dest.nm_addr); } IEEE802154_SADDRCOPY(meta->destaddr.panid, pktmeta->dpanid); @@ -237,6 +238,7 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, return OK; } +#endif /**************************************************************************** * Name: sixlowpan_frame_hdrlen @@ -257,7 +259,7 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ int sixlowpan_frame_hdrlen(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_frame_meta_s *meta) + FAR const void *meta) { return radio->r_get_mhrlen(radio, meta); } @@ -283,8 +285,7 @@ int sixlowpan_frame_hdrlen(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ int sixlowpan_frame_submit(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *frame) + FAR const void *meta, FAR struct iob_s *frame) { return radio->r_req_data(radio, meta, frame); } diff --git a/net/sixlowpan/sixlowpan_hc06.c b/net/sixlowpan/sixlowpan_hc06.c index ac6a6866470..93bb4155988 100644 --- a/net/sixlowpan/sixlowpan_hc06.c +++ b/net/sixlowpan/sixlowpan_hc06.c @@ -135,7 +135,7 @@ static const uint16_t g_unc_ctxconf[] = 0x0000, 0x0088, 0x0082, 0x0180 }; -/* Uncompression of ctx-based +/* Uncompression of mx-based * * 0 -> 0 bits from packet * 1 -> 2 bytes from prefix - Bunch of zeroes 5 bytes from packet @@ -273,29 +273,41 @@ static uint8_t compress_ipaddr(FAR const net_ipv6addr_t ipaddr, uint8_t bitpos) } static uint8_t compress_tagaddr(FAR const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_tagaddr_s *macaddr, + FAR const struct netdev_varaddr_s *macaddr, uint8_t bitpos) { uint8_t tag; - ninfo("Compressing bitpos=%u extended=%u\n", bitpos, macaddr->extended); +#ifdef CONFIG_DEBUG_NET_INFO + ninfo("Compressing bitpos=%u addrlen=%u\n", bitpos, macaddr->nv_addrlen); ninfo(" ipaddr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3], ipaddr[4], ipaddr[5], ipaddr[6], ipaddr[7]); - if (macaddr->extended) + switch (macaddr->nv_addrlen) { - ninfo(" eaddr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - macaddr->u.eaddr.u8[0], macaddr->u.eaddr.u8[1], - macaddr->u.eaddr.u8[2], macaddr->u.eaddr.u8[3], - macaddr->u.eaddr.u8[4], macaddr->u.eaddr.u8[5], - macaddr->u.eaddr.u8[6], macaddr->u.eaddr.u8[7]); - } - else - { - ninfo(" saddr=%02x:%02x\n", - macaddr->u.saddr.u8[0], macaddr->u.saddr.u8[1]); + case 1: + ninfo(" addr=%02x\n", macaddr->nv_addr[0]); + break; + + case 2: + ninfo(" saddr=%02x:%02x\n", + macaddr->nv_addr[0], macaddr->nv_addr[1]); + break; + + case 8: + ninfo(" eaddr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + macaddr->nv_addr[0], macaddr->nv_addr[1], + macaddr->nv_addr[2], macaddr->nv_addr[3], + macaddr->nv_addr[4], macaddr->nv_addr[5], + macaddr->nv_addr[6], macaddr->nv_addr[7]); + break; + + default: + nerr("ERROR: Unsupported addrlen %u\n", macaddr->nv_addrlen); + break; } +#endif if (sixlowpan_ismacbased(ipaddr, macaddr)) { @@ -310,33 +322,48 @@ static uint8_t compress_tagaddr(FAR const net_ipv6addr_t ipaddr, return tag; } -static uint8_t compress_laddr(FAR const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_addr_s *macaddr, +static uint8_t compress_laddr(FAR const net_ipv6addr_t srcipaddr, + FAR const struct netdev_varaddr_s *macaddr, uint8_t bitpos) { uint8_t tag; +#ifdef CONFIG_DEBUG_NET_INFO ninfo("Compressing bitpos=%u\n", bitpos); - ninfo(" ipaddr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", - ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3], - ipaddr[4], ipaddr[5], ipaddr[6], ipaddr[7]); + ninfo(" srcipaddr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + srcipaddr[0], srcipaddr[1], srcipaddr[2], srcipaddr[3], + srcipaddr[4], srcipaddr[5], srcipaddr[6], srcipaddr[7]); -#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR - ninfo(" eaddr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - macaddr->u8[0], macaddr->u8[1], macaddr->u8[2], macaddr->u8[3], - macaddr->u8[4], macaddr->u8[5], macaddr->u8[6], macaddr->u8[7]); -#else - ninfo(" saddr=%02x:%02x\n", - macaddr->u8[0], macaddr->u8[1]); + switch (macaddr->nv_addrlen) + { + case 1: + ninfo(" addr=%02x\n", macaddr->nv_addr[0]); + break; + + case 2: + ninfo(" saddr=%02x:%02x\n", + macaddr->nv_addr[0], macaddr->nv_addr[1]); + break; + + case 8: + ninfo(" eaddr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + macaddr->nv_addr[0], macaddr->nv_addr[1], macaddr->nv_addr[2], + macaddr->nv_addr[3], macaddr->nv_addr[4], macaddr->nv_addr[5], + macaddr->nv_addr[6], macaddr->nv_addr[7]); + break; + + default: + ninfo(" Unsupported addrlen %u\n", macaddr->nv_addrlen); + } #endif - if (sixlowpan_isaddrbased(ipaddr, macaddr)) + if (sixlowpan_ismacbased(srcipaddr, macaddr)) { tag = (3 << bitpos); /* 0-bits */ } else { - tag = compress_ipaddr(ipaddr, bitpos); + tag = compress_ipaddr(srcipaddr, bitpos); } ninfo("Tag=%02x\n", tag); @@ -356,7 +383,7 @@ static uint8_t compress_laddr(FAR const net_ipv6addr_t ipaddr, * ****************************************************************************/ -static void uncompress_addr(FAR const struct ieee802154_addr_s *addr, +static void uncompress_addr(FAR const struct netdev_varaddr_s *addr, FAR const uint8_t *prefix, uint16_t prefpost, FAR net_ipv6addr_t ipaddr) { @@ -376,27 +403,24 @@ static void uncompress_addr(FAR const struct ieee802154_addr_s *addr, srcptr = g_hc06ptr; if (usemac) { - bool saddr = (addr->mode == IEEE802154_ADDRMODE_SHORT); - uint16_t addrsize = saddr ? NET_6LOWPAN_SADDRSIZE: NET_6LOWPAN_EADDRSIZE; - /* Select the source the address data */ - srcptr = saddr ? addr->saddr : addr->eaddr; + srcptr = addr->nv_addr; /* If the provided postcount is zero and we are taking data from the - * MAC address, set postcount to the address length. + * MAC address, set postcount to the full address length. */ if (postcount == 0) { - postcount = addrsize; + postcount = addr->nv_addrlen; } /* If we are converting the entire MAC address, then we need to some some * special bit operations. */ - fullmac = (postcount == addrsize); + fullmac = (postcount == addr->nv_addrlen); } /* Copy any prefix */ @@ -603,7 +627,7 @@ void sixlowpan_hc06_initialize(void) int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, - FAR const struct sixlowpan_tagaddr_s *destmac, + FAR const struct netdev_varaddr_s *destmac, FAR uint8_t *fptr) { FAR uint8_t *iphc = fptr + g_frame_hdrlen; @@ -772,7 +796,7 @@ int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, /* Compression compare with this nodes address (source) */ iphc1 |= compress_laddr(ipv6->srcipaddr, - &radio->r_dev.d_mac.ieee802154, + &radio->r_dev.d_mac.sixlowpan, SIXLOWPAN_IPHC_SAM_BIT); } @@ -783,7 +807,7 @@ int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, ipv6->srcipaddr[3] == 0) { iphc1 |= compress_laddr(ipv6->srcipaddr, - &radio->r_dev.d_mac.ieee802154, + &radio->r_dev.d_mac.sixlowpan, SIXLOWPAN_IPHC_SAM_BIT); } else @@ -998,29 +1022,35 @@ int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, * appropriate values * * Input Parmeters: - * ind - MAC header meta data including node addressing information. - * iplen - Equal to 0 if the packet is not a fragment (IP length is then - * inferred from the L2 length), non 0 if the packet is a first - * fragment. - * iob - Pointer to the IOB containing the received frame. - * fptr - Pointer to frame to be compressed. - * bptr - Output goes here. Normally this is a known offset into d_buf, - * may be redirected to a "bitbucket" on the case of FRAGN frames. + * radio - Reference to a radio network driver state instance. + * metadata - Obfuscated MAC metadata including node addressing + * information. + * iplen - Equal to 0 if the packet is not a fragment (IP length is + * then inferred from the L2 length), non 0 if the packet is + * a first fragment. + * iob - Pointer to the IOB containing the received frame. + * fptr - Pointer to frame to be compressed. + * bptr - Output goes here. Normally this is a known offset into + * d_buf, may be redirected to a "bitbucket" on the case of + * FRAGN frames. * * Returned Value: * None * ****************************************************************************/ -void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, +void sixlowpan_uncompresshdr_hc06(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, uint16_t iplen, FAR struct iob_s *iob, FAR uint8_t *fptr, FAR uint8_t *bptr) { FAR struct ipv6_hdr_s *ipv6 = (FAR struct ipv6_hdr_s *)bptr; + struct netdev_varaddr_s addr; FAR uint8_t *iphc; uint8_t iphc0; uint8_t iphc1; uint8_t tmp; + int ret; /* iphc points to IPHC. At least two byte will be used for the encoding. */ @@ -1132,6 +1162,13 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, /* Address context based compression */ + ret = sixlowpan_extract_srcaddr(radio, metadata, &addr); + if (ret < 0) + { + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + return; + } + if ((iphc1 & SIXLOWPAN_IPHC_SAC) != 0) { FAR struct sixlowpan_addrcontext_s *addrcontext; @@ -1154,7 +1191,7 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, * address. */ - uncompress_addr(&ind->src, + uncompress_addr(&addr, tmp != 0 ? addrcontext->prefix : NULL, g_unc_ctxconf[tmp], ipv6->srcipaddr); } @@ -1165,7 +1202,7 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, * address. */ - uncompress_addr(&ind->src, g_llprefix, g_unc_llconf[tmp], + uncompress_addr(&addr, g_llprefix, g_unc_llconf[tmp], ipv6->srcipaddr); } @@ -1176,6 +1213,13 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, /* Multicast compression */ + ret = sixlowpan_extract_destaddr(radio, metadata, &addr); + if (ret < 0) + { + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + return; + } + if ((iphc1 & SIXLOWPAN_IPHC_M) != 0) { /* Address context based multicast compression */ @@ -1201,7 +1245,7 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, g_hc06ptr++; } - uncompress_addr(&ind->dest, prefix, g_unc_mxconf[tmp], + uncompress_addr(&addr, prefix, g_unc_mxconf[tmp], ipv6->destipaddr); } } @@ -1225,8 +1269,8 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, return; } - uncompress_addr(&ind->dest, addrcontext->prefix, - g_unc_ctxconf[tmp], ipv6->destipaddr); + uncompress_addr(&addr, addrcontext->prefix, g_unc_ctxconf[tmp], + ipv6->destipaddr); } else { @@ -1234,7 +1278,7 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, * as SAC. */ - uncompress_addr(&ind->dest,g_llprefix, g_unc_llconf[tmp], + uncompress_addr(&addr, g_llprefix, g_unc_llconf[tmp], ipv6->destipaddr); } } diff --git a/net/sixlowpan/sixlowpan_hc1.c b/net/sixlowpan/sixlowpan_hc1.c index 40632328489..ef7ef40a329 100644 --- a/net/sixlowpan/sixlowpan_hc1.c +++ b/net/sixlowpan/sixlowpan_hc1.c @@ -58,31 +58,6 @@ #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: sixlowpan_uncompress_addr - * - * Description: - * Uncompress a link-local, MAC-based IPv6 address. - * - ****************************************************************************/ - -static void sixlowpan_uncompress_addr(FAR const struct ieee802154_addr_s *addr, - FAR net_ipv6addr_t ipaddr) -{ - if (addr->mode == IEEE802154_ADDRMODE_SHORT) - { - sixlowpan_ipfromsaddr(addr->saddr, ipaddr); - } - else - { - sixlowpan_ipfromeaddr(addr->eaddr, ipaddr); - } -} - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -147,7 +122,7 @@ static void sixlowpan_uncompress_addr(FAR const struct ieee802154_addr_s *addr, int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, - FAR const struct sixlowpan_tagaddr_s *destmac, + FAR const struct netdev_varaddr_s *destmac, FAR uint8_t *fptr) { FAR uint8_t *hc1 = fptr + g_frame_hdrlen; @@ -157,7 +132,7 @@ int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, if (ipv6->vtc != 0x60 || ipv6->tcf != 0 || ipv6->flow != 0 || !sixlowpan_islinklocal(ipv6->srcipaddr) || - !sixlowpan_isaddrbased(ipv6->srcipaddr, &radio->r_dev.d_mac.ieee802154) || + !sixlowpan_ismacbased(ipv6->srcipaddr, &radio->r_dev.d_mac.sixlowpan) || !sixlowpan_islinklocal(ipv6->destipaddr) || !sixlowpan_ismacbased(ipv6->destipaddr, destmac) || ( 1 @@ -300,14 +275,16 @@ int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, * are set to the appropriate values * * Input Parameters: - * ind - MAC header meta data including node addressing information. - * iplen - Equal to 0 if the packet is not a fragment (IP length is then - * inferred from the L2 length), non 0 if the packet is a 1st - * fragment. - * iob - Pointer to the IOB containing the received frame. - * fptr - Pointer to frame to be uncompressed. - * bptr - Output goes here. Normally this is a known offset into d_buf, - * may be redirected to a "bitbucket" on the case of FRAGN frames. + * metadata - Obfuscated MAC metadata including node addressing + * information. + * iplen - Equal to 0 if the packet is not a fragment (IP length is + * then inferred from the L2 length), non 0 if the packet is + * a 1st fragment. + * iob - Pointer to the IOB containing the received frame. + * fptr - Pointer to frame to be uncompressed. + * bptr - Output goes here. Normally this is a known offset into + * d_buf, may be redirected to a "bitbucket" on the case of + * FRAGN frames. * * Returned Value: * Zero (OK) is returned on success, on failure a negater errno value is @@ -315,12 +292,15 @@ int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, * ****************************************************************************/ -int sixlowpan_uncompresshdr_hc1(FAR const struct ieee802154_data_ind_s *ind, - uint16_t iplen, FAR struct iob_s *iob, - FAR uint8_t *fptr, FAR uint8_t *bptr) +int sixlowpan_uncompresshdr_hc1(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, uint16_t iplen, + FAR struct iob_s *iob, FAR uint8_t *fptr, + FAR uint8_t *bptr) { FAR struct ipv6_hdr_s *ipv6 = (FAR struct ipv6_hdr_s *)bptr; FAR uint8_t *hc1 = fptr + g_frame_hdrlen; + struct netdev_varaddr_s addr; + int ret; ninfo("fptr=%p g_frame_hdrlen=%u\n", fptr, g_frame_hdrlen); @@ -415,7 +395,15 @@ int sixlowpan_uncompresshdr_hc1(FAR const struct ieee802154_data_ind_s *ind, if ((hc1[SIXLOWPAN_HC1_ENCODING] & SIXLOWPAN_HC1_SRCADDR_MASK) == SIXLOWPAN_HC1_SRCADDR_PCIC) { - sixlowpan_uncompress_addr(&ind->src, ipv6->srcipaddr); + ret = sixlowpan_extract_srcaddr(radio, metadata, &addr); + if (ret < 0) + { + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + } + else + { + sixlowpan_ipfromaddr(&addr, ipv6->srcipaddr); + } } else { @@ -431,7 +419,15 @@ int sixlowpan_uncompresshdr_hc1(FAR const struct ieee802154_data_ind_s *ind, if ((hc1[SIXLOWPAN_HC1_ENCODING] & SIXLOWPAN_HC1_DESTADDR_MASK) == SIXLOWPAN_HC1_DESTADDR_PCIC) { - sixlowpan_uncompress_addr(&ind->dest, ipv6->destipaddr); + ret = sixlowpan_extract_srcaddr(radio, metadata, &addr); + if (ret < 0) + { + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + } + else + { + sixlowpan_ipfromaddr(&addr, ipv6->destipaddr); + } } else { diff --git a/net/sixlowpan/sixlowpan_icmpv6send.c b/net/sixlowpan/sixlowpan_icmpv6send.c index 77e21eb3034..78bfbbe3466 100644 --- a/net/sixlowpan/sixlowpan_icmpv6send.c +++ b/net/sixlowpan/sixlowpan_icmpv6send.c @@ -39,6 +39,7 @@ #include +#include #include #include @@ -78,7 +79,6 @@ * ****************************************************************************/ -#ifdef CONFIG_NET_IPFORWARD void sixlowpan_icmpv6_send(FAR struct net_driver_s *dev, FAR struct net_driver_s *fwddev, FAR struct ipv6_hdr_s *ipv6) @@ -100,14 +100,14 @@ void sixlowpan_icmpv6_send(FAR struct net_driver_s *dev, * protocol header. */ - if (ipv6icmpv6->ipv6.proto != IP_PROTO_ICMPv6) + if (ipv6icmpv6->ipv6.proto != IP_PROTO_ICMP6) { nwarn("WARNING: Expected ICMPv6 protoype: %u vs %s\n", - ipv6icmpv6->ipv6.proto, IP_PROTO_ICMPv6); + ipv6icmpv6->ipv6.proto, IP_PROTO_ICMP6); } else { - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; FAR uint8_t *buf; uint16_t hdrlen; uint16_t buflen; @@ -156,6 +156,5 @@ void sixlowpan_icmpv6_send(FAR struct net_driver_s *dev, drop: dev->d_len = 0; } -#endif #endif /* CONFIG_NET_6LOWPAN && CONFIG_NET_ICMPv6 */ diff --git a/net/sixlowpan/sixlowpan_input.c b/net/sixlowpan/sixlowpan_input.c index bdbd3e35868..5dde2df3b51 100644 --- a/net/sixlowpan/sixlowpan_input.c +++ b/net/sixlowpan/sixlowpan_input.c @@ -139,8 +139,8 @@ static uint8_t g_bitbucket[UNCOMP_MAXHDR]; * the previosly received fragements. * * Input Parameters: - * radio - Radio network device driver state instance - * ind - Characteristics of the newly received frame + * radio - Radio network device driver state instance + * metadata - Characteristics of the newly received frame * * Returned Value: * true if the sources are the same. @@ -148,34 +148,29 @@ static uint8_t g_bitbucket[UNCOMP_MAXHDR]; ****************************************************************************/ static bool sixlowpan_compare_fragsrc(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_data_ind_s *ind) + FAR const void *metadata) { - /* Check for an extended source address */ + struct netdev_varaddr_s fragsrc; + int ret; - if (ind->src.mode == IEEE802154_ADDRMODE_EXTENDED) + /* Extract the source address from the 'metadata' */ + + ret = sixlowpan_extract_srcaddr(radio, metadata, &fragsrc); + if (ret < 0) { - /* Was the first source address also extended? */ - - if (radio->r_fragsrc.extended) - { - /* Yes.. perform the extended address comparison */ - - return sixlowpan_eaddrcmp(radio->r_fragsrc.u.eaddr.u8, ind->src.eaddr); - } - } - else - { - /* Short source address. Was the first source address also short? */ - - if (!radio->r_fragsrc.extended) - { - /* Yes.. perform the extended short comparison */ - - return sixlowpan_saddrcmp(radio->r_fragsrc.u.saddr.u8, &ind->src.saddr); - } + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + return false; } - /* Address are different size and, hence, cannot match */ + /* The addresses cannot match if they are not the same size */ + + if (fragsrc.nv_addrlen == radio->r_fragsrc.nv_addrlen) + { + /* The are the same sizer, return the address comparisson */ + + return (memcmp(fragsrc.nv_addr, radio->r_fragsrc.nv_addr, + fragsrc.nv_addrlen) == 0); + } return false; } @@ -286,9 +281,9 @@ static void sixlowpan_uncompress_ipv6hdr(FAR uint8_t *fptr, FAR uint8_t *bptr) * SHALL in the RFC 4944 and should never happen) * * Input Parameters: - * radio - The radio network device driver interface. - * ind - Meta data characterizing the received frame. - * iob - The IOB containing the frame. + * radio - The radio network device driver interface. + * metadata - Metadata characterizing the received frame. + * iob - The IOB containing the frame. * * Returned Value: * On success, a value greater than equal to zero is returned, either: @@ -305,8 +300,7 @@ static void sixlowpan_uncompress_ipv6hdr(FAR uint8_t *fptr, FAR uint8_t *bptr) ****************************************************************************/ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_data_ind_s *ind, - FAR struct iob_s *iob) + FAR const void *metadata, FAR struct iob_s *iob) { FAR uint8_t *fptr; /* Convenience pointer to beginning of the frame */ FAR uint8_t *bptr; /* Used to redirect uncompressed header to the bitbucket */ @@ -323,6 +317,7 @@ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, bool isfirstfrag = false; uint16_t fragtag = 0; /* Tag of the fragment */ systime_t elapsed; /* Elapsed time */ + int ret; #endif /* CONFIG_NET_6LOWPAN_FRAG */ /* Get a pointer to the payload following the IEEE802.15.4 frame header(s). @@ -459,7 +454,7 @@ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, /* Verify that this fragment is part of that reassembly sequence */ else if (fragsize != radio->r_pktlen || radio->r_reasstag != fragtag || - !sixlowpan_compare_fragsrc(radio, ind)) + !sixlowpan_compare_fragsrc(radio, metadata)) { /* The packet is a fragment that does not belong to the packet * being reassembled or the packet is not a fragment. @@ -511,20 +506,16 @@ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, ninfo("Starting reassembly: r_pktlen %u, r_reasstag %d\n", radio->r_pktlen, radio->r_reasstag); - /* Extract the source address from the 'ind' meta data. NOTE that the - * size of the source address may be different that our local, destination + /* Extract the source address from the 'metadata'. NOTE that the size + * of the source address may be different than our local, destination * address. */ - if (ind->src.mode == IEEE802154_ADDRMODE_EXTENDED) + ret = sixlowpan_extract_srcaddr(radio, metadata, &radio->r_fragsrc); + if (ret < 0) { - radio->r_fragsrc.extended = true; - sixlowpan_eaddrcopy(radio->r_fragsrc.u.eaddr.u8, ind->src.eaddr); - } - else - { - memset(&radio->r_fragsrc, 0, sizeof(struct sixlowpan_tagaddr_s)); - sixlowpan_saddrcopy(radio->r_fragsrc.u.saddr.u8, &ind->src.saddr); + nerr("ERROR: sixlowpan_extract_srcaddr failed: %d\n", ret); + return ret; } } #endif /* CONFIG_NET_6LOWPAN_FRAG */ @@ -537,7 +528,7 @@ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, if ((hc1[SIXLOWPAN_HC1_DISPATCH] & SIXLOWPAN_DISPATCH_IPHC_MASK) == SIXLOWPAN_DISPATCH_IPHC) { ninfo("IPHC Dispatch\n"); - sixlowpan_uncompresshdr_hc06(ind, fragsize, iob, fptr, bptr); + sixlowpan_uncompresshdr_hc06(radio, metadata, fragsize, iob, fptr, bptr); } else #endif /* CONFIG_NET_6LOWPAN_COMPRESSION_HC06 */ @@ -546,7 +537,7 @@ static int sixlowpan_frame_process(FAR struct sixlowpan_driver_s *radio, if (hc1[SIXLOWPAN_HC1_DISPATCH] == SIXLOWPAN_DISPATCH_HC1) { ninfo("HC1 Dispatch\n"); - sixlowpan_uncompresshdr_hc1(ind, fragsize, iob, fptr, bptr); + sixlowpan_uncompresshdr_hc1(radio, metadata, fragsize, iob, fptr, bptr); } else #endif /* CONFIG_NET_6LOWPAN_COMPRESSION_HC1 */ @@ -757,9 +748,15 @@ static int sixlowpan_dispatch(FAR struct sixlowpan_driver_s *radio) * framelist - The head of an incoming list of frames. Normally this * would be a single frame. A list may be provided if * appropriate, however. - * ind - Meta data characterizing the received packet. If there are - * multilple frames in the list, this meta data must apply to - * all of the frames! + * metadata - Meta data characterizing the received packet. The specific + * type of this metadata is obfuscated and depends on the + * type of the radio driver. This could be be either + * (1) struct ieee802154_data_ind_s for an IEEE 802.15.4 + * radio, or (2) struct pktradio_metadata_s for a non-standard + * packet radio. + * + * If there are multilple frames in the list, this metadata + * must apply to all of the frames in the list. * * Returned Value: * Ok is returned on success; Othewise a negated errno value is returned. @@ -767,8 +764,7 @@ static int sixlowpan_dispatch(FAR struct sixlowpan_driver_s *radio) ****************************************************************************/ int sixlowpan_input(FAR struct sixlowpan_driver_s *radio, - FAR struct iob_s *framelist, - FAR const struct ieee802154_data_ind_s *ind) + FAR struct iob_s *framelist, FAR const void *metadata) { int ret = -EINVAL; @@ -789,7 +785,7 @@ int sixlowpan_input(FAR struct sixlowpan_driver_s *radio, /* Process the frame, decompressing it into the packet buffer */ - ret = sixlowpan_frame_process(radio, ind, iob); + ret = sixlowpan_frame_process(radio, metadata, iob); /* Free the IOB the held the consumed frame */ @@ -814,7 +810,7 @@ int sixlowpan_input(FAR struct sixlowpan_driver_s *radio, { FAR struct ipv6_hdr_s *ipv6hdr; FAR uint8_t *buffer; - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; size_t hdrlen; size_t buflen; diff --git a/net/sixlowpan/sixlowpan_internal.h b/net/sixlowpan/sixlowpan_internal.h index 9fa072994bf..1463de44c29 100644 --- a/net/sixlowpan/sixlowpan_internal.h +++ b/net/sixlowpan/sixlowpan_internal.h @@ -66,6 +66,7 @@ #include #include #include +#include #ifdef CONFIG_NET_6LOWPAN @@ -73,12 +74,15 @@ * Pre-processor Definitions ****************************************************************************/ -/* IEEE 802.15.4 addres macros */ -/* Copy a an IEEE 802.15.4 address */ +/* Copy a generic address */ #define sixlowpan_anyaddrcopy(dest,src,len) \ memcpy(dest, src, len) +#ifdef CONFIG_WIRELESS_IEEE802154 +/* IEEE 802.15.4 address macros */ +/* Copy a an IEEE 802.15.4 address */ + #define sixlowpan_saddrcopy(dest,src) \ sixlowpan_anyaddrcopy(dest,src,NET_6LOWPAN_SADDRSIZE) @@ -88,19 +92,7 @@ #define sixlowpan_addrcopy(dest,src) \ sixlowpan_anyaddrcopy(dest,src,NET_6LOWPAN_ADDRSIZE) -/* Compare two IEEE 802.15.4 addresses */ - -#define sixlowpan_anyaddrcmp(addr1,addr2,len) \ - (memcmp(addr1, addr2, len) == 0) - -#define sixlowpan_saddrcmp(addr1,addr2) \ - sixlowpan_anyaddrcmp(addr1,addr2,NET_6LOWPAN_SADDRSIZE) - -#define sixlowpan_eaddrcmp(addr1,addr2) \ - sixlowpan_anyaddrcmp(addr1,addr2,NET_6LOWPAN_EADDRSIZE) - -#define sixlowpan_addrcmp(addr1,addr2) \ - sixlowpan_anyaddrcmp(addr1,addr2,NET_6LOWPAN_ADDRSIZE) +#endif /* General helper macros ****************************************************/ @@ -170,26 +162,42 @@ struct ipv6icmp_hdr_s }; #endif +#ifdef CONFIG_WIRELESS_IEEE802154 /* In order to provide a customizable IEEE 802.15.4 MAC header, a structure * of meta data is passed to the MAC network driver, struct * ieee802154_frame_meta_s. Many of the settings in this meta data are - * fixed, deterimined by the 6LoWPAN configuration. Other settings depend + * fixed, determined by the 6LoWPAN configuration. Other settings depend * on the protocol used in the current packet or on chacteristics of the * destination node. * * The following structure is used to summarize those per-packet - * customizations and, along, with the fixed configuratin settings, + * customizations and, along, with the fixed configuratoin settings, * determines the full form of that meta data. */ -struct packet_metadata_s +struct ieee802_txmetadata_s { - uint8_t sextended : 1; /* Extended source address */ - uint8_t dextended : 1; /* Extended destination address */ - uint8_t xmits; /* Max MAC transmisstion */ - uint8_t dpanid[IEEE802154_PANIDSIZE]; /* Destination PAN ID */ - union sixlowpan_anyaddr_u source; /* Source IEEE 802.15.4 address */ - union sixlowpan_anyaddr_u dest; /* Destination IEEE 802.15.4 address */ + uint8_t sextended : 1; /* Extended source address */ + uint8_t dextended : 1; /* Extended destination address */ + uint8_t xmits; /* Max MAC transmisstion */ + uint8_t dpanid[IEEE802154_PANIDSIZE]; /* Destination PAN ID */ + struct netdev_maxaddr_s source; /* Source IEEE 802.15.4 address */ + struct netdev_maxaddr_s dest; /* Destination IEEE 802.15.4 address */ +}; +#endif + +/* This structure holds the packet metadata as a union when multiple different + * radio type are supported. + */ + +union sixlowpan_metadata_u +{ +#ifdef CONFIG_WIRELESS_IEEE802154 + struct ieee802154_frame_meta_s ieee802154; +#endif +#ifdef CONFIG_WIRELESS_PKTRADIO + struct pktradio_metadata_s pktradio; +#endif }; /**************************************************************************** @@ -224,12 +232,12 @@ extern uint8_t g_frame_hdrlen; * Public Function Prototypes ****************************************************************************/ -struct net_driver_s; /* Forward reference */ -struct sixlowpan_driver_s; /* Forward reference */ -struct devif_callback_s; /* Forward reference */ -struct ipv6_hdr_s; /* Forward reference */ -struct sixlowpan_addr_s; /* Forward reference */ -struct iob_s; /* Forward reference */ +struct net_driver_s; /* Forward reference */ +struct sixlowpan_driver_s; /* Forward reference */ +struct devif_callback_s; /* Forward reference */ +struct ipv6_hdr_s; /* Forward reference */ +struct netdev_varaddr_s; /* Forward reference */ +struct iob_s; /* Forward reference */ /**************************************************************************** * Name: sixlowpan_send @@ -267,7 +275,7 @@ struct iob_s; /* Forward reference */ int sixlowpan_send(FAR struct net_driver_s *dev, FAR struct devif_callback_s **list, FAR const struct ipv6_hdr_s *ipv6hdr, FAR const void *buf, - size_t len, FAR const struct sixlowpan_tagaddr_s *destmac, + size_t len, FAR const struct netdev_varaddr_s *destmac, uint16_t timeout); /**************************************************************************** @@ -280,7 +288,8 @@ int sixlowpan_send(FAR struct net_driver_s *dev, * Input Parameters: * radio - Reference to a radio network driver state instance. * pktmeta - Meta-data specific to the current outgoing frame - * meta - Location to return the corresponding meta data. + * meta - Location to return the corresponding meta data reference + * (obfuscated). * paylen - The size of the data payload to be sent. * * Returned Value: @@ -291,10 +300,12 @@ int sixlowpan_send(FAR struct net_driver_s *dev, * ****************************************************************************/ +#ifdef CONFIG_WIRELESS_IEEE802154 int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, - FAR const struct packet_metadata_s *pktmeta, + FAR const struct ieee802_txmetadata_s *pktmeta, FAR struct ieee802154_frame_meta_s *meta, uint16_t paylen); +#endif /**************************************************************************** * Name: sixlowpan_frame_hdrlen @@ -306,7 +317,7 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, * * Input parameters: * radio - Reference to a radio network driver state instance. - * meta - Meta data that describes the MAC header + * meta - obfuscated meta data that describes the MAC header * * Returned Value: * The frame header length is returnd on success; otherwise, a negated @@ -315,7 +326,7 @@ int sixlowpan_meta_data(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ int sixlowpan_frame_hdrlen(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_frame_meta_s *meta); + FAR const void *meta); /**************************************************************************** * Name: sixlowpan_frame_submit @@ -328,7 +339,7 @@ int sixlowpan_frame_hdrlen(FAR struct sixlowpan_driver_s *radio, * * Input parameters: * radio - Reference to a radio network driver state instance. - * meta - Meta data that describes the MAC header + * meta - Obfuscated metadata that describes the MAC header * frame - The IOB containing the frame to be submitted. * * Returned Value: @@ -338,8 +349,7 @@ int sixlowpan_frame_hdrlen(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ int sixlowpan_frame_submit(FAR struct sixlowpan_driver_s *radio, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *frame); + FAR const void *meta, FAR struct iob_s *frame); /**************************************************************************** * Name: sixlowpan_queue_frames @@ -376,7 +386,7 @@ int sixlowpan_frame_submit(FAR struct sixlowpan_driver_s *radio, int sixlowpan_queue_frames(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, FAR const void *buf, size_t buflen, - FAR const struct sixlowpan_tagaddr_s *destmac); + FAR const struct netdev_varaddr_s *destmac); /**************************************************************************** * Name: sixlowpan_hc06_initialize @@ -433,7 +443,7 @@ void sixlowpan_hc06_initialize(void); #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC06 int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, - FAR const struct sixlowpan_tagaddr_s *destmac, + FAR const struct netdev_varaddr_s *destmac, FAR uint8_t *fptr); #endif @@ -451,14 +461,17 @@ int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, * appropriate values * * Input Parmeters: - * ind - MAC header meta data including node addressing information. - * iplen - Equal to 0 if the packet is not a fragment (IP length is then - * inferred from the L2 length), non 0 if the packet is a first - * fragment. - * iob - Pointer to the IOB containing the received frame. - * fptr - Pointer to frame to be compressed. - * bptr - Output goes here. Normally this is a known offset into d_buf, - * may be redirected to a "bitbucket" on the case of FRAGN frames. + * radio - Reference to a radio network driver state instance. + * metadata - Obfuscated MAC metadata including node addressing + * information. + * iplen - Equal to 0 if the packet is not a fragment (IP length is + * then inferred from the L2 length), non 0 if the packet is + * a first fragment. + * iob - Pointer to the IOB containing the received frame. + * fptr - Pointer to frame to be compressed. + * bptr - Output goes here. Normally this is a known offset into + * d_buf, may be redirected to a "bitbucket" on the case of + * FRAGN frames. * * Returned Value: * None @@ -466,7 +479,8 @@ int sixlowpan_compresshdr_hc06(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC06 -void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, +void sixlowpan_uncompresshdr_hc06(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, uint16_t iplen, FAR struct iob_s *iob, FAR uint8_t *fptr, FAR uint8_t *bptr); #endif @@ -497,7 +511,7 @@ void sixlowpan_uncompresshdr_hc06(FAR const struct ieee802154_data_ind_s *ind, #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, FAR const struct ipv6_hdr_s *ipv6, - FAR const struct sixlowpan_tagaddr_s *destmac, + FAR const struct netdev_varaddr_s *destmac, FAR uint8_t *fptr); #endif @@ -514,14 +528,17 @@ int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, * are set to the appropriate values * * Input Parameters: - * ind - MAC header meta data including node addressing information. - * iplen - Equal to 0 if the packet is not a fragment (IP length is then - * inferred from the L2 length), non 0 if the packet is a 1st - * fragment. - * iob - Pointer to the IOB containing the received frame. - * fptr - Pointer to frame to be uncompressed. - * bptr - Output goes here. Normally this is a known offset into d_buf, - * may be redirected to a "bitbucket" on the case of FRAGN frames. + * radio - Reference to a radio network driver state instance. + * metadata - Obfuscated MAC metadata including node addressing + * information. + * iplen - Equal to 0 if the packet is not a fragment (IP length is + * then inferred from the L2 length), non 0 if the packet is + * a 1st fragment. + * iob - Pointer to the IOB containing the received frame. + * fptr - Pointer to frame to be uncompressed. + * bptr - Output goes here. Normally this is a known offset into + * d_buf, may be redirected to a "bitbucket" on the case of + * FRAGN frames. * * Returned Value: * Zero (OK) is returned on success, on failure a negater errno value is @@ -530,9 +547,10 @@ int sixlowpan_compresshdr_hc1(FAR struct sixlowpan_driver_s *radio, ****************************************************************************/ #ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 -int sixlowpan_uncompresshdr_hc1(FAR const struct ieee802154_data_ind_s *ind, - uint16_t iplen, FAR struct iob_s *iob, - FAR uint8_t *fptr, FAR uint8_t *bptr); +int sixlowpan_uncompresshdr_hc1(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, uint16_t iplen, + FAR struct iob_s *iob, FAR uint8_t *fptr, + FAR uint8_t *bptr); #endif /**************************************************************************** @@ -570,28 +588,13 @@ int sixlowpan_uncompresshdr_hc1(FAR const struct ieee802154_data_ind_s *ind, int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio, const net_ipv6addr_t ipaddr, - FAR struct sixlowpan_tagaddr_s *addr); + FAR struct netdev_varaddr_s *addr); -void sixlowpan_ipfromsaddr(FAR const uint8_t *saddr, - FAR net_ipv6addr_t ipaddr); -void sixlowpan_ipfromeaddr(FAR const uint8_t *eaddr, - FAR net_ipv6addr_t ipaddr); - -bool sixlowpan_issaddrbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_saddr_s *saddr); -bool sixlowpan_iseaddrbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_eaddr_s *eaddr); - -#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR -# define sixlowpan_isaddrbased(ipaddr,addr) \ - sixlowpan_iseaddrbased(ipaddr,(FAR struct sixlowpan_eaddr_s *)addr) -#else -# define sixlowpan_isaddrbased(ipaddr,addr) \ - sixlowpan_issaddrbased(ipaddr,(FAR struct sixlowpan_saddr_s *)addr) -#endif +void sixlowpan_ipfromaddr(FAR const struct netdev_varaddr_s *addr, + FAR net_ipv6addr_t ipaddr); bool sixlowpan_ismacbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_tagaddr_s *addr); + FAR const struct netdev_varaddr_s *addr); /**************************************************************************** * Name: sixlowpan_src_panid @@ -609,8 +612,52 @@ bool sixlowpan_ismacbased(const net_ipv6addr_t ipaddr, * ****************************************************************************/ +#ifdef CONFIG_WIRELESS_IEEE802154 int sixlowpan_src_panid(FAR struct sixlowpan_driver_s *radio, FAR uint8_t *panid); +#endif + +/**************************************************************************** + * Name: sixlowpan_extract_srcaddr + * + * Description: + * Extract the source MAC address from the radio-specific RX metadata, and + * return the source address in a radio-agnostic form. + * + * Input parameters: + * radio - Reference to a radio network driver state instance. + * metadata - Opaque reference to the radio-specific RX metadata. + * srcaddr - The location in which to return the source MAC address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int sixlowpan_extract_srcaddr(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, + FAR struct netdev_varaddr_s *srcaddr); + +/**************************************************************************** + * Name: sixlowpan_extract_destaddr + * + * Description: + * Extract the destination MAC address from the radio-specific RX metadata, + * and return the destination address in a radio-agnostic form. + * + * Input parameters: + * radio - Reference to a radio network driver state instance. + * metadata - Opaque reference to the radio-specific RX metadata. + * destaddr - The location in which to return the destination MAC address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int sixlowpan_extract_destaddr(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, + FAR struct netdev_varaddr_s *destaddr); #endif /* CONFIG_NET_6LOWPAN */ #endif /* _NET_SIXLOWPAN_SIXLOWPAN_INTERNAL_H */ diff --git a/net/sixlowpan/sixlowpan_send.c b/net/sixlowpan/sixlowpan_send.c index 6a528249b23..736eb360826 100644 --- a/net/sixlowpan/sixlowpan_send.c +++ b/net/sixlowpan/sixlowpan_send.c @@ -83,7 +83,7 @@ struct sixlowpan_send_s uint16_t s_timeout; /* Send timeout in deciseconds */ systime_t s_time; /* Last send time for determining timeout */ FAR const struct ipv6_hdr_s *s_ipv6hdr; /* IPv6 header, followed by UDP or ICMP header. */ - FAR const struct sixlowpan_tagaddr_s *s_destmac; /* Destination MAC address */ + FAR const struct netdev_varaddr_s *s_destmac; /* Destination MAC address */ FAR const void *s_buf; /* Data to send */ size_t s_len; /* Length of data in buf */ }; @@ -276,7 +276,7 @@ end_wait: int sixlowpan_send(FAR struct net_driver_s *dev, FAR struct devif_callback_s **list, FAR const struct ipv6_hdr_s *ipv6hdr, FAR const void *buf, - size_t len, FAR const struct sixlowpan_tagaddr_s *destmac, + size_t len, FAR const struct netdev_varaddr_s *destmac, uint16_t timeout) { struct sixlowpan_send_s sinfo; diff --git a/net/sixlowpan/sixlowpan_tcpsend.c b/net/sixlowpan/sixlowpan_tcpsend.c index e44d3cb8ec7..949ff4e4f26 100644 --- a/net/sixlowpan/sixlowpan_tcpsend.c +++ b/net/sixlowpan/sixlowpan_tcpsend.c @@ -94,7 +94,7 @@ struct sixlowpan_send_s int s_result; /* The result of the transfer */ uint16_t s_timeout; /* Send timeout in deciseconds */ systime_t s_time; /* Last send time for determining timeout */ - FAR const struct sixlowpan_tagaddr_s *s_destmac; /* Destination MAC address */ + FAR const struct netdev_varaddr_s *s_destmac; /* Destination MAC address */ FAR const uint8_t *s_buf; /* Data to send */ size_t s_buflen; /* Length of data in buf */ ssize_t s_sent; /* The number of bytes sent */ @@ -639,7 +639,7 @@ static int sixlowpan_send_packet(FAR struct socket *psock, FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn, FAR const uint8_t *buf, size_t len, - FAR const struct sixlowpan_tagaddr_s *destmac, + FAR const struct netdev_varaddr_s *destmac, uint16_t timeout) { struct sixlowpan_send_s sinfo; @@ -756,7 +756,7 @@ ssize_t psock_6lowpan_tcp_send(FAR struct socket *psock, FAR const void *buf, { FAR struct tcp_conn_s *conn; FAR struct net_driver_s *dev; - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; uint16_t timeout; int ret; @@ -957,7 +957,7 @@ void sixlowpan_tcp_send(FAR struct net_driver_s *dev, } else { - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; FAR uint8_t *buf; uint16_t hdrlen; uint16_t buflen; diff --git a/net/sixlowpan/sixlowpan_udpsend.c b/net/sixlowpan/sixlowpan_udpsend.c index d357e384028..17c9abdf11d 100644 --- a/net/sixlowpan/sixlowpan_udpsend.c +++ b/net/sixlowpan/sixlowpan_udpsend.c @@ -163,7 +163,7 @@ ssize_t psock_6lowpan_udp_sendto(FAR struct socket *psock, FAR struct udp_conn_s *conn; FAR struct net_driver_s *dev; struct ipv6udp_hdr_s ipv6udp; - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; uint16_t iplen; uint16_t timeout; int ret; @@ -476,7 +476,7 @@ void sixlowpan_udp_send(FAR struct net_driver_s *dev, } else { - struct sixlowpan_tagaddr_s destmac; + struct netdev_varaddr_s destmac; FAR uint8_t *buf; uint16_t hdrlen; uint16_t buflen; diff --git a/net/sixlowpan/sixlowpan_utils.c b/net/sixlowpan/sixlowpan_utils.c index 9b7fbb59ec4..e7f6f27a1e0 100644 --- a/net/sixlowpan/sixlowpan_utils.c +++ b/net/sixlowpan/sixlowpan_utils.c @@ -57,6 +57,7 @@ #include #include +#include #include #include "sixlowpan/sixlowpan_internal.h" @@ -78,28 +79,27 @@ * * 128 112 96 80 64 48 32 16 * ---- ---- ---- ---- ---- ---- ---- ---- + * fe80 0000 0000 0000 0000 00ff fe00 xx00 1-byte short address IEEE 48-bit MAC * xxxx 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC * xxxx 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64 * ****************************************************************************/ #ifndef CONFIG_NET_STARPOINT -static void sixlowpan_saddrfromip(const net_ipv6addr_t ipaddr, - FAR struct sixlowpan_saddr_s *saddr) +static void sixlowpan_saddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *saddr) { DEBUGASSERT(ipaddr[0] == HTONS(0xfe80)); /* Big-endian uint16_t to byte order */ - saddr->u8[0] = ipaddr[7] >> 8; - saddr->u8[1] = ipaddr[7] & 0xff; - saddr->u8[0] ^= 0x02; + saddr[0] = ipaddr[7] >> 8; + saddr[1] = ipaddr[7] & 0xff; + saddr[0] ^= 0x02; } -static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, - FAR struct sixlowpan_eaddr_s *eaddr) +static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, FAR uint8_t *eaddr) { - FAR uint8_t *eptr = eaddr->u8; + FAR uint8_t *eptr = eaddr; int i; DEBUGASSERT(ipaddr[0] == HTONS(0xfe80)); @@ -112,7 +112,7 @@ static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, *eptr++ = ipaddr[i] & 0xff; } - eaddr->u8[0] ^= 0x02; + eaddr[0] ^= 0x02; } #endif /* !CONFIG_NET_STARPOINT */ @@ -133,7 +133,7 @@ static void sixlowpan_eaddrfromip(const net_ipv6addr_t ipaddr, #if defined(CONFIG_NET_STARPOINT) && defined(CONFIG_NET_6LOWPAN_EXTENDEDADDR) static int sixlowpan_coord_eaddr(FAR struct sixlowpan_driver_s *radio, - FAR struct sixlowpan_eaddr_s *eaddr) + FAR struct netdev_varaddr_s *eaddr) { FAR struct net_driver_s *dev = &radio->r_dev; struct ieee802154_netmac_s arg; @@ -171,7 +171,7 @@ static int sixlowpan_coord_eaddr(FAR struct sixlowpan_driver_s *radio, #if defined(CONFIG_NET_STARPOINT) && !defined(CONFIG_NET_6LOWPAN_EXTENDEDADDR) static int sixlowpan_coord_saddr(FAR struct sixlowpan_driver_s *radio, - FAR struct sixlowpan_saddr_s *saddr) + FAR struct netdev_varaddr_s *saddr) { FAR struct net_driver_s *dev = &radio->r_dev; struct ieee802154_netmac_s arg; @@ -187,7 +187,7 @@ static int sixlowpan_coord_saddr(FAR struct sixlowpan_driver_s *radio, return ret; } - IEEE802154_SADDRCOPY(saddr->u8, arg.u.getreq.attrval.mac.saddr); + IEEE802154_SADDRCOPY(saddr->nv_addr, arg.u.getreq.attrval.mac.saddr); return OK; } #endif @@ -207,6 +207,7 @@ static int sixlowpan_coord_saddr(FAR struct sixlowpan_driver_s *radio, * * 128 112 96 80 64 48 32 16 * ---- ---- ---- ---- ---- ---- ---- ---- + * fe80 0000 0000 0000 0000 00ff fe00 xx00 1-byte short address IEEE 48-bit MAC * xxxx 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC * xxxx 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64 * @@ -218,7 +219,7 @@ static int sixlowpan_coord_saddr(FAR struct sixlowpan_driver_s *radio, int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio, const net_ipv6addr_t ipaddr, - FAR struct sixlowpan_tagaddr_s *destaddr) + FAR struct netdev_varaddr_s *destaddr) { #ifdef CONFIG_NET_STARPOINT int ret; @@ -228,11 +229,12 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio, */ #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR - ret = sixlowpan_coord_eaddr(radio, &destaddr->u.eaddr); - destaddr->extended = true; + ret = sixlowpan_coord_eaddr(radio, &destaddr->nv_addr); + destaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; #else - memset(destaddr, 0, sizeof(struct sixlowpan_tagaddr_s)); - ret = sixlowpan_coord_saddr(radio, &destaddr->u.saddr); + memset(destaddr, 0, sizeof(struct netdev_varaddr_s)); + ret = sixlowpan_coord_saddr(radio, &destaddr->nv_addr); + destaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; #endif return ret; @@ -244,13 +246,14 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio, if (SIXLOWPAN_IS_IID_16BIT_COMPRESSABLE(ipaddr)) { - memset(destaddr, 0, sizeof(struct sixlowpan_tagaddr_s)); - sixlowpan_saddrfromip(ipaddr, &destaddr->u.saddr); + memset(destaddr, 0, sizeof(struct netdev_varaddr_s)); + sixlowpan_saddrfromip(ipaddr, destaddr->nv_addr); + destaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; } else { - sixlowpan_eaddrfromip(ipaddr, &destaddr->u.eaddr); - destaddr->extended = true; + sixlowpan_eaddrfromip(ipaddr, destaddr->nv_addr); + destaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; } return OK; @@ -258,22 +261,38 @@ int sixlowpan_destaddrfromip(FAR struct sixlowpan_driver_s *radio, } /**************************************************************************** - * Name: sixlowpan_ipfrom[s|e]addr + * Name: sixlowpan_ipfromaddr (plus helpers) * * Description: * sixlowpan_ipfrom[s|e]addr(): Create a link-local, MAC-based IPv6 - * address from an IEEE802.15.4 short address (saddr) or extended address - * (eaddr). + * address from an IEEE802.15.4 short address (saddr), extended address + * (eaddr), or other variable length radio addresses. * * 128 112 96 80 64 48 32 16 * ---- ---- ---- ---- ---- ---- ---- ---- + * fe80 0000 0000 0000 0000 00ff fe00 xx00 1-byte short address IEEE 48-bit MAC * fe80 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC * fe80 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64 * ****************************************************************************/ -void sixlowpan_ipfromsaddr(FAR const uint8_t *saddr, - FAR net_ipv6addr_t ipaddr) +#ifdef CONFIG_WIRELESS_PKTRADIO +static inline void sixlowpan_ipfrombyte(FAR const uint8_t *byte, + FAR net_ipv6addr_t ipaddr) +{ + ipaddr[0] = HTONS(0xfe80); + ipaddr[1] = 0; + ipaddr[2] = 0; + ipaddr[3] = 0; + ipaddr[4] = 0; + ipaddr[5] = HTONS(0x00ff); + ipaddr[6] = HTONS(0xfe00); + ipaddr[7] = (uint16_t)byte[0] << 8 ^ 0x0200; +} +#endif + +static inline void sixlowpan_ipfromsaddr(FAR const uint8_t *saddr, + FAR net_ipv6addr_t ipaddr) { ipaddr[0] = HTONS(0xfe80); ipaddr[1] = 0; @@ -283,11 +302,11 @@ void sixlowpan_ipfromsaddr(FAR const uint8_t *saddr, ipaddr[5] = HTONS(0x00ff); ipaddr[6] = HTONS(0xfe00); ipaddr[7] = (uint16_t)saddr[0] << 8 | (uint16_t)saddr[1]; - ipaddr[7] ^= 0x200; + ipaddr[7] ^= 0x0200; } -void sixlowpan_ipfromeaddr(FAR const uint8_t *eaddr, - FAR net_ipv6addr_t ipaddr) +static inline void sixlowpan_ipfromeaddr(FAR const uint8_t *eaddr, + FAR net_ipv6addr_t ipaddr) { ipaddr[0] = HTONS(0xfe80); ipaddr[1] = 0; @@ -297,58 +316,96 @@ void sixlowpan_ipfromeaddr(FAR const uint8_t *eaddr, ipaddr[5] = (uint16_t)eaddr[2] << 8 | (uint16_t)eaddr[3]; ipaddr[6] = (uint16_t)eaddr[4] << 8 | (uint16_t)eaddr[5]; ipaddr[7] = (uint16_t)eaddr[6] << 8 | (uint16_t)eaddr[7]; - ipaddr[4] ^= 0x200; + ipaddr[4] ^= 0x0200; +} + +void sixlowpan_ipfromaddr(FAR const struct netdev_varaddr_s *addr, + FAR net_ipv6addr_t ipaddr) +{ + switch (addr->nv_addrlen) + { +#ifdef CONFIG_WIRELESS_PKTRADIO + case 1: + sixlowpan_ipfrombyte(addr->nv_addr, ipaddr); + break; +#endif + + case NET_6LOWPAN_SADDRSIZE: + sixlowpan_ipfromsaddr(addr->nv_addr, ipaddr); + break; + + case NET_6LOWPAN_EADDRSIZE: + sixlowpan_ipfromeaddr(addr->nv_addr, ipaddr); + break; + + default: + nerr("ERROR: Unsupported address length: %u\n", addr->nv_addrlen); + break; + } } /**************************************************************************** - * Name: sixlowpan_ismacbased + * Name: sixlowpan_ismacbased (and helpers) * * Description: * sixlowpan_ismacbased() will return true for IP addresses formed from * IEEE802.15.4 MAC addresses. sixlowpan_destaddrfromip() is intended to - * handle a tagged address or any size. Local addresses are of a fixed - * but configurable size and sixlowpan_isaddrbased() is for use with such - * local addresses. - * + * handle a tagged address or any size. * * 128 112 96 80 64 48 32 16 * ---- ---- ---- ---- ---- ---- ---- ---- + * fe80 0000 0000 0000 0000 00ff fe00 xx00 1-byte short address IEEE 48-bit MAC * fe80 0000 0000 0000 0000 00ff fe00 xxxx 2-byte short address IEEE 48-bit MAC * fe80 0000 0000 0000 xxxx xxxx xxxx xxxx 8-byte extended address IEEE EUI-64 * ****************************************************************************/ -bool sixlowpan_issaddrbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_saddr_s *saddr) +#ifdef CONFIG_WIRELESS_PKTRADIO +static inline bool sixlowpan_isbytebased(const net_ipv6addr_t ipaddr, + uint8_t byte) { - FAR const uint8_t *byteptr = saddr->u8; - return (ipaddr[5] == HTONS(0x00ff) && ipaddr[6] == HTONS(0xfe00) && - ipaddr[7] == (GETUINT16(byteptr, 0) ^ 0x0200)); + ipaddr[7] == (((uint16_t)byte << 8) ^ 0x0200)); +} +#endif + +static inline bool sixlowpan_issaddrbased(const net_ipv6addr_t ipaddr, + FAR const uint8_t *saddr) +{ + return (ipaddr[5] == HTONS(0x00ff) && + ipaddr[6] == HTONS(0xfe00) && + ipaddr[7] == (GETUINT16(saddr, 0) ^ 0x0200)); } -bool sixlowpan_iseaddrbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_eaddr_s *eaddr) +static inline bool sixlowpan_iseaddrbased(const net_ipv6addr_t ipaddr, + FAR const uint8_t *eaddr) { - FAR const uint8_t *byteptr = eaddr->u8; - - return (ipaddr[4] == (GETUINT16(byteptr, 0) ^ 0x0200) && - ipaddr[5] == GETUINT16(byteptr, 2) && - ipaddr[6] == GETUINT16(byteptr, 4) && - ipaddr[7] == GETUINT16(byteptr, 6)); + return (ipaddr[4] == (GETUINT16(eaddr, 0) ^ 0x0200) && + ipaddr[5] == GETUINT16(eaddr, 2) && + ipaddr[6] == GETUINT16(eaddr, 4) && + ipaddr[7] == GETUINT16(eaddr, 6)); } bool sixlowpan_ismacbased(const net_ipv6addr_t ipaddr, - FAR const struct sixlowpan_tagaddr_s *addr) + FAR const struct netdev_varaddr_s *addr) { - if (addr->extended) + switch (addr->nv_addrlen) { - return sixlowpan_iseaddrbased(ipaddr, &addr->u.eaddr); - } - else - { - return sixlowpan_issaddrbased(ipaddr, &addr->u.saddr); +#ifdef CONFIG_WIRELESS_PKTRADIO + case 1: + return sixlowpan_isbytebased(ipaddr, addr->nv_addr[0]); +#endif + + case NET_6LOWPAN_SADDRSIZE: + return sixlowpan_issaddrbased(ipaddr, addr->nv_addr); + + case NET_6LOWPAN_EADDRSIZE: + return sixlowpan_iseaddrbased(ipaddr, addr->nv_addr); + + default: + nerr("ERROR: Unsupported address length: %u\n", addr->nv_addrlen); + return false; } } @@ -368,6 +425,7 @@ bool sixlowpan_ismacbased(const net_ipv6addr_t ipaddr, * ****************************************************************************/ +#ifdef CONFIG_WIRELESS_IEEE802154 int sixlowpan_src_panid(FAR struct sixlowpan_driver_s *radio, FAR uint8_t *panid) { @@ -388,5 +446,140 @@ int sixlowpan_src_panid(FAR struct sixlowpan_driver_s *radio, IEEE802154_PANIDCOPY(panid, arg.u.getreq.attrval.mac.panid); return OK; } +#endif + +/**************************************************************************** + * Name: sixlowpan_extract_srcaddr + * + * Description: + * Extract the source MAC address from the radio-specific RX metadata, and + * return the source address in a radio-agnostic form. + * + * Input parameters: + * radio - Reference to a radio network driver state instance. + * metadata - Opaque reference to the radio-specific RX metadata. + * srcaddr - The location in which to return the source MAC address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int sixlowpan_extract_srcaddr(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, + FAR struct netdev_varaddr_s *srcaddr) +{ + DEBUGASSERT(radio != NULL && metadata != NULL && srcaddr != NULL); + +#ifdef CONFIG_WIRELESS_IEEE802154 +#ifdef CONFIG_WIRELESS_PKTRADIO + if (radio->r_dev.d_lltype == NET_LL_IEEE802154) +#endif + { + FAR const struct ieee802154_data_ind_s *ind = + (FAR const struct ieee802154_data_ind_s *)metadata; + + if (ind->src.mode == IEEE802154_ADDRMODE_SHORT) + { + srcaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; + memcpy(srcaddr->nv_addr, ind->src.saddr, NET_6LOWPAN_SADDRSIZE); + } + else + { + srcaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; + memcpy(srcaddr->nv_addr, ind->src.eaddr, NET_6LOWPAN_EADDRSIZE); + } + + return OK; + } +#endif + +#ifdef CONFIG_WIRELESS_PKTRADIO +#ifdef CONFIG_WIRELESS_IEEE802154 + else +#endif + { + FAR const struct pktradio_metadata_s *pktmeta = + (FAR const struct pktradio_metadata_s *)metadata; + + DEBUGASSERT(pktmeta->pm_src.pa_addrlen <= CONFIG_PKTRADIO_ADDRLEN); + + srcaddr->nv_addrlen = pktmeta->pm_src.pa_addrlen; + memcpy(srcaddr->nv_addr, pktmeta->pm_src.pa_addr, + pktmeta->pm_src.pa_addrlen); + + return OK; + } +#endif + + return -EINVAL; /* Shouldn't get here */ +} + +/**************************************************************************** + * Name: sixlowpan_extract_destaddr + * + * Description: + * Extract the destination MAC address from the radio-specific RX metadata, + * and return the destination address in a radio-agnostic form. + * + * Input parameters: + * radio - Reference to a radio network driver state instance. + * metadata - Opaque reference to the radio-specific RX metadata. + * destaddr - The location in which to return the destination MAC address. + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int sixlowpan_extract_destaddr(FAR struct sixlowpan_driver_s *radio, + FAR const void *metadata, + FAR struct netdev_varaddr_s *destaddr) +{ + DEBUGASSERT(radio != NULL && metadata != NULL && destaddr != NULL); + +#ifdef CONFIG_WIRELESS_IEEE802154 +#ifdef CONFIG_WIRELESS_PKTRADIO + if (radio->r_dev.d_lltype == NET_LL_IEEE802154) +#endif + { + FAR const struct ieee802154_data_ind_s *ind = + (FAR const struct ieee802154_data_ind_s *)metadata; + + if (ind->dest.mode == IEEE802154_ADDRMODE_SHORT) + { + destaddr->nv_addrlen = NET_6LOWPAN_SADDRSIZE; + memcpy(destaddr->nv_addr, ind->dest.saddr, NET_6LOWPAN_SADDRSIZE); + } + else + { + destaddr->nv_addrlen = NET_6LOWPAN_EADDRSIZE; + memcpy(destaddr->nv_addr, ind->dest.eaddr, NET_6LOWPAN_EADDRSIZE); + } + + return OK; + } +#endif + +#ifdef CONFIG_WIRELESS_PKTRADIO +#ifdef CONFIG_WIRELESS_IEEE802154 + else +#endif + { + FAR const struct pktradio_metadata_s *pktmeta = + (FAR const struct pktradio_metadata_s *)metadata; + + DEBUGASSERT(pktmeta->pm_dest.pa_addrlen <= CONFIG_PKTRADIO_ADDRLEN); + + destaddr->nv_addrlen = pktmeta->pm_dest.pa_addrlen; + memcpy(destaddr->nv_addr, pktmeta->pm_dest.pa_addr, + pktmeta->pm_dest.pa_addrlen); + + return OK; + } +#endif + + return -EINVAL; /* Shouldn't get here */ +} #endif /* CONFIG_NET_6LOWPAN */ diff --git a/wireless/ieee802154/mac802154_loopback.c b/wireless/ieee802154/mac802154_loopback.c index b6432263da1..79617036ba0 100644 --- a/wireless/ieee802154/mac802154_loopback.c +++ b/wireless/ieee802154/mac802154_loopback.c @@ -164,10 +164,11 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd, unsigned long arg); #endif static int lo_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta); + FAR const void *meta); static int lo_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist); + FAR const void *meta, FAR struct iob_s *framelist); +static int lo_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties); /**************************************************************************** * Private Functions @@ -192,7 +193,8 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) { /* Set the MAC address as the eaddr */ - IEEE802154_EADDRCOPY(dev->d_mac.ieee802154.u8, g_eaddr); + dev->d_mac.sixlowpan.nv_addrlen = NET_6LOWPAN_EADDRSIZE; + IEEE802154_EADDRCOPY(dev->d_mac.sixlowpan.nv_addr, g_eaddr); /* Set the IP address based on the eaddr */ @@ -211,7 +213,8 @@ static void lo_addr2ip(FAR struct net_driver_s *dev) { /* Set the MAC address as the saddr */ - IEEE802154_SADDRCOPY(dev->d_mac.ieee802154.u8, g_saddr); + dev->d_mac.sixlowpan.nv_addrlen = NET_6LOWPAN_SADDRSIZE; + IEEE802154_SADDRCOPY(dev->d_mac.sixlowpan.nv_addr, g_saddr); /* Set the IP address based on the saddr */ @@ -340,7 +343,7 @@ static int lo_loopback(FAR struct net_driver_s *dev) ninfo("Send frame %p to the network: Offset=%u Length=%u\n", iob, iob->io_offset, iob->io_len); - ret = sixlowpan_input(&priv->lo_ieee, iob, &ind); + ret = sixlowpan_input(&priv->lo_ieee, iob, (FAR void *)&ind); /* Increment statistics */ @@ -481,14 +484,14 @@ static int lo_ifup(FAR struct net_driver_s *dev) #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR ninfo(" Node: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x PANID=%02x:%02x\n", - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], - dev->d_mac.ieee802154.u8[2], dev->d_mac.ieee802154.u8[3], - dev->d_mac.ieee802154.u8[4], dev->d_mac.ieee802154.u8[5], - dev->d_mac.ieee802154.u8[6], dev->d_mac.ieee802154.u8[7], + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], + dev->d_mac.sixlowpan.nv_addr[2], dev->d_mac.sixlowpan.nv_addr[3], + dev->d_mac.sixlowpan.nv_addr[4], dev->d_mac.sixlowpan.nv_addr[5], + dev->d_mac.sixlowpan.nv_addr[6], dev->d_mac.sixlowpan.nv_addr[7], priv->lo_panid[0], priv->lo_panid[1]); #else ninfo(" Node: %02x:%02x PANID=%02x:%02x\n", - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], priv->lo_panid[0], priv->lo_panid[1]); #endif @@ -801,7 +804,8 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * * Returned Value: * A non-negative MAC headeer length is returned on success; a negated @@ -810,7 +814,7 @@ static int lo_ioctl(FAR struct net_driver_s *dev, int cmd, ****************************************************************************/ static int lo_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta) + FAR const void *meta) { return MAC_HDRLEN; } @@ -823,7 +827,8 @@ static int lo_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * framelist - Head of a list of frames to be transferred. * * Returned Value: @@ -833,16 +838,16 @@ static int lo_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, ****************************************************************************/ static int lo_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist) + FAR const void *meta, FAR struct iob_s *framelist) { FAR struct lo_driver_s *priv; FAR struct iob_s *iob; - DEBUGASSERT(netdev != NULL && netdev->r_dev.d_private != NULL && - framelist != NULL); + DEBUGASSERT(netdev != NULL && netdev->r_dev.d_private != NULL); priv = (FAR struct lo_driver_s *)netdev->r_dev.d_private; + DEBUGASSERT(meta != NULL && framelist != NULL); + /* Add the incoming list of framelist to queue of framelist to loopback */ for (iob = framelist; iob != NULL; iob = framelist) @@ -883,6 +888,35 @@ static int lo_req_data(FAR struct sixlowpan_driver_s *netdev, return OK; } +/**************************************************************************** + * Name: lo_properties + * + * Description: + * Different packet radios may have different properties. If there are + * multiple packet radios, then those properties have to be queried at + * run time. This information is provided to the 6LoWPAN network via the + * following structure. + * + * Input parameters: + * netdev - The network device to be queried + * properties - Location where radio properities will be returned. + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +static int lo_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties) +{ + DEBUGASSERT(netdev != NULL && properties != NULL); + + properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ + properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ + return OK; +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -943,6 +977,7 @@ int ieee8021514_loopback(void) radio->r_get_mhrlen = lo_get_mhrlen; /* Get MAC header length */ radio->r_req_data = lo_req_data; /* Enqueue frame for transmission */ + radio->r_properties = lo_properties; /* Returns radio properties */ /* Create a watchdog for timing polling for and timing of transmissions */ diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c index ffe5d79d6ae..5e038dd4a38 100644 --- a/wireless/ieee802154/mac802154_netdev.c +++ b/wireless/ieee802154/mac802154_netdev.c @@ -148,41 +148,14 @@ static void macnet_notify(FAR struct mac802154_maccb_s *maccb, static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, FAR struct ieee802154_data_ind_s *ind); -/* Asynchronous confirmations to requests */ +/* Asynchronous confirmations to requests (most not implemented) */ static void macnet_conf_data(FAR struct macnet_driver_s *priv, FAR const struct ieee802154_data_conf_s *conf); -static void macnet_conf_associate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_assoc_conf_s *conf); -static void macnet_conf_disassociate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_disassoc_conf_s *conf); -static void macnet_conf_gts(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_gts_conf_s *conf); -static void macnet_conf_rxenable(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_rxenable_conf_s *conf); -static void macnet_conf_scan(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_scan_conf_s *conf); -static void macnet_conf_start(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_start_conf_s *conf); -static void macnet_conf_poll(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_poll_conf_s *conf); -/* Asynchronous event indications, replied to synchronously with responses */ - -static void macnet_ind_associate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_assoc_ind_s *conf); -static void macnet_ind_disassociate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_disassoc_ind_s *conf); -static void macnet_ind_beacon(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_beacon_ind_s *conf); -static void macnet_ind_gts(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_gts_ind_s *conf); -static void macnet_ind_orphan(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_orphan_ind_s *conf); -static void macnet_ind_commstatus(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_commstatus_ind_s *conf); -static void macnet_ind_syncloss(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_syncloss_ind_s *conf); +/* Asynchronous event indications, replied to synchronously with responses. + * (none are implemented). + */ /* Network interface support ************************************************/ /* Common TX logic */ @@ -212,10 +185,11 @@ static int macnet_ioctl(FAR struct net_driver_s *dev, int cmd, unsigned long arg); #endif static int macnet_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta); + FAR const void *meta); static int macnet_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist); + FAR const void *meta, FAR struct iob_s *framelist); +static int macnet_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties); /**************************************************************************** * Private Functions @@ -261,7 +235,8 @@ static int macnet_advertise(FAR struct net_driver_s *dev) /* Set the MAC address as the eaddr */ eaddr = arg.u.getreq.attrval.mac.eaddr; - IEEE802154_EADDRCOPY(dev->d_mac.ieee802154.u8, eaddr); + IEEE802154_EADDRCOPY(dev->d_mac.sixlowpan.nv_addr, eaddr); + dev->d_mac.sixlowpan.nv_addrlen = NET_6LOWPAN_EADDRSIZE; /* Set the IP address based on the eaddr */ @@ -296,7 +271,8 @@ static int macnet_advertise(FAR struct net_driver_s *dev) /* Set the MAC address as the saddr */ saddr = arg.u.getreq.attrval.mac.saddr; - IEEE802154_SADDRCOPY(dev->d_mac.ieee802154.u8, saddr); + IEEE802154_SADDRCOPY(dev->d_mac.sixlowpan.nv_addr, saddr); + dev->d_mac.sixlowpan.nv_addrlen = NET_6LOWPAN_SADDRSIZE; /* Set the IP address based on the saddr */ @@ -442,7 +418,7 @@ static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, /* Transfer the frame to the network logic */ - sixlowpan_input(&priv->md_dev, iob, ind); + sixlowpan_input(&priv->md_dev, iob, (FAR void *)ind); /* sixlowpan_input() will free the IOB, but we must free the struct * ieee802154_data_ind_s container here. @@ -463,197 +439,6 @@ static int macnet_rxframe(FAR struct mac802154_maccb_s *maccb, static void macnet_conf_data(FAR struct macnet_driver_s *priv, FAR const struct ieee802154_data_conf_s *conf) { - -} - -/**************************************************************************** - * Name: macnet_conf_associate - * - * Description: - * Association request completed - * - ****************************************************************************/ - -static void macnet_conf_associate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_assoc_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_disassociate - * - * Description: - * Disassociation request completed - * - ****************************************************************************/ - -static void macnet_conf_disassociate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_disassoc_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_gts - * - * Description: - * GTS management completed - * - ****************************************************************************/ - -static void macnet_conf_gts(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_gts_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_rxenable - * - * Description: - * - ****************************************************************************/ - -static void macnet_conf_rxenable(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_rxenable_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_scan - * - * Description: - * - ****************************************************************************/ - -static void macnet_conf_scan(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_scan_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_start - * - * Description: - * - ****************************************************************************/ - -static void macnet_conf_start(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_start_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_conf_poll - * - * Description: - * - ****************************************************************************/ - -static void macnet_conf_poll(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_poll_conf_s *conf) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_associate - * - * Description: - * Association request received - * - ****************************************************************************/ - -static void macnet_ind_associate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_assoc_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_disassociate - * - * Description: - * Disassociation request received - * - ****************************************************************************/ - -static void macnet_ind_disassociate(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_disassoc_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_beacon - * - * Description: - * Beacon notification - * - ****************************************************************************/ - -static void macnet_ind_beacon(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_beacon_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_gts - * - * Description: - * GTS management request received - * - ****************************************************************************/ - -static void macnet_ind_gts(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_gts_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_orphan - * - * Description: - * Orphan device detected - * - ****************************************************************************/ - -static void macnet_ind_orphan(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_orphan_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_commstatus - * - * Description: - * - ****************************************************************************/ - -static void macnet_ind_commstatus(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_commstatus_ind_s *ind) -{ - -} - -/**************************************************************************** - * Name: macnet_ind_syncloss - * - * Description: - * - ****************************************************************************/ - -static void macnet_ind_syncloss(FAR struct macnet_driver_s *priv, - FAR struct ieee802154_syncloss_ind_s *ind) -{ - } /**************************************************************************** @@ -790,13 +575,13 @@ static int macnet_ifup(FAR struct net_driver_s *dev) #ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR wlinfo(" Node: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1], - dev->d_mac.ieee802154.u8[2], dev->d_mac.ieee802154.u8[3], - dev->d_mac.ieee802154.u8[4], dev->d_mac.ieee802154.u8[5], - dev->d_mac.ieee802154.u8[6], dev->d_mac.ieee802154.u8[7]); + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1], + dev->d_mac.sixlowpan.nv_addr[2], dev->d_mac.sixlowpan.nv_addr[3], + dev->d_mac.sixlowpan.nv_addr[4], dev->d_mac.sixlowpan.nv_addr[5], + dev->d_mac.sixlowpan.nv_addr[6], dev->d_mac.sixlowpan.nv_addr[7]); #else wlinfo(" Node: %02x:%02x\n", - dev->d_mac.ieee802154.u8[0], dev->d_mac.ieee802154.u8[1]); + dev->d_mac.sixlowpan.nv_addr[0], dev->d_mac.sixlowpan.nv_addr[1]); #endif /* Set and activate a timer process */ @@ -1062,7 +847,8 @@ static int macnet_ioctl(FAR struct net_driver_s *dev, int cmd, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * * Returned Value: * A non-negative MAC headeer length is returned on success; a negated @@ -1071,14 +857,18 @@ static int macnet_ioctl(FAR struct net_driver_s *dev, int cmd, ****************************************************************************/ static int macnet_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta) + FAR const void *meta) { FAR struct macnet_driver_s *priv; + FAR const struct ieee802154_frame_meta_s *pktmeta; - DEBUGASSERT(netdev != NULL && netdev->r_dev.d_private != NULL && meta != NULL); + DEBUGASSERT(netdev != NULL && netdev->r_dev.d_private != NULL); priv = (FAR struct macnet_driver_s *)netdev->r_dev.d_private; - return mac802154_get_mhrlen(priv->md_mac, meta); + DEBUGASSERT(meta != NULL); + pktmeta = (FAR const struct ieee802154_frame_meta_s *)meta; + + return mac802154_get_mhrlen(priv->md_mac, pktmeta); } /**************************************************************************** @@ -1089,7 +879,8 @@ static int macnet_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, * * Input parameters: * netdev - The networkd device that will mediate the MAC interface - * meta - Meta data needed to recreate the MAC header + * meta - Obfuscated metadata structure needed to create the radio + * MAC header * framelist - Head of a list of frames to be transferred. * * Returned Value: @@ -1099,10 +890,10 @@ static int macnet_get_mhrlen(FAR struct sixlowpan_driver_s *netdev, ****************************************************************************/ static int macnet_req_data(FAR struct sixlowpan_driver_s *netdev, - FAR const struct ieee802154_frame_meta_s *meta, - FAR struct iob_s *framelist) + FAR const void *meta, FAR struct iob_s *framelist) { FAR struct macnet_driver_s *priv; + FAR const struct ieee802154_frame_meta_s *pktmeta; FAR struct iob_s *iob; int ret; @@ -1112,6 +903,7 @@ static int macnet_req_data(FAR struct sixlowpan_driver_s *netdev, priv = (FAR struct macnet_driver_s *)netdev->r_dev.d_private; DEBUGASSERT(meta != NULL && framelist != NULL); + pktmeta = (FAR const struct ieee802154_frame_meta_s *)meta; /* Add the incoming list of frames to the MAC's outgoing queue */ @@ -1133,7 +925,7 @@ static int macnet_req_data(FAR struct sixlowpan_driver_s *netdev, do { - ret = mac802154_req_data(priv->md_mac, meta, iob); + ret = mac802154_req_data(priv->md_mac, pktmeta, iob); } while (ret == -EINTR); @@ -1160,6 +952,35 @@ static int macnet_req_data(FAR struct sixlowpan_driver_s *netdev, return OK; } +/**************************************************************************** + * Name: macnet_properties + * + * Description: + * Different packet radios may have different properties. If there are + * multiple packet radios, then those properties have to be queried at + * run time. This information is provided to the 6LoWPAN network via the + * following structure. + * + * Input parameters: + * netdev - The network device to be queried + * properties - Location where radio properities will be returned. + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on + * any failure. + * + ****************************************************************************/ + +static int macnet_properties(FAR struct sixlowpan_driver_s *netdev, + FAR struct sixlowpan_properties_s *properties) +{ + DEBUGASSERT(netdev != NULL && properties != NULL); + + properties->sp_addrlen = NET_6LOWPAN_ADDRSIZE; /* Length of an address */ + properties->sp_pktlen = CONFIG_NET_6LOWPAN_FRAMELEN; /* Fixed frame length */ + return OK; +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -1244,8 +1065,9 @@ int mac802154netdev_register(MACHANDLE mac) /* Initialize the Network frame-related callbacks */ - radio->r_get_mhrlen = macnet_get_mhrlen; /* Get MAC header length */ - radio->r_req_data = macnet_req_data; /* Enqueue frame for transmission */ + radio->r_get_mhrlen = macnet_get_mhrlen; /* Get MAC header length */ + radio->r_req_data = macnet_req_data; /* Enqueue frame for transmission */ + radio->r_properties = macnet_properties; /* Return radio properies */ /* Initialize the MAC callbacks */