1e24404dcc
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: 7029dffd027f53e08917
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: da782d6cdf5889ce65f5
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: 27c0a6ec0838f79543dc
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: 3fcf84a9a247791442a0
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: 855cf97130b458934ac4
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: cb79778a30f287cc25d6
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: 66e87f9bb3598386ef90
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: 91e985a877c9ff8cbab9
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: 89e9d426e92fc0fbcf7e
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: 87b616414a6bd744c4b3
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: 90a7666655f4e46b0da7
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: 623d54a7f72319ea53a9
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: 52c3ddfae6d88dc9b2e5
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.
520 lines
17 KiB
C
520 lines
17 KiB
C
/****************************************************************************
|
|
* net/devif/ipv6_input.c
|
|
* Device driver IPv6 packet receipt interface
|
|
*
|
|
* Copyright (C) 2015, 2017 Gregory Nutt. All rights reserved.
|
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
|
*
|
|
* Adapted for NuttX from logic in uIP which also has a BSD-like license:
|
|
*
|
|
* uIP is an implementation of the TCP/IP protocol stack intended for
|
|
* small 8-bit and 16-bit microcontrollers.
|
|
*
|
|
* uIP provides the necessary protocols for Internet communication,
|
|
* with a very small code footprint and RAM requirements - the uIP
|
|
* code size is on the order of a few kilobytes and RAM usage is on
|
|
* the order of a few hundred bytes.
|
|
*
|
|
* Original author Adam Dunkels <adam@dunkels.com>
|
|
* Copyright () 2001-2003, Adam Dunkels.
|
|
* All rights reserved.
|
|
*
|
|
* 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. The name of the author may not be used to endorse or promote
|
|
* products derived from this software without specific prior
|
|
* written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* uIP is a small implementation of the IP, UDP and TCP protocols (as
|
|
* well as some basic ICMP stuff). The implementation couples the IP,
|
|
* UDP, TCP and the application layers very tightly. To keep the size
|
|
* of the compiled code down, this code frequently uses the goto
|
|
* statement. While it would be possible to break the ipv6_input()
|
|
* function into many smaller functions, this would increase the code
|
|
* size because of the overhead of parameter passing and the fact that
|
|
* the optimizer would not be as efficient.
|
|
*
|
|
* The principle is that we have a small buffer, called the d_buf,
|
|
* in which the device driver puts an incoming packet. The TCP/IP
|
|
* stack parses the headers in the packet, and calls the
|
|
* application. If the remote host has sent data to the application,
|
|
* this data is present in the d_buf and the application read the
|
|
* data from there. It is up to the application to put this data into
|
|
* a byte stream if needed. The application will not be fed with data
|
|
* that is out of sequence.
|
|
*
|
|
* If the application wishes to send data to the peer, it should put
|
|
* its data into the d_buf. The d_appdata pointer points to the
|
|
* first available byte. The TCP/IP stack will calculate the
|
|
* checksums, and fill in the necessary header fields and finally send
|
|
* the packet back to the peer.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#ifdef CONFIG_NET_IPv6
|
|
|
|
#include <sys/ioctl.h>
|
|
#include <stdint.h>
|
|
#include <debug.h>
|
|
#include <string.h>
|
|
|
|
#include <net/if.h>
|
|
|
|
#include <nuttx/net/netconfig.h>
|
|
#include <nuttx/net/netdev.h>
|
|
#include <nuttx/net/netstats.h>
|
|
#include <nuttx/net/ip.h>
|
|
|
|
#include "neighbor/neighbor.h"
|
|
#include "tcp/tcp.h"
|
|
#include "udp/udp.h"
|
|
#include "sixlowpan/sixlowpan.h"
|
|
#include "pkt/pkt.h"
|
|
#include "icmpv6/icmpv6.h"
|
|
|
|
#include "netdev/netdev.h"
|
|
#include "ipforward/ipforward.h"
|
|
#include "devif/devif.h"
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Macros */
|
|
|
|
#define IPv6BUF ((FAR struct ipv6_hdr_s *)&dev->d_buf[NET_LL_HDRLEN(dev)])
|
|
|
|
/****************************************************************************
|
|
* Private Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: check_dev_destipaddr
|
|
*
|
|
* Description:
|
|
* Check if the destination address in the IPv6 is destined for the
|
|
* provided network device.
|
|
*
|
|
* Returned Value:
|
|
* 1 - This packet is destined for this network device
|
|
* 0 - This packet is NOT destined for this network device
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_NETDEV_MULTINIC
|
|
static int check_dev_destipaddr(FAR struct net_driver_s *dev, FAR void *arg)
|
|
{
|
|
FAR struct ipv6_hdr_s *ipv6 = (FAR struct ipv6_hdr_s *)arg;
|
|
|
|
/* Check if the IPv6 destination address matches the IPv6 address assigned
|
|
* to this device.
|
|
*/
|
|
|
|
if (net_ipv6addr_cmp(ipv6->destipaddr, dev->d_ipv6addr))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
/* No match, return 0 to keep searching */
|
|
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: check_destipaddr
|
|
*
|
|
* Description:
|
|
* Check if the destination address in the IPv6 is destined for us. This
|
|
* is typically just a comparison the of the IPv6 destination address in
|
|
* the IPv6 packet with the IPv6 address assigned to the receiving device.
|
|
*
|
|
* Input Parameters:
|
|
* dev - The device on which the packet was received and which contains
|
|
* the IPv6 packet.
|
|
* ipv6 - A convenience pointer to the IPv6 header in within the IPv6
|
|
* packet
|
|
*
|
|
* Returned Value:
|
|
* true - This packet is destined for us
|
|
* false - This packet is NOT destined for us and may need to be forwarded.
|
|
*
|
|
****************************************************************************/
|
|
|
|
static bool check_destipaddr(FAR struct net_driver_s *dev,
|
|
FAR struct ipv6_hdr_s *ipv6)
|
|
{
|
|
#ifdef CONFIG_NETDEV_MULTINIC
|
|
int ret;
|
|
#endif
|
|
|
|
/* For IPv6, packet reception is a little trickier as we need to make sure
|
|
* that we listen to certain multicast addresses (all hosts multicast
|
|
* address, and the solicited-node multicast address) as well. However,
|
|
* we will cheat here and accept all multicast packets that are sent to
|
|
* the ff02::/16 addresses.
|
|
*/
|
|
|
|
if (ipv6->destipaddr[0] == HTONS(0xff02))
|
|
{
|
|
#ifdef CONFIG_NET_IPFORWARD_BROADCAST
|
|
/* Forward multicast packets */
|
|
|
|
ipv6_forward_broadcast(dev, ipv6);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
#ifdef CONFIG_NETDEV_MULTINIC
|
|
/* We will also allow for a perverse case where we receive a packet
|
|
* addressed to us, but on a different device. Can that really happen?
|
|
*/
|
|
|
|
ret = netdev_foreach(check_dev_destipaddr, ipv6);
|
|
if (ret == 1)
|
|
{
|
|
/* The traversal of the network devices will return 0 if there is
|
|
* no network device with that address or 1 if there is a network
|
|
* device with such an address.
|
|
*/
|
|
|
|
return true;
|
|
}
|
|
#else
|
|
/* There is only one network device. If this packet is addressed to us,
|
|
* then the IPv6 destination address must be the address of assigned to
|
|
* this device.
|
|
*/
|
|
|
|
if (net_ipv6addr_cmp(ipv6->destipaddr, dev->d_ipv6addr))
|
|
{
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* Public Functions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: ipv6_input
|
|
*
|
|
* Description:
|
|
* Receive an IPv6 packet from the network device. Verify and forward to
|
|
* L3 packet handling logic if the packet is destined for us.
|
|
*
|
|
* Input Parameters:
|
|
* dev - The device on which the packet was received and which contains
|
|
* the IPv6 packet.
|
|
* Returned Value:
|
|
* OK - The packet was processed (or dropped) and can be discarded.
|
|
* ERROR - Hold the packet and try again later. There is a listening
|
|
* socket but no receive in place to catch the packet yet. The
|
|
* device's d_len will be set to zero in this case as there is
|
|
* no outgoing data.
|
|
*
|
|
* If this function returns to the network driver with dev->d_len > 0,
|
|
* that is an indication to the driver that there is an outgoing response
|
|
* to this input.
|
|
*
|
|
* Assumptions:
|
|
* The network is locked.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int ipv6_input(FAR struct net_driver_s *dev)
|
|
{
|
|
FAR struct ipv6_hdr_s *ipv6 = IPv6BUF;
|
|
uint16_t hdrlen;
|
|
uint16_t pktlen;
|
|
#ifdef CONFIG_NET_IPFORWARD
|
|
int ret;
|
|
#endif
|
|
|
|
/* This is where the input processing starts. */
|
|
|
|
#ifdef CONFIG_NET_STATISTICS
|
|
g_netstats.ipv6.recv++;
|
|
#endif
|
|
|
|
/* Start of IP input header processing code. */
|
|
/* Check validity of the IP header. */
|
|
|
|
if ((ipv6->vtc & 0xf0) != 0x60)
|
|
{
|
|
/* IP version and header length. */
|
|
|
|
#ifdef CONFIG_NET_STATISTICS
|
|
g_netstats.ipv6.drop++;
|
|
g_netstats.ipv6.vhlerr++;
|
|
#endif
|
|
|
|
nwarn("WARNING: Invalid IPv6 version: %d\n", ipv6->vtc >> 4);
|
|
goto drop;
|
|
}
|
|
|
|
/* Get the size of the packet minus the size of link layer header */
|
|
|
|
hdrlen = NET_LL_HDRLEN(dev);
|
|
if ((hdrlen + IPv6_HDRLEN) > dev->d_len)
|
|
{
|
|
nwarn("WARNING: Packet shorter than IPv6 header\n");
|
|
goto drop;
|
|
}
|
|
|
|
dev->d_len -= hdrlen;
|
|
|
|
/* Check the size of the packet. If the size reported to us in d_len is
|
|
* smaller the size reported in the IP header, we assume that the packet
|
|
* has been corrupted in transit. If the size of d_len is larger than the
|
|
* size reported in the IP packet header, the packet has been padded and
|
|
* we set d_len to the correct value.
|
|
*
|
|
* The length reported in the IPv6 header is the length of the payload
|
|
* that follows the header. The device interface uses the d_len variable
|
|
* for holding the size of the entire packet, including the IP header but
|
|
* without the link layer header.
|
|
*/
|
|
|
|
pktlen = ((uint16_t)ipv6->len[0] << 8) + (uint16_t)ipv6->len[1] +
|
|
IPv6_HDRLEN;
|
|
|
|
if (pktlen <= dev->d_len)
|
|
{
|
|
dev->d_len = pktlen;
|
|
}
|
|
else
|
|
{
|
|
nwarn("WARNING: IP packet shorter than length in IP header\n");
|
|
goto drop;
|
|
}
|
|
|
|
/* If IP broadcast support is configured, we check for a broadcast
|
|
* UDP packet, which may be destined to us (even if there is no IP
|
|
* address yet assigned to the device as is the case when we are
|
|
* negotiating over DHCP for an address).
|
|
*/
|
|
|
|
#if defined(CONFIG_NET_BROADCAST) && defined(NET_UDP_HAVE_STACK)
|
|
if (ipv6->proto == IP_PROTO_UDP &&
|
|
net_ipv6addr_cmp(ipv6->destipaddr, g_ipv6_alloneaddr))
|
|
{
|
|
#ifdef CONFIG_NET_IPFORWARD_BROADCAST
|
|
/* Forward broadcast packets */
|
|
|
|
ipv6_forward_broadcast(dev, ipv6);
|
|
#endif
|
|
return udp_ipv6_input(dev);
|
|
}
|
|
|
|
/* In other cases, the device must be assigned a non-zero IP address. */
|
|
|
|
else
|
|
#endif
|
|
#ifdef CONFIG_NET_ICMPv6
|
|
if (net_ipv6addr_cmp(dev->d_ipv6addr, g_ipv6_allzeroaddr))
|
|
{
|
|
/* If we are configured to use ping IP address configuration and
|
|
* hasn't been assigned an IP address yet, we accept all ICMP
|
|
* packets.
|
|
*/
|
|
|
|
nwarn("WARNING: No IP address assigned\n");
|
|
goto drop;
|
|
}
|
|
|
|
/* Check if the packet is destined for out IP address */
|
|
|
|
else
|
|
#endif
|
|
{
|
|
/* Check if the packet is destined for us. */
|
|
|
|
if (!check_destipaddr(dev, ipv6))
|
|
{
|
|
#ifdef CONFIG_NET_IPFORWARD
|
|
/* Not destined for us, try to forward the packet */
|
|
|
|
ret = ipv6_forward(dev, ipv6);
|
|
if (ret >= 0)
|
|
{
|
|
/* The packet was forwarded. Return success; d_len will
|
|
* be set appropriately by the forwarding logic: Cleared
|
|
* if the packet is forward via anoother device or non-
|
|
* zero if it will be forwarded by the same device that
|
|
* it was received on.
|
|
*/
|
|
|
|
return OK;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
/* 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
|
|
goto drop;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Make sure that all packet processing logic knows that there is an IPv6
|
|
* packet in the device buffer.
|
|
*/
|
|
|
|
IFF_SET_IPv6(dev->d_flags);
|
|
|
|
/* Now process the incoming packet according to the protocol. */
|
|
|
|
switch (ipv6->proto)
|
|
{
|
|
#ifdef NET_TCP_HAVE_STACK
|
|
case IP_PROTO_TCP: /* TCP input */
|
|
/* Forward the IPv6 TCP packet */
|
|
|
|
tcp_ipv6_input(dev);
|
|
|
|
#ifdef CONFIG_NET_6LOWPAN
|
|
/* TCP output comes through three different mechansims. Either from:
|
|
*
|
|
* 1. TCP socket output. For the case of TCP output to an
|
|
* IEEE802.15.4, the TCP output is caught in the socket
|
|
* send()/sendto() logic and and redirected to 6LoWPAN logic.
|
|
* 2. TCP output from the TCP state machine. That will occur
|
|
* during TCP packet processing by the TCP state meachine.
|
|
* 3. TCP output resulting from TX or timer polling
|
|
*
|
|
* Case 3 is handled here. Logic here detects if (1) an attempt
|
|
* to return with d_len > 0 and (2) that the device is an
|
|
* IEEE802.15.4 MAC network driver. Under those conditions, 6LoWPAN
|
|
* logic will be called to create the IEEE80215.4 frames.
|
|
*/
|
|
|
|
#ifdef CONFIG_NET_MULTILINK
|
|
/* Handle the case where multiple link layer protocols are supported */
|
|
|
|
if (dev->d_len > 0 && dev->d_lltype == CONFIG_NET_6LOWPAN)
|
|
#else
|
|
if (dev->d_len > 0)
|
|
#endif
|
|
{
|
|
/* Let 6LoWPAN handle the TCP output */
|
|
|
|
sixlowpan_tcp_send(dev, dev, ipv6);
|
|
|
|
/* Drop the packet in the d_buf */
|
|
|
|
goto drop;
|
|
}
|
|
#endif /* CONFIG_NET_6LOWPAN */
|
|
break;
|
|
#endif /* NET_TCP_HAVE_STACK */
|
|
|
|
#ifdef NET_UDP_HAVE_STACK
|
|
case IP_PROTO_UDP: /* UDP input */
|
|
/* Forward the IPv6 UDP packet */
|
|
|
|
udp_ipv6_input(dev);
|
|
break;
|
|
#endif
|
|
|
|
/* Check for ICMP input */
|
|
|
|
#ifdef CONFIG_NET_ICMPv6
|
|
case IP_PROTO_ICMP6: /* ICMP6 input */
|
|
/* Forward the ICMPv6 packet */
|
|
|
|
icmpv6_input(dev);
|
|
|
|
#ifdef CONFIG_NET_6LOWPAN
|
|
/* All outgoing ICMPv6 messages come through one of two mechanisms:
|
|
*
|
|
* 1. The output from internal ICMPv6 message passing. These
|
|
* outgoing messages will use device polling and will be
|
|
* handled elsewhere.
|
|
* 2. ICMPv6 output resulting from TX or timer polling.
|
|
*
|
|
* Case 2 is handled here. Logic here detects if (1) an attempt
|
|
* to return with d_len > 0 and (2) that the device is an
|
|
* IEEE802.15.4 MAC network driver. Under those conditions, 6LoWPAN
|
|
* logic will be called to create the IEEE80215.4 frames.
|
|
*/
|
|
|
|
#ifdef CONFIG_NET_MULTILINK
|
|
/* Handle the case where multiple link layer protocols are supported */
|
|
|
|
if (dev->d_len > 0 && dev->d_lltype == CONFIG_NET_6LOWPAN)
|
|
#else
|
|
if (dev->d_len > 0)
|
|
#endif
|
|
{
|
|
/* Let 6LoWPAN handle the ICMPv6 output */
|
|
|
|
sixlowpan_icmpv6_send(dev, dev, ipv6);
|
|
|
|
/* Drop the packet in the d_buf */
|
|
|
|
goto drop;
|
|
}
|
|
#endif /* CONFIG_NET_6LOWPAN */
|
|
break;
|
|
#endif /* CONFIG_NET_ICMPv6 */
|
|
|
|
default: /* Unrecognized/unsupported protocol */
|
|
#ifdef CONFIG_NET_STATISTICS
|
|
g_netstats.ipv6.drop++;
|
|
g_netstats.ipv6.protoerr++;
|
|
#endif
|
|
|
|
nwarn("WARNING: Unrecognized IP protocol: %04x\n", ipv6->proto);
|
|
goto drop;
|
|
}
|
|
|
|
/* Return and let the caller do any pending transmission. */
|
|
|
|
return OK;
|
|
|
|
/* Drop the packet. NOTE that OK is returned meaning that the
|
|
* packet has been processed (although processed unsuccessfully).
|
|
*/
|
|
|
|
drop:
|
|
dev->d_len = 0;
|
|
return OK;
|
|
}
|
|
#endif /* CONFIG_NET_IPv6 */
|