From 0799b3f89991033c3310c9e389693070d4311880 Mon Sep 17 00:00:00 2001 From: Andrei Otcheretianski Date: Wed, 10 Jun 2015 11:43:35 +0300 Subject: [PATCH] P2P: Specify frequency when sending Probe Response frame If the RX frequency of the Probe Request frame is known, specify it when sending the Probe Response frame. This is needed when the Probe Request frame is received on another virtual interface, for example, when a GO or P2PS client are discoverable on the group operating channel. Signed-off-by: Andrei Otcheretianski Reviewed-by: Ilan Peer --- src/p2p/p2p.c | 2 +- src/p2p/p2p.h | 9 ++++++--- wpa_supplicant/ap.c | 7 ++++++- wpa_supplicant/driver_i.h | 6 ++++-- wpa_supplicant/p2p_supplicant.c | 6 ++++-- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index a450d92..a1ac807 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -2440,7 +2440,7 @@ p2p_reply_probe(struct p2p_data *p2p, const u8 *addr, const u8 *dst, wpabuf_put_buf(buf, ies); wpabuf_free(ies); - p2p->cfg->send_probe_resp(p2p->cfg->cb_ctx, buf); + p2p->cfg->send_probe_resp(p2p->cfg->cb_ctx, buf, rx_freq); wpabuf_free(buf); diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index b4407f0..67b8bdb 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -570,12 +570,14 @@ struct p2p_config { * send_probe_resp - Transmit a Probe Response frame * @ctx: Callback context from cb_ctx * @buf: Probe Response frame (including the header and body) + * @freq: Forced frequency (in MHz) to use or 0. * Returns: 0 on success, -1 on failure * * This function is used to reply to Probe Request frames that were * indicated with a call to p2p_probe_req_rx(). The response is to be - * sent on the same channel or to be dropped if the driver is not - * anymore listening to Probe Request frames. + * sent on the same channel, unless otherwise specified, or to be + * dropped if the driver is not listening to Probe Request frames + * anymore. * * Alternatively, the responsibility for building the Probe Response * frames in Listen state may be in another system component in which @@ -586,7 +588,8 @@ struct p2p_config { * Request frames must be indicated by calling p2p_probe_req_rx() even * if this send_probe_resp() is not used. */ - int (*send_probe_resp)(void *ctx, const struct wpabuf *buf); + int (*send_probe_resp)(void *ctx, const struct wpabuf *buf, + unsigned int freq); /** * send_action - Transmit an Action frame diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 15192d1..f3960c5 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -485,8 +485,13 @@ static int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da, int ssi_signal) { struct wpa_supplicant *wpa_s = ctx; + unsigned int freq = 0; + + if (wpa_s->ap_iface) + freq = wpa_s->ap_iface->freq; + return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len, - 0, ssi_signal); + freq, ssi_signal); } diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h index b5b34c2..1fcb180 100644 --- a/wpa_supplicant/driver_i.h +++ b/wpa_supplicant/driver_i.h @@ -286,11 +286,13 @@ static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s, } static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s, - const u8 *data, size_t data_len, int noack) + const u8 *data, size_t data_len, int noack, + unsigned int freq) { if (wpa_s->driver->send_mlme) return wpa_s->driver->send_mlme(wpa_s->drv_priv, - data, data_len, noack, 0); + data, data_len, noack, + freq); return -1; } diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index a12ffb9..df7565f 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -2397,10 +2397,12 @@ static void wpas_stop_listen(void *ctx) } -static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf) +static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf, + unsigned int freq) { struct wpa_supplicant *wpa_s = ctx; - return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1); + return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, + freq); } -- 2.1.4