P2P: Send received Presence Response information to ctrl_iface monitors
The P2P_PRESENCE_REQ command did not give any easily available indication of the response received from the GO. Make this more useful by providing such response (if received) as a ctrl_iface monitor event (P2P-PRESENCE-RESPONSE). Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
9a170ed244
commit
c64e3a08a9
6 changed files with 56 additions and 5 deletions
|
@ -147,6 +147,7 @@ extern "C" {
|
||||||
#define P2P_EVENT_INVITATION_RESULT "P2P-INVITATION-RESULT "
|
#define P2P_EVENT_INVITATION_RESULT "P2P-INVITATION-RESULT "
|
||||||
#define P2P_EVENT_FIND_STOPPED "P2P-FIND-STOPPED "
|
#define P2P_EVENT_FIND_STOPPED "P2P-FIND-STOPPED "
|
||||||
#define P2P_EVENT_PERSISTENT_PSK_FAIL "P2P-PERSISTENT-PSK-FAIL id="
|
#define P2P_EVENT_PERSISTENT_PSK_FAIL "P2P-PERSISTENT-PSK-FAIL id="
|
||||||
|
#define P2P_EVENT_PRESENCE_RESPONSE "P2P-PRESENCE-RESPONSE "
|
||||||
|
|
||||||
/* parameters: <PMF enabled> <timeout in ms> <Session Information URL> */
|
/* parameters: <PMF enabled> <timeout in ms> <Session Information URL> */
|
||||||
#define ESS_DISASSOC_IMMINENT "ESS-DISASSOC-IMMINENT "
|
#define ESS_DISASSOC_IMMINENT "ESS-DISASSOC-IMMINENT "
|
||||||
|
|
|
@ -3770,6 +3770,11 @@ static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (p2p->cfg->presence_resp) {
|
||||||
|
p2p->cfg->presence_resp(p2p->cfg->cb_ctx, sa, *msg.status,
|
||||||
|
msg.noa, msg.noa_len);
|
||||||
|
}
|
||||||
|
|
||||||
if (*msg.status) {
|
if (*msg.status) {
|
||||||
p2p_dbg(p2p, "P2P Presence Request was rejected: status %u",
|
p2p_dbg(p2p, "P2P Presence Request was rejected: status %u",
|
||||||
*msg.status);
|
*msg.status);
|
||||||
|
|
|
@ -778,6 +778,17 @@ struct p2p_config {
|
||||||
* or 0 if not.
|
* or 0 if not.
|
||||||
*/
|
*/
|
||||||
int (*go_connected)(void *ctx, const u8 *dev_addr);
|
int (*go_connected)(void *ctx, const u8 *dev_addr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* presence_resp - Callback on Presence Response
|
||||||
|
* @ctx: Callback context from cb_ctx
|
||||||
|
* @src: Source address (GO's P2P Interface Address)
|
||||||
|
* @status: Result of the request (P2P_SC_*)
|
||||||
|
* @noa: Returned NoA value
|
||||||
|
* @noa_len: Length of the NoA buffer in octets
|
||||||
|
*/
|
||||||
|
void (*presence_resp)(void *ctx, const u8 *src, u8 status,
|
||||||
|
const u8 *noa, size_t noa_len);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -418,9 +418,11 @@ p2p_presence_req [<duration> <interval>] [<duration> <interval>]
|
||||||
Send a P2P Presence Request to the GO (this is only available when
|
Send a P2P Presence Request to the GO (this is only available when
|
||||||
acting as a P2P client). If no duration/interval pairs are given, the
|
acting as a P2P client). If no duration/interval pairs are given, the
|
||||||
request indicates that this client has no special needs for GO
|
request indicates that this client has no special needs for GO
|
||||||
presence. the first parameter pair gives the preferred duration and
|
presence. The first parameter pair gives the preferred duration and
|
||||||
interval values in microseconds. If the second pair is included, that
|
interval values in microseconds. If the second pair is included, that
|
||||||
indicates which value would be acceptable.
|
indicates which value would be acceptable. This command returns OK
|
||||||
|
immediately and the response from the GO is indicated in a
|
||||||
|
P2P-PRESENCE-RESPONSE event message.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
|
|
||||||
|
|
|
@ -489,6 +489,8 @@ static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s,
|
||||||
os_free(wpa_s->go_params);
|
os_free(wpa_s->go_params);
|
||||||
wpa_s->go_params = NULL;
|
wpa_s->go_params = NULL;
|
||||||
|
|
||||||
|
wpa_s->waiting_presence_resp = 0;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network");
|
wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network");
|
||||||
if (ssid && (ssid->p2p_group ||
|
if (ssid && (ssid->p2p_group ||
|
||||||
ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION ||
|
ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION ||
|
||||||
|
@ -3364,6 +3366,28 @@ int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void wpas_presence_resp(void *ctx, const u8 *src, u8 status,
|
||||||
|
const u8 *noa, size_t noa_len)
|
||||||
|
{
|
||||||
|
struct wpa_supplicant *wpa_s, *intf = ctx;
|
||||||
|
char hex[100];
|
||||||
|
|
||||||
|
for (wpa_s = intf->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
|
||||||
|
if (wpa_s->waiting_presence_resp)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!wpa_s) {
|
||||||
|
wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No group interface was waiting for presence response");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wpa_s->waiting_presence_resp = 0;
|
||||||
|
|
||||||
|
wpa_snprintf_hex(hex, sizeof(hex), noa, noa_len);
|
||||||
|
wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PRESENCE_RESPONSE "src=" MACSTR
|
||||||
|
" status=%u noa=%s", MAC2STR(src), status, hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wpas_p2p_init - Initialize P2P module for %wpa_supplicant
|
* wpas_p2p_init - Initialize P2P module for %wpa_supplicant
|
||||||
* @global: Pointer to global data from wpa_supplicant_init()
|
* @global: Pointer to global data from wpa_supplicant_init()
|
||||||
|
@ -3409,6 +3433,7 @@ int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
|
||||||
p2p.invitation_result = wpas_invitation_result;
|
p2p.invitation_result = wpas_invitation_result;
|
||||||
p2p.get_noa = wpas_get_noa;
|
p2p.get_noa = wpas_get_noa;
|
||||||
p2p.go_connected = wpas_go_connected;
|
p2p.go_connected = wpas_go_connected;
|
||||||
|
p2p.presence_resp = wpas_presence_resp;
|
||||||
|
|
||||||
os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
|
os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
|
||||||
os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
|
os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
|
||||||
|
@ -5434,6 +5459,8 @@ done:
|
||||||
int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
|
int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
|
||||||
u32 interval1, u32 duration2, u32 interval2)
|
u32 interval1, u32 duration2, u32 interval2)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
|
if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -5442,9 +5469,13 @@ int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
|
||||||
wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
|
wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
|
ret = p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
|
||||||
wpa_s->own_addr, wpa_s->assoc_freq,
|
wpa_s->own_addr, wpa_s->assoc_freq,
|
||||||
duration1, interval1, duration2, interval2);
|
duration1, interval1, duration2, interval2);
|
||||||
|
if (ret == 0)
|
||||||
|
wpa_s->waiting_presence_resp = 1;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -663,6 +663,7 @@ struct wpa_supplicant {
|
||||||
unsigned int p2p_go_vht:1;
|
unsigned int p2p_go_vht:1;
|
||||||
unsigned int user_initiated_pd:1;
|
unsigned int user_initiated_pd:1;
|
||||||
unsigned int p2p_go_group_formation_completed:1;
|
unsigned int p2p_go_group_formation_completed:1;
|
||||||
|
unsigned int waiting_presence_resp;
|
||||||
int p2p_first_connection_timeout;
|
int p2p_first_connection_timeout;
|
||||||
int p2p_persistent_go_freq;
|
int p2p_persistent_go_freq;
|
||||||
int p2p_persistent_id;
|
int p2p_persistent_id;
|
||||||
|
|
Loading…
Reference in a new issue