mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 20:44:39 +08:00
Add support for an in-memory routing table cache in order to improve performance when the routing table is retained in a file. The cache holds the most recently used routing table entries and so can eliminate some file access.
Squashed commit of the following:
net/route: Flush in cache when any entry is deleted from the routing table. When a router matching an IP address is found, add the routing table entry to the cache.
net/route: Add utility functions to manage an in-memory cache to improve performance when use a file-based routing table.
This commit is contained in:
@@ -65,6 +65,24 @@ config ROUTE_MAX_IPv4_RAMROUTES
|
||||
eliminates dynamica memory allocations, but limits the maximum size
|
||||
of the in-memory routing table to this number.
|
||||
|
||||
config ROUTE_IPv4_CACHEROUTE
|
||||
bool "In-memory IPv4 cache"
|
||||
default n
|
||||
depends on ROUTE_IPv4_FILEROUTE
|
||||
---help---
|
||||
Accessing a routing table on a file system before each packet is sent
|
||||
can harm performance. This option will cache a few of the most
|
||||
frequently used routing table entries in memory to reduce performance
|
||||
issues.
|
||||
|
||||
config ROUTE_MAX_IPv4_CACHEROUTES
|
||||
int "IPv4 cache size"
|
||||
default 4
|
||||
depends on ROUTE_IPv4_CACHEROUTE
|
||||
---help---
|
||||
This determines the maxium number of routes that can be cached in
|
||||
memory.
|
||||
|
||||
choice
|
||||
prompt "IPv6 routing table"
|
||||
default ROUTE_IPv6_RAMROUTE
|
||||
@@ -125,5 +143,23 @@ config ROUTE_FILEDIR
|
||||
table will be accessed. This is a string and should not include
|
||||
any traling '/'.
|
||||
|
||||
config ROUTE_IPv6_CACHEROUTE
|
||||
bool "In-memory IPv6 cache"
|
||||
default n
|
||||
depends on ROUTE_IPv6_FILEROUTE
|
||||
---help---
|
||||
Accessing a routing table on a file system before each packet is sent
|
||||
can harm performance. This option will cache a few of the most
|
||||
frequently used routing table entries in memory to reduce performance
|
||||
issues.
|
||||
|
||||
config ROUTE_MAX_IPv6_CACHEROUTES
|
||||
int "IPv6 cache size"
|
||||
default 4
|
||||
depends on ROUTE_IPv6_CACHEROUTE
|
||||
---help---
|
||||
This determines the maxium number of routes that can be cached in
|
||||
memory.
|
||||
|
||||
endif # NET_ROUTE
|
||||
endmenu # ARP Configuration
|
||||
|
||||
@@ -67,6 +67,14 @@ SOCK_CSRCS += net_fileroute.c net_add_fileroute.c net_del_fileroute.c
|
||||
SOCK_CSRCS += net_foreach_fileroute.c
|
||||
endif
|
||||
|
||||
# In-memory cache for file-based routing tables
|
||||
|
||||
ifeq ($(CONFIG_ROUTE_IPv4_CACHEROUTE),y)
|
||||
SOCK_CSRCS += net_cacheroute.c
|
||||
else ifeq ($(CONFIG_ROUTE_IPv6_CACHEROUTE),y)
|
||||
SOCK_CSRCS += net_cacheroute.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_DEBUG_NET_INFO),y)
|
||||
SOCK_CSRCS += net_dumproute.c
|
||||
endif
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
/****************************************************************************
|
||||
* net/route/cacheroute.h
|
||||
*
|
||||
* Copyright (C) 2017 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_ROUTE_CACHEROUTE_H
|
||||
#define __NET_ROUTE_CACHEROUTE_H 1
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include "route/route.h"
|
||||
|
||||
#if defined(CONFIG_ROUTE_IPv4_CACHEROUTE) || defined(CONFIG_ROUTE_IPv6_CACHEROUTE)
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_init_cacheroute
|
||||
*
|
||||
* Description:
|
||||
* Initialize the in-memory, routing table cache
|
||||
*
|
||||
* Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
* Assumptions:
|
||||
* Called early in initialization so that no special protection is needed.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void net_init_cacheroute(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_addcache_ipv4 and net_addcache_ipv6
|
||||
*
|
||||
* Description:
|
||||
* Add one route to the routing table cache
|
||||
*
|
||||
* Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success; a negated errno value is returned
|
||||
* on any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
int net_addcache_ipv4(FAR struct net_route_ipv4_s *route);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
int net_addcache_ipv6(FAR struct net_route_ipv6_s *route);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_foreachcache_ipv4/net_foreachcache_ipv6
|
||||
*
|
||||
* Description:
|
||||
* Traverse the routing table cahce
|
||||
*
|
||||
* Parameters:
|
||||
* handler - Will be called for each route in the routing table cache.
|
||||
* arg - An arbitrary value that will be passed tot he handler.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) returned if the entire table was searched. A negated errno
|
||||
* value will be returned in the event of a failure. Handlers may also
|
||||
* terminate the search early with any non-zero value.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
int net_foreachcache_ipv4(route_handler_ipv4_t handler, FAR void *arg);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
int net_foreachcache_ipv6(route_handler_ipv6_t handler, FAR void *arg);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_flushcache_ipv4 and net_flushcache_ipv6
|
||||
*
|
||||
* Description:
|
||||
* Flush the content of the routing table cache
|
||||
*
|
||||
* Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
void net_flushcache_ipv4(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
void net_flushcache_ipv6(void);
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_ROUTE_IPv4_CACHEROUTE || CONFIG_ROUTE_IPv6_CACHEROUTE */
|
||||
#endif /* __NET_ROUTE_CACHEROUTE_H */
|
||||
@@ -124,7 +124,7 @@ void net_init_ramroute(void)
|
||||
ramroute_init(&g_ipv4_routes);
|
||||
ramroute_init(&g_free_ipv4routes);
|
||||
|
||||
/* All all of the pre-allocated routing table entries to a free list */
|
||||
/* Add all of the pre-allocated routing table entries to a free list */
|
||||
|
||||
for (i = 0; i < CONFIG_ROUTE_MAX_IPv4_RAMROUTES; i++)
|
||||
{
|
||||
@@ -136,7 +136,7 @@ void net_init_ramroute(void)
|
||||
ramroute_init(&g_ipv6_routes);
|
||||
ramroute_init(&g_free_ipv6routes);
|
||||
|
||||
/* All all of the pre-allocated routing table entries to a free list */
|
||||
/* Add all of the pre-allocated routing table entries to a free list */
|
||||
|
||||
for (i = 0; i < CONFIG_ROUTE_MAX_IPv6_RAMROUTES; i++)
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -51,6 +51,7 @@
|
||||
#include <nuttx/net/ip.h>
|
||||
|
||||
#include "route/fileroute.h"
|
||||
#include "route/cacheroute.h"
|
||||
#include "route/route.h"
|
||||
|
||||
#if defined(CONFIG_ROUTE_IPv4_FILEROUTE) || defined(CONFIG_ROUTE_IPv6_FILEROUTE)
|
||||
@@ -276,6 +277,14 @@ int net_delroute_ipv4(in_addr_t target, in_addr_t netmask)
|
||||
goto errout_with_lock;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* We are committed to modifying the routing table. Flush the in-memory
|
||||
* routing table cache.
|
||||
*/
|
||||
|
||||
net_flushcache_ipv4();
|
||||
#endif
|
||||
|
||||
/* Loop, copying each entry, to the previous entry thus removing the entry
|
||||
* to be deleted.
|
||||
*/
|
||||
@@ -420,6 +429,14 @@ int net_delroute_ipv6(net_ipv6addr_t target, net_ipv6addr_t netmask)
|
||||
goto errout_with_lock;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* We are committed to modifying the routing table. Flush the in-memory
|
||||
* routing table cache.
|
||||
*/
|
||||
|
||||
net_flushcache_ipv6();
|
||||
#endif
|
||||
|
||||
/* Loop, copying each entry, to the previous entry thus removing the entry
|
||||
* to be deleted.
|
||||
*/
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_FILEROUTE
|
||||
int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
||||
int net_foreachroute_ipv4(route_handler_ipv4_t handler, FAR void *arg)
|
||||
{
|
||||
struct net_route_ipv4_s route;
|
||||
struct file fshandle;
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_RAMROUTE
|
||||
int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
||||
int net_foreachroute_ipv4(route_handler_ipv4_t handler, FAR void *arg)
|
||||
{
|
||||
FAR struct net_route_ipv4_entry_s *route;
|
||||
FAR struct net_route_ipv4_entry_s *next;
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_ROMROUTE
|
||||
int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
||||
int net_foreachroute_ipv4(route_handler_ipv4_t handler, FAR void *arg)
|
||||
{
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
|
||||
#include "route/ramroute.h"
|
||||
#include "route/fileroute.h"
|
||||
#include "route/cacheroute.h"
|
||||
#include "route/route.h"
|
||||
|
||||
#ifdef CONFIG_NET_ROUTE
|
||||
@@ -72,6 +73,10 @@ void net_init_route(void)
|
||||
#if defined(CONFIG_ROUTE_IPv4_FILEROUTE) || defined(CONFIG_ROUTE_IPv6_FILEROUTE)
|
||||
net_init_fileroute();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ROUTE_IPv4_CACHEROUTE) || defined(CONFIG_ROUTE_IPv6_CACHEROUTE)
|
||||
net_init_cacheroute();
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET_ROUTE */
|
||||
|
||||
+100
-19
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/route/net_router.c
|
||||
*
|
||||
* Copyright (C) 2013-2015 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2013-2015, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -48,10 +48,27 @@
|
||||
#include <nuttx/net/ip.h>
|
||||
|
||||
#include "devif/devif.h"
|
||||
#include "route/cacheroute.h"
|
||||
#include "route/route.h"
|
||||
|
||||
#if defined(CONFIG_NET) && defined(CONFIG_NET_ROUTE)
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor defintions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
# define IPv4_ROUTER entry.router
|
||||
#else
|
||||
# define IPv4_ROUTER router
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
# define IPv6_ROUTER entry.router
|
||||
#else
|
||||
# define IPv6_ROUTER router
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
@@ -59,16 +76,24 @@
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
struct route_ipv4_match_s
|
||||
{
|
||||
in_addr_t target; /* Target IPv4 address on an external network to match */
|
||||
in_addr_t router; /* IPv4 address of the router on one of our networks */
|
||||
in_addr_t target; /* Target IPv4 address on remote network */
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
struct net_route_ipv4_s entry; /* Full entry from the IPv4 routing table */
|
||||
#else
|
||||
in_addr_t router; /* IPv4 address of router a local networks */
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
struct route_ipv6_match_s
|
||||
{
|
||||
net_ipv6addr_t target; /* Target IPv6 address on an external network to match */
|
||||
net_ipv6addr_t router; /* IPv6 address of the router on one of our networks */
|
||||
net_ipv6addr_t target; /* Target IPv6 address on remote network */
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
struct net_route_ipv6_s entry; /* Full entry from the IPv6 routing table */
|
||||
#else
|
||||
net_ipv6addr_t router; /* IPv6 address of router a local networks */
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -103,9 +128,15 @@ static int net_ipv4_match(FAR struct net_route_ipv4_s *route, FAR void *arg)
|
||||
|
||||
if (net_ipv4addr_maskcmp(route->target, match->target, route->netmask))
|
||||
{
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* They match.. Copy the entire routing table entry */
|
||||
|
||||
memcpy(&match->entry, route, sizeof(struct net_route_ipv4_s));
|
||||
#else
|
||||
/* They match.. Copy the router address */
|
||||
|
||||
net_ipv4addr_copy(match->router, route->router);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -140,9 +171,15 @@ static int net_ipv6_match(FAR struct net_route_ipv6_s *route, FAR void *arg)
|
||||
|
||||
if (net_ipv6addr_maskcmp(route->target, match->target, route->netmask))
|
||||
{
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* They match.. Copy the entire routing table entry */
|
||||
|
||||
memcpy(&match->entry, route, sizeof(struct net_route_ipv6_s));
|
||||
#else
|
||||
/* They match.. Copy the router address */
|
||||
|
||||
net_ipv6addr_copy(match->router, route->router);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -189,23 +226,45 @@ int net_ipv4_router(in_addr_t target, FAR in_addr_t *router)
|
||||
memset(&match, 0, sizeof(struct route_ipv4_match_s));
|
||||
net_ipv4addr_copy(match.target, target);
|
||||
|
||||
/* Find an router entry with the routing table that can forward to this
|
||||
* address
|
||||
*/
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* First see if we can find a router entry in the cache */
|
||||
|
||||
ret = net_foreachroute_ipv4(net_ipv4_match, &match);
|
||||
ret = net_foreachcache_ipv4(net_ipv4_match, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route. Return the router address. */
|
||||
|
||||
net_ipv4addr_copy(*router, match.router);
|
||||
net_ipv4addr_copy(*router, match.IPv4_ROUTER);
|
||||
ret = OK;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* There is no route for this address */
|
||||
/* Find a router entry with the routing table that can forward to this
|
||||
* address
|
||||
*/
|
||||
|
||||
ret = -ENOENT;
|
||||
ret = net_foreachroute_ipv4(net_ipv4_match, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route. */
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* Add the route to the cache */
|
||||
|
||||
ret = net_addcache_ipv4(&match.entry);
|
||||
#endif
|
||||
/* Return the router address. */
|
||||
|
||||
net_ipv4addr_copy(*router, match.IPv4_ROUTER);
|
||||
ret = OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There is no route for this address */
|
||||
|
||||
ret = -ENOENT;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -247,23 +306,45 @@ int net_ipv6_router(const net_ipv6addr_t target, net_ipv6addr_t router)
|
||||
memset(&match, 0, sizeof(struct route_ipv6_match_s));
|
||||
net_ipv6addr_copy(match.target, target);
|
||||
|
||||
/* Find an router entry with the routing table that can forward to this
|
||||
* address
|
||||
*/
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* First see if we can find a router entry in the cache */
|
||||
|
||||
ret = net_foreachroute_ipv6(net_ipv6_match, &match);
|
||||
ret = net_foreachcache_ipv6(net_ipv6_match, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route. Return the router address. */
|
||||
|
||||
net_ipv6addr_copy(router, match.router);
|
||||
net_ipv6addr_copy(router, match.IPv6_ROUTER);
|
||||
ret = OK;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* There is no route for this address */
|
||||
/* Find n router entry with the routing table that can forward to this
|
||||
* address
|
||||
*/
|
||||
|
||||
ret = -ENOENT;
|
||||
ret = net_foreachroute_ipv6(net_ipv6_match, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route */
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* Add the route to the cache */
|
||||
|
||||
ret = net_addcache_ipv6(&match.entry);
|
||||
#endif
|
||||
/* Return the router address. */
|
||||
|
||||
net_ipv6addr_copy(router, match.IPv6_ROUTER);
|
||||
ret = OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There is no route for this address */
|
||||
|
||||
ret = -ENOENT;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
+103
-23
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* net/route/netdev_router.c
|
||||
*
|
||||
* Copyright (C) 2013-2015 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2013-2015, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -47,10 +47,27 @@
|
||||
#include <nuttx/net/ip.h>
|
||||
|
||||
#include "netdev/netdev.h"
|
||||
#include "route/cacheroute.h"
|
||||
#include "route/route.h"
|
||||
|
||||
#if defined(CONFIG_NET) && defined(CONFIG_NET_ROUTE)
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor defintions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
# define IPv4_ROUTER entry.router
|
||||
#else
|
||||
# define IPv4_ROUTER router
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
# define IPv6_ROUTER entry.router
|
||||
#else
|
||||
# define IPv6_ROUTER router
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
@@ -58,18 +75,26 @@
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
struct route_ipv4_devmatch_s
|
||||
{
|
||||
FAR struct net_driver_s *dev; /* The route must use this device */
|
||||
in_addr_t target; /* Target IPv4 address on an external network to match */
|
||||
in_addr_t router; /* IPv6 address of the router on one of our networks */
|
||||
FAR struct net_driver_s *dev; /* The route must use this device */
|
||||
in_addr_t target; /* Target IPv4 address on remote network */
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
struct net_route_ipv4_s entry; /* Full entry from the IPv4 routing table */
|
||||
#else
|
||||
in_addr_t router; /* IPv4 address of router a local networks */
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
struct route_ipv6_devmatch_s
|
||||
{
|
||||
FAR struct net_driver_s *dev; /* The route must use this device */
|
||||
net_ipv6addr_t target; /* Target IPv4 address on an external network to match */
|
||||
net_ipv6addr_t router; /* IPv6 address of the router on one of our networks */
|
||||
FAR struct net_driver_s *dev; /* The route must use this device */
|
||||
net_ipv6addr_t target; /* Target IPv4 address on remote network */
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
struct net_route_ipv6_s entry; /* Full entry from the IPv6 routing table */
|
||||
#else
|
||||
net_ipv6addr_t router; /* IPv6 address of router a local networks */
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -110,9 +135,15 @@ static int net_ipv4_devmatch(FAR struct net_route_ipv4_s *route,
|
||||
if (net_ipv4addr_maskcmp(route->target, match->target, route->netmask) &&
|
||||
net_ipv4addr_maskcmp(route->router, dev->d_ipaddr, dev->d_netmask))
|
||||
{
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* They match.. Copy the entire routing table entry */
|
||||
|
||||
memcpy(&match->entry, route, sizeof(struct net_route_ipv4_s));
|
||||
#else
|
||||
/* They match.. Copy the router address */
|
||||
|
||||
net_ipv4addr_copy(match->router, route->router);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -154,9 +185,15 @@ static int net_ipv6_devmatch(FAR struct net_route_ipv6_s *route,
|
||||
net_ipv6addr_maskcmp(route->router, dev->d_ipv6addr,
|
||||
dev->d_ipv6netmask))
|
||||
{
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* They match.. Copy the entire routing table entry */
|
||||
|
||||
memcpy(&match->entry, route, sizeof(struct net_route_ipv6_s));
|
||||
#else
|
||||
/* They match.. Copy the router address */
|
||||
|
||||
net_ipv6addr_copy(match->router, route->router);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -202,24 +239,46 @@ void netdev_ipv4_router(FAR struct net_driver_s *dev, in_addr_t target,
|
||||
match.dev = dev;
|
||||
net_ipv4addr_copy(match.target, target);
|
||||
|
||||
/* Find an router entry with the routing table that can forward to this
|
||||
* address using this device.
|
||||
*/
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* First see if we can find a router entry in the cache */
|
||||
|
||||
ret = net_foreachroute_ipv4(net_ipv4_devmatch, &match);
|
||||
ret = net_foreachcache_ipv4(net_ipv4_devmatch, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route. Return the router address. */
|
||||
|
||||
net_ipv4addr_copy(*router, match.router);
|
||||
net_ipv4addr_copy(*router, match.IPv4_ROUTER);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* There isn't a matching route.. fallback and use the default router
|
||||
* of the device.
|
||||
/* Find a router entry with the routing table that can forward to this
|
||||
* address using this device.
|
||||
*/
|
||||
|
||||
net_ipv4addr_copy(*router, dev->d_draddr);
|
||||
ret = net_foreachroute_ipv4(net_ipv4_devmatch, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route */
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv4_CACHEROUTE
|
||||
/* Add the route to the cache */
|
||||
|
||||
ret = net_addcache_ipv4(&match.entry);
|
||||
#endif
|
||||
/* We Return the router address. */
|
||||
|
||||
net_ipv4addr_copy(*router, match.IPv4_ROUTER);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There isn't a matching route.. fallback and use the default
|
||||
* router
|
||||
* of the device.
|
||||
*/
|
||||
|
||||
net_ipv4addr_copy(*router, dev->d_draddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -259,24 +318,45 @@ void netdev_ipv6_router(FAR struct net_driver_s *dev,
|
||||
match.dev = dev;
|
||||
net_ipv6addr_copy(match.target, target);
|
||||
|
||||
/* Find an router entry with the routing table that can forward to this
|
||||
* address using this device.
|
||||
*/
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* First see if we can find a router entry in the cache */
|
||||
|
||||
ret = net_foreachroute_ipv6(net_ipv6_devmatch, &match);
|
||||
ret = net_foreachcache_ipv6(net_ipv6_devmatch, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route. Return the router address. */
|
||||
|
||||
net_ipv6addr_copy(router, match.router);
|
||||
net_ipv6addr_copy(router, match.IPv6_ROUTER);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* There isn't a matching route.. fallback and use the default router
|
||||
* of the device.
|
||||
/* Find a router entry with the routing table that can forward to this
|
||||
* address using this device.
|
||||
*/
|
||||
|
||||
net_ipv6addr_copy(router, dev->d_ipv6draddr);
|
||||
ret = net_foreachroute_ipv6(net_ipv6_devmatch, &match);
|
||||
if (ret > 0)
|
||||
{
|
||||
/* We found a route */
|
||||
|
||||
#ifdef CONFIG_ROUTE_IPv6_CACHEROUTE
|
||||
/* Add the route to the cache */
|
||||
|
||||
ret = net_addcache_ipv6(&match.entry);
|
||||
#endif
|
||||
/* Return the router address. */
|
||||
|
||||
net_ipv6addr_copy(router, match.IPv6_ROUTER);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There isn't a matching route.. fallback and use the default
|
||||
* router of the device.
|
||||
*/
|
||||
|
||||
net_ipv6addr_copy(router, dev->d_ipv6draddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
+5
-5
@@ -64,7 +64,7 @@ struct net_route_ipv4_s
|
||||
|
||||
/* Type of the call out function pointer provided to net_foreachroute_ipv4() */
|
||||
|
||||
typedef int (*route_handler_t)(FAR struct net_route_ipv4_s *route,
|
||||
typedef int (*route_handler_ipv4_t)(FAR struct net_route_ipv4_s *route,
|
||||
FAR void *arg);
|
||||
#endif /* CONFIG_NET_IPv4 */
|
||||
|
||||
@@ -260,7 +260,7 @@ void netdev_ipv6_router(FAR struct net_driver_s *dev,
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_foreachroute_ipv4
|
||||
* Name: net_foreachroute_ipv4/net_foreachroute_ipv6
|
||||
*
|
||||
* Description:
|
||||
* Traverse the routing table
|
||||
@@ -270,14 +270,14 @@ void netdev_ipv6_router(FAR struct net_driver_s *dev,
|
||||
* arg - An arbitrary value that will be passed tot he handler.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) returned if the entire table was search. A negated errno
|
||||
* Zero (OK) returned if the entire table was searched. A negated errno
|
||||
* value will be returned in the event of a failure. Handlers may also
|
||||
* terminate the search early with any non-zero, non-negative value.
|
||||
* terminate the search early with any non-zero value.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg);
|
||||
int net_foreachroute_ipv4(route_handler_ipv4_t handler, FAR void *arg);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
|
||||
Reference in New Issue
Block a user