P2PS: Do not add unnecessary attributes to PD Response
authorMax Stepanov <Max.Stepanov@intel.com>
Thu, 8 Oct 2015 09:36:05 +0000 (12:36 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 11 Oct 2015 18:42:03 +0000 (21:42 +0300)
Don't add unnecessary P2PS attributes to PD Response depending on the
type of exchange.

Signed-off-by: Max Stepanov <Max.Stepanov@intel.com>
src/p2p/p2p_pd.c

index 916e521..c416ab6 100644 (file)
@@ -295,6 +295,11 @@ static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p,
                u8 *len = p2p_buf_add_ie_hdr(buf);
                struct p2ps_provision *prov = p2p->p2ps_prov;
                u8 group_capab;
+               u8 conncap = 0;
+
+               if (status == P2P_SC_SUCCESS ||
+                   status == P2P_SC_SUCCESS_DEFERRED)
+                       conncap = prov->conncap;
 
                if (!status && prov->status != -1)
                        status = prov->status;
@@ -333,11 +338,11 @@ static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p,
                        }
                }
 
-               if (!persist && (prov->conncap & P2PS_SETUP_GROUP_OWNER))
+               if (!persist && (conncap & P2PS_SETUP_GROUP_OWNER))
                        p2ps_add_new_group_info(p2p, dev, buf);
 
                /* Add Operating Channel if conncap indicates GO */
-               if (persist || (prov->conncap & P2PS_SETUP_GROUP_OWNER)) {
+               if (persist || (conncap & P2PS_SETUP_GROUP_OWNER)) {
                        if (p2p->op_reg_class && p2p->op_channel)
                                p2p_buf_add_operating_channel(
                                        buf, p2p->cfg->country,
@@ -350,17 +355,20 @@ static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p,
                                        p2p->cfg->op_channel);
                }
 
-               p2p_buf_add_channel_list(buf, p2p->cfg->country,
-                                        &p2p->channels);
+               if (persist ||
+                   (conncap & (P2PS_SETUP_CLIENT | P2PS_SETUP_GROUP_OWNER)))
+                       p2p_buf_add_channel_list(buf, p2p->cfg->country,
+                                                &p2p->channels);
 
-               if (!persist && (status == P2P_SC_SUCCESS ||
-                                status == P2P_SC_SUCCESS_DEFERRED))
-                       p2p_buf_add_connection_capability(buf, prov->conncap);
+               if (!persist && conncap)
+                       p2p_buf_add_connection_capability(buf, conncap);
 
                p2p_buf_add_advertisement_id(buf, adv_id, prov->adv_mac);
 
-               p2p_buf_add_config_timeout(buf, p2p->go_timeout,
-                                          p2p->client_timeout);
+               if (persist ||
+                   (conncap & (P2PS_SETUP_CLIENT | P2PS_SETUP_GROUP_OWNER)))
+                       p2p_buf_add_config_timeout(buf, p2p->go_timeout,
+                                                  p2p->client_timeout);
 
                p2p_buf_add_session_id(buf, prov->session_id,
                                       prov->session_mac);