aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/config/config_route.c24
-rw-r--r--src/include/usr/route.h23
-rw-r--r--src/usr/route.c24
-rw-r--r--src/usr/route_ipv4.c58
4 files changed, 115 insertions, 14 deletions
diff --git a/src/config/config_route.c b/src/config/config_route.c
new file mode 100644
index 0000000..c31d2da
--- /dev/null
+++ b/src/config/config_route.c
@@ -0,0 +1,24 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2, or (at
+ * your option) any later version.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <config/general.h>
+
+/** @file
+ *
+ * Routing management configuration options
+ *
+ */
+
+/*
+ * Drag in routing management for relevant protocols
+ *
+ */
+#ifdef NET_PROTO_IPV4
+REQUIRE_OBJECT ( route_ipv4 );
+#endif
diff --git a/src/include/usr/route.h b/src/include/usr/route.h
index 855fa7b..b914f4b 100644
--- a/src/include/usr/route.h
+++ b/src/include/usr/route.h
@@ -3,12 +3,33 @@
/** @file
*
- * Routing table management
+ * Routing management
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
+#include <ipxe/tables.h>
+
+/** A routing family */
+struct routing_family {
+ /**
+ * Print routes for a network device
+ *
+ * @v netdev Network device
+ */
+ void ( * print ) ( struct net_device *netdev );
+};
+
+/** Routing family table */
+#define ROUTING_FAMILIES __table ( struct routing_family, "routing_families" )
+
+/** Declare a routing family */
+#define __routing_family( order ) __table_entry ( ROUTING_FAMILIES, order )
+
+#define ROUTING_IPV4 01
+#define ROUTING_IPV6 02
+
extern void route ( void );
#endif /* _USR_ROUTE_H */
diff --git a/src/usr/route.c b/src/usr/route.c
index e393e38..ba4cc32 100644
--- a/src/usr/route.c
+++ b/src/usr/route.c
@@ -19,28 +19,26 @@
FILE_LICENCE ( GPL2_OR_LATER );
-#include <stdio.h>
#include <ipxe/netdevice.h>
-#include <ipxe/ip.h>
#include <usr/route.h>
/** @file
*
- * Routing table management
+ * Routing management
*
*/
+/**
+ * Print routing table
+ *
+ */
void route ( void ) {
- struct ipv4_miniroute *miniroute;
+ struct net_device *netdev;
+ struct routing_family *family;
- list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
- printf ( "%s: %s/", miniroute->netdev->name,
- inet_ntoa ( miniroute->address ) );
- printf ( "%s", inet_ntoa ( miniroute->netmask ) );
- if ( miniroute->gateway.s_addr )
- printf ( " gw %s", inet_ntoa ( miniroute->gateway ) );
- if ( ! netdev_is_open ( miniroute->netdev ) )
- printf ( " (inaccessible)" );
- printf ( "\n" );
+ for_each_netdev ( netdev ) {
+ for_each_table_entry ( family, ROUTING_FAMILIES ) {
+ family->print ( netdev );
+ }
}
}
diff --git a/src/usr/route_ipv4.c b/src/usr/route_ipv4.c
new file mode 100644
index 0000000..b4d1b7b
--- /dev/null
+++ b/src/usr/route_ipv4.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdio.h>
+#include <ipxe/netdevice.h>
+#include <ipxe/ip.h>
+#include <usr/route.h>
+
+/** @file
+ *
+ * IPv4 routing management
+ *
+ */
+
+/**
+ * Print IPv4 routing table
+ *
+ * @v netdev Network device
+ */
+static void route_ipv4_print ( struct net_device *netdev ) {
+ struct ipv4_miniroute *miniroute;
+
+ list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
+ if ( miniroute->netdev != netdev )
+ continue;
+ printf ( "%s: %s/", netdev->name,
+ inet_ntoa ( miniroute->address ) );
+ printf ( "%s", inet_ntoa ( miniroute->netmask ) );
+ if ( miniroute->gateway.s_addr )
+ printf ( " gw %s", inet_ntoa ( miniroute->gateway ) );
+ if ( ! netdev_is_open ( miniroute->netdev ) )
+ printf ( " (inaccessible)" );
+ printf ( "\n" );
+ }
+}
+
+/** IPv4 routing family */
+struct routing_family ipv4_routing_family __routing_family ( ROUTING_IPV4 ) = {
+ .print = route_ipv4_print,
+};