[PATCH] nl80211: Do not assume the device is rf-killed before trying to set it up
Peer, Ilan
ilan.peer
Sun Apr 27 03:06:25 PDT 2014
> -----Original Message-----
> From: hostap-bounces at lists.shmoo.com [mailto:hostap-
> bounces at lists.shmoo.com] On Behalf Of Tomasz Bursztyka
> Sent: Friday, April 25, 2014 15:24
> To: hostap at lists.shmoo.com
> Subject: [PATCH] nl80211: Do not assume the device is rf-killed before trying
> to set it up
>
> This fixes a regression which is assuming that since the general rf-kill status is
> on, all devices are rf-killed. This rule is actually not true since this rf-kill status
> is not per-device specific and the actual device might not be rf-killed though
> users are prevented to use it due to that logic.
>
> The kernel knows better which device is rf-killed or not, and will check its
> status properly when it tries to set it up (or "start" it for P2P).
> Thus it's better to rely on the kernel's returned code as it used to be.
>
> Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka at linux.intel.com>
> ---
> src/drivers/driver_nl80211.c | 38 ++++++++++++++++++++------------------
> 1 file changed, 20 insertions(+), 18 deletions(-)
>
> diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index
> 7e3de51..f256655 100644
> --- a/src/drivers/driver_nl80211.c
> +++ b/src/drivers/driver_nl80211.c
> @@ -4673,6 +4673,7 @@ wpa_driver_nl80211_finish_drv_init(struct
> wpa_driver_nl80211_data *drv,
> struct i802_bss *bss = drv->first_bss;
> int send_rfkill_event = 0;
> enum nl80211_iftype nlmode;
> + int ret;
>
> drv->ifindex = if_nametoindex(bss->ifname);
> bss->ifindex = drv->ifindex;
> @@ -4710,25 +4711,26 @@ wpa_driver_nl80211_finish_drv_init(struct
> wpa_driver_nl80211_data *drv,
> return -1;
> }
>
> - if (nlmode == NL80211_IFTYPE_P2P_DEVICE)
> - nl80211_get_macaddr(bss);
> -
> - if (!rfkill_is_blocked(drv->rfkill)) {
> - int ret = i802_set_iface_flags(bss, 1);
> - if (ret) {
> - wpa_printf(MSG_ERROR, "nl80211: Could not set "
> - "interface '%s' UP", bss->ifname);
> - return ret;
> + ret = i802_set_iface_flags(bss, 1);
> + if (ret < 0) {
> + if (rfkill_is_blocked(drv->rfkill)) {
> + wpa_printf(MSG_DEBUG, "nl80211: Could not yet
> enable "
> + "interface '%s' due to rfkill",
> + bss->ifname);
> + drv->if_disabled = 1;
> + send_rfkill_event = 1;
> + } else {
> + wpa_printf(MSG_ERROR, "nl80211: Could not %s "
> + "interface '%s' UP",
> + nlmode == NL80211_IFTYPE_P2P_DEVICE ?
> + "start P2P" : "set", bss->ifname);
> + return -1;
Can use "return ret;"
> }
> - if (nlmode == NL80211_IFTYPE_P2P_DEVICE)
> - return ret;
> - } else {
> - wpa_printf(MSG_DEBUG, "nl80211: Could not yet enable "
> - "interface '%s' due to rfkill", bss->ifname);
> - if (nlmode == NL80211_IFTYPE_P2P_DEVICE)
> - return 0;
> - drv->if_disabled = 1;
> - send_rfkill_event = 1;
> + }
> +
> + if (nlmode == NL80211_IFTYPE_P2P_DEVICE) {
> + nl80211_get_macaddr(bss);
> + return ret;
Returning here is problematic as the wpa_driver_nl80211_send_rfkill() will not be called, and the INTERFACE_DISABLED event will not be fired.
Regards,
Ilan.
More information about the Hostap
mailing list