The previous path metric update from RANN frame has not considered
the own link metric toward the transmitting mesh STA. Fix this.
Reported-by: Michael65535
Signed-off-by: Chun-Yeow Yeoh <[email protected]>
---
net/mac80211/mesh_hwmp.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
index c1d1b86..35ad398 100644
--- a/net/mac80211/mesh_hwmp.c
+++ b/net/mac80211/mesh_hwmp.c
@@ -797,7 +797,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
struct mesh_path *mpath;
u8 ttl, flags, hopcount;
const u8 *orig_addr;
- u32 orig_sn, metric, metric_txsta, interval;
+ u32 orig_sn, new_metric, orig_metric, last_hop_metric, interval;
bool root_is_gate;
ttl = rann->rann_ttl;
@@ -808,7 +808,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
interval = le32_to_cpu(rann->rann_interval);
hopcount = rann->rann_hopcount;
hopcount++;
- metric = le32_to_cpu(rann->rann_metric);
+ orig_metric = le32_to_cpu(rann->rann_metric);
/* Ignore our own RANNs */
if (ether_addr_equal(orig_addr, sdata->vif.addr))
@@ -825,7 +825,10 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
return;
}
- metric_txsta = airtime_link_metric_get(local, sta);
+ last_hop_metric = airtime_link_metric_get(local, sta);
+ new_metric = orig_metric + last_hop_metric;
+ if (new_metric < orig_metric)
+ new_metric = MAX_METRIC;
mpath = mesh_path_lookup(sdata, orig_addr);
if (!mpath) {
@@ -838,7 +841,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
}
if (!(SN_LT(mpath->sn, orig_sn)) &&
- !(mpath->sn == orig_sn && metric < mpath->rann_metric)) {
+ !(mpath->sn == orig_sn && new_metric < mpath->rann_metric)) {
rcu_read_unlock();
return;
}
@@ -856,7 +859,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
}
mpath->sn = orig_sn;
- mpath->rann_metric = metric + metric_txsta;
+ mpath->rann_metric = new_metric;
mpath->is_root = true;
/* Recording RANNs sender address to send individually
* addressed PREQs destined for root mesh STA */
@@ -876,7 +879,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
mesh_path_sel_frame_tx(MPATH_RANN, flags, orig_addr,
orig_sn, 0, NULL, 0, broadcast_addr,
hopcount, ttl, interval,
- metric + metric_txsta, 0, sdata);
+ new_metric, 0, sdata);
}
rcu_read_unlock();
--
2.3.0
Thanks Chun-Yeow, this is a good change.
On Tue, Nov 14, 2017 at 7:20 AM, Chun-Yeow Yeoh <[email protected]> wrote:
> The previous path metric update from RANN frame has not considered
> the own link metric toward the transmitting mesh STA. Fix this.
>
> Reported-by: Michael65535
> Signed-off-by: Chun-Yeow Yeoh <[email protected]>
> ---
> net/mac80211/mesh_hwmp.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
> index c1d1b86..35ad398 100644
> --- a/net/mac80211/mesh_hwmp.c
> +++ b/net/mac80211/mesh_hwmp.c
> @@ -797,7 +797,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> struct mesh_path *mpath;
> u8 ttl, flags, hopcount;
> const u8 *orig_addr;
> - u32 orig_sn, metric, metric_txsta, interval;
> + u32 orig_sn, new_metric, orig_metric, last_hop_metric, interval;
> bool root_is_gate;
>
> ttl = rann->rann_ttl;
> @@ -808,7 +808,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> interval = le32_to_cpu(rann->rann_interval);
> hopcount = rann->rann_hopcount;
> hopcount++;
> - metric = le32_to_cpu(rann->rann_metric);
> + orig_metric = le32_to_cpu(rann->rann_metric);
>
> /* Ignore our own RANNs */
> if (ether_addr_equal(orig_addr, sdata->vif.addr))
> @@ -825,7 +825,10 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> return;
> }
>
> - metric_txsta = airtime_link_metric_get(local, sta);
> + last_hop_metric = airtime_link_metric_get(local, sta);
> + new_metric = orig_metric + last_hop_metric;
> + if (new_metric < orig_metric)
> + new_metric = MAX_METRIC;
>
> mpath = mesh_path_lookup(sdata, orig_addr);
> if (!mpath) {
> @@ -838,7 +841,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> }
>
> if (!(SN_LT(mpath->sn, orig_sn)) &&
> - !(mpath->sn == orig_sn && metric < mpath->rann_metric)) {
> + !(mpath->sn == orig_sn && new_metric < mpath->rann_metric)) {
> rcu_read_unlock();
> return;
> }
> @@ -856,7 +859,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> }
>
> mpath->sn = orig_sn;
> - mpath->rann_metric = metric + metric_txsta;
> + mpath->rann_metric = new_metric;
> mpath->is_root = true;
> /* Recording RANNs sender address to send individually
> * addressed PREQs destined for root mesh STA */
> @@ -876,7 +879,7 @@ static void hwmp_rann_frame_process(struct ieee80211_sub_if_data *sdata,
> mesh_path_sel_frame_tx(MPATH_RANN, flags, orig_addr,
> orig_sn, 0, NULL, 0, broadcast_addr,
> hopcount, ttl, interval,
> - metric + metric_txsta, 0, sdata);
> + new_metric, 0, sdata);
> }
>
> rcu_read_unlock();
> --
> 2.3.0
>
--
thomas