From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-bn3nam01on0092.outbound.protection.outlook.com ([104.47.33.92]:53808 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1032288AbeCAPc2 (ORCPT ); Thu, 1 Mar 2018 10:32:28 -0500 From: Sasha Levin To: "stable@vger.kernel.org" , "stable-commits@vger.kernel.org" CC: Chun-Yeow Yeoh , Johannes Berg , Sasha Levin Subject: [added to the 4.1 stable tree] mac80211: fix the update of path metric for RANN frame Date: Thu, 1 Mar 2018 15:25:24 +0000 Message-ID: <20180301152116.1486-264-alexander.levin@microsoft.com> References: <20180301152116.1486-1-alexander.levin@microsoft.com> In-Reply-To: <20180301152116.1486-1-alexander.levin@microsoft.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org List-ID: From: Chun-Yeow Yeoh This patch has been added to the 4.1 stable tree. If you have any objections, please let us know. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [ Upstream commit fbbdad5edf0bb59786a51b94a9d006bc8c2da9a2 ] 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 Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- 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 214e63b84e5c..4efc60236cdb 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c @@ -763,7 +763,7 @@ static void hwmp_rann_frame_process(struct ieee80211_su= b_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; =20 ttl =3D rann->rann_ttl; @@ -774,7 +774,7 @@ static void hwmp_rann_frame_process(struct ieee80211_su= b_if_data *sdata, interval =3D le32_to_cpu(rann->rann_interval); hopcount =3D rann->rann_hopcount; hopcount++; - metric =3D le32_to_cpu(rann->rann_metric); + orig_metric =3D le32_to_cpu(rann->rann_metric); =20 /* Ignore our own RANNs */ if (ether_addr_equal(orig_addr, sdata->vif.addr)) @@ -791,7 +791,10 @@ static void hwmp_rann_frame_process(struct ieee80211_s= ub_if_data *sdata, return; } =20 - metric_txsta =3D airtime_link_metric_get(local, sta); + last_hop_metric =3D airtime_link_metric_get(local, sta); + new_metric =3D orig_metric + last_hop_metric; + if (new_metric < orig_metric) + new_metric =3D MAX_METRIC; =20 mpath =3D mesh_path_lookup(sdata, orig_addr); if (!mpath) { @@ -804,7 +807,7 @@ static void hwmp_rann_frame_process(struct ieee80211_su= b_if_data *sdata, } =20 if (!(SN_LT(mpath->sn, orig_sn)) && - !(mpath->sn =3D=3D orig_sn && metric < mpath->rann_metric)) { + !(mpath->sn =3D=3D orig_sn && new_metric < mpath->rann_metric)) { rcu_read_unlock(); return; } @@ -822,7 +825,7 @@ static void hwmp_rann_frame_process(struct ieee80211_su= b_if_data *sdata, } =20 mpath->sn =3D orig_sn; - mpath->rann_metric =3D metric + metric_txsta; + mpath->rann_metric =3D new_metric; mpath->is_root =3D true; /* Recording RANNs sender address to send individually * addressed PREQs destined for root mesh STA */ @@ -842,7 +845,7 @@ static void hwmp_rann_frame_process(struct ieee80211_su= b_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); } =20 rcu_read_unlock(); --=20 2.14.1