Fix some bad pointer arithmatic in the tg3 driver that was causing the dynamic memory...
[people/xl0/gpxe.git] / src / usr / dhcpmgmt.c
index 0e36d55..060dd67 100644 (file)
  */
 
 #include <string.h>
+#include <stdio.h>
 #include <byteswap.h>
-#include <vsprintf.h>
 #include <gpxe/in.h>
+#include <gpxe/ip.h>
 #include <gpxe/dhcp.h>
 #include <gpxe/async.h>
 #include <gpxe/netdevice.h>
+#include <gpxe/dns.h>
 #include <usr/ifmgmt.h>
 #include <usr/dhcpmgmt.h>
 
@@ -32,6 +34,9 @@
  *
  */
 
+/* Avoid dragging in dns.o */
+struct in_addr nameserver;
+
 /**
  * Configure network device via DHCP
  *
@@ -41,8 +46,8 @@
 int dhcp ( struct net_device *netdev ) {
        static struct dhcp_option_block *dhcp_options = NULL;
        struct dhcp_session dhcp;
-       struct in_addr address = { htonl ( 0 ) };
-       struct in_addr netmask = { htonl ( 0 ) };
+       struct in_addr address = { 0 };
+       struct in_addr netmask = { 0 };
        struct in_addr gateway = { INADDR_NONE };
        struct async async;
        int rc;
@@ -58,17 +63,15 @@ int dhcp ( struct net_device *netdev ) {
                dhcp_options = NULL;
        }
 
+       /* Clear any existing routing table entry */
+       del_ipv4_address ( netdev );
+
        /* Issue DHCP request */
        printf ( "DHCP (%s %s)...", netdev->name, netdev_hwaddr ( netdev ) );
        memset ( &dhcp, 0, sizeof ( dhcp ) );
        dhcp.netdev = netdev;
-       async_init_orphan ( &async );
-       if ( ( rc = start_dhcp ( &dhcp, &async ) ) != 0 ) {
-               printf ( "could not start (%s)\n", strerror ( rc ) );
-               return rc;
-       }
-       async_wait ( &async, &rc, 1 );  
-       if ( rc != 0 ) {
+       if ( ( rc = async_block ( &async,
+                                 start_dhcp ( &dhcp, &async ) ) ) != 0 ) {
                printf ( "failed (%s)\n", strerror ( rc ) );
                return rc;
        }
@@ -91,5 +94,9 @@ int dhcp ( struct net_device *netdev ) {
                return rc;
        }
 
+       /* Retrieve other DHCP options that we care about */
+       find_dhcp_ipv4_option ( dhcp_options, DHCP_DNS_SERVERS,
+                               &nameserver );
+
        return 0;
 }