--- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -754,7 +754,6 @@ nla_put_failure: } -#ifndef HOSTAPD static int nl80211_get_macaddr(struct i802_bss *bss) { struct nl_msg *msg; @@ -776,7 +775,6 @@ nla_put_failure: nlmsg_free(msg); return NL80211_IFTYPE_UNSPECIFIED; } -#endif /* HOSTAPD */ static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv, @@ -3613,6 +3611,7 @@ static void * wpa_driver_nl80211_init(vo drv->monitor_sock = -1; drv->eapol_tx_sock = -1; drv->ap_scan_as_station = NL80211_IFTYPE_UNSPECIFIED; + drv->nlmode = NL80211_IFTYPE_STATION; if (wpa_driver_nl80211_init_nl(drv)) { os_free(drv); @@ -4003,31 +4002,16 @@ static int i802_set_iface_flags(struct i static int -wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv) +wpa_driver_nl80211_finish_drv_init_sta(struct wpa_driver_nl80211_data *drv, + int *send_rfkill_event) { -#ifndef HOSTAPD enum nl80211_iftype nlmode = NL80211_IFTYPE_STATION; -#endif /* HOSTAPD */ struct i802_bss *bss = &drv->first_bss; - int send_rfkill_event = 0; int dynamic_if; - drv->ifindex = if_nametoindex(bss->ifname); - bss->ifindex = drv->ifindex; - bss->wdev_id = drv->global->if_add_wdevid; - bss->wdev_id_set = drv->global->if_add_wdevid_set; - dynamic_if = drv->ifindex == drv->global->if_add_ifindex; dynamic_if = dynamic_if || drv->global->if_add_wdevid_set; - drv->global->if_add_wdevid_set = 0; - if (wpa_driver_nl80211_capa(drv)) - return -1; - - wpa_printf(MSG_DEBUG, "nl80211: interface %s in phy %s", - bss->ifname, drv->phyname); - -#ifndef HOSTAPD if (dynamic_if) nlmode = nl80211_get_ifmode(bss); @@ -4056,7 +4040,7 @@ wpa_driver_nl80211_finish_drv_init(struc "interface '%s' due to rfkill", bss->ifname); drv->if_disabled = 1; - send_rfkill_event = 1; + *send_rfkill_event = 1; } else { wpa_printf(MSG_ERROR, "nl80211: Could not set " "interface '%s' UP", bss->ifname); @@ -4066,7 +4050,30 @@ wpa_driver_nl80211_finish_drv_init(struc netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, 1, IF_OPER_DORMANT); -#endif /* HOSTAPD */ + return 0; +} + +static int +wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv) +{ + struct i802_bss *bss = &drv->first_bss; + int send_rfkill_event = 0; + + drv->ifindex = if_nametoindex(bss->ifname); + bss->ifindex = drv->ifindex; + bss->wdev_id = drv->global->if_add_wdevid; + bss->wdev_id_set = drv->global->if_add_wdevid_set; + drv->global->if_add_wdevid_set = 0; + + if (wpa_driver_nl80211_capa(drv)) + return -1; + + wpa_printf(MSG_DEBUG, "nl80211: interface %s in phy %s", + bss->ifname, drv->phyname); + + if (drv->nlmode == NL80211_IFTYPE_STATION && + wpa_driver_nl80211_finish_drv_init_sta(drv, &send_rfkill_event)) + return -1; if (linux_get_ifhwaddr(drv->global->ioctl_sock, bss->ifname, bss->addr))