diff --git a/net/icmpv6/icmpv6_input.c b/net/icmpv6/icmpv6_input.c index 7ced607b59..ab584c65af 100644 --- a/net/icmpv6/icmpv6_input.c +++ b/net/icmpv6/icmpv6_input.c @@ -74,6 +74,14 @@ #define ICMPv6RADVERTISE \ ((struct icmpv6_router_advertise_s *)&dev->d_buf[NET_LL_HDRLEN(dev) + IPv6_HDRLEN]) +#if defined(CONFIG_NET_MULTILINK) +# define DEV_LLTYPE(d) ((d)->d_lltype) +#elif defined(CONFIG_NET_ETHERNET) +# define DEV_LLTYPE(d) NET_LL_ETHERNET +#elif defined(CONFIG_NET_6LOWPAN) +# define DEV_LLTYPE(d) NET_LL_IEEE802154 +#endif + /**************************************************************************** * Public Data ****************************************************************************/ @@ -167,8 +175,7 @@ void icmpv6_input(FAR struct net_driver_s *dev) { /* Save the sender's address mapping in our Neighbor Table. */ - neighbor_add(icmp->srcipaddr, - (FAR struct neighbor_addr_s *)adv->tgtlladdr); + neighbor_add(icmp->srcipaddr, DEV_LLTYPE(dev), adv->tgtlladdr); #ifdef CONFIG_NET_ICMPv6_NEIGHBOR /* Then notify any logic waiting for the Neighbor Advertisement */ diff --git a/net/neighbor/Kconfig b/net/neighbor/Kconfig index 6792e0846d..89405c4e48 100644 --- a/net/neighbor/Kconfig +++ b/net/neighbor/Kconfig @@ -9,6 +9,4 @@ config NET_IPv6_NCONF_ENTRIES int "Number of IPv6 neighbors" default 8 -#config NET_IPv6_NEIGHBOR_ADDRTYPE - endif # NET_IPv6 diff --git a/net/neighbor/Make.defs b/net/neighbor/Make.defs index 7f6b56244e..dd466a9c24 100644 --- a/net/neighbor/Make.defs +++ b/net/neighbor/Make.defs @@ -50,6 +50,10 @@ ifeq ($(CONFIG_NET_6LOWPAN),y) # NET_CSRCS += neighbor_6lowpan_out.c endif +ifeq ($(CONFIG_DEBUG_NET_INFO),y) +NET_CSRCS += neighbor_dumpentry.c +endif + # Include utility build support DEPPATH += --dep-path neighbor diff --git a/net/neighbor/neighbor.h b/net/neighbor/neighbor.h index 378b6fa211..bf9a3839d2 100644 --- a/net/neighbor/neighbor.h +++ b/net/neighbor/neighbor.h @@ -3,7 +3,7 @@ * Header file for database of link-local neighbors, used by IPv6 code and * to be used by future ARP code. * - * Copyright (C) 2007-2009, 2015 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009, 2015, 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * A leverage of logic from uIP which also has a BSD style license @@ -51,6 +51,7 @@ #include #include +#include #ifdef CONFIG_NET_IPv6 @@ -72,11 +73,19 @@ struct neighbor_addr_s { -#ifdef CONFIG_NET_IPv6_NEIGHBOR_ADDRTYPE - CONFIG_NET_IPv6_NEIGHBOR_ADDRTYPE na_addr; -#else - struct ether_addr na_addr; + union + { +#ifdef CONFIG_NET_MULTILINK + uint8_t na_lltype; #endif + +#ifdef CONFIG_NET_ETHERNET + struct ether_addr na_ethernet; +#endif +#ifdef CONFIG_NET_6LOWPAN + struct sixlowpan_addr_s na_sixlowpan; +#endif + } u; }; /* This structure describes on entry in the neighbor table. This is intended @@ -150,6 +159,7 @@ FAR struct neighbor_entry *neighbor_findentry(const net_ipv6addr_t ipaddr); * * Input Parameters: * ipaddr - The IPv6 address of the mapping. + * lltype - The link layer address type * addr - The link layer address of the mapping * * Returned Value: @@ -157,7 +167,8 @@ FAR struct neighbor_entry *neighbor_findentry(const net_ipv6addr_t ipaddr); * ****************************************************************************/ -void neighbor_add(FAR net_ipv6addr_t ipaddr, FAR struct neighbor_addr_s *addr); +void neighbor_add(FAR net_ipv6addr_t ipaddr, uint8_t lltype, + FAR uint8_t *addr); /**************************************************************************** * Name: neighbor_lookup @@ -212,6 +223,50 @@ void neighbor_update(const net_ipv6addr_t ipaddr); void neighbor_periodic(int hsec); +/**************************************************************************** + * Name: neighbor_dumpentry + * + * Description: + * Dump the conents of an entry Neighbor Table. + * + * Input Parameters: + * msg - Message to print with the entry + * neighbor - The table entry to dump + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_NET_INFO +void neighbor_dumpentry(FAR const char *msg, + FAR struct neighbor_entry *neighbor); +#else +# define neighbor_dumpentry(msg,neighbor) +#endif + +/**************************************************************************** + * Name: neighbor_dumpipaddr + * + * Description: + * Dump an IP address. + * + * Input Parameters: + * msg - Message to print with the entry + * ipaddr - The IP address to dump + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_DEBUG_NET_INFO +void neighbor_dumpipaddr(FAR const char *msg, + const net_ipv6addr_t ipaddr); +#else +# define neighbor_dumpipaddr(msg,ipaddr) +#endif + #endif /* CONFIG_NET_IPv6 */ #endif /* __NET_NEIGHBOR_NEIGHBOR_H */ diff --git a/net/neighbor/neighbor_add.c b/net/neighbor/neighbor_add.c index fed15353ae..61fe2ac7dd 100644 --- a/net/neighbor/neighbor_add.c +++ b/net/neighbor/neighbor_add.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/neighbor/neighbor_add.c * - * Copyright (C) 2007-2009, 2015 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009, 2015, 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * A leverage of logic from uIP which also has a BSD style license @@ -43,6 +43,7 @@ #include +#include #include #include @@ -63,6 +64,7 @@ * * Input Parameters: * ipaddr - The IPv6 address of the mapping. + * lltype - The link layer address type * addr - The link layer address of the mapping * * Returned Value: @@ -70,23 +72,36 @@ * ****************************************************************************/ -void neighbor_add(FAR net_ipv6addr_t ipaddr, FAR struct neighbor_addr_s *addr) +void neighbor_add(FAR net_ipv6addr_t ipaddr, uint8_t lltype, + FAR uint8_t *addr) { + uint8_t addrlen; uint8_t oldest_time; int oldest_ndx; int i; - ninfo("Add neighbor: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", - ntohs(ipaddr[0]), ntohs(ipaddr[1]), ntohs(ipaddr[2]), - ntohs(ipaddr[3]), ntohs(ipaddr[4]), ntohs(ipaddr[5]), - ntohs(ipaddr[6]), ntohs(ipaddr[7])); - ninfo(" at: %02x:%02x:%02x:%02x:%02x:%02x\n", - addr->na_addr.ether_addr_octet[0], - addr->na_addr.ether_addr_octet[1], - addr->na_addr.ether_addr_octet[2], - addr->na_addr.ether_addr_octet[3], - addr->na_addr.ether_addr_octet[4], - addr->na_addr.ether_addr_octet[5]); + /* Get the length of the address for this link layer type */ + +#ifdef CONFIG_NET_ETHERNET +#ifdef CONFIG_NET_6LOWPAN + if (lltype == NET_LL_ETHERNET) +#endif + { + addrlen = IFHWADDRLEN; + } +#endif +#ifdef CONFIG_NET_6LOWPAN +#ifdef CONFIG_NET_ETHERNET + else +#endif + { +#ifdef CONFIG_NET_6LOWPAN_EXTENDEDADDR + addrlen = NET_6LOWPAN_EADDRSIZE; +#else + addrlen = NET_6LOWPAN_SADDRSIZE; +#endif + } +#endif /* Find the first unused entry or the oldest used entry. */ @@ -101,7 +116,12 @@ void neighbor_add(FAR net_ipv6addr_t ipaddr, FAR struct neighbor_addr_s *addr) break; } +#ifdef CONFIG_NET_MULTILINK + 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)) +#endif { oldest_ndx = i; break; @@ -120,5 +140,13 @@ void neighbor_add(FAR net_ipv6addr_t ipaddr, FAR struct neighbor_addr_s *addr) g_neighbors[oldest_ndx].ne_time = 0; net_ipv6addr_copy(g_neighbors[oldest_ndx].ne_ipaddr, ipaddr); - memcpy(&g_neighbors[oldest_ndx].ne_addr, addr, sizeof(struct neighbor_addr_s)); + +#ifdef CONFIG_NET_MULTILINK + g_neighbors[oldest_ndx].ne_addr.na_lltype = lltype; +#endif + memcpy(&g_neighbors[oldest_ndx].ne_addr.u, addr, addrlen); + + /* Dump the contents of the new entry */ + + neighbor_dumpentry("Added entry", &g_neighbors[oldest_ndx]); } diff --git a/net/neighbor/neighbor_ethernet_out.c b/net/neighbor/neighbor_ethernet_out.c index f342f7cc40..4da54e42fc 100644 --- a/net/neighbor/neighbor_ethernet_out.c +++ b/net/neighbor/neighbor_ethernet_out.c @@ -240,7 +240,7 @@ void neighbor_out(FAR struct net_driver_s *dev) /* Build an Ethernet header. */ - memcpy(eth->dest, naddr->na_addr.ether_addr_octet, ETHER_ADDR_LEN); + memcpy(eth->dest, naddr->u.na_ethernet.ether_addr_octet, ETHER_ADDR_LEN); } /* Finish populating the Ethernet header */ diff --git a/net/neighbor/neighbor_findentry.c b/net/neighbor/neighbor_findentry.c index fe6a7b7b31..7cd1e3fd76 100644 --- a/net/neighbor/neighbor_findentry.c +++ b/net/neighbor/neighbor_findentry.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/neighbor/neighbor_findentry.c * - * Copyright (C) 2007-2009, 2015 Gregory Nutt. All rights reserved. + * Copyright (C) 2007-2009, 2015, 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * A leverage of logic from uIP which also has a BSD style license @@ -49,7 +49,7 @@ #include "neighbor/neighbor.h" /**************************************************************************** - * Private Functions + * Public Functions ****************************************************************************/ /**************************************************************************** @@ -72,29 +72,17 @@ FAR struct neighbor_entry *neighbor_findentry(const net_ipv6addr_t ipaddr) { int i; - ninfo("Find neighbor: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", - ntohs(ipaddr[0]), ntohs(ipaddr[1]), ntohs(ipaddr[2]), - ntohs(ipaddr[3]), ntohs(ipaddr[4]), ntohs(ipaddr[5]), - ntohs(ipaddr[6]), ntohs(ipaddr[7])); - for (i = 0; i < CONFIG_NET_IPv6_NCONF_ENTRIES; ++i) { FAR struct neighbor_entry *neighbor = &g_neighbors[i]; if (net_ipv6addr_cmp(neighbor->ne_ipaddr, ipaddr)) { - ninfo(" at: %02x:%02x:%02x:%02x:%02x:%02x\n", - neighbor->ne_addr.na_addr.ether_addr_octet[0], - neighbor->ne_addr.na_addr.ether_addr_octet[1], - neighbor->ne_addr.na_addr.ether_addr_octet[2], - neighbor->ne_addr.na_addr.ether_addr_octet[3], - neighbor->ne_addr.na_addr.ether_addr_octet[4], - neighbor->ne_addr.na_addr.ether_addr_octet[5]); - - return &g_neighbors[i]; + neighbor_dumpentry("Entry found", neighbor); + return neighbor; } } - ninfo(" Not found\n"); + neighbor_dumpipaddr("Not found", ipaddr); return NULL; } diff --git a/net/neighbor/neighbor_lookup.c b/net/neighbor/neighbor_lookup.c index 01f029b69f..67d8764303 100644 --- a/net/neighbor/neighbor_lookup.c +++ b/net/neighbor/neighbor_lookup.c @@ -76,14 +76,6 @@ FAR const struct neighbor_addr_s *neighbor_lookup(const net_ipv6addr_t ipaddr) neighbor = neighbor_findentry(ipaddr); if (neighbor != NULL) { - ninfo("Lookup neighbor: %02x:%02x:%02x:%02x:%02x:%02x\n", - neighbor->ne_addr.na_addr.ether_addr_octet[0], - neighbor->ne_addr.na_addr.ether_addr_octet[1], - neighbor->ne_addr.na_addr.ether_addr_octet[2], - neighbor->ne_addr.na_addr.ether_addr_octet[3], - neighbor->ne_addr.na_addr.ether_addr_octet[4], - neighbor->ne_addr.na_addr.ether_addr_octet[5]); - return &neighbor->ne_addr; }