]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Stop more quickly on initialization errors
authorJouni Malinen <jouni@qca.qualcomm.com>
Thu, 20 Oct 2011 18:36:36 +0000 (21:36 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 20 Oct 2011 18:36:36 +0000 (21:36 +0300)
Stop on fatal errors like an attempt to use a non-existing interface or
not have root privileges to avoid producing confusing error messages.

src/drivers/driver_nl80211.c
src/drivers/linux_ioctl.c

index 9d6846ce1155567699e24d6ceeb7c972b9f932fe..90a55cd2443003d86141541111b4d4f6735a0672 100644 (file)
@@ -2340,8 +2340,9 @@ wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
        if ((drv->global == NULL ||
             drv->ifindex != drv->global->if_add_ifindex) &&
            wpa_driver_nl80211_set_mode(bss, NL80211_IFTYPE_STATION) < 0) {
-               wpa_printf(MSG_DEBUG, "nl80211: Could not configure driver to "
+               wpa_printf(MSG_ERROR, "nl80211: Could not configure driver to "
                           "use managed mode");
+               return -1;
        }
 
        if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 1)) {
@@ -5711,15 +5712,21 @@ static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
        wpa_printf(MSG_DEBUG, "nl80211: Try mode change after setting "
                   "interface down");
        for (i = 0; i < 10; i++) {
-               if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0) ==
-                   0) {
+               int res;
+               res = linux_set_iface_flags(drv->ioctl_sock, bss->ifname, 0);
+               if (res == -EACCES || res == -ENODEV)
+                       break;
+               if (res == 0) {
                        /* Try to set the mode again while the interface is
                         * down */
                        ret = nl80211_set_mode(drv, drv->ifindex, nlmode);
-                       if (linux_set_iface_flags(drv->ioctl_sock, bss->ifname,
-                                                 1))
+                       if (ret == -EACCES)
+                               break;
+                       res = linux_set_iface_flags(drv->ioctl_sock,
+                                                   bss->ifname, 1);
+                       if (res && !ret)
                                ret = -1;
-                       if (!ret)
+                       else if (ret != -EBUSY)
                                break;
                } else
                        wpa_printf(MSG_DEBUG, "nl80211: Failed to set "
index 0d6cf5416beec1144b2a3d8aaba1bb987d7c87ed..3f7ee291dedc714f7cb0232a1c3bb08a03ba76e6 100644 (file)
@@ -24,6 +24,7 @@
 int linux_set_iface_flags(int sock, const char *ifname, int dev_up)
 {
        struct ifreq ifr;
+       int ret;
 
        if (sock < 0)
                return -1;
@@ -32,9 +33,10 @@ int linux_set_iface_flags(int sock, const char *ifname, int dev_up)
        os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
 
        if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0) {
+               ret = errno ? -errno : -999;
                wpa_printf(MSG_ERROR, "Could not read interface %s flags: %s",
                           ifname, strerror(errno));
-               return -1;
+               return ret;
        }
 
        if (dev_up) {
@@ -48,9 +50,10 @@ int linux_set_iface_flags(int sock, const char *ifname, int dev_up)
        }
 
        if (ioctl(sock, SIOCSIFFLAGS, &ifr) != 0) {
+               ret = errno ? -errno : -999;
                wpa_printf(MSG_ERROR, "Could not set interface %s flags: %s",
                           ifname, strerror(errno));
-               return -1;
+               return ret;
        }
 
        return 0;