Commit 1e838bf3 authored by Luis Carlos Cobo's avatar Luis Carlos Cobo Committed by David S. Miller

[PATCH] libertas: specific mesh scan for mshX interface

With this patch, scanning with mshX interface will only return mesh networks. To
differentiate them, a specific mesh IE in beacons/probe responses is used. This
IE has been introduced in firmware release 5.110.14. Note:

Even though there can be at most a single mesh per channel, this scan might
return several networks in the same channel.

If all nodes in a mesh network are associated to an AP, they won't produce
beacons/probe responses, thus the network will not be listed. This will be fixed
in future firmware releases.

Scan on ethX interface is not filtered, so it will list both mesh and non-mesh
networks.
Signed-off-by: default avatarLuis Carlos Cobo <luisca@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent ab617971
...@@ -156,6 +156,8 @@ static inline void lbs_dbg_hex(char *prompt, u8 * buf, int len) ...@@ -156,6 +156,8 @@ static inline void lbs_dbg_hex(char *prompt, u8 * buf, int len)
#define MRVDRV_MAX_BEACON_INTERVAL 1000 #define MRVDRV_MAX_BEACON_INTERVAL 1000
#define MRVDRV_BEACON_INTERVAL 100 #define MRVDRV_BEACON_INTERVAL 100
#define MARVELL_MESH_IE_LENGTH 9
/** INT status Bit Definition*/ /** INT status Bit Definition*/
#define his_cmddnldrdy 0x01 #define his_cmddnldrdy 0x01
#define his_cardevent 0x02 #define his_cardevent 0x02
......
...@@ -1099,6 +1099,12 @@ static int libertas_process_bss(struct bss_descriptor * bss, ...@@ -1099,6 +1099,12 @@ static int libertas_process_bss(struct bss_descriptor * bss,
memcpy(bss->wpa_ie, elem, bss->wpa_ie_len); memcpy(bss->wpa_ie, elem, bss->wpa_ie_len);
lbs_dbg_hex("process_bss: WPA IE", bss->wpa_ie, lbs_dbg_hex("process_bss: WPA IE", bss->wpa_ie,
elem->len); elem->len);
} else if (elem->len >= MARVELL_MESH_IE_LENGTH &&
elem->data[0] == 0x00 &&
elem->data[1] == 0x50 &&
elem->data[2] == 0x43 &&
elem->data[3] == 0x04) {
bss->mesh = 1;
} }
break; break;
...@@ -1611,6 +1617,10 @@ int libertas_get_scan(struct net_device *dev, struct iw_request_info *info, ...@@ -1611,6 +1617,10 @@ int libertas_get_scan(struct net_device *dev, struct iw_request_info *info,
break; break;
} }
/* For mesh device, list only mesh networks */
if (dev == priv->mesh_dev && !iter_bss->mesh)
continue;
/* Prune old an old scan result */ /* Prune old an old scan result */
stale_time = iter_bss->last_scanned + DEFAULT_MAX_SCAN_AGE; stale_time = iter_bss->last_scanned + DEFAULT_MAX_SCAN_AGE;
if (time_after(jiffies, stale_time)) { if (time_after(jiffies, stale_time)) {
......
...@@ -170,6 +170,8 @@ struct bss_descriptor { ...@@ -170,6 +170,8 @@ struct bss_descriptor {
u8 rsn_ie[MAX_WPA_IE_LEN]; u8 rsn_ie[MAX_WPA_IE_LEN];
size_t rsn_ie_len; size_t rsn_ie_len;
u8 mesh;
struct list_head list; struct list_head list;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment