Network routing table: Trivial name changes to make IPv4 and IPv6 more symmetric. Add debug logic to dump the content of the router table.
This commit is contained in:
parent
5a352cacc1
commit
4dceea4901
8 changed files with 105 additions and 35 deletions
|
|
@ -40,6 +40,10 @@ ifeq ($(CONFIG_NET_ROUTE),y)
|
|||
SOCK_CSRCS += net_addroute.c net_allocroute.c net_delroute.c
|
||||
SOCK_CSRCS += net_foreachroute.c net_router.c netdev_router.c
|
||||
|
||||
ifeq ($(CONFIG_DEBUG_NET_INFO),y)
|
||||
SOCK_CSRCS += net_dumproute.c
|
||||
endif
|
||||
|
||||
# Include routing table build support
|
||||
|
||||
DEPPATH += --dep-path route
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/****************************************************************************
|
||||
* net/route/net_addroute.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
|
||||
|
|
@ -74,7 +74,7 @@
|
|||
#ifdef CONFIG_NET_IPv4
|
||||
int net_addroute_ipv4(in_addr_t target, in_addr_t netmask, in_addr_t router)
|
||||
{
|
||||
FAR struct net_route_s *route;
|
||||
FAR struct net_route_ipv4_s *route;
|
||||
|
||||
/* Allocate a route entry */
|
||||
|
||||
|
|
@ -90,6 +90,7 @@ int net_addroute_ipv4(in_addr_t target, in_addr_t netmask, in_addr_t router)
|
|||
net_ipv4addr_copy(route->target, target);
|
||||
net_ipv4addr_copy(route->netmask, netmask);
|
||||
net_ipv4addr_copy(route->router, router);
|
||||
net_ipv4_dumproute("New route", route);
|
||||
|
||||
/* Get exclusive address to the networking data structures */
|
||||
|
||||
|
|
@ -123,6 +124,7 @@ int net_addroute_ipv6(net_ipv6addr_t target, net_ipv6addr_t netmask,
|
|||
net_ipv6addr_copy(route->target, target);
|
||||
net_ipv6addr_copy(route->netmask, netmask);
|
||||
net_ipv6addr_copy(route->router, router);
|
||||
net_ipv6_dumproute("New route", route);
|
||||
|
||||
/* Get exclusive address to the networking data structures */
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ static sq_queue_t g_freeroutes_ipv6;
|
|||
/* This is an array of pre-allocated network routes */
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static struct net_route_s g_preallocroutes[CONFIG_NET_MAXROUTES];
|
||||
static struct net_route_ipv4_s g_preallocroutes[CONFIG_NET_MAXROUTES];
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
|
|
@ -158,9 +158,9 @@ void net_initroute(void)
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
FAR struct net_route_s *net_allocroute_ipv4(void)
|
||||
FAR struct net_route_ipv4_s *net_allocroute_ipv4(void)
|
||||
{
|
||||
FAR struct net_route_s *route;
|
||||
FAR struct net_route_ipv4_s *route;
|
||||
|
||||
/* Get exclusive address to the networking data structures */
|
||||
|
||||
|
|
@ -168,7 +168,7 @@ FAR struct net_route_s *net_allocroute_ipv4(void)
|
|||
|
||||
/* Then add the new entry to the table */
|
||||
|
||||
route = (FAR struct net_route_s *)
|
||||
route = (FAR struct net_route_ipv4_s *)
|
||||
sq_remfirst((FAR sq_queue_t *)&g_freeroutes);
|
||||
|
||||
net_unlock();
|
||||
|
|
@ -210,7 +210,7 @@ FAR struct net_route_ipv6_s *net_allocroute_ipv6(void)
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
void net_freeroute_ipv4(FAR struct net_route_s *route)
|
||||
void net_freeroute_ipv4(FAR struct net_route_ipv4_s *route)
|
||||
{
|
||||
DEBUGASSERT(route);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/****************************************************************************
|
||||
* net/route/net_delroute.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
|
||||
|
|
@ -42,7 +42,9 @@
|
|||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#include <nuttx/net/ip.h>
|
||||
|
||||
#include "route/route.h"
|
||||
|
|
@ -56,7 +58,7 @@
|
|||
#ifdef CONFIG_NET_IPv4
|
||||
struct route_match_s
|
||||
{
|
||||
FAR struct net_route_s *prev; /* Predecessor in the list */
|
||||
FAR struct net_route_ipv4_s *prev; /* Predecessor in the list */
|
||||
in_addr_t target; /* The target IP address to match */
|
||||
in_addr_t netmask; /* The network mask to match */
|
||||
};
|
||||
|
|
@ -76,7 +78,7 @@ struct route_match_ipv6_s
|
|||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_match
|
||||
* Name: net_match_ipv4
|
||||
*
|
||||
* Description:
|
||||
* Return 1 if the route is available
|
||||
|
|
@ -91,7 +93,7 @@ struct route_match_ipv6_s
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static int net_match(FAR struct net_route_s *route, FAR void *arg)
|
||||
static int net_match_ipv4(FAR struct net_route_ipv4_s *route, FAR void *arg)
|
||||
{
|
||||
FAR struct route_match_s *match = (FAR struct route_match_s *)arg;
|
||||
|
||||
|
|
@ -99,6 +101,11 @@ static int net_match(FAR struct net_route_s *route, FAR void *arg)
|
|||
* must be the same.
|
||||
*/
|
||||
|
||||
net_ipv4_dumproute("Comparing", route);
|
||||
ninfo("With:\n");
|
||||
ninfo(" target=%08lx netmask=%08lx\n",
|
||||
htonl(match->target), htonl(match->netmask));
|
||||
|
||||
if (net_ipv4addr_maskcmp(route->target, match->target, match->netmask) &&
|
||||
net_ipv4addr_cmp(route->netmask, match->netmask))
|
||||
{
|
||||
|
|
@ -139,6 +146,19 @@ static int net_match_ipv6(FAR struct net_route_ipv6_s *route, FAR void *arg)
|
|||
* must be the same.
|
||||
*/
|
||||
|
||||
net_ipv6_dumproute("Comparing", route);
|
||||
ninfo("With:\n");
|
||||
ninfo(" target: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
|
||||
htons(match->target[0]), htons(match->target[1]),
|
||||
htons(match->target[2]), htons(match->target[3]),
|
||||
htons(match->target[4]), htons(match->target[5]),
|
||||
htons(match->target[6]), htons(match->target[7]));
|
||||
ninfo(" netmask: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
|
||||
htons(match->netmask[0]), htons(match->netmask[1]),
|
||||
htons(match->netmask[2]), htons(match->netmask[3]),
|
||||
htons(match->netmask[4]), htons(match->netmask[5]),
|
||||
htons(match->netmask[6]), htons(match->netmask[7]));
|
||||
|
||||
if (net_ipv6addr_maskcmp(route->target, match->target, match->netmask) &&
|
||||
net_ipv6addr_cmp(route->netmask, match->netmask))
|
||||
{
|
||||
|
|
@ -200,7 +220,7 @@ int net_delroute_ipv4(in_addr_t target, in_addr_t netmask)
|
|||
|
||||
/* Then remove the entry from the routing table */
|
||||
|
||||
return net_foreachroute_ipv4(net_match, &match) ? OK : -ENOENT;
|
||||
return net_foreachroute_ipv4(net_match_ipv4, &match) ? OK : -ENOENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/****************************************************************************
|
||||
* net/route/net_foreachroute.c
|
||||
*
|
||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2013, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -72,8 +72,8 @@
|
|||
#ifdef CONFIG_NET_IPv4
|
||||
int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
||||
{
|
||||
FAR struct net_route_s *route;
|
||||
FAR struct net_route_s *next;
|
||||
FAR struct net_route_ipv4_s *route;
|
||||
FAR struct net_route_ipv4_s *next;
|
||||
int ret = 0;
|
||||
|
||||
/* Prevent concurrent access to the routing table */
|
||||
|
|
@ -82,8 +82,8 @@ int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
|||
|
||||
/* Visit each entry in the routing table */
|
||||
|
||||
for (route = (FAR struct net_route_s *)g_ipv4_routes.head;
|
||||
route;
|
||||
for (route = (FAR struct net_route_ipv4_s *)g_ipv4_routes.head;
|
||||
ret == 0 && route != NULL;
|
||||
route = next)
|
||||
{
|
||||
/* Get the next entry in the to visit. We do this BEFORE calling the
|
||||
|
|
@ -91,7 +91,7 @@ int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg)
|
|||
*/
|
||||
|
||||
next = route->flink;
|
||||
ret = handler(route, arg);
|
||||
ret = handler(route, arg);
|
||||
}
|
||||
|
||||
/* Unlock the network */
|
||||
|
|
@ -115,7 +115,7 @@ int net_foreachroute_ipv6(route_handler_ipv6_t handler, FAR void *arg)
|
|||
/* Visit each entry in the routing table */
|
||||
|
||||
for (route = (FAR struct net_route_ipv6_s *)g_ipv6_routes.head;
|
||||
route;
|
||||
ret == 0 && route != NULL;
|
||||
route = next)
|
||||
{
|
||||
/* Get the next entry in the to visit. We do this BEFORE calling the
|
||||
|
|
@ -123,7 +123,7 @@ int net_foreachroute_ipv6(route_handler_ipv6_t handler, FAR void *arg)
|
|||
*/
|
||||
|
||||
next = route->flink;
|
||||
ret = handler(route, arg);
|
||||
ret = handler(route, arg);
|
||||
}
|
||||
|
||||
/* Unlock the network */
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ struct route_ipv6_match_s
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static int net_ipv4_match(FAR struct net_route_s *route, FAR void *arg)
|
||||
static int net_ipv4_match(FAR struct net_route_ipv4_s *route, FAR void *arg)
|
||||
{
|
||||
FAR struct route_ipv4_match_s *match = (FAR struct route_ipv4_match_s *)arg;
|
||||
|
||||
|
|
|
|||
|
|
@ -93,9 +93,11 @@ struct route_ipv6_devmatch_s
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
static int net_ipv4_devmatch(FAR struct net_route_s *route, FAR void *arg)
|
||||
static int net_ipv4_devmatch(FAR struct net_route_ipv4_s *route,
|
||||
FAR void *arg)
|
||||
{
|
||||
FAR struct route_ipv4_devmatch_s *match = (FAR struct route_ipv4_devmatch_s *)arg;
|
||||
FAR struct route_ipv4_devmatch_s *match =
|
||||
(FAR struct route_ipv4_devmatch_s *)arg;
|
||||
FAR struct net_driver_s *dev = match->dev;
|
||||
|
||||
/* To match, (1) the masked target addresses must be the same, and (2) the
|
||||
|
|
@ -134,9 +136,11 @@ static int net_ipv4_devmatch(FAR struct net_route_s *route, FAR void *arg)
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
static int net_ipv6_devmatch(FAR struct net_route_ipv6_s *route, FAR void *arg)
|
||||
static int net_ipv6_devmatch(FAR struct net_route_ipv6_s *route,
|
||||
FAR void *arg)
|
||||
{
|
||||
FAR struct route_ipv6_devmatch_s *match = (FAR struct route_ipv6_devmatch_s *)arg;
|
||||
FAR struct route_ipv6_devmatch_s *match =
|
||||
(FAR struct route_ipv6_devmatch_s *)arg;
|
||||
FAR struct net_driver_s *dev = match->dev;
|
||||
|
||||
/* To match, (1) the masked target addresses must be the same, and (2) the
|
||||
|
|
@ -147,7 +151,8 @@ static int net_ipv6_devmatch(FAR struct net_route_ipv6_s *route, FAR void *arg)
|
|||
*/
|
||||
|
||||
if (net_ipv6addr_maskcmp(route->target, match->target, route->netmask) &&
|
||||
net_ipv6addr_maskcmp(route->router, dev->d_ipv6addr, dev->d_ipv6netmask))
|
||||
net_ipv6addr_maskcmp(route->router, dev->d_ipv6addr,
|
||||
dev->d_ipv6netmask))
|
||||
{
|
||||
/* They match.. Copy the router address */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/****************************************************************************
|
||||
* net/route/route.h
|
||||
*
|
||||
* Copyright (C) 2013-2014 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2013-2014, 2017 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
|
@ -65,17 +65,18 @@
|
|||
/* This structure describes one entry in the routing table */
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
struct net_route_s
|
||||
struct net_route_ipv4_s
|
||||
{
|
||||
FAR struct net_route_s *flink; /* Supports a singly linked list */
|
||||
in_addr_t target; /* The destination network */
|
||||
in_addr_t netmask; /* The network address mask */
|
||||
in_addr_t router; /* Route packets via this router */
|
||||
FAR struct net_route_ipv4_s *flink; /* Supports a singly linked list */
|
||||
in_addr_t target; /* The destination network */
|
||||
in_addr_t netmask; /* The network address mask */
|
||||
in_addr_t router; /* Route packets via this router */
|
||||
};
|
||||
|
||||
/* Type of the call out function pointer provided to net_foreachroute_ipv4() */
|
||||
|
||||
typedef int (*route_handler_t)(FAR struct net_route_s *route, FAR void *arg);
|
||||
typedef int (*route_handler_t)(FAR struct net_route_ipv4_s *route,
|
||||
FAR void *arg);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
|
|
@ -151,7 +152,7 @@ void net_initroute(void);
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
FAR struct net_route_s *net_allocroute_ipv4(void);
|
||||
FAR struct net_route_ipv4_s *net_allocroute_ipv4(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
|
|
@ -173,7 +174,7 @@ FAR struct net_route_ipv6_s *net_allocroute_ipv6(void);
|
|||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
void net_freeroute_ipv4(FAR struct net_route_s *route);
|
||||
void net_freeroute_ipv4(FAR struct net_route_ipv4_s *route);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
|
|
@ -346,6 +347,44 @@ int net_foreachroute_ipv4(route_handler_t handler, FAR void *arg);
|
|||
int net_foreachroute_ipv6(route_handler_ipv6_t handler, FAR void *arg);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: net_ipv4_dumproute and net_ipv6_dumproute
|
||||
*
|
||||
* Description:
|
||||
* Dump a routing table enter
|
||||
*
|
||||
* Parameters:
|
||||
* route - The entry to be dumped
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_DEBUG_NET_INFO
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
void net_ipv4_dumproute(FAR const char *msg,
|
||||
FAR struct net_route_ipv4_s *route);
|
||||
#else
|
||||
# define net_ipv4_dumproute(m,r)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
void net_ipv6_dumproute(FAR const char *msg,
|
||||
FAR struct net_route_ipv6_s *route);
|
||||
#else
|
||||
# define net_ipv6_dumproute(m,r)
|
||||
#endif
|
||||
|
||||
#else
|
||||
# define net_ipv4_dumproute(m,r)
|
||||
# define net_ipv6_dumproute(m,r)
|
||||
#endif
|
||||
|
||||
#undef EXTERN
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue