]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ipv4] Abstract out protocol-specific portions of "route" command
authorMichael Brown <mcb30@ipxe.org>
Tue, 3 Sep 2013 15:28:34 +0000 (16:28 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 3 Sep 2013 15:30:18 +0000 (16:30 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/config/config_route.c [new file with mode: 0644]
src/include/usr/route.h
src/usr/route.c
src/usr/route_ipv4.c [new file with mode: 0644]

diff --git a/src/config/config_route.c b/src/config/config_route.c
new file mode 100644 (file)
index 0000000..c31d2da
--- /dev/null
@@ -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
index 855fa7ba8dfdda2161bccbc1a5f33541014c02ab..b914f4b84e4ca2f4e4f591c2a23922d380e69a28 100644 (file)
@@ -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 */
index e393e38d4fade20f9a746d3cfc36242eab60420e..ba4cc3221780cf99f8e8b2d7ebec63b9d66dd73c 100644 (file)
 
 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 (file)
index 0000000..b4d1b7b
--- /dev/null
@@ -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,
+};