[dhcp] Await link-up before starting DHCP
authorJoshua Oreman <oremanj@xenon.get-linux.org>
Tue, 9 Jun 2009 04:46:56 +0000 (21:46 -0700)
committerJoshua Oreman <oremanj@xenon.get-linux.org>
Tue, 9 Jun 2009 04:46:56 +0000 (21:46 -0700)
The existing code does not check for link-up status on an interface
before it begins sending DHCP requests. On wired NICs, this is mostly
harmless, as the link comes up quickly and the DHCP requests are
retried several times. On wireless, though, the "link-up" process
involves a network scan and association that can take several seconds,
and it's best to wait to start sending DHCP packets until that's over.

I chose 15 seconds as the timeout, to match autoboot.

src/usr/dhcpmgmt.c

index a0ac4c3..c26f58f 100644 (file)
@@ -28,6 +28,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <usr/ifmgmt.h>
 #include <usr/dhcpmgmt.h>
 
+#define LINK_WAIT_MS   15000
+
 /** @file
  *
  * DHCP management
@@ -41,6 +43,11 @@ int dhcp ( struct net_device *netdev ) {
        if ( ( rc = ifopen ( netdev ) ) != 0 )
                return rc;
 
+       if ( ( rc = iflinkwait ( netdev, LINK_WAIT_MS ) ) != 0 ) {
+               printf ( "%s: no link detected\n", netdev->name );
+               return rc;
+       }
+
        /* Perform DHCP */
        printf ( "DHCP (%s %s)", netdev->name, netdev_hwaddr ( netdev ) );
        if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 )