nl80211: Stop more quickly on initialization errors

Stop on fatal errors like an attempt to use a non-existing interface or
not have root privileges to avoid producing confusing error messages.
This commit is contained in:
Jouni Malinen 2011-10-20 21:36:36 +03:00 committed by Jouni Malinen
parent 8c0d3b4fc6
commit 6e8183d714
2 changed files with 18 additions and 8 deletions

View 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 "

View 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;