dhclient - Do not force-up wlan interfaces
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 20 Aug 2014 17:34:14 +0000 (10:34 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 20 Aug 2014 17:34:14 +0000 (10:34 -0700)
* Do not force a wlan interface up, this may interfere with wpa_supplicant
  operation.

* Increase the default timeout for waiting for the interface to become
  active from 10 seconds to 30 seconds.  wlan interfaces can take
  considerably longer than 10 seconds to associate and dhclient operation
  now detaches without waiting so the longer timeout will not interfere
  with the boot sequence.

sbin/dhclient/clparse.c
sbin/dhclient/dhclient.c
sbin/dhclient/dispatch.c

index a04d9b5..8b67635 100644 (file)
@@ -58,7 +58,7 @@ read_client_conf(void)
        new_parse(path_dhclient_conf);
 
        /* Set some defaults... */
-       config->link_timeout = 10;
+       config->link_timeout = 30;
        config->timeout = 60;
        config->select_interval = 0;
        config->reboot_timeout = 10;
index bd589fa..ee2b271 100644 (file)
@@ -78,7 +78,6 @@ int no_daemon;
 int stayalive = 0;
 int unknown_ok = 1;
 int routefd = -1;
-int forceup = 1;       /* force interface up */
 pid_t monitor_pid;
 
 struct iaddr iaddr_broadcast = { 4, { 255, 255, 255, 255 } };
@@ -406,8 +405,7 @@ main(int argc, char *argv[])
        read_client_conf();
 
        if (interface_status(ifi->name) == 0) {
-               if (forceup)
-                       interface_link_forceup(ifi->name);
+               interface_link_forceup(ifi->name);
                /* Give it up to 4 seconds of silent grace to find link */
                i = -4;
        } else {
index 38b64a2..fdad0c7 100644 (file)
@@ -203,10 +203,15 @@ got_one(void)
        do_packet(result, from.sin_port, ifrom, &hfrom);
 }
 
+/*
+ * Normally its ok to force the interface link up, but don't do it
+ * if it is an 80211 interface.
+ */
 int
 interface_link_forceup(char *ifname)
 {
        struct ifreq ifr;
+       struct ifmediareq ifmr;
        int sock;
 
        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
@@ -218,6 +223,13 @@ interface_link_forceup(char *ifname)
                close(sock);
                return (-1);
        }
+       memset(&ifmr, 0, sizeof(ifmr));
+       strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
+       if (ioctl(sock, SIOCGIFMEDIA, (caddr_t)&ifmr) != -1) {
+               if (IFM_TYPE(ifmr.ifm_active) == IFM_IEEE80211) {
+                       return 0;
+               }
+       }
 
        if ((ifr.ifr_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) {
                ifr.ifr_flags |= IFF_UP;