P2P: Fix SD and DevDisc to limit maximum wait time per driver support
The driver may reject offchannel TX operation if the requested wait time is longer than what the driver indicates as the maximum remain-on-channel time. Two of the P2P action frame cases used long enough wait times (1000 ms for DevDisc and 5000 ms for SD) that could go beyond the limit with some drivers. Fix these to limit the maximum wait to what the driver indicates as supported. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
2e9f8ee723
commit
a0ab408d3b
2 changed files with 10 additions and 2 deletions
|
@ -68,6 +68,7 @@ int p2p_send_dev_disc_req(struct p2p_data *p2p, struct p2p_device *dev)
|
||||||
{
|
{
|
||||||
struct p2p_device *go;
|
struct p2p_device *go;
|
||||||
struct wpabuf *req;
|
struct wpabuf *req;
|
||||||
|
unsigned int wait_time;
|
||||||
|
|
||||||
go = p2p_get_device(p2p, dev->member_in_go_dev);
|
go = p2p_get_device(p2p, dev->member_in_go_dev);
|
||||||
if (go == NULL || dev->oper_freq <= 0) {
|
if (go == NULL || dev->oper_freq <= 0) {
|
||||||
|
@ -88,9 +89,12 @@ int p2p_send_dev_disc_req(struct p2p_data *p2p, struct p2p_device *dev)
|
||||||
os_memcpy(p2p->pending_client_disc_addr, dev->info.p2p_device_addr,
|
os_memcpy(p2p->pending_client_disc_addr, dev->info.p2p_device_addr,
|
||||||
ETH_ALEN);
|
ETH_ALEN);
|
||||||
p2p->pending_action_state = P2P_PENDING_DEV_DISC_REQUEST;
|
p2p->pending_action_state = P2P_PENDING_DEV_DISC_REQUEST;
|
||||||
|
wait_time = 1000;
|
||||||
|
if (p2p->cfg->max_listen && wait_time > p2p->cfg->max_listen)
|
||||||
|
wait_time = p2p->cfg->max_listen;
|
||||||
if (p2p_send_action(p2p, dev->oper_freq, go->info.p2p_device_addr,
|
if (p2p_send_action(p2p, dev->oper_freq, go->info.p2p_device_addr,
|
||||||
p2p->cfg->dev_addr, go->info.p2p_device_addr,
|
p2p->cfg->dev_addr, go->info.p2p_device_addr,
|
||||||
wpabuf_head(req), wpabuf_len(req), 1000) < 0) {
|
wpabuf_head(req), wpabuf_len(req), wait_time) < 0) {
|
||||||
p2p_dbg(p2p, "Failed to send Action frame");
|
p2p_dbg(p2p, "Failed to send Action frame");
|
||||||
wpabuf_free(req);
|
wpabuf_free(req);
|
||||||
/* TODO: how to recover from failure? */
|
/* TODO: how to recover from failure? */
|
||||||
|
|
|
@ -266,6 +266,7 @@ int p2p_start_sd(struct p2p_data *p2p, struct p2p_device *dev)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct p2p_sd_query *query;
|
struct p2p_sd_query *query;
|
||||||
int freq;
|
int freq;
|
||||||
|
unsigned int wait_time;
|
||||||
|
|
||||||
freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
|
freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
|
||||||
if (freq <= 0) {
|
if (freq <= 0) {
|
||||||
|
@ -290,9 +291,12 @@ int p2p_start_sd(struct p2p_data *p2p, struct p2p_device *dev)
|
||||||
p2p->sd_query = query;
|
p2p->sd_query = query;
|
||||||
p2p->pending_action_state = P2P_PENDING_SD;
|
p2p->pending_action_state = P2P_PENDING_SD;
|
||||||
|
|
||||||
|
wait_time = 5000;
|
||||||
|
if (p2p->cfg->max_listen && wait_time > p2p->cfg->max_listen)
|
||||||
|
wait_time = p2p->cfg->max_listen;
|
||||||
if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr,
|
if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr,
|
||||||
p2p->cfg->dev_addr, dev->info.p2p_device_addr,
|
p2p->cfg->dev_addr, dev->info.p2p_device_addr,
|
||||||
wpabuf_head(req), wpabuf_len(req), 5000) < 0) {
|
wpabuf_head(req), wpabuf_len(req), wait_time) < 0) {
|
||||||
p2p_dbg(p2p, "Failed to send Action frame");
|
p2p_dbg(p2p, "Failed to send Action frame");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue