@@ -1794,8 +1794,10 @@ struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p)
struct wpabuf *buf;
u8 *len;
int pw_id = -1;
+ struct wpabuf *custom_ies[P2P_MAX_PROBE_RESPONSE_IES];
+ int i = 0, num_ies = 0;
- buf = wpabuf_alloc(1000);
+ buf = wpabuf_alloc(1500);
if (buf == NULL)
return NULL;
@@ -1816,6 +1818,17 @@ struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p)
p2p_buf_add_device_info(buf, p2p, NULL);
p2p_buf_update_ie_hdr(buf, len);
+ /* Add custom ies corresponding to the device */
+ num_ies = 0;
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ if (p2p->proberesp_ies[i])
+ custom_ies[num_ies++] = p2p->proberesp_ies[i];
+ }
+ if (num_ies)
+ p2p_buf_add_custom_ies(buf, custom_ies, num_ies);
+
+ wpa_hexdump(MSG_DEBUG, "Probe response IEs: ",
+ wpabuf_head(buf), wpabuf_len(buf));
return buf;
}
@@ -2479,6 +2492,73 @@ int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
return 0;
}
+void p2p_remove_all_probereq_ies(struct p2p_data *p2p)
+{
+ int i;
+
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ wpabuf_free(p2p->probereq_ies[i]);
+ p2p->probereq_ies[i] = NULL;
+ }
+}
+
+
+int p2p_add_probereq_ies(struct p2p_data *p2p,
+ const struct wpabuf *ie)
+{
+ int i;
+
+ if (ie == NULL)
+ return -1;
+
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ if (p2p->probereq_ies[i] == NULL)
+ break;
+ }
+ if (i >= P2P_MAX_PROBE_REQUEST_IES)
+ return -1;
+
+ p2p->probereq_ies[i] = wpabuf_dup(ie);
+ if (p2p->probereq_ies[i] == NULL)
+ return -1;
+
+ return 0;
+}
+
+
+void p2p_remove_all_proberesp_ies(struct p2p_data *p2p)
+{
+ int i;
+
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ wpabuf_free(p2p->proberesp_ies[i]);
+ p2p->proberesp_ies[i] = NULL;
+ }
+}
+
+
+int p2p_add_proberesp_ies(struct p2p_data *p2p,
+ const struct wpabuf *ie)
+{
+ int i;
+
+ if (ie == NULL)
+ return -1;
+
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ if (p2p->proberesp_ies[i] == NULL)
+ break;
+ }
+ if (i >= P2P_MAX_PROBE_RESPONSE_IES)
+ return -1;
+
+ p2p->proberesp_ies[i] = wpabuf_dup(ie);
+ if (p2p->proberesp_ies[i] == NULL)
+ return -1;
+
+ return 0;
+}
+
int p2p_set_country(struct p2p_data *p2p, const char *country)
{
@@ -2650,6 +2730,9 @@ void p2p_scan_res_handled(struct p2p_data *p2p)
void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id)
{
+ int i, num_ies;
+ struct wpabuf *custom_ies[P2P_MAX_PROBE_RESPONSE_IES];
+
u8 *len = p2p_buf_add_ie_hdr(ies);
p2p_buf_add_capability(ies, p2p->dev_capab &
~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
@@ -2664,6 +2747,15 @@ void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id)
p2p->ext_listen_interval);
/* TODO: p2p_buf_add_operating_channel() if GO */
p2p_buf_update_ie_hdr(ies, len);
+
+ /* Set the custom IEs to be used in probe requests */
+ num_ies = 0;
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ if (p2p->probereq_ies[i])
+ custom_ies[num_ies++] = p2p->probereq_ies[i];
+ }
+ if (num_ies)
+ p2p_buf_add_custom_ies(ies, custom_ies, num_ies);
}
@@ -20,6 +20,23 @@
#define P2P_MAX_REG_CLASS_CHANNELS 20
/**
+ * P2P_MAX_PROBE_REQUEST_IES - Maximum number of custom IEs that can
+ * added to probe requests
+ */
+#define P2P_MAX_PROBE_REQUEST_IES 10
+
+/**
+ * P2P_MAX_PROBE_RESPONSE_IES - Maximum number of custom IEs that can
+ * added to probe responses (either to a
+ * p2p device or a group owner
+ */
+#define P2P_MAX_PROBE_RESPONSE_IES 10
+/**
+ * P2P_CUSTOM_IES_MAX_BYTE_SIZE Maximum size of each element of custom
+ * ies in terms of number of bytes
+ */
+#define P2P_CUSTOM_IES_MAX_BYTE_SIZE 255
+/**
* struct p2p_channels - List of supported channels
*/
struct p2p_channels {
@@ -1660,6 +1677,51 @@ int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
const struct wpabuf *vendor_ext);
/**
+ * p2p_remove_all_probereq_ies - Remove all the custom IEs associated with
+ * probe requests
+ * @p2p: P2P module context from p2p_init()
+ */
+void p2p_remove_all_probereq_ies(struct p2p_data *p2p);
+
+/**
+ * p2p_add_probereq_ie - Add a custom IE to be attached to probe requests
+ * @p2p: P2P module context from p2p_init()
+ * @ie: The IE to add (for attaching to probe requests)
+ * Returns: 0 on success, -1 on failure
+ *
+ * The wpabuf structures in the array are owned by the P2P
+ * module after this call.
+ */
+int p2p_add_probereq_ies(struct p2p_data *p2p,
+ const struct wpabuf *ie);
+
+/**
+ * p2p_remove_all_proberesp_ies - Remove all the custom IEs associated with
+ * probe responses
+ * @p2p: P2P module context from p2p_init()
+ */
+void p2p_remove_all_proberesp_ies(struct p2p_data *p2p);
+
+/**
+ * p2p_add_proberesp_ie - Add a custom IE to be attached to probe responses
+ * @p2p: P2P module context from p2p_init()
+ * @ie: The IE to add (for attaching to probe responses)
+ * Returns: 0 on success, -1 on failure
+ *
+ * The wpabuf structures in the array are owned by the P2P
+ * module after this call.
+ */
+int p2p_add_proberesp_ies(struct p2p_data *p2p,
+ const struct wpabuf *ie);
+/**
+ * p2p_group_update_ies - update probe response of the group with
+ * corresponding IEs.
+ * @group: Per-group P2P state for GO
+ * Returns: 0 on success, -1 on failure
+ */
+void p2p_group_update_ies(struct p2p_group *group);
+
+/**
* p2p_set_oper_channel - Set the P2P operating channel
* @p2p: P2P module context from p2p_init()
* @op_reg_class: Operating regulatory class to set
@@ -428,3 +428,21 @@ void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id,
p2p_buf_update_ie_hdr(buf, len);
}
+
+
+/*
+ * In order to support additional usages based on P2P there would be a need
+ * to add custom IEs to probe requests/responses transmitted by a P2P device.
+ * This utility method would allow doing that.
+ */
+void p2p_buf_add_custom_ies(struct wpabuf *buf, struct wpabuf *ies[], int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++) {
+ if (wpabuf_tailroom(buf) <
+ wpabuf_len(ies[i]))
+ continue;
+ wpabuf_put_buf(buf, ies[i]);
+ }
+}
@@ -40,7 +40,7 @@ struct p2p_group {
};
-static void p2p_group_update_ies(struct p2p_group *group);
+void p2p_group_update_ies(struct p2p_group *group);
struct p2p_group * p2p_group_init(struct p2p_data *p2p,
@@ -220,7 +220,7 @@ static struct wpabuf * p2p_group_build_probe_resp_ie(struct p2p_group *group)
}
-static void p2p_group_update_ies(struct p2p_group *group)
+void p2p_group_update_ies(struct p2p_group *group)
{
struct wpabuf *beacon_ie;
struct wpabuf *probe_resp_ie;
@@ -424,6 +424,20 @@ struct p2p_data {
* in IDLE state.
*/
int pd_retries;
+
+ /*
+ * Custom IES set to provide specific upper layer information
+ * (example Wifi Display) during probe request. These are not
+ * associated to vendor specific information.
+ */
+ struct wpabuf *probereq_ies[P2P_MAX_PROBE_REQUEST_IES];
+
+ /*
+ * Custom IES set to provide specific upper layer information
+ * (example Wifi Display) during probe response. These are not
+ * associated to vendor specific information.
+ */
+ struct wpabuf *proberesp_ies[P2P_MAX_PROBE_RESPONSE_IES];
};
/**
@@ -582,6 +596,8 @@ void p2p_buf_add_noa(struct wpabuf *buf, u8 noa_index, u8 opp_ps, u8 ctwindow,
struct p2p_noa_desc *desc1, struct p2p_noa_desc *desc2);
void p2p_buf_add_ext_listen_timing(struct wpabuf *buf, u16 period,
u16 interval);
+void p2p_buf_add_custom_ies(struct wpabuf *buf, struct wpabuf *ies[],
+ int num);
void p2p_buf_add_p2p_interface(struct wpabuf *buf, struct p2p_data *p2p);
void p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id,
int all_attr);
@@ -27,7 +27,6 @@
#include "config_ssid.h"
#include "wps/wps.h"
-
struct wpa_cred {
/**
* next - Next credential in the list
@@ -165,6 +164,8 @@ struct wpa_cred {
#define CFG_CHANGED_P2P_LISTEN_CHANNEL BIT(11)
#define CFG_CHANGED_P2P_OPER_CHANNEL BIT(12)
#define CFG_CHANGED_P2P_PREF_CHAN BIT(13)
+#define CFG_CHANGED_P2P_PROBEREQ_IES BIT(14)
+#define CFG_CHANGED_P2P_PROBERESP_IES BIT(15)
/**
* struct wpa_config - wpa_supplicant configuration data
@@ -661,6 +662,30 @@ struct wpa_config {
* wps_nfc_dh_pubkey - NFC Device Password for password token
*/
struct wpabuf *wps_nfc_dev_pw;
+/**
+ * P2P_MAX_PROBE_REQUEST_IES - Maximum number of custom IEs that can
+ * added to probe requests
+ */
+#define P2P_MAX_PROBE_REQUEST_IES 10
+
+/**
+ * P2P_MAX_PROBE_RESPONSE_IES - Maximum number of custom IEs that can
+ * added to probe responses (either to a
+ * p2p device or a group owner
+ */
+#define P2P_MAX_PROBE_RESPONSE_IES 10
+ /*
+ * Custom IES set to provide specific upper layer information
+ * (example Wifi Display) during probe request. These are not
+ * associated to vendor specific information.
+ */
+ struct wpabuf *probereq_ies[P2P_MAX_PROBE_REQUEST_IES];
+ /*
+ * Custom IES set to provide specific upper layer information
+ * (example Wifi Display) during probe response. These are not
+ * associated to vendor specific information.
+ */
+ struct wpabuf *proberesp_ies[P2P_MAX_PROBE_RESPONSE_IES];
};
@@ -2749,6 +2749,14 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = {
wpas_dbus_getter_persistent_groups,
NULL
},
+ { "ProbeRequestIEs", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "aay",
+ wpas_dbus_getter_p2p_probereq_ies,
+ wpas_dbus_setter_p2p_probereq_ies,
+ },
+ { "ProbeResponseIEs", WPAS_DBUS_NEW_IFACE_P2PDEVICE, "aay",
+ wpas_dbus_getter_p2p_proberesp_ies,
+ wpas_dbus_setter_p2p_proberesp_ies,
+ },
#endif /* CONFIG_P2P */
{ "DisconnectReason", WPAS_DBUS_NEW_IFACE_INTERFACE, "i",
wpas_dbus_getter_disconnect_reason,
@@ -2134,6 +2134,253 @@ error:
return wpas_dbus_error_invalid_args(message, NULL);
}
+/**
+ * wpas_dbus_getter_p2p_probereq_ies - Get the custom ies set for
+ * p2p probe request from the supplicant
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Getter for "Properties" property of a p2p device.
+ */
+dbus_bool_t wpas_dbus_getter_p2p_probereq_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data)
+{
+ struct wpa_supplicant *wpa_s = user_data;
+ struct wpabuf *probereq_ies[P2P_MAX_PROBE_REQUEST_IES];
+ int num_ies, i;
+
+ /* Probe request IEs */
+ num_ies = 0;
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ if (wpa_s->conf->probereq_ies[i] == NULL)
+ continue;
+ probereq_ies[num_ies++] =
+ wpa_s->conf->probereq_ies[i];
+ }
+
+ if (!wpas_dbus_simple_array_array_property_getter(iter,
+ DBUS_TYPE_BYTE,
+ probereq_ies, num_ies,
+ error)) {
+ dbus_set_error_const(error, DBUS_ERROR_FAILED,
+ "no memory");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * wpas_dbus_getter_p2p_proberesp_ies - Get the custom ies set for
+ * p2p probe response from the supplicant
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Getter for "Properties" property of a p2p device.
+ */
+dbus_bool_t wpas_dbus_getter_p2p_proberesp_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data)
+{
+ struct wpa_supplicant *wpa_s = user_data;
+ struct wpabuf *proberesp_ies[P2P_MAX_PROBE_RESPONSE_IES];
+ int num_ies, i;
+
+ /* Probe response IEs */
+ num_ies = 0;
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ if (wpa_s->conf->proberesp_ies[i] == NULL)
+ continue;
+ proberesp_ies[num_ies++] =
+ wpa_s->conf->proberesp_ies[i];
+ }
+
+ if (!wpas_dbus_simple_array_array_property_getter(iter,
+ DBUS_TYPE_BYTE,
+ proberesp_ies, num_ies,
+ error)) {
+ dbus_set_error_const(error, DBUS_ERROR_FAILED,
+ "no memory");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * PRIVATE read_byte_array_from_dbus - Reads an array of bytes from the
+ * dbus. Can be called by setter call-backs
+ * @iter: Pointer to incoming dbus message iter
+ * @dest: Copy read data into the wpabuf struct
+ * @max_byte_len: Maximum size of the data to be read
+ * Returns: data_len: The size of the data read in bytes
+ */
+
+static int read_byte_array_from_dbus(DBusMessageIter iter,
+ u8 *dest, int max_byte_length)
+{
+
+ int blob_len = 0;
+ DBusMessageIter simple_iter;
+
+ dbus_message_iter_recurse(&iter, &simple_iter);
+
+ while (dbus_message_iter_get_arg_type(&simple_iter) ==
+ DBUS_TYPE_BYTE) {
+ /* There is more data */
+ if (blob_len == max_byte_length) {
+
+ /*Reached max size, cannot read any more data*/
+ wpa_printf(MSG_DEBUG, "DBUS: Read Failed, "
+ "Data too big: Max size = %d", max_byte_length);
+ return -1;
+ }
+
+ /* Read the next byte*/
+ dbus_message_iter_get_basic(&simple_iter,
+ &dest[blob_len]);
+
+ dbus_message_iter_next(&simple_iter);
+ wpa_printf(MSG_DEBUG, "%x ", dest[blob_len]);
+ blob_len++;
+ }
+
+ return blob_len;
+}
+
+/**
+ * wpas_dbus_setter_p2p_probereq_ies - Set the custom ies information
+ * to be used by the supplicant for probe request
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Setter for "Properties" property of a p2p device.
+ */
+
+dbus_bool_t wpas_dbus_setter_p2p_probereq_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data)
+{
+ struct wpa_supplicant *wpa_s = user_data;
+ DBusMessageIter variant_iter, array_iter;
+ u8 blob_data[P2P_CUSTOM_IES_MAX_BYTE_SIZE];
+ int num_ies = 0, i = 0, blob_len = 0;
+ struct wpabuf *probereq_ies[P2P_MAX_PROBE_REQUEST_IES];
+
+ dbus_message_iter_recurse(iter, &variant_iter);
+ if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY)
+ return FALSE;
+
+ dbus_message_iter_recurse(&variant_iter, &array_iter);
+
+ while ((num_ies < P2P_MAX_PROBE_REQUEST_IES) &&
+ (dbus_message_iter_get_arg_type(&array_iter) ==
+ DBUS_TYPE_ARRAY)) {
+ /* Read the next byte array from the dbus*/
+ blob_len = read_byte_array_from_dbus(array_iter, &blob_data[0],
+ P2P_CUSTOM_IES_MAX_BYTE_SIZE);
+ if (blob_len < 0)
+ continue;
+
+ probereq_ies[num_ies] = wpabuf_alloc_copy(blob_data, blob_len);
+ if (probereq_ies[num_ies] == NULL)
+ goto error;
+ num_ies++;
+ dbus_message_iter_next(&array_iter);
+ }
+ /* Save data */
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ wpabuf_free(wpa_s->conf->probereq_ies[i]);
+ wpa_s->conf->probereq_ies[i] = NULL;
+ if (i < num_ies)
+ wpa_s->conf->probereq_ies[i] =
+ probereq_ies[i];
+ }
+
+ wpa_s->conf->changed_parameters |=
+ CFG_CHANGED_P2P_PROBEREQ_IES;
+ /* Supplicant config changed update P2P */
+ wpa_supplicant_update_config(wpa_s);
+
+ return TRUE;
+
+error:
+ while (--num_ies)
+ wpabuf_free(probereq_ies[num_ies]);
+
+ return FALSE;
+}
+
+/**
+ * wpas_dbus_setter_p2p_proberesp_ies - Set the custom ies information
+ * to be used by the supplicant for probe response
+ * @iter: Pointer to incoming dbus message iter
+ * @error: Location to store error on failure
+ * @user_data: Function specific data
+ * Returns: TRUE on success, FALSE on failure
+ *
+ * Setter for "Properties" property of a p2p device.
+ */
+
+dbus_bool_t wpas_dbus_setter_p2p_proberesp_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data)
+{
+ struct wpa_supplicant *wpa_s = user_data;
+ DBusMessageIter variant_iter, array_iter;
+ u8 blob_data[P2P_CUSTOM_IES_MAX_BYTE_SIZE];
+ int num_ies = 0, i = 0, blob_len = 0;
+ struct wpabuf *proberesp_ies[P2P_MAX_PROBE_RESPONSE_IES];
+
+ dbus_message_iter_recurse(iter, &variant_iter);
+ if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY)
+ return FALSE;
+
+ dbus_message_iter_recurse(&variant_iter, &array_iter);
+
+ while ((num_ies < P2P_MAX_PROBE_RESPONSE_IES) &&
+ (dbus_message_iter_get_arg_type(&array_iter) ==
+ DBUS_TYPE_ARRAY)) {
+ /* Read the next byte array from the dbus*/
+ if (read_byte_array_from_dbus(array_iter, blob_data,
+ P2P_CUSTOM_IES_MAX_BYTE_SIZE) < 0)
+ continue;
+
+ proberesp_ies[num_ies] = wpabuf_alloc_copy(blob_data, blob_len);
+ if (proberesp_ies[num_ies] == NULL)
+ goto error;
+ num_ies++;
+ dbus_message_iter_next(&array_iter);
+ }
+ /* Save data */
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ wpabuf_free(wpa_s->conf->proberesp_ies[i]);
+ wpa_s->conf->proberesp_ies[i] = NULL;
+ if (i < num_ies)
+ wpa_s->conf->proberesp_ies[i] =
+ proberesp_ies[i];
+ }
+
+ wpa_s->conf->changed_parameters |=
+ CFG_CHANGED_P2P_PROBERESP_IES;
+ /* Supplicant config changed update P2P */
+ wpa_supplicant_update_config(wpa_s);
+
+ return TRUE;
+
+error:
+ while (--num_ies)
+ wpabuf_free(proberesp_ies[num_ies]);
+
+ return FALSE;
+}
DBusMessage * wpas_dbus_handler_p2p_delete_service(
DBusMessage *message, struct wpa_supplicant *wpa_s)
@@ -109,6 +109,22 @@ dbus_bool_t wpas_dbus_getter_p2p_peergo(DBusMessageIter *iter,
DBusError *error,
void *user_data);
+dbus_bool_t wpas_dbus_getter_p2p_probereq_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data);
+
+dbus_bool_t wpas_dbus_setter_p2p_probereq_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data);
+
+dbus_bool_t wpas_dbus_getter_p2p_proberesp_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data);
+
+dbus_bool_t wpas_dbus_setter_p2p_proberesp_ies(DBusMessageIter *iter,
+ DBusError *error,
+ void *user_data);
+
/*
* P2P Peer properties.
*/
@@ -4424,6 +4424,47 @@ void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
}
}
+ if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PROBEREQ_IES) {
+ int i;
+ p2p_remove_all_probereq_ies(p2p);
+ for (i = 0; i < P2P_MAX_PROBE_REQUEST_IES; i++) {
+ if (wpa_s->conf->probereq_ies[i] == NULL)
+ continue;
+ p2p_add_probereq_ies(
+ p2p, wpa_s->conf->probereq_ies[i]);
+ }
+ /*TODO:wpas_p2p_custom_ies_update(wpa_s, 1);*/
+ }
+ if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PROBERESP_IES) {
+ int i;
+ struct wpa_ssid *ssid;
+ int go_mode = 0;
+
+ p2p_remove_all_proberesp_ies(p2p);
+ for (i = 0; i < P2P_MAX_PROBE_RESPONSE_IES; i++) {
+ if (wpa_s->conf->proberesp_ies[i] == NULL)
+ continue;
+ p2p_add_proberesp_ies(
+ p2p, wpa_s->conf->proberesp_ies[i]);
+ }
+ /*TODO: wpas_p2p_custom_ies_update(wpa_s, 0);*/
+
+ /*
+ * If we are in GO mode currently then also update
+ * the group's IEs
+ */
+ ssid = wpa_s->conf->ssid;
+ if (ssid) {
+ go_mode = !(ssid->mode != WPAS_MODE_P2P_GO &&
+ ssid->mode != WPAS_MODE_AP &&
+ ssid->mode !=
+ WPAS_MODE_P2P_GROUP_FORMATION);
+ if ((wpa_s->wpa_state == WPA_COMPLETED) && go_mode &&
+ wpa_s->p2p_group)
+ p2p_group_update_ies(wpa_s->p2p_group);
+ }
+ }
+
if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
char country[3];