{nl,cfg,mac}80211: Implement RSSI threshold for mesh peering

Mesh peer links are established only if average rssi of the peer
candidate satisfies the threshold. This is not in 802.11s specification
but was requested by David Fulgham, an open80211s user. This is a way to avoid
marginal peer links with stations that are barely within range.

This patch adds a new mesh configuration parameter, mesh_rssi_threshold. This
feature is supported only for hardwares that report signal in dBm.

Signed-off-by: Ashok Nagarajan <ashok@cozybit.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Ashok Nagarajan
2012-02-28 17:04:08 -08:00
committed by John W. Linville
parent 5809802180
commit 5533513784
7 changed files with 39 additions and 1 deletions

View File

@@ -31,6 +31,11 @@
#define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout)
#define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks)
#define sta_meets_rssi_threshold(sta, sdata) \
(sdata->u.mesh.mshcfg.rssi_threshold == 0 ||\
(s8) -ewma_read(&sta->avg_signal) > \
sdata->u.mesh.mshcfg.rssi_threshold)
enum plink_event {
PLINK_UNDEFINED,
OPN_ACPT,
@@ -301,7 +306,8 @@ void mesh_neighbour_update(u8 *hw_addr, u32 rates,
if (mesh_peer_accepts_plinks(elems) &&
sta->plink_state == NL80211_PLINK_LISTEN &&
sdata->u.mesh.accepting_plinks &&
sdata->u.mesh.mshcfg.auto_open_plinks)
sdata->u.mesh.mshcfg.auto_open_plinks &&
sta_meets_rssi_threshold(sta, sdata))
mesh_plink_open(sta);
rcu_read_unlock();
@@ -531,6 +537,14 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
return;
}
if (ftype == WLAN_SP_MESH_PEERING_OPEN &&
!sta_meets_rssi_threshold(sta, sdata)) {
mpl_dbg("Mesh plink: %pM does not meet rssi threshold\n",
sta->sta.addr);
rcu_read_unlock();
return;
}
if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) {
mpl_dbg("Mesh plink: Action frame from non-authed peer\n");
rcu_read_unlock();