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:
Gregory Nutt
2017-09-29 12:04:45 -06:00
parent 44d88abb83
commit ae78a925eb
13 changed files with 1180 additions and 52 deletions
+36
View File
@@ -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
+8
View File
@@ -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
+143
View File
@@ -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 */
+2 -2
View File
@@ -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
+17
View File
@@ -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.
*/
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+5
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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