summaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorAshok Nagarajan <ashok@cozybit.com>2012-02-28 20:04:08 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-05 15:23:15 -0500
commit5533513784a88049e19dd2ab380a452b61e5171e (patch)
tree8e48d0cf30f3e94475ee80479308e98908b3c0bc /net/mac80211
parent5809802180b2b638762465cbad3f51a9ac8ff0b3 (diff)
{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>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/cfg.c8
-rw-r--r--net/mac80211/debugfs_netdev.c2
-rw-r--r--net/mac80211/mesh_plink.c16
3 files changed, 25 insertions, 1 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 6a77d4c910f9..ab31cc56a2fb 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1314,6 +1314,14 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
1314 } 1314 }
1315 if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask)) 1315 if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
1316 conf->dot11MeshForwarding = nconf->dot11MeshForwarding; 1316 conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
1317 if (_chg_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) {
1318 /* our RSSI threshold implementation is supported only for
1319 * devices that report signal in dBm.
1320 */
1321 if (!(sdata->local->hw.flags & IEEE80211_HW_SIGNAL_DBM))
1322 return -ENOTSUPP;
1323 conf->rssi_threshold = nconf->rssi_threshold;
1324 }
1317 return 0; 1325 return 0;
1318} 1326}
1319 1327
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
index 510ed1dab3c7..9f484d8905fd 100644
--- a/net/mac80211/debugfs_netdev.c
+++ b/net/mac80211/debugfs_netdev.c
@@ -443,6 +443,7 @@ IEEE80211_IF_FILE(dot11MeshGateAnnouncementProtocol,
443IEEE80211_IF_FILE(dot11MeshHWMPRannInterval, 443IEEE80211_IF_FILE(dot11MeshHWMPRannInterval,
444 u.mesh.mshcfg.dot11MeshHWMPRannInterval, DEC); 444 u.mesh.mshcfg.dot11MeshHWMPRannInterval, DEC);
445IEEE80211_IF_FILE(dot11MeshForwarding, u.mesh.mshcfg.dot11MeshForwarding, DEC); 445IEEE80211_IF_FILE(dot11MeshForwarding, u.mesh.mshcfg.dot11MeshForwarding, DEC);
446IEEE80211_IF_FILE(rssi_threshold, u.mesh.mshcfg.rssi_threshold, DEC);
446#endif 447#endif
447 448
448 449
@@ -581,6 +582,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
581 MESHPARAMS_ADD(dot11MeshHWMPRootMode); 582 MESHPARAMS_ADD(dot11MeshHWMPRootMode);
582 MESHPARAMS_ADD(dot11MeshHWMPRannInterval); 583 MESHPARAMS_ADD(dot11MeshHWMPRannInterval);
583 MESHPARAMS_ADD(dot11MeshGateAnnouncementProtocol); 584 MESHPARAMS_ADD(dot11MeshGateAnnouncementProtocol);
585 MESHPARAMS_ADD(rssi_threshold);
584#undef MESHPARAMS_ADD 586#undef MESHPARAMS_ADD
585} 587}
586#endif 588#endif
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
index 8806e5ef8ffe..80ce52772538 100644
--- a/net/mac80211/mesh_plink.c
+++ b/net/mac80211/mesh_plink.c
@@ -31,6 +31,11 @@
31#define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout) 31#define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout)
32#define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks) 32#define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks)
33 33
34#define sta_meets_rssi_threshold(sta, sdata) \
35 (sdata->u.mesh.mshcfg.rssi_threshold == 0 ||\
36 (s8) -ewma_read(&sta->avg_signal) > \
37 sdata->u.mesh.mshcfg.rssi_threshold)
38
34enum plink_event { 39enum plink_event {
35 PLINK_UNDEFINED, 40 PLINK_UNDEFINED,
36 OPN_ACPT, 41 OPN_ACPT,
@@ -301,7 +306,8 @@ void mesh_neighbour_update(u8 *hw_addr, u32 rates,
301 if (mesh_peer_accepts_plinks(elems) && 306 if (mesh_peer_accepts_plinks(elems) &&
302 sta->plink_state == NL80211_PLINK_LISTEN && 307 sta->plink_state == NL80211_PLINK_LISTEN &&
303 sdata->u.mesh.accepting_plinks && 308 sdata->u.mesh.accepting_plinks &&
304 sdata->u.mesh.mshcfg.auto_open_plinks) 309 sdata->u.mesh.mshcfg.auto_open_plinks &&
310 sta_meets_rssi_threshold(sta, sdata))
305 mesh_plink_open(sta); 311 mesh_plink_open(sta);
306 312
307 rcu_read_unlock(); 313 rcu_read_unlock();
@@ -531,6 +537,14 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
531 return; 537 return;
532 } 538 }
533 539
540 if (ftype == WLAN_SP_MESH_PEERING_OPEN &&
541 !sta_meets_rssi_threshold(sta, sdata)) {
542 mpl_dbg("Mesh plink: %pM does not meet rssi threshold\n",
543 sta->sta.addr);
544 rcu_read_unlock();
545 return;
546 }
547
534 if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) { 548 if (sta && !test_sta_flag(sta, WLAN_STA_AUTH)) {
535 mpl_dbg("Mesh plink: Action frame from non-authed peer\n"); 549 mpl_dbg("Mesh plink: Action frame from non-authed peer\n");
536 rcu_read_unlock(); 550 rcu_read_unlock();