Skip to content

Commit

Permalink
net/mld: Add basic build structure for Multicast Listener Discovery (…
Browse files Browse the repository at this point in the history
…MLD). No real MLD logic yet. Only a few hooks to capture and dispatch MLD ICMPv6 packets.
  • Loading branch information
gregory-nutt committed Oct 31, 2018
1 parent a3c67df commit dde1e89
Show file tree
Hide file tree
Showing 11 changed files with 304 additions and 4 deletions.
6 changes: 3 additions & 3 deletions include/nuttx/net/icmpv6.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@
#define ICMPv6_RESERVED_ERROR_MSG 127
#define ICMPv6_ECHO_REQUEST 128
#define ICMPv6_ECHO_REPLY 129
#define ICMPV6_MCAST_LISTEN_QUERY 130 /* RFC 2710 */
#define ICMPV6_MCAST_LISTEN_REPORT 131
#define ICMPV6_MCAST_LISTEN_DONE 132
#define ICMPV6_MCAST_LISTEN_QUERY 130 /* RFC 2710 and 3810 */
#define ICMPV6_MCAST_LISTEN_REPORT_V1 131 /* RFC 2710 */
#define ICMPV6_MCAST_LISTEN_DONE_V1 132 /* RFC 2710 */
#define ICMPV6_ROUTER_SOLICIT 133 /* RFC 4861 */
#define ICMPV6_ROUTER_ADVERTISE 134
#define ICMPv6_NEIGHBOR_SOLICIT 135
Expand Down
1 change: 1 addition & 0 deletions include/nuttx/net/mld.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/****************************************************************************
* include/nuttx/net/mld.h
* Multicast Listener Discovery (MLD) Definitions
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
Expand Down
1 change: 1 addition & 0 deletions net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ source "net/bluetooth/Kconfig"
source "net/ieee802154/Kconfig"
source "net/icmp/Kconfig"
source "net/icmpv6/Kconfig"
source "net/mld/Kconfig"
source "net/igmp/Kconfig"
source "net/arp/Kconfig"
source "net/loopback/Kconfig"
Expand Down
1 change: 1 addition & 0 deletions net/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ include neighbor/Make.defs
include igmp/Make.defs
include pkt/Make.defs
include local/Make.defs
include mld/Make.defs
include netlink/Make.defs
include tcp/Make.defs
include udp/Make.defs
Expand Down
1 change: 1 addition & 0 deletions net/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Directory Structure
+- ipforward - IP forwarding logic
+- local - Unix domain (local) sockets
+- loopback - Local loopback
+- mld - Multicast Listener Discovery (MLD)
+- neighbor - Neighbor Discovery Protocol (IPv6)
+- netdev - Socket network device interface
+- netlink - Netlink IPC socket interface
Expand Down
75 changes: 75 additions & 0 deletions net/icmpv6/icmpv6_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "neighbor/neighbor.h"
#include "utils/utils.h"
#include "icmpv6/icmpv6.h"
#include "mld/mld.h"

#ifdef CONFIG_NET_ICMPv6

Expand All @@ -82,6 +83,15 @@
#define ICMPv6RADVERTISE \
((struct icmpv6_router_advertise_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN])

#define MLDQUEURY \
((FAR struct mld_mcast_listen_query_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN])
#define MLDREPORT_V1 \
((FAR struct mld_mcast_listen_report_v1_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN])
#define MLDREPORT_V2 \
((FAR struct mld_mcast_listen_report_v2_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN])
#define MLDDONE_V1 \
((FAR struct mld_mcast_listen_done_v1_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN])

/****************************************************************************
* Private Functions
****************************************************************************/
Expand Down Expand Up @@ -475,6 +485,71 @@ void icmpv6_input(FAR struct net_driver_s *dev)
break;
#endif

#ifdef CONFIG_NET_MLD
/* Dispatch received Multicast Listener Discovery (MLD) packets. */

case ICMPV6_MCAST_LISTEN_QUERY: /* Multicast Listener Query, RFC 2710 and RFC 3810 */
{
FAR struct mld_mcast_listen_query_s *query = MLDQUEURY;
int ret;

ret = mld_query_input(dev, query);
if (ret < 0)
{
goto icmpv6_drop_packet;
}

goto icmpv6_send_nothing; /* REVISIT */
}
break;

case ICMPV6_MCAST_LISTEN_REPORT_V1: /* Version 1 Multicast Listener Report, RFC 2710 */
{
FAR struct mld_mcast_listen_report_v1_s *report = MLDREPORT_V1;
int ret;

ret = mld_report_v1(dev, report);
if (ret < 0)
{
goto icmpv6_drop_packet;
}

goto icmpv6_send_nothing; /* REVISIT */
}
break;


case ICMPV6_MCAST_LISTEN_REPORT_V2: /* Version 2 Multicast Listener Report, RFC 3810 */
{
FAR struct mld_mcast_listen_report_v2_s *report = MLDREPORT_V2;
int ret;

ret = mld_report_v2(dev, report);
if (ret < 0)
{
goto icmpv6_drop_packet;
}

goto icmpv6_send_nothing; /* REVISIT */
}
break;

case ICMPV6_MCAST_LISTEN_DONE_V1: /* Version 1 Multicast Listener Done, RFC 2710 */
{
FAR struct mld_mcast_listen_done_v1_s *done = MLDDONE_V1;
int ret;

ret = mld_done_v1(dev, done);
if (ret < 0)
{
goto icmpv6_drop_packet;
}

goto icmpv6_send_nothing; /* REVISIT */
}
break;
#endif

default:
{
nwarn("WARNING: Unknown ICMPv6 type: %d\n", ipicmp->type);
Expand Down
18 changes: 18 additions & 0 deletions net/mld/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

if NET_ICMPv6

menuconfig NET_MLD
bool "Multicast Listener Discovery (MLD)"
default n
depends on EXPERIMENTAL
---help---
Enable Multicast Listener Discovery (MLD) support.

if NET_MLD

endif # NET_MLD
endif # NET_ICMPv6
47 changes: 47 additions & 0 deletions net/mld/Make.defs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
############################################################################
# net/mld/Make.defs
#
# Copyright (C) 2018 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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 COPYRIGHT HOLDERS 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
# COPYRIGHT OWNER 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.
#
############################################################################

# Logic specific to Multicast Listener Discovery (MLD)

ifeq ($(CONFIG_NET_MLD),y)

SOCK_CSRCS +=
NET_CSRCS +=

# Include MLD build support

DEPPATH += --dep-path mld
VPATH += :mld
endif
149 changes: 149 additions & 0 deletions net/mld/mld.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/****************************************************************************
* net/mld/mld.h
* Multicast Listener Discovery (MLD) Definitions
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 NuttX 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 COPYRIGHT HOLDERS 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
* COPYRIGHT OWNER 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 __NET_NETLINK_MLD_H
#define __NET_NETLINK_MLD_H

/****************************************************************************
* Included Files
****************************************************************************/

#include <nuttx/config.h>

#include <sys/types.h>
#include <queue.h>
#include <semaphore.h>

#include "devif/devif.h"
#include "socket/socket.h"

#ifdef CONFIG_NET_MLD

/****************************************************************************
* Pre-processor Definitions
****************************************************************************/

/****************************************************************************
* Public Type Definitions
****************************************************************************/

/****************************************************************************
* Public Data
****************************************************************************/

#ifdef __cplusplus
# define EXTERN extern "C"
extern "C"
{
#else
# define EXTERN extern
#endif

/****************************************************************************
* Public Function Prototypes
****************************************************************************/

struct net_driver_s; /* Forward reference */
struct mld_mcast_listen_query_s; /* Forward reference */
struct mld_mcast_listen_report_v1_s; /* Forward reference */
struct mld_mcast_listen_report_v2_s; /* Forward reference */
struct mld_mcast_listen_done_v1_s; /* Forward reference */

/****************************************************************************
* Name: mld_initialize()
*
* Description:
* Initialize the MLD structures. Called once and only from the
* networking layer.
*
****************************************************************************/

void mld_initialize(void);

/****************************************************************************
* Name: mld_query
*
* Description:
* Called from icmpv6_input() when a Multicast Listener Query is received.
*
****************************************************************************/

int mld_query_input(FAR struct net_driver_s *dev,
FAR const struct mld_mcast_listen_query_s *query);

/****************************************************************************
* Name: mld_report_v1
*
* Description:
* Called from icmpv6_input() when a Version 1 Multicast Listener Report is
* received.
*
****************************************************************************/

int mld_report_v1(FAR struct net_driver_s *dev,
FAR const struct mld_mcast_listen_report_v1_s *report);

/****************************************************************************
* Name: mld_report_v2
*
* Description:
* Called from icmpv6_input() when a Version 2 Multicast Listener Report is
* received.
*
****************************************************************************/

int mld_report_v2(FAR struct net_driver_s *dev,
FAR const struct mld_mcast_listen_report_v2_s *report);

/****************************************************************************
* Name: mld_done_v1
*
* Description:
* Called from icmpv6_input() when a Version 1 Multicast Listener Done is
* received.
*
****************************************************************************/

int mld_done_v1(FAR struct net_driver_s *dev,
FAR const struct mld_mcast_listen_done_v1_s *done);

#undef EXTERN
#ifdef __cplusplus
}
#endif

#endif /* CONFIG_NET_MLD */
#endif /* __NET_NETLINK_MLD_H */
7 changes: 7 additions & 0 deletions net/net_initialize.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
#include "neighbor/neighbor.h"
#include "icmp/icmp.h"
#include "icmpv6/icmpv6.h"
#include "mld/mld.h"
#include "tcp/tcp.h"
#include "udp/udp.h"
#include "pkt/pkt.h"
Expand Down Expand Up @@ -108,6 +109,12 @@ void net_setup(void)

neighbor_initialize();

#ifdef CONFIG_NET_MLD
/* Initialize ICMPv6 Multicast Listener Discovery (MLD) logic */

mld_initialize();
#endif

#ifdef CONFIG_NET_6LOWPAN
/* Initialize 6LoWPAN data structures */

Expand Down
2 changes: 1 addition & 1 deletion net/netlink/netlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ EXTERN const struct sock_intf_s g_netlink_sockif;
* Name: netlink_initialize()
*
* Description:
* Initialize the User Socket connection structures. Called once and only
* Initialize the NetLink connection structures. Called once and only
* from the networking layer.
*
****************************************************************************/
Expand Down

0 comments on commit dde1e89

Please sign in to comment.