From 108def931eddddc2a5c7e08c393a71b1e35787d9 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 27 Jun 2010 00:11:42 -0700 Subject: [PATCH] P2P: Add command for pre-authorizing an invitation to an active group This is mainly designed for testing and allows p2p_connect join auth to be used to accept a specific invitation to an active group that may be received in the future. --- wpa_supplicant/ctrl_iface.c | 4 +++- wpa_supplicant/p2p_supplicant.c | 20 ++++++++++++++++++++ wpa_supplicant/wpa_supplicant_i.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index c4169f2b5..3d604f34b 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -1850,7 +1850,7 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd, int freq = 0; /* <"pbc" | "pin" | PIN> [label|display|keypad] [persistent] - * [join|auth] [go_intent=<0..15>] [freq=] */ + * [join] [auth] [go_intent=<0..15>] [freq=] */ if (hwaddr_aton(cmd, addr)) return -1; @@ -2451,6 +2451,7 @@ static int p2p_ctrl_set(struct wpa_supplicant *wpa_s, char *cmd) "disabled" : "enabled"); if (wpa_s->global->p2p_disabled) { wpas_p2p_stop_find(wpa_s); + os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN); p2p_flush(wpa_s->global->p2p); } return 0; @@ -2716,6 +2717,7 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, if (p2p_ctrl_set(wpa_s, buf + 8) < 0) reply_len = -1; } else if (os_strcmp(buf, "P2P_FLUSH") == 0) { + os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN); p2p_flush(wpa_s->global->p2p); } else if (os_strncmp(buf, "P2P_PRESENCE_REQ ", 17) == 0) { if (p2p_ctrl_presence_req(wpa_s, buf + 17) < 0) diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index ccb2e0d19..005bc1a3f 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -41,6 +41,8 @@ wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated, int go); static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s); static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx); +static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr, + const u8 *dev_addr, enum p2p_wps_method wps_method); static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s); @@ -1685,6 +1687,13 @@ static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid, if (!persistent_group) { wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR " to join an active group", MAC2STR(sa)); + if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) && + os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN) == + 0) { + wpa_printf(MSG_DEBUG, "P2P: Accept previously " + "authorized invitation"); + goto accept_inv; + } /* * Do not accept the invitation automatically; notify user and * request approval. @@ -1731,6 +1740,7 @@ static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid, ETH_ALEN); } +accept_inv: if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, cur_bssid) == 0 && wpa_s->assoc_freq) { wpa_printf(MSG_DEBUG, "P2P: Trying to force channel to match " @@ -1772,6 +1782,9 @@ static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid, if (s) { wpas_p2p_group_add_persistent( wpa_s, s, s->mode == WPAS_MODE_P2P_GO, 0); + } else { + wpas_p2p_join(wpa_s, bssid, go_dev_addr, + wpa_s->p2p_wps_method); } return; } @@ -2453,6 +2466,13 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr, if (join) { u8 iface_addr[ETH_ALEN]; + if (auth) { + wpa_printf(MSG_DEBUG, "P2P: Authorize invitation to " + "connect a running group from " MACSTR, + MAC2STR(peer_addr)); + os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN); + return ret; + } if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr, iface_addr) < 0) os_memcpy(iface_addr, peer_addr, ETH_ALEN); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index f76ea57d7..f272a60a0 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -474,6 +474,7 @@ struct wpa_supplicant { int p2p_long_listen; char p2p_pin[10]; int p2p_wps_method; + u8 p2p_auth_invite[ETH_ALEN]; int p2p_sd_over_ctrl_iface; int p2p_in_provisioning; int pending_invite_ssid_id;