lkml.org 
[lkml]   [2018]   [Feb]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 33/86] mac80211: fix the update of path metric for RANN frame
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chun-Yeow Yeoh <yeohchunyeow@gmail.com>


    [ 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 <yeohchunyeow@gmail.com>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/mac80211/mesh_hwmp.c | 15 +++++++++------
    1 file changed, 9 insertions(+), 6 deletions(-)

    --- a/net/mac80211/mesh_hwmp.c
    +++ b/net/mac80211/mesh_hwmp.c
    @@ -788,7 +788,7 @@ static void hwmp_rann_frame_process(stru
    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;
    @@ -799,7 +799,7 @@ static void hwmp_rann_frame_process(stru
    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))
    @@ -816,7 +816,10 @@ static void hwmp_rann_frame_process(stru
    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) {
    @@ -829,7 +832,7 @@ static void hwmp_rann_frame_process(stru
    }

    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;
    }
    @@ -847,7 +850,7 @@ static void hwmp_rann_frame_process(stru
    }

    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 */
    @@ -867,7 +870,7 @@ static void hwmp_rann_frame_process(stru
    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();

    \
     
     \ /
      Last update: 2018-02-02 19:20    [W:4.136 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site