Squashed commit of the following:

commit f97da3a546f9d6e1b858cfc45538a06b62396034
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 30 19:09:46 2017 -0600

    Network: Condition out some types that depend on definitions that are only available with 6LoWPAN is enabled.

commit 312e9dc1195527100e12bf6be8b629f5b29be1f6
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 30 18:57:23 2017 -0600

    6LoWPAN: Fix case where source and destination IP address were backward.  Fix some compile issues when star topology support is enabled.

commit 3b0e71c5807194fbb006d0560bb2c98133055ba3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 30 16:01:48 2017 -0600

    6LoWPAN PktRadio:  Finishes up all logic; Lots of misc changes from build testing.

commit cc118f8cb335e1c48354fd7112e20be57de50b68
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 30 12:41:18 2017 -0600

    6LoWPAN: Remove explicate type struct ieee802154_frame_meta_s from derive interface methods.  Replace with a opaque void * type so that other radio meta data structures may use the interfaces.  Add a new radion interface to get properties of the radio.  Spirit:  Finish packet I/O interface with the network.

commit 1aa0a63e8341ca5f9f88c294f96d1740459146d4
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 30 07:57:15 2017 -0600

    6LoWPAN: Replace metadata input parameter type from struct ieee802154_data_ind_s to void*.  This permits radios with different MAC metadata to interact with 6LoWPAN.  Includes many changes to handle variable length radio addresses.  No longer just short and exteneded; any length.

commit 46266ace61ae6246123873935436d864c7de31e0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 17:50:42 2017 -0600

    Spirit: Fix typos in SPI debug code.

commit 27c6b235f6a2d3b2f08da4920b224a40e9991f59
Merge: 7029dffd02 7f53e08917
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 13:43:02 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 7029dffd02156bcbfa84262671c2ca766a117191
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 12:02:13 2017 -0600

    6LoWPAN PktRadio: Add missing MetaData-related prototypes and initialization logic.  Perform a major renaming to make room in the 6LoWPAN name space for packet radios.

commit e2012f7c1df14155c0bfd45d7f1cb3f71b259f48
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 10:16:23 2017 -0600

    6LoWPAN PktRadio:  Some initial changes to support raw packet radios without IEEE 802.15.4 with 6LoWPAN.

commit c6dbf9178539b7da75e492ffd1d1f93c9c326299
Merge: da782d6cdf 5889ce65f5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 07:30:08 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit da782d6cdff5980d71aaa2da5f9c28ab3438d085
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 29 07:26:48 2017 -0600

    Spirit:  Completes port of the spirit radio library to NuttX.

commit 63f3595c47dca13952d28b518c7f0a8d6ae9037a
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 17:42:51 2017 -0600

    Spirit:  Bring in a couple ore more radio interface functions.

commit 692a27da396b7683749790923d8fa085091764f1
Merge: 27c0a6ec08 38f79543dc
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 15:49:37 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 27c0a6ec0813187f125922c81189a70cf04d83d4
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 15:47:27 2017 -0600

    Spirit:  Bring in a couple ore more radio interface functions.

commit 96657af2831487724723a60084831619257fd953
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 14:20:14 2017 -0600

    Spirit:  Bring in more radio interface functions.

commit 640d55399b54a019be68825668fca1446abd082f
Merge: 3fcf84a9a2 47791442a0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 12:01:43 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 3fcf84a9a2673e1e1466ce5b114d7b73c257e515
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 12:00:31 2017 -0600

    Spirit: Brings in the last of the PktCommon interfaces.

commit d26ebd901ba4ba84910e99b4e728b98c30fa4c0b
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 09:54:52 2017 -0600

    Spirit: Add a few more PktCommon interfaces.

commit b5cb8041d50233a4abb8fb4d1dcef5428ae2c2b2
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 09:33:31 2017 -0600

    libc/termios:  Remember block comments before empty file sections.

commit 0fcab2c1c8c74442d40bd5e8c6af50a34f8a5821
Author: Sebastien Lorquet <sebastien@lorquet.fr>
Date:   Fri Jul 28 09:31:00 2017 -0600

    tcdrain implementation based on a new term ioctl

commit 797d4adf7d41068c671f0217d369b797b269de1a
Author: Stefan Kolb <Stefan.Kolb@avat.de>
Date:   Fri Jul 28 09:19:04 2017 -0600

    We discovered a problem with the samv7 mcan driver which results, under some circumstances, in a very high CPU load.

    The problem occurs, and is easily reproducible, if the device is connected to a CAN network with a wrongly configured CAN speed (baud rate). In our tests we set the CAN speed of the device to 1000000 and the speed of the other CAN nodes to 500000. The device is restarted and sends a CANopen “bootup message” to the CAN network. This results in huge amount of errors messages on the CAN bus, probably because of the CAN feature for acknowledging error messages. The error messages can’t be read by the device because of the misconfigured CAN speed, instead the CAN chip reports lots of errors, which are reported to the application which uses the CAN driver (CONFIG_CAN_ERRORS is enabled).

    The CAN errors are reported from the CAN chip via interrupts and thus the interrupt load is very high in this scenario. To fix the problem the driver now disables each RX error interrupt after it is occurred. The RX error interrupts are turned back on if at least one CAN message is received successfully.

commit e298f48e96d9e34017dcab8e4d87032862ae9322
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 28 09:06:26 2017 -0600

    Spirit:  Bring in PktStack interfaces.

commit 4a0f00a7058312dcf6ac392689b9f69112f613ec
Merge: 855cf97130 b458934ac4
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 18:05:02 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 855cf9713052a851a1daeb3842db2edd6ff6f658
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 18:03:56 2017 -0600

    Spirit Network Driver:  Add some hooks that will eventually support address filtering.

commit 3b3fb24ea86cf8233b034871d5c550f47ab852e6
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 17:13:21 2017 -0600

    Spirit: Add a PktStack header file.

commit 705e8fff6a21264ab751fb34c107cb109430ac89
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 15:00:03 2017 -0600

    Spirit:  Bring in last of timer interfaces.

commit f8984b2f82e165f5bba132d6b099222d1beb1fbd
Merge: cb79778a30 f287cc25d6
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 11:57:01 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit cb79778a3044ae97a1cc615dfa24099144f04bd0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 11:46:31 2017 -0600

    Spirit:  Bring in last of QI interfaces.

commit 0245b330a33aa73531b82ae261b1312be9922e0f
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 10:14:34 2017 -0600

    Spirit:  Add general interfaces.

commit 121845a8f229ec2c88e5721da5512135f6624ee5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Thu Jul 27 09:41:23 2017 -0600

    Spirit:  Bring in last of GPIO interfaces.

commit 279bfcc92bcd0cfa48c0ed7862fa2b75fbee99b8
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 17:09:19 2017 -0600

    Spirit: Add some missing configuration options: Add register -level debug options.

commit 4be89324a5908e35afc70373c279f4d05f62b48f
Merge: 66e87f9bb3 598386ef90
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 15:36:20 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 66e87f9bb3ef75fddf25400bc08475c5e6ad4c30
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 15:19:56 2017 -0600

    Spirit:  Brings in last of PktBasic logic.

commit 8b4c89d6a103003fa04363e2c2ae7b9ee390bf49
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 11:55:50 2017 -0600

    Spirit:  Bring in AES and MBUS logic.

commit d00022d39ab0ce839de29386949481e5c24feff3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 09:22:03 2017 -0600

    Spirit:  Bring in remainder of calibration interfaces.

commit 40b4b2f902e04293f8940551a97a9a24a48988dd
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 08:44:32 2017 -0600

    Spirit:  Bring in DirectRF interfaces.

commit 7c109608e1a2989f3edbc2fd939a2d225fff382a
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Wed Jul 26 07:46:19 2017 -0600

    Spirit: Add CSMA support.

commit 0f88896595d162c4ac6138e7b1af2fc35c865b3d
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 18:57:43 2017 -0600

    Spirit:  Add some initial TX logic to network driver.

commit 4dc7058dfcdcf40980578680b7e1a4206dea4ea2
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 17:02:11 2017 -0600

    Spirit: Completes ports of spirit_management.* files

commit c904eef51d929e041b87d0c8aff6fa3c2f895341
Merge: 91e985a877 c9ff8cbab9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 15:15:04 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 91e985a87729017a66d19276c4d47681064f95ea
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 15:13:54 2017 -0600

    Spirit:  Add a few more functions that will soon be needed for packet transmission.

commit b5981d29983907c2194fbc26af4b72ad532bee78
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 13:30:07 2017 -0600

    Spirit:  Finish off some initialization issues; Started some interrupt handling logic.

commit c21073e0bc2870b3d9ba40bdfdfd5151ce4f5890
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 09:35:52 2017 -0600

    Spirit:  Completes very basic radio initialization for network driver

commit 1b544334361c54f46bcf0ba313c125932e8dafc6
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Tue Jul 25 07:58:30 2017 -0600

    Spirit: Add more radio initialization logic... getting closer.

commit 45d1047db60843c57d394ec910c63e7c127671e0
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 19:15:33 2017 -0600

    Spirit: add some CSMA initialization logic

commit bcf55c71336d48947fe19bb09a799169852301c2
Merge: 89e9d426e9 2fc0fbcf7e
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:47:11 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 89e9d426e91c056e659fccf5e5c4392618f8f777
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:44:19 2017 -0600

    Update some comments

commit 9c5d8a5833350006ed389e898b11c8c8a20e5f4f
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 16:15:54 2017 -0600

    Spirit:  Rename drivers/wireless/spirit/src to lib.  Move Spirit network driver out of IEEE802.15.4 into drivers/wireless/spirit/drivers

commit cabc0ec9e6eb558dcb715ab17264383aa0105e7a
Merge: 87b616414a 6bd744c4b3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 15:38:40 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 87b616414a79c01a71acea78f8258e05325c1996
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 15:37:27 2017 -0600

    Spirit radio driver is mutating into a standalone network driver.

commit 507798233868a661ae8adad3e3aa117075a7a146
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 13:32:08 2017 -0600

    Spirit: More radio initialization logic

commit 33af25704ce9ca83d576300d153cfe31cc6d2576
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 12:19:14 2017 -0600

    Spirit:  Beginning of radio initialization logic

commit 97b20014c016e55952a8f9d8f4ae29e2cc555b23
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Mon Jul 24 09:42:06 2017 -0600

    Spirit: More initialization logic.

commit 295d8e27824c0417fccea2344b30bb5c93ffbabe
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 15:39:53 2017 -0600

    Spirit:  Add header file containing enumeration of commands.

commit 8a2d9dd8eb9cc70cbcdd1b913fc9022b9c9ec8da
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 11:33:50 2017 -0600

    Spirit:  Add GPIO initialization logic

commit 8b6d80c44f92024c45a6ba63ba1af3fdafe94dc3
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sun Jul 23 10:07:25 2017 -0600

    Spirit:  Add interrupt control logic.

commit 423f846fe5c914f92a4bfea4d9d1fa33de1c77a5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 19:06:52 2017 -0600

    Spirit: Yet a little more radio initialization logic.

commit 5895b979823e51ddde5ad52e6de66a8ad662e883
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 15:36:05 2017 -0600

    Spirit: A little more radio initialization logic.

commit 86311ab30aad386203c181c792847dd1d37f9a02
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 13:02:32 2017 -0600

    Spirit: A miniscule amount of radio initialization logic.

commit ad55e89d5ee12ea1eeea95fcd38ff3da0db4416a
Merge: 90a7666655 f4e46b0da7
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 10:56:30 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 90a766665534b05da0157dbc383cb06a98c86a79
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 10:52:52 2017 -0600

    Spirit1:  A few fixes for a clean build of initial configuration (not much there yet)

commit bbbf04c223230a52a7705a2161128265cfbaa480
Merge: 623d54a7f7 2319ea53a9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:53:57 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 623d54a7f719e9032099f88f38203efee4b80722
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:43:52 2017 -0600

    b-l475e-iot01a: Add a configuration for testing sprit radio.

commit d309d73d9f4665f9d870eb03531f450043d9389d
Merge: 52c3ddfae6 d88dc9b2e5
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 09:02:06 2017 -0600

    Merge remote-tracking branch 'origin/master' into spirit

commit 52c3ddfae6802e111c2b5cf1207baf21a61dd00b
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Sat Jul 22 08:33:04 2017 -0600

    Spirit:  Add register definition header file.

commit 8d842ab5e8f9ca653b42f9ee88dc279f06b4fa98
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 17:27:03 2017 -0600

    b-l475e-iot01a: Add initial, unverified support for the SPSRGF/Spirit1 module.

commit 73d902a1048616fb9c2dd2147cabcd8ee78e19ac
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 15:49:43 2017 -0600

    Spirit: Fixes to get skeleton IEEE 802.15.4 driver build.

commit ebc5a8387bb94f0cc3827533795f3e4a33207e67
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 15:16:29 2017 -0600

    Spirit1:  Add framework for IEEE 802.15.4 driver.  Does not yet build.

commit 52e195a7ae14ddb18bdd56258f4877381d2501ca
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 14:02:42 2017 -0600

    Spirit:  A little more SPI logic.

commit 90048d0c5b8a5af4d81a15d99535c84ed38d8ae9
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 11:19:06 2017 -0600

    Spirit: Build directories setup.  Some initial files added, mostly just to verify build.

commit 8273a381ac1f6bb081b292b5e73226185e9e634c
Author: Gregory Nutt <gnutt@nuttx.org>
Date:   Fri Jul 21 08:34:04 2017 -0600

    USB composite:  Remove references to CDC/ACM and USB MSC from composite logic.  They are no longer coupled.
This commit is contained in:
Gregory Nutt
2017-07-30 19:10:51 -06:00
parent a420c0f369
commit 1e24404dcc
30 changed files with 1366 additions and 958 deletions
@@ -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
@@ -41,6 +41,7 @@
#include <nuttx/config.h>
#include <string.h>
#include <assert.h>
#include <debug.h>
File diff suppressed because it is too large Load Diff
+10 -9
View File
@@ -45,6 +45,7 @@
* Included Files
******************************************************************************/
#include <stdio.h>
#include <assert.h>
#include <nuttx/spi/spi.h>
@@ -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
-125
View File
@@ -1,125 +0,0 @@
/****************************************************************************
* include/nuttx/net/ieee802154.h
*
* Copyright (C) 2017, Gregory Nutt, all rights reserved
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Derives from Contiki:
*
* Copyright (c) 2008, Swedish Institute of Computer Science.
* All rights reserved.
* Authors: Adam Dunkels <adam@sics.se>
* Nicolas Tsiftes <nvt@sics.se>
* Niclas Finne <nfi@sics.se>
* Mathilde Durvy <mdurvy@cisco.com>
* Julien Abeille <jabeille@cisco.com>
*
* 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 <nuttx/config.h>
#include <stdint.h>
#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 */
+39 -13
View File
@@ -63,14 +63,24 @@
# include <nuttx/net/igmp.h>
#endif
#ifdef CONFIG_NET_6LOWPAN
# include <nuttx/net/ieee802154.h>
#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
/****************************************************************************
+79 -16
View File
@@ -57,7 +57,6 @@
#include <nuttx/clock.h>
#include <nuttx/mm/iob.h>
#include <nuttx/net/netdev.h>
#include <nuttx/net/ieee802154.h>
#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 */
@@ -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 <gnutt@nuttx.org>
+6 -12
View File
@@ -45,6 +45,8 @@
#include <nuttx/config.h>
#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 */
+1
View File
@@ -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
+1
View File
@@ -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
+9 -7
View File
@@ -51,7 +51,8 @@
#include <nuttx/clock.h>
#include <nuttx/net/ip.h>
#include <nuttx/net/ieee802154.h>
#include <nuttx/net/netdev.h>
#include <nuttx/net/sixlowpan.h>
#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;
};
+6 -3
View File
@@ -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 */
+70 -23
View File
@@ -37,6 +37,7 @@
#include <nuttx/config.h>
#include <stdio.h>
#include <debug.h>
#include <nuttx/net/net.h>
@@ -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 */
}
/****************************************************************************
+24 -8
View File
@@ -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
+18 -1
View File
@@ -46,6 +46,7 @@
#include <nuttx/net/net.h>
#include <nuttx/net/netdev.h>
#include <nuttx/net/sixlowpan.h>
#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.
+10 -10
View File
@@ -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)
+159 -70
View File
@@ -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. */
+9 -8
View File
@@ -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);
}
+98 -54
View File
@@ -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);
}
}
+36 -40
View File
@@ -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
{
+4 -5
View File
@@ -39,6 +39,7 @@
#include <nuttx/config.h>
#include <assert.h>
#include <debug.h>
#include <nuttx/net/netdev.h>
@@ -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 */
+46 -50
View File
@@ -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;
+127 -80
View File
@@ -66,6 +66,7 @@
#include <nuttx/net/udp.h>
#include <nuttx/net/icmpv6.h>
#include <nuttx/net/sixlowpan.h>
#include <nuttx/wireless/pktradio.h>
#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 */
+2 -2
View File
@@ -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;
+4 -4
View File
@@ -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;
+2 -2
View File
@@ -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;
+248 -55
View File
@@ -57,6 +57,7 @@
#include <debug.h>
#include <nuttx/net/sixlowpan.h>
#include <nuttx/wireless/pktradio.h>
#include <nuttx/wireless/ieee802154/ieee802154_mac.h>
#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 */
+53 -18
View File
@@ -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 */
+65 -243
View File
@@ -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 */