]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
AP: Pass station P2P PS capabilities info during station add/set
authorAyala Beker <ayala.beker@intel.com>
Thu, 7 Apr 2016 10:31:01 +0000 (13:31 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 8 Apr 2016 10:02:49 +0000 (13:02 +0300)
If a legacy client with no P2P PS support is trying to connect to
a P2P GO, the driver should know that, and change its PS behavior
accordingly.

Add a parameter to hostapd_sta_add_params() indicating if P2P PS is
supported by the station and pass this parameter to kernel with nl80211
driver when the station is added/set.

Signed-off-by: Ayala Beker <ayala.beker@intel.com>
src/ap/ap_drv_ops.c
src/ap/ap_drv_ops.h
src/ap/ieee802_11.c
src/drivers/driver.h
src/drivers/driver_nl80211.c

index b89f60e1f8a4b6f59a5ad69fa7764a77f0588fea..a3f4dd92b26a688148393f77863516306b66723f 100644 (file)
@@ -362,7 +362,8 @@ int hostapd_sta_add(struct hostapd_data *hapd,
                    u16 listen_interval,
                    const struct ieee80211_ht_capabilities *ht_capab,
                    const struct ieee80211_vht_capabilities *vht_capab,
-                   u32 flags, u8 qosinfo, u8 vht_opmode, int set)
+                   u32 flags, u8 qosinfo, u8 vht_opmode, int supp_p2p_ps,
+                   int set)
 {
        struct hostapd_sta_add_params params;
 
@@ -384,6 +385,7 @@ int hostapd_sta_add(struct hostapd_data *hapd,
        params.vht_opmode = vht_opmode;
        params.flags = hostapd_sta_flags_to_drv(flags);
        params.qosinfo = qosinfo;
+       params.support_p2p_ps = supp_p2p_ps;
        params.set = set;
        return hapd->driver->sta_add(hapd->drv_priv, &params);
 }
index 757a706c40625ed4aa1beba993bb6bf38525b46f..6ea1dab0d54bfb8da1c6cd5eb376b5f5e60958af 100644 (file)
@@ -41,7 +41,8 @@ int hostapd_sta_add(struct hostapd_data *hapd,
                    u16 listen_interval,
                    const struct ieee80211_ht_capabilities *ht_capab,
                    const struct ieee80211_vht_capabilities *vht_capab,
-                   u32 flags, u8 qosinfo, u8 vht_opmode, int set);
+                   u32 flags, u8 qosinfo, u8 vht_opmode, int supp_p2p_ps,
+                   int set);
 int hostapd_set_privacy(struct hostapd_data *hapd, int enabled);
 int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem,
                             size_t elem_len);
index 6a373c54c25923247c9a2f6b4f02b5960d77b300..aa2b965b83c4737bde0866db2dce91ff6ef67fa8 100644 (file)
@@ -1221,7 +1221,7 @@ static void handle_auth(struct hostapd_data *hapd,
                                WLAN_STA_AUTHORIZED);
 
                if (hostapd_sta_add(hapd, sta->addr, 0, 0, 0, 0, 0,
-                                   NULL, NULL, sta->flags, 0, 0, 0)) {
+                                   NULL, NULL, sta->flags, 0, 0, 0, 0)) {
                        hostapd_logger(hapd, sta->addr,
                                       HOSTAPD_MODULE_IEEE80211,
                                       HOSTAPD_LEVEL_NOTICE,
@@ -1805,7 +1805,8 @@ static int add_associated_sta(struct hostapd_data *hapd,
                            sta->flags & WLAN_STA_HT ? &ht_cap : NULL,
                            sta->flags & WLAN_STA_VHT ? &vht_cap : NULL,
                            sta->flags | WLAN_STA_ASSOC, sta->qosinfo,
-                           sta->vht_opmode, sta->added_unassoc)) {
+                           sta->vht_opmode, sta->p2p_ie ? 1 : 0,
+                           sta->added_unassoc)) {
                hostapd_logger(hapd, sta->addr,
                               HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_NOTICE,
                               "Could not %s STA to kernel driver",
index b7e0d1635f649460edd5543d8a9c1d9a9ddcaf03..79489501784209b89fd3027431050a891b4fa78e 100644 (file)
@@ -1419,6 +1419,7 @@ struct hostapd_sta_add_params {
        size_t supp_channels_len;
        const u8 *supp_oper_classes;
        size_t supp_oper_classes_len;
+       int support_p2p_ps;
 };
 
 struct mac_address {
index 798e69476717d43e7121ffacf522df0302e7f01a..58f65556a633020a92aee894d5d489632159347f 100644 (file)
@@ -3877,6 +3877,13 @@ static int wpa_driver_nl80211_sta_add(void *priv,
                                    params->ext_capab_len, params->ext_capab))
                                goto fail;
                }
+
+               if (is_ap_interface(drv->nlmode) &&
+                   nla_put_u8(msg, NL80211_ATTR_STA_SUPPORT_P2P_PS,
+                              params->support_p2p_ps ?
+                              NL80211_P2P_PS_SUPPORTED :
+                              NL80211_P2P_PS_UNSUPPORTED))
+                       goto fail;
        }
        if (!params->set) {
                if (params->aid) {