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 <andrei.otcheretianski@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Andrei Otcheretianski 2015-06-10 11:43:35 +03:00 committed by Jouni Malinen
parent 5d180a7739
commit 0799b3f899
5 changed files with 21 additions and 9 deletions

View file

@ -2440,7 +2440,7 @@ p2p_reply_probe(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
wpabuf_put_buf(buf, ies); wpabuf_put_buf(buf, ies);
wpabuf_free(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); wpabuf_free(buf);

View file

@ -570,12 +570,14 @@ struct p2p_config {
* send_probe_resp - Transmit a Probe Response frame * send_probe_resp - Transmit a Probe Response frame
* @ctx: Callback context from cb_ctx * @ctx: Callback context from cb_ctx
* @buf: Probe Response frame (including the header and body) * @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 * Returns: 0 on success, -1 on failure
* *
* This function is used to reply to Probe Request frames that were * 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 * 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 * sent on the same channel, unless otherwise specified, or to be
* anymore listening to Probe Request frames. * dropped if the driver is not listening to Probe Request frames
* anymore.
* *
* Alternatively, the responsibility for building the Probe Response * Alternatively, the responsibility for building the Probe Response
* frames in Listen state may be in another system component in which * 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 * Request frames must be indicated by calling p2p_probe_req_rx() even
* if this send_probe_resp() is not used. * 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 * send_action - Transmit an Action frame

View file

@ -485,8 +485,13 @@ static int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da,
int ssi_signal) int ssi_signal)
{ {
struct wpa_supplicant *wpa_s = ctx; 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, return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len,
0, ssi_signal); freq, ssi_signal);
} }

View file

@ -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, 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) if (wpa_s->driver->send_mlme)
return wpa_s->driver->send_mlme(wpa_s->drv_priv, return wpa_s->driver->send_mlme(wpa_s->drv_priv,
data, data_len, noack, 0); data, data_len, noack,
freq);
return -1; return -1;
} }

View file

@ -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; 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);
} }