]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Disable IEEE 802.11b rates only for P2P iftypes
authorJouni Malinen <j@w1.fi>
Sat, 29 Oct 2011 19:46:58 +0000 (22:46 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 29 Oct 2011 19:46:58 +0000 (22:46 +0300)
Instead of hardcoding IEEE 802.11b rates to be disabled whenever
P2P support is built in and supported by the driver, do this only
when an interface is set to P2P mode (both when adding a new
interface and when changing the interface mode). This re-enables
use of IEEE 802.11b APs with CONFIG_P2P=y builds.

Signed-hostap: Jouni Malinen <j@w1.fi>

src/drivers/driver_nl80211.c

index aa437aa6bcc7485289452538ff7afdea3c089629..8fc6dd9bf6bbebe359aa24f222ce7a61bff0d0d4 100644 (file)
@@ -220,8 +220,8 @@ struct wpa_driver_nl80211_data {
        int monitor_sock;
        int monitor_ifidx;
        int no_monitor_iface_capab;
-       int disable_11b_rates;
 
+       unsigned int disabled_11b_rates:1;
        unsigned int pending_remain_on_chan:1;
        unsigned int in_interface_list:1;
 
@@ -313,6 +313,13 @@ static int is_sta_interface(enum nl80211_iftype nlmode)
 }
 
 
+static int is_p2p_interface(enum nl80211_iftype nlmode)
+{
+       return (nlmode == NL80211_IFTYPE_P2P_CLIENT ||
+               nlmode == NL80211_IFTYPE_P2P_GO);
+}
+
+
 struct nl80211_bss_info_arg {
        struct wpa_driver_nl80211_data *drv;
        struct wpa_scan_results *res;
@@ -2419,17 +2426,6 @@ wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
                                       drv, drv->ctx);
        }
 
-#ifdef CONFIG_P2P
-       if (drv->capa.flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) {
-               /*
-                * FIX: Do this conditionally on the interface type to avoid
-                * changing non-P2P use cases.
-                */
-               drv->disable_11b_rates = 1;
-               nl80211_disable_11b_rates(drv, drv->ifindex, 1);
-       }
-#endif /* CONFIG_P2P */
-
        return 0;
 }
 
@@ -2507,10 +2503,8 @@ static void wpa_driver_nl80211_deinit(void *priv)
                os_free(drv->if_indices);
 #endif /* HOSTAPD */
 
-       if (drv->disable_11b_rates) {
-               drv->disable_11b_rates = 0;
+       if (drv->disabled_11b_rates)
                nl80211_disable_11b_rates(drv, drv->ifindex, 0);
-       }
 
        netlink_send_oper_ifla(drv->global->netlink, drv->ifindex, 0,
                               IF_OPER_UP);
@@ -4651,7 +4645,7 @@ static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
                                                wds);
        }
 
-       if (ret >= 0 && drv->disable_11b_rates)
+       if (ret >= 0 && is_p2p_interface(iftype))
                nl80211_disable_11b_rates(drv, ret, 1);
 
        return ret;
@@ -5783,8 +5777,13 @@ done:
                bss->beacon_set = 0;
        }
 
-       if (!ret && drv->disable_11b_rates)
+       if (!ret && is_p2p_interface(drv->nlmode)) {
                nl80211_disable_11b_rates(drv, drv->ifindex, 1);
+               drv->disabled_11b_rates = 1;
+       } else if (!ret && drv->disabled_11b_rates) {
+               nl80211_disable_11b_rates(drv, drv->ifindex, 0);
+               drv->disabled_11b_rates = 0;
+       }
 
        if (ret)
                wpa_printf(MSG_DEBUG, "nl80211: Interface mode change to %d "