aboutsummaryrefslogtreecommitdiffstats
path: root/src/p2p
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2012-06-16 20:17:39 +0300
committerJouni Malinen <j@w1.fi>2012-06-16 20:17:39 +0300
commitf33bc035824a39017a25bedd7017a3ddf6bec866 (patch)
tree6deaf9888d821001a88903a03930f798ce523b11 /src/p2p
parent18485b5469c5eeea6a552264fbfaabb089a0a557 (diff)
downloadexternal_wpa_supplicant_8_ti-f33bc035824a39017a25bedd7017a3ddf6bec866.zip
external_wpa_supplicant_8_ti-f33bc035824a39017a25bedd7017a3ddf6bec866.tar.gz
external_wpa_supplicant_8_ti-f33bc035824a39017a25bedd7017a3ddf6bec866.tar.bz2
P2P: Fix P2P Client Discoverability bit updates
The P2P Client Discoverability bit is reserved in most frames and its value in the local P2P peer table should only be updated based on P2P Group Info attribute from a GO. Fix this by avoiding changes to this dev_capab bit based on other P2P frames. It would be more correct to track this separately for each group in which the peer is a member, but since we do not do that for the other group specific information either, this can do for now. It should be noted that prior to commit 18485b5469c5eeea6a552264fbfaabb089a0a557 wpa_supplicant set this bit in all P2P frames. However, that commit changed this to match the specification, i.e., the bit is not set in frames which are received from P2P Device role. As such, this fix is needed to be able to figure out that a peer supports client discoverability capability after that commit. Signed-hostap: Jouni Malinen <j@w1.fi> intended-for: hostap-1
Diffstat (limited to 'src/p2p')
-rw-r--r--src/p2p/p2p.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index 295e8f2..f7915bd 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -437,13 +437,25 @@ static int p2p_add_group_clients(struct p2p_data *p2p, const u8 *go_dev_addr,
continue; /* ignore our own entry */
dev = p2p_get_device(p2p, cli->p2p_device_addr);
if (dev) {
- /*
- * Update information only if we have not received this
- * directly from the client.
- */
if (dev->flags & (P2P_DEV_GROUP_CLIENT_ONLY |
- P2P_DEV_PROBE_REQ_ONLY))
+ P2P_DEV_PROBE_REQ_ONLY)) {
+ /*
+ * Update information since we have not
+ * received this directly from the client.
+ */
p2p_copy_client_info(dev, cli);
+ } else {
+ /*
+ * Need to update P2P Client Discoverability
+ * flag since it is valid only in P2P Group
+ * Info attribute.
+ */
+ dev->info.dev_capab &=
+ ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
+ dev->info.dev_capab |=
+ cli->dev_capab &
+ P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
+ }
if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
}
@@ -526,7 +538,13 @@ static void p2p_copy_wps_info(struct p2p_device *dev, int probe_req,
}
if (msg->capability) {
- dev->info.dev_capab = msg->capability[0];
+ /*
+ * P2P Client Discoverability bit is reserved in all frames
+ * that use this function, so do not change its value here.
+ */
+ dev->info.dev_capab &= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
+ dev->info.dev_capab |= msg->capability[0] &
+ ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
dev->info.group_capab = msg->capability[1];
}