P2P: Reject multi-channel concurrent operations depending on driver

The driver wrapper can now indicate whether the driver supports
concurrent operations on multiple channels (e.g., infra STA connection
on 5 GHz channel 36 and P2P group on 2.4 GHz channel 1). If not,
P2P_CONNECT commands will be rejected if they would require
multi-channel concurrency.

The new failure codes for P2P_CONNECT:

FAIL-CHANNEL-UNAVAILABLE:
The requested/needed channel is not currently available (i.e., user has
an option of disconnecting another interface to make the channel
available).

FAIL-CHANNEL-UNSUPPORTED:
The request channel is not available for P2P.
This commit is contained in:
Jouni Malinen 2010-10-14 14:24:56 +03:00 committed by Jouni Malinen
parent 7861cb08c9
commit d054a4622c
5 changed files with 74 additions and 12 deletions

View file

@ -542,6 +542,8 @@ struct wpa_driver_capa {
#define WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE 0x00000400
/* This interface is P2P capable (P2P Device, GO, or P2P Client */
#define WPA_DRIVER_FLAGS_P2P_CAPABLE 0x00000800
/* Driver supports concurrent operations on multiple channels */
#define WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT 0x00001000
unsigned int flags;
int max_scan_ssids;

View file

@ -1255,4 +1255,12 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
*/
void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled);
/**
* p2p_supported_freq - Check whether channel is supported for P2P
* @p2p: P2P module context from p2p_init()
* @freq: Channel frequency in MHz
* Returns: 0 if channel not usable for P2P, 1 if usable for P2P
*/
int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq);
#endif /* P2P_H */

View file

@ -258,3 +258,14 @@ int p2p_channels_includes(const struct p2p_channels *channels, u8 reg_class,
}
return 0;
}
int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq)
{
u8 op_reg_class, op_channel;
if (p2p_freq_to_channel(p2p->cfg->country, freq,
&op_reg_class, &op_channel) < 0)
return 0;
return p2p_channels_includes(&p2p->cfg->channels, op_reg_class,
op_channel);
}