diff options
Diffstat (limited to 'net/mac80211/mesh_hwmp.c')
| -rw-r--r-- | net/mac80211/mesh_hwmp.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 4f7826d7b47c..4394463a0c2e 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(); | 

