Search Linux Wireless

Re: [PATCH] {nl,cfg,mac}80211: Enable control quality monitoring for mesh

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ashok,

You'll have to resubmit, see inline.

On Thu, Feb 23, 2012 at 6:30 PM, Ashok Nagarajan <ashok@xxxxxxxxxxx> wrote:
> 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.
>
> Signed-off-by: Ashok Nagarajan <ashok@xxxxxxxxxxx>
> Signed-off-by: Javier Cardona <javier@xxxxxxxxxxx>
> ---
>  drivers/net/wireless/mac80211_hwsim.c |    1 +
>  net/mac80211/cfg.c                    |    1 +
>  net/mac80211/mesh_plink.c             |   22 +++++++++++++++++++++-
>  net/wireless/nl80211.c                |    3 ++-
>  4 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
> index 4b9e730..ca7d5a6 100644
> --- a/drivers/net/wireless/mac80211_hwsim.c
> +++ b/drivers/net/wireless/mac80211_hwsim.c
> @@ -729,6 +729,7 @@ static int mac80211_hwsim_add_interface(struct ieee80211_hw *hw,
>                    __func__, ieee80211_vif_type_p2p(vif),
>                    vif->addr);
>        hwsim_set_magic(vif);
> +       vif->driver_flags |= IEEE80211_VIF_SUPPORTS_CQM_RSSI;
>        return 0;
>  }
>
> diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
> index f7eb25a..d50258d 100644
> --- a/net/mac80211/cfg.c
> +++ b/net/mac80211/cfg.c
> @@ -1853,6 +1853,7 @@ static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
>
>        /* tell the driver upon association, unless already associated */
>        if (sdata->u.mgd.associated &&
> +           sdata->vif.type != NL80211_IFTYPE_STATION &&

The logic and the order are wrong.  This needs to be:

+        if (sdata->u.mgd.associated &&
+        if (sdata->vif.type == NL80211_IFTYPE_STATION &&
              sdata->u.mgd.associated &&

This prevents checking sdata->u.mgd.associated for vifs that are not
of managed type.

>            sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
>                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
>
> diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
> index 8806e5e..6144f35 100644
> --- a/net/mac80211/mesh_plink.c
> +++ b/net/mac80211/mesh_plink.c
> @@ -31,6 +31,17 @@
>  #define dot11MeshHoldingTimeout(s) (s->u.mesh.mshcfg.dot11MeshHoldingTimeout)
>  #define dot11MeshMaxPeerLinks(s) (s->u.mesh.mshcfg.dot11MeshMaxPeerLinks)
>
> +/*
> + * NOTE: Mesh peer links are established only if average rssi of the peer
> + * candidate satisfies the threshold. sta_meets_rssi_treshold doesn't use
> + * hysteresis as fluctuations around threshold have no adverse effects.
> + */
> +
> +#define sta_meets_rssi_threshold(sta, sdata) \
> +               (sdata->vif.bss_conf.cqm_rssi_thold == 0 || \
> +               ((s8) -ewma_read(&sta->avg_signal)) > \
> +                sdata->vif.bss_conf.cqm_rssi_thold)
> +
>  enum plink_event {
>        PLINK_UNDEFINED,
>        OPN_ACPT,
> @@ -301,7 +312,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 +543,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();
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 1998c36..6feff8c 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -5796,7 +5796,8 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
>                return -EOPNOTSUPP;
>
>        if (wdev->iftype != NL80211_IFTYPE_STATION &&
> -           wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
> +           wdev->iftype != NL80211_IFTYPE_P2P_CLIENT &&
> +           wdev->iftype != NL80211_IFTYPE_MESH_POINT)
>                return -EOPNOTSUPP;
>
>        return rdev->ops->set_cqm_rssi_config(wdev->wiphy, dev,
> --
> 1.7.0.4
>



-- 
Javier Cardona
cozybit Inc.
http://www.cozybit.com
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux