Regression. Frames transmitted when a mesh path was wating to be resolved were being transmitted with an invalid Receiver Address. Signed-off-by: Javier Cardona <javier@xxxxxxxxxxx> --- net/mac80211/mesh.h | 2 +- net/mac80211/mesh_pathtbl.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index 2a2ed18..1827725 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h @@ -61,7 +61,7 @@ enum mesh_path_flags { * retry * @discovery_retries: number of discovery retries * @flags: mesh path flags, as specified on &enum mesh_path_flags - * @state_lock: mesh pat state lock + * @state_lock: mesh path state lock * * * The combination of dst and sdata is unique in the mesh path table. Since the diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c index ae98766..75a13ee 100644 --- a/net/mac80211/mesh_pathtbl.c +++ b/net/mac80211/mesh_pathtbl.c @@ -55,7 +55,23 @@ static DEFINE_RWLOCK(pathtbl_resize_lock); */ void mesh_path_assign_nexthop(struct mesh_path *mpath, struct sta_info *sta) { - rcu_assign_pointer(mpath->next_hop, sta); + struct sk_buff *skb, *skb_first = NULL; + struct ieee80211_hdr *hdr; + + rcu_read_lock(); + mpath->next_hop = sta; + + while ((skb = skb_dequeue(&mpath->frame_queue)) != skb_first) { + if (!skb_first) + skb_first = skb; + hdr = (struct ieee80211_hdr *) skb->data; + memcpy(hdr->addr1, sta->sta.addr, ETH_ALEN); + skb_queue_tail(&mpath->frame_queue, skb); + } + if (skb_first) + skb_queue_tail(&mpath->frame_queue, skb_first); + + rcu_read_unlock(); } -- 1.5.4.3 -- 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