Add "name" field to network device, to facilitate netdev commands.
authorMichael Brown <mcb30@etherboot.org>
Tue, 9 Jan 2007 23:48:18 +0000 (23:48 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 9 Jan 2007 23:48:18 +0000 (23:48 +0000)
src/include/gpxe/netdevice.h
src/net/ipv4.c
src/net/netdevice.c
src/tests/aoeboot.c
src/tests/dhcptest.c
src/usr/autoboot.c

index bc08272..90d03fc 100644 (file)
@@ -138,7 +138,8 @@ struct ll_protocol {
 struct net_device {
        /** List of network devices */
        struct list_head list;
-
+       /** Name of this network device */
+       char name[8];
        /** List of persistent reference holders */
        struct list_head references;
 
@@ -224,14 +225,12 @@ struct net_device {
 #define __net_protocol __table ( net_protocols, 01 )
 
 /**
- * Get network device name
+ * Get printable network device hardware address
  *
  * @v netdev           Network device
- * @ret name           Network device name
- *
- * The name will be the device's link-layer address.
+ * @ret name           Hardware address
  */
-static inline const char * netdev_name ( struct net_device *netdev ) {
+static inline const char * netdev_hwaddr ( struct net_device *netdev ) {
        return netdev->ll_protocol->ntoa ( netdev->ll_addr );
 }
 
@@ -247,6 +246,7 @@ extern int netdev_open ( struct net_device *netdev );
 extern void netdev_close ( struct net_device *netdev );
 extern void unregister_netdev ( struct net_device *netdev );
 extern void free_netdev ( struct net_device *netdev );
+struct net_device * find_netdev ( const char *name );
 extern struct net_device * next_netdev ( void );
 extern int net_tx ( struct pk_buff *pkb, struct net_device *netdev,
                    struct net_protocol *net_protocol, const void *ll_dest );
index 228a5a5..e663ec3 100644 (file)
@@ -79,7 +79,7 @@ static struct ipv4_miniroute * add_ipv4_miniroute ( struct net_device *netdev,
                DBG ( "/%s ", inet_ntoa ( netmask ) );
                if ( gateway.s_addr != INADDR_NONE )
                        DBG ( "gw %s ", inet_ntoa ( gateway ) );
-               DBG ( "via %s\n", netdev_name ( netdev ) );
+               DBG ( "via %s\n", netdev->name );
 
                /* Record routing information */
                miniroute->netdev = netdev;
@@ -115,7 +115,7 @@ static void del_ipv4_miniroute ( struct ipv4_miniroute *miniroute ) {
        DBG ( "/%s ", inet_ntoa ( miniroute->netmask ) );
        if ( miniroute->gateway.s_addr != INADDR_NONE )
                DBG ( "gw %s ", inet_ntoa ( miniroute->gateway ) );
-       DBG ( "via %s\n", netdev_name ( miniroute->netdev ) );
+       DBG ( "via %s\n", miniroute->netdev->name );
 
        ref_del ( &miniroute->netdev_ref );
        list_del ( &miniroute->list );
index 40f836d..f3b76a7 100644 (file)
@@ -21,6 +21,7 @@
 #include <byteswap.h>
 #include <string.h>
 #include <errno.h>
+#include <vsprintf.h>
 #include <gpxe/if_ether.h>
 #include <gpxe/pkbuff.h>
 #include <gpxe/tables.h>
@@ -187,14 +188,20 @@ struct net_device * alloc_netdev ( size_t priv_size ) {
  * @v netdev           Network device
  * @ret rc             Return status code
  *
- * Adds the network device to the list of network devices.
+ * Gives the network device a name and adds it to the list of network
+ * devices.
  */
 int register_netdev ( struct net_device *netdev ) {
-       
+       static unsigned int ifindex = 0;
+
+       /* Create device name */
+       snprintf ( netdev->name, sizeof ( netdev->name ), "net%d",
+                  ifindex++ );
+
        /* Add to device list */
        list_add_tail ( &netdev->list, &net_devices );
-       DBGC ( netdev, "NETDEV %p registered as %s\n",
-              netdev, netdev_name ( netdev ) );
+       DBGC ( netdev, "NETDEV %p registered as %s (%s)\n",
+              netdev, netdev->name, netdev_hwaddr ( netdev ) );
 
        return 0;
 }
@@ -285,6 +292,23 @@ void free_netdev ( struct net_device *netdev ) {
        free ( netdev );
 }
 
+/**
+ * Get network device by name
+ *
+ * @v name             Network device name
+ * @ret netdev         Network device, or NULL
+ */
+struct net_device * find_netdev ( const char *name ) {
+       struct net_device *netdev;
+
+       list_for_each_entry ( netdev, &net_devices, list ) {
+               if ( strcmp ( netdev->name, name ) == 0 )
+                       return netdev;
+       }
+
+       return NULL;
+}
+
 /**
  * Iterate through network devices
  *
index e585731..9d3013b 100644 (file)
@@ -36,7 +36,7 @@ int test_aoeboot ( struct net_device *netdev, const char *aoename,
        int rc;
 
        printf ( "Attempting to boot from AoE device %s via %s\n",
-                aoename, netdev_name ( netdev ) );
+                aoename, netdev->name );
 
        if ( ( rc = aoe_parse ( aoename, &test_aoedev.aoe ) ) != 0 ) {
                printf ( "Invalid AoE device name \"%s\"\n", aoename );
index 19949ab..d6b1992 100644 (file)
@@ -224,7 +224,7 @@ int test_dhcp ( struct net_device *netdev ) {
                goto out_no_del_ipv4;
 
        /* Issue DHCP request */
-       printf ( "DHCP (%s)...", netdev_name ( netdev ) );
+       printf ( "DHCP (%s)...", netdev->name );
        memset ( &dhcp, 0, sizeof ( dhcp ) );
        dhcp.netdev = netdev;
        if ( ( rc = async_wait ( start_dhcp ( &dhcp ) ) ) != 0 ) {
index e677229..0fa4e8e 100644 (file)
@@ -41,7 +41,7 @@ void autoboot ( void ) {
        }
 
        if ( ( rc = netdev_open ( netdev ) ) != 0 ) {
-               printf ( "Could not open %s: %s\n", netdev_name ( netdev ),
+               printf ( "Could not open %s: %s\n", netdev->name,
                         strerror ( rc ) );
                return;
        }