P2P: Consider age for the P2P scan results
cfg80211 caches the scan results according the channel number. Due to the 15 sec aging this might cause the user mode to see more than one scan result with the same BSSID, e.g. - one scan result for the P2P Device and one for the P2P GO (once it's enabled). Fix this by updating the device entry only if the new peer entry is newer than the one previously stored. Signed-off-by: Yoni Divinsky <yoni.divinsky@ti.com> Signed-off-by: Victor Goldenshtein <victorg@ti.com> Signed-off-by: Igal Chernobelsky <igalc@ti.com> Signed-hostap: Arik Nemtsov <arik@wizery.com>
This commit is contained in:
parent
d125df25e4
commit
3dfd0484fc
7 changed files with 38 additions and 14 deletions
|
@ -1321,7 +1321,8 @@ static void wpa_driver_test_scan_timeout(void *eloop_ctx, void *timeout_ctx)
|
||||||
for (i = 0; i < drv->num_scanres; i++) {
|
for (i = 0; i < drv->num_scanres; i++) {
|
||||||
struct wpa_scan_res *bss = drv->scanres[i];
|
struct wpa_scan_res *bss = drv->scanres[i];
|
||||||
if (p2p_scan_res_handler(drv->p2p, bss->bssid,
|
if (p2p_scan_res_handler(drv->p2p, bss->bssid,
|
||||||
bss->freq, bss->level,
|
bss->freq, bss->age,
|
||||||
|
bss->level,
|
||||||
(const u8 *) (bss + 1),
|
(const u8 *) (bss + 1),
|
||||||
bss->ie_len) > 0)
|
bss->ie_len) > 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -583,6 +583,7 @@ static void p2p_copy_wps_info(struct p2p_device *dev, int probe_req,
|
||||||
* P2P Device Address or P2P Interface Address)
|
* P2P Device Address or P2P Interface Address)
|
||||||
* @level: Signal level (signal strength of the received frame from the peer)
|
* @level: Signal level (signal strength of the received frame from the peer)
|
||||||
* @freq: Frequency on which the Beacon or Probe Response frame was received
|
* @freq: Frequency on which the Beacon or Probe Response frame was received
|
||||||
|
* @age_ms: Age of the information in milliseconds
|
||||||
* @ies: IEs from the Beacon or Probe Response frame
|
* @ies: IEs from the Beacon or Probe Response frame
|
||||||
* @ies_len: Length of ies buffer in octets
|
* @ies_len: Length of ies buffer in octets
|
||||||
* @scan_res: Whether this was based on scan results
|
* @scan_res: Whether this was based on scan results
|
||||||
|
@ -593,13 +594,15 @@ static void p2p_copy_wps_info(struct p2p_device *dev, int probe_req,
|
||||||
* like Provision Discovery Request that contains P2P Capability and P2P Device
|
* like Provision Discovery Request that contains P2P Capability and P2P Device
|
||||||
* Info attributes.
|
* Info attributes.
|
||||||
*/
|
*/
|
||||||
int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
|
int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
|
||||||
const u8 *ies, size_t ies_len, int scan_res)
|
unsigned int age_ms, int level, const u8 *ies,
|
||||||
|
size_t ies_len, int scan_res)
|
||||||
{
|
{
|
||||||
struct p2p_device *dev;
|
struct p2p_device *dev;
|
||||||
struct p2p_message msg;
|
struct p2p_message msg;
|
||||||
const u8 *p2p_dev_addr;
|
const u8 *p2p_dev_addr;
|
||||||
int i;
|
int i;
|
||||||
|
struct os_time time_now, time_tmp_age, entry_ts;
|
||||||
|
|
||||||
os_memset(&msg, 0, sizeof(msg));
|
os_memset(&msg, 0, sizeof(msg));
|
||||||
if (p2p_parse_ies(ies, ies_len, &msg)) {
|
if (p2p_parse_ies(ies, ies_len, &msg)) {
|
||||||
|
@ -634,7 +637,22 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
|
||||||
p2p_parse_free(&msg);
|
p2p_parse_free(&msg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
os_get_time(&dev->last_seen);
|
|
||||||
|
os_get_time(&time_now);
|
||||||
|
time_tmp_age.sec = age_ms / 1000;
|
||||||
|
time_tmp_age.usec = (age_ms % 1000) * 1000;
|
||||||
|
os_time_sub(&time_now, &time_tmp_age, &entry_ts);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update the device entry only if the new peer
|
||||||
|
* entry is newer than the one previously stored.
|
||||||
|
*/
|
||||||
|
if (dev->last_seen.usec > 0 &&
|
||||||
|
os_time_before(&entry_ts, &dev->last_seen))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
os_memcpy(&dev->last_seen, &entry_ts, sizeof(struct os_time));
|
||||||
|
|
||||||
dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY);
|
dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY);
|
||||||
|
|
||||||
if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0)
|
if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0)
|
||||||
|
@ -2723,9 +2741,10 @@ static void p2p_prov_disc_cb(struct p2p_data *p2p, int success)
|
||||||
|
|
||||||
|
|
||||||
int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
|
int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
|
||||||
int level, const u8 *ies, size_t ies_len)
|
unsigned int age, int level, const u8 *ies,
|
||||||
|
size_t ies_len)
|
||||||
{
|
{
|
||||||
p2p_add_device(p2p, bssid, freq, level, ies, ies_len, 1);
|
p2p_add_device(p2p, bssid, freq, age, level, ies, ies_len, 1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1183,6 +1183,7 @@ void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
|
||||||
* @p2p: P2P module context from p2p_init()
|
* @p2p: P2P module context from p2p_init()
|
||||||
* @bssid: BSSID of the scan result
|
* @bssid: BSSID of the scan result
|
||||||
* @freq: Frequency of the channel on which the device was found in MHz
|
* @freq: Frequency of the channel on which the device was found in MHz
|
||||||
|
* @age: Age of the scan result in milliseconds
|
||||||
* @level: Signal level (signal strength of the received Beacon/Probe Response
|
* @level: Signal level (signal strength of the received Beacon/Probe Response
|
||||||
* frame)
|
* frame)
|
||||||
* @ies: Pointer to IEs from the scan result
|
* @ies: Pointer to IEs from the scan result
|
||||||
|
@ -1204,7 +1205,8 @@ void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
|
||||||
* start of a pending operation, e.g., to start a pending GO negotiation.
|
* start of a pending operation, e.g., to start a pending GO negotiation.
|
||||||
*/
|
*/
|
||||||
int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
|
int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
|
||||||
int level, const u8 *ies, size_t ies_len);
|
unsigned int age, int level, const u8 *ies,
|
||||||
|
size_t ies_len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* p2p_scan_res_handled - Indicate end of scan results
|
* p2p_scan_res_handled - Indicate end of scan results
|
||||||
|
|
|
@ -692,8 +692,9 @@ struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p,
|
||||||
struct p2p_message *msg);
|
struct p2p_message *msg);
|
||||||
void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
|
void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
|
||||||
struct p2p_device *dev, struct p2p_message *msg);
|
struct p2p_device *dev, struct p2p_message *msg);
|
||||||
int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
|
int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
|
||||||
const u8 *ies, size_t ies_len, int scan_res);
|
unsigned int age_ms, int level, const u8 *ies,
|
||||||
|
size_t ies_len, int scan_res);
|
||||||
struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr);
|
struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr);
|
||||||
struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
|
struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
|
||||||
const u8 *addr);
|
const u8 *addr);
|
||||||
|
|
|
@ -176,8 +176,8 @@ void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa,
|
||||||
"P2P: Invitation Request from unknown peer "
|
"P2P: Invitation Request from unknown peer "
|
||||||
MACSTR, MAC2STR(sa));
|
MACSTR, MAC2STR(sa));
|
||||||
|
|
||||||
if (p2p_add_device(p2p, sa, rx_freq, 0, data + 1, len - 1, 0))
|
if (p2p_add_device(p2p, sa, rx_freq, 0, 0, data + 1, len - 1,
|
||||||
{
|
0)) {
|
||||||
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
||||||
"P2P: Invitation Request add device failed "
|
"P2P: Invitation Request add device failed "
|
||||||
MACSTR, MAC2STR(sa));
|
MACSTR, MAC2STR(sa));
|
||||||
|
|
|
@ -151,8 +151,9 @@ void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
|
||||||
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
||||||
"P2P: Provision Discovery Request from "
|
"P2P: Provision Discovery Request from "
|
||||||
"unknown peer " MACSTR, MAC2STR(sa));
|
"unknown peer " MACSTR, MAC2STR(sa));
|
||||||
if (p2p_add_device(p2p, sa, rx_freq, 0, data + 1, len - 1, 0))
|
|
||||||
{
|
if (p2p_add_device(p2p, sa, rx_freq, 0, 0, data + 1, len - 1,
|
||||||
|
0)) {
|
||||||
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
|
||||||
"P2P: Provision Discovery Request add device "
|
"P2P: Provision Discovery Request add device "
|
||||||
"failed " MACSTR, MAC2STR(sa));
|
"failed " MACSTR, MAC2STR(sa));
|
||||||
|
|
|
@ -105,7 +105,7 @@ static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
|
||||||
for (i = 0; i < scan_res->num; i++) {
|
for (i = 0; i < scan_res->num; i++) {
|
||||||
struct wpa_scan_res *bss = scan_res->res[i];
|
struct wpa_scan_res *bss = scan_res->res[i];
|
||||||
if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
|
if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
|
||||||
bss->freq, bss->level,
|
bss->freq, bss->age, bss->level,
|
||||||
(const u8 *) (bss + 1),
|
(const u8 *) (bss + 1),
|
||||||
bss->ie_len) > 0)
|
bss->ie_len) > 0)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue