P2P: Add GO Intent of connecting device in GO Negotiation Request event

Add GO Intent information of connecting device in GO Negotiation Request
event which will help applications to decide its own GO intent value in
advance and can avoid failure cases when both devices use GO Intent 15
depending on application requirement.

Signed-off-by: Mayank Haarit <mayank.h@samsung.com>
This commit is contained in:
MAYANK HAARIT 2015-06-02 05:47:33 +00:00 committed by Jouni Malinen
parent f5d5161db1
commit aa2b12562b
7 changed files with 26 additions and 15 deletions

View file

@ -705,6 +705,7 @@ struct p2p_config {
* @ctx: Callback context from cb_ctx * @ctx: Callback context from cb_ctx
* @src: Source address of the message triggering this notification * @src: Source address of the message triggering this notification
* @dev_passwd_id: WPS Device Password ID * @dev_passwd_id: WPS Device Password ID
* @go_intent: Peer's GO Intent
* *
* This callback is used to notify that a P2P Device is requesting * This callback is used to notify that a P2P Device is requesting
* group owner negotiation with us, but we do not have all the * group owner negotiation with us, but we do not have all the
@ -713,7 +714,8 @@ struct p2p_config {
* PIN or PBC button press. This information can be provided with a * PIN or PBC button press. This information can be provided with a
* call to p2p_connect(). * call to p2p_connect().
*/ */
void (*go_neg_req_rx)(void *ctx, const u8 *src, u16 dev_passwd_id); void (*go_neg_req_rx)(void *ctx, const u8 *src, u16 dev_passwd_id,
u8 go_intent);
/** /**
* go_neg_completed - Notification of GO Negotiation results * go_neg_completed - Notification of GO Negotiation results

View file

@ -668,7 +668,9 @@ void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa,
MAC2STR(sa)); MAC2STR(sa));
status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE; status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
p2p->cfg->go_neg_req_rx(p2p->cfg->cb_ctx, sa, p2p->cfg->go_neg_req_rx(p2p->cfg->cb_ctx, sa,
msg.dev_password_id); msg.dev_password_id,
msg.go_intent ? (*msg.go_intent >> 1) :
0);
} else if (p2p->go_neg_peer && p2p->go_neg_peer != dev) { } else if (p2p->go_neg_peer && p2p->go_neg_peer != dev) {
p2p_dbg(p2p, "Already in Group Formation with another peer"); p2p_dbg(p2p, "Already in Group Formation with another peer");
status = P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE; status = P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;

View file

@ -1063,7 +1063,8 @@ error:
void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s, void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
const u8 *src, u16 dev_passwd_id) const u8 *src, u16 dev_passwd_id,
u8 go_intent)
{ {
DBusMessage *msg; DBusMessage *msg;
DBusMessageIter iter; DBusMessageIter iter;
@ -1097,7 +1098,9 @@ void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH, if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
&path) || &path) ||
!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16, !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16,
&dev_passwd_id)) &dev_passwd_id) ||
!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BYTE,
&go_intent))
wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
else else
dbus_connection_send(iface->con, msg, NULL); dbus_connection_send(iface->con, msg, NULL);
@ -3123,6 +3126,7 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
{ {
{ "path", "o", ARG_OUT }, { "path", "o", ARG_OUT },
{ "dev_passwd_id", "i", ARG_OUT }, { "dev_passwd_id", "i", ARG_OUT },
{ "device_go_intent", "y", ARG_OUT },
END_ARGS END_ARGS
} }
}, },

View file

@ -185,7 +185,8 @@ void wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
u16 config_methods, u16 config_methods,
unsigned int generated_pin); unsigned int generated_pin);
void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s, void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
const u8 *src, u16 dev_passwd_id); const u8 *src, u16 dev_passwd_id,
u8 go_intent);
void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s, void wpas_dbus_signal_p2p_group_started(struct wpa_supplicant *wpa_s,
const struct wpa_ssid *ssid, const struct wpa_ssid *ssid,
int client, int network_id); int client, int network_id);
@ -378,10 +379,10 @@ wpas_dbus_signal_p2p_provision_discovery(struct wpa_supplicant *wpa_s,
{ {
} }
static inline void wpas_dbus_signal_p2p_go_neg_req( static inline void wpas_dbus_signal_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
struct wpa_supplicant *wpa_s, const u8 *src,
const u8 *src, u16 dev_passwd_id,
u16 dev_passwd_id) u8 go_intent)
{ {
} }

View file

@ -561,9 +561,9 @@ void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
const u8 *src, u16 dev_passwd_id) const u8 *src, u16 dev_passwd_id, u8 go_intent)
{ {
wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id); wpas_dbus_signal_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
} }

View file

@ -93,7 +93,7 @@ void wpas_notify_p2p_group_removed(struct wpa_supplicant *wpa_s,
const struct wpa_ssid *ssid, const struct wpa_ssid *ssid,
const char *role); const char *role);
void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_go_neg_req(struct wpa_supplicant *wpa_s,
const u8 *src, u16 dev_passwd_id); const u8 *src, u16 dev_passwd_id, u8 go_intent);
void wpas_notify_p2p_go_neg_completed(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_go_neg_completed(struct wpa_supplicant *wpa_s,
struct p2p_go_neg_results *res); struct p2p_go_neg_results *res);
void wpas_notify_p2p_invitation_result(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_invitation_result(struct wpa_supplicant *wpa_s,

View file

@ -2146,13 +2146,15 @@ static void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
} }
static void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id) static void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id,
u8 go_intent)
{ {
struct wpa_supplicant *wpa_s = ctx; struct wpa_supplicant *wpa_s = ctx;
wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR
" dev_passwd_id=%u", MAC2STR(src), dev_passwd_id); " dev_passwd_id=%u go_intent=%u", MAC2STR(src),
dev_passwd_id, go_intent);
wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id); wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
} }