From ce7156b6079b4fb0a639f12919a88897c6fddac1 Mon Sep 17 00:00:00 2001 From: patacongo Date: Thu, 8 Jul 2010 01:48:16 +0000 Subject: Add IGMP initialization logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2778 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/include/net/uip/uip-igmp.h | 1 + nuttx/net/accept.c | 3 +- nuttx/net/connect.c | 2 +- nuttx/net/netdev_register.c | 8 ++- nuttx/net/uip/Make.defs | 4 ++ nuttx/net/uip/uip_igmpinit.c | 121 +++++++++++++++++++++++++++++++++++++++ nuttx/net/uip/uip_initialize.c | 2 +- nuttx/net/uip/uip_internal.h | 10 ++++ 8 files changed, 147 insertions(+), 4 deletions(-) create mode 100755 nuttx/net/uip/uip_igmpinit.c diff --git a/nuttx/include/net/uip/uip-igmp.h b/nuttx/include/net/uip/uip-igmp.h index 8f80ac1f2..56c6a17b3 100755 --- a/nuttx/include/net/uip/uip-igmp.h +++ b/nuttx/include/net/uip/uip-igmp.h @@ -50,6 +50,7 @@ #include #include +#include #include diff --git a/nuttx/net/accept.c b/nuttx/net/accept.c index 82d413d3f..ec6f40706 100644 --- a/nuttx/net/accept.c +++ b/nuttx/net/accept.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/accept.c * - * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2010 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -46,6 +46,7 @@ #include #include #include +#include #include #include diff --git a/nuttx/net/connect.c b/nuttx/net/connect.c index 927abfe0e..6a5c2a8a2 100644 --- a/nuttx/net/connect.c +++ b/nuttx/net/connect.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/connect.c * - * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2010 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without diff --git a/nuttx/net/netdev_register.c b/nuttx/net/netdev_register.c index e5426d4e6..15a71c209 100644 --- a/nuttx/net/netdev_register.c +++ b/nuttx/net/netdev_register.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/netdev_register.c * - * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2010 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -140,6 +140,12 @@ int netdev_register(FAR struct uip_driver_s *dev) dev->flink = g_netdevices; g_netdevices = dev; + + /* Configure the device for IGMP support */ + +#ifdef CONFIG_NET_IGMP + uip_igmpdevinit(dev); +#endif netdev_semgive(); nlldbg("Registered MAC: %02x:%02x:%02x:%02x:%02x:%02x as dev: %s\n", diff --git a/nuttx/net/uip/Make.defs b/nuttx/net/uip/Make.defs index ce102ff62..31011ffa3 100644 --- a/nuttx/net/uip/Make.defs +++ b/nuttx/net/uip/Make.defs @@ -78,6 +78,10 @@ UIP_CSRCS += uip_icmpping.c uip_icmppoll.c uip_icmpsend.c endif endif +ifeq ($(CONFIG_NET_IGMP),y) +UIP_CSRCS += uip_igmpinit.c +endif + endif endif diff --git a/nuttx/net/uip/uip_igmpinit.c b/nuttx/net/uip/uip_igmpinit.c new file mode 100755 index 000000000..32d986835 --- /dev/null +++ b/nuttx/net/uip/uip_igmpinit.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * net/uip/uip_igmpinit.c + * IGMP initialization logic + * + * Copyright (C) 2010 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * The NuttX implementation of IGMP was inspired by the IGMP add-on for the + * lwIP TCP/IP stack by Steve Reynolds: + * + * Copyright (c) 2002 CITEL Technologies Ltd. + * 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. Neither the name of CITEL Technologies Ltd 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 CITEL TECHNOLOGIES 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 CITEL TECHNOLOGIES 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "uip_internal.h" + +#ifdef CONFIG_NET_IGMP + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_NET_IPv6 +# error "IGMP for IPv6 not supported" +#endif + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +uip_ipaddr_t g_allsystems; +uip_ipaddr_t g_allrouters; + +/**************************************************************************** + * Name: uip_igmpinit + * + * Description: + * Perform one-time IGMP initialization. + * + ****************************************************************************/ +void uip_igmpinit(void) +{ + nvdbg("IGMP initializing\n"); + + uip_ipaddr(g_allrouters, 224, 0, 0, 2); + uip_ipaddr(g_allsystems, 224, 0, 0, 1); + + /* Initialize the group allocation logic */ + + uip_grpinit(); +} + +/**************************************************************************** + * Name: uip_igmpdevinit + * + * Description: + * Called when a new network device is registered to configure that device + * for IGMP support. + * + ****************************************************************************/ + +void uip_igmpdevinit(struct uip_driver_s *dev) +{ + struct igmp_group_s *group; + + nvdbg("IGMP initializing dev %p\n", dev); + DEBUGASSERT(dev->grplist == NULL); + + /* Add the all systems address to the group */ + + group = uip_grpalloc(dev, &g_allsystems); + group->state = IGMP_IDLE_MEMBER; + + /* Initialize the group timer (but don't start it yet) */ + + group->wdog = wd_create(); + + /* Allow the IGMP messages at the MAC level */ + + uip_igmpmac(dev, &g_allrouters, true); + uip_igmpmac(dev, &g_allsystems, true); +} + +#endif /* CONFIG_NET_IGMP */ diff --git a/nuttx/net/uip/uip_initialize.c b/nuttx/net/uip/uip_initialize.c index 8c05765bc..08f9485a7 100644 --- a/nuttx/net/uip/uip_initialize.c +++ b/nuttx/net/uip/uip_initialize.c @@ -144,7 +144,7 @@ void uip_initialize(void) /* Initialize IGMP support */ #ifdef CONFIG_NET_IGMP - uip_udpinit(); + uip_igmpinit(); #endif } #endif /* CONFIG_NET */ diff --git a/nuttx/net/uip/uip_internal.h b/nuttx/net/uip/uip_internal.h index 990a08e6f..af20911d3 100644 --- a/nuttx/net/uip/uip_internal.h +++ b/nuttx/net/uip/uip_internal.h @@ -218,6 +218,16 @@ EXTERN void uip_igmpinit(void); EXTERN void uip_igmpinput(struct uip_driver_s *dev); +/* Defined in uip_igmpgroup.c ***********************************************/ + +EXTERN void uip_grpinit(void); +EXTERN FAR struct igmp_group_s *uip_grpalloc(FAR struct uip_driver_s *dev, + FAR uip_ipaddr_t *addr); + +/* Defined in TBD */ + +EXTERN void uip_igmpmac(struct uip_driver_s *dev, uip_ipaddr_t *ip, bool on); + #endif /* CONFIG_NET_IGMP */ #undef EXTERN -- cgit v1.2.3