diff options
Diffstat (limited to 'net/mac80211/mesh_hwmp.c')
| -rw-r--r-- | net/mac80211/mesh_hwmp.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index d28acb6b1f81..829e08a657d0 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include <linux/slab.h> | ||
| 10 | #include "mesh.h" | 11 | #include "mesh.h" |
| 11 | 12 | ||
| 12 | #ifdef CONFIG_MAC80211_VERBOSE_MHWMP_DEBUG | 13 | #ifdef CONFIG_MAC80211_VERBOSE_MHWMP_DEBUG |
| @@ -128,10 +129,10 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, | |||
| 128 | IEEE80211_STYPE_ACTION); | 129 | IEEE80211_STYPE_ACTION); |
| 129 | 130 | ||
| 130 | memcpy(mgmt->da, da, ETH_ALEN); | 131 | memcpy(mgmt->da, da, ETH_ALEN); |
| 131 | memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); | 132 | memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); |
| 132 | /* BSSID == SA */ | 133 | /* BSSID == SA */ |
| 133 | memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN); | 134 | memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); |
| 134 | mgmt->u.action.category = MESH_PATH_SEL_CATEGORY; | 135 | mgmt->u.action.category = WLAN_CATEGORY_MESH_PATH_SEL; |
| 135 | mgmt->u.action.u.mesh_action.action_code = MESH_PATH_SEL_ACTION; | 136 | mgmt->u.action.u.mesh_action.action_code = MESH_PATH_SEL_ACTION; |
| 136 | 137 | ||
| 137 | switch (action) { | 138 | switch (action) { |
| @@ -222,9 +223,9 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, | |||
| 222 | IEEE80211_STYPE_ACTION); | 223 | IEEE80211_STYPE_ACTION); |
| 223 | 224 | ||
| 224 | memcpy(mgmt->da, ra, ETH_ALEN); | 225 | memcpy(mgmt->da, ra, ETH_ALEN); |
| 225 | memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); | 226 | memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); |
| 226 | /* BSSID is left zeroed, wildcard value */ | 227 | /* BSSID is left zeroed, wildcard value */ |
| 227 | mgmt->u.action.category = MESH_PATH_SEL_CATEGORY; | 228 | mgmt->u.action.category = WLAN_CATEGORY_MESH_PATH_SEL; |
| 228 | mgmt->u.action.u.mesh_action.action_code = MESH_PATH_SEL_ACTION; | 229 | mgmt->u.action.u.mesh_action.action_code = MESH_PATH_SEL_ACTION; |
| 229 | ie_len = 15; | 230 | ie_len = 15; |
| 230 | pos = skb_put(skb, 2 + ie_len); | 231 | pos = skb_put(skb, 2 + ie_len); |
| @@ -335,7 +336,7 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata, | |||
| 335 | bool process = true; | 336 | bool process = true; |
| 336 | 337 | ||
| 337 | rcu_read_lock(); | 338 | rcu_read_lock(); |
| 338 | sta = sta_info_get(local, mgmt->sa); | 339 | sta = sta_info_get(sdata, mgmt->sa); |
| 339 | if (!sta) { | 340 | if (!sta) { |
| 340 | rcu_read_unlock(); | 341 | rcu_read_unlock(); |
| 341 | return 0; | 342 | return 0; |
| @@ -374,7 +375,7 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata, | |||
| 374 | new_metric = MAX_METRIC; | 375 | new_metric = MAX_METRIC; |
| 375 | exp_time = TU_TO_EXP_TIME(orig_lifetime); | 376 | exp_time = TU_TO_EXP_TIME(orig_lifetime); |
| 376 | 377 | ||
| 377 | if (memcmp(orig_addr, sdata->dev->dev_addr, ETH_ALEN) == 0) { | 378 | if (memcmp(orig_addr, sdata->vif.addr, ETH_ALEN) == 0) { |
| 378 | /* This MP is the originator, we are not interested in this | 379 | /* This MP is the originator, we are not interested in this |
| 379 | * frame, except for updating transmitter's path info. | 380 | * frame, except for updating transmitter's path info. |
| 380 | */ | 381 | */ |
| @@ -391,7 +392,7 @@ static u32 hwmp_route_info_get(struct ieee80211_sub_if_data *sdata, | |||
| 391 | if (SN_GT(mpath->sn, orig_sn) || | 392 | if (SN_GT(mpath->sn, orig_sn) || |
| 392 | (mpath->sn == orig_sn && | 393 | (mpath->sn == orig_sn && |
| 393 | action == MPATH_PREQ && | 394 | action == MPATH_PREQ && |
| 394 | new_metric > mpath->metric)) { | 395 | new_metric >= mpath->metric)) { |
| 395 | process = false; | 396 | process = false; |
| 396 | fresh_info = false; | 397 | fresh_info = false; |
| 397 | } | 398 | } |
| @@ -486,7 +487,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, | |||
| 486 | 487 | ||
| 487 | mhwmp_dbg("received PREQ from %pM\n", orig_addr); | 488 | mhwmp_dbg("received PREQ from %pM\n", orig_addr); |
| 488 | 489 | ||
| 489 | if (memcmp(target_addr, sdata->dev->dev_addr, ETH_ALEN) == 0) { | 490 | if (memcmp(target_addr, sdata->vif.addr, ETH_ALEN) == 0) { |
| 490 | mhwmp_dbg("PREQ is for us\n"); | 491 | mhwmp_dbg("PREQ is for us\n"); |
| 491 | forward = false; | 492 | forward = false; |
| 492 | reply = true; | 493 | reply = true; |
| @@ -579,7 +580,7 @@ static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata, | |||
| 579 | * replies | 580 | * replies |
| 580 | */ | 581 | */ |
| 581 | target_addr = PREP_IE_TARGET_ADDR(prep_elem); | 582 | target_addr = PREP_IE_TARGET_ADDR(prep_elem); |
| 582 | if (memcmp(target_addr, sdata->dev->dev_addr, ETH_ALEN) == 0) | 583 | if (memcmp(target_addr, sdata->vif.addr, ETH_ALEN) == 0) |
| 583 | /* destination, no forwarding required */ | 584 | /* destination, no forwarding required */ |
| 584 | return; | 585 | return; |
| 585 | 586 | ||
| @@ -611,7 +612,7 @@ static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata, | |||
| 611 | 612 | ||
| 612 | mesh_path_sel_frame_tx(MPATH_PREP, flags, orig_addr, | 613 | mesh_path_sel_frame_tx(MPATH_PREP, flags, orig_addr, |
| 613 | cpu_to_le32(orig_sn), 0, target_addr, | 614 | cpu_to_le32(orig_sn), 0, target_addr, |
| 614 | cpu_to_le32(target_sn), mpath->next_hop->sta.addr, hopcount, | 615 | cpu_to_le32(target_sn), next_hop, hopcount, |
| 615 | ttl, cpu_to_le32(lifetime), cpu_to_le32(metric), | 616 | ttl, cpu_to_le32(lifetime), cpu_to_le32(metric), |
| 616 | 0, sdata); | 617 | 0, sdata); |
| 617 | rcu_read_unlock(); | 618 | rcu_read_unlock(); |
| @@ -623,7 +624,6 @@ static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata, | |||
| 623 | fail: | 624 | fail: |
| 624 | rcu_read_unlock(); | 625 | rcu_read_unlock(); |
| 625 | sdata->u.mesh.mshstats.dropped_frames_no_route++; | 626 | sdata->u.mesh.mshstats.dropped_frames_no_route++; |
| 626 | return; | ||
| 627 | } | 627 | } |
| 628 | 628 | ||
| 629 | static void hwmp_perr_frame_process(struct ieee80211_sub_if_data *sdata, | 629 | static void hwmp_perr_frame_process(struct ieee80211_sub_if_data *sdata, |
| @@ -805,14 +805,14 @@ static void mesh_queue_preq(struct mesh_path *mpath, u8 flags) | |||
| 805 | spin_unlock(&ifmsh->mesh_preq_queue_lock); | 805 | spin_unlock(&ifmsh->mesh_preq_queue_lock); |
| 806 | 806 | ||
| 807 | if (time_after(jiffies, ifmsh->last_preq + min_preq_int_jiff(sdata))) | 807 | if (time_after(jiffies, ifmsh->last_preq + min_preq_int_jiff(sdata))) |
| 808 | ieee80211_queue_work(&sdata->local->hw, &ifmsh->work); | 808 | ieee80211_queue_work(&sdata->local->hw, &sdata->work); |
| 809 | 809 | ||
| 810 | else if (time_before(jiffies, ifmsh->last_preq)) { | 810 | else if (time_before(jiffies, ifmsh->last_preq)) { |
| 811 | /* avoid long wait if did not send preqs for a long time | 811 | /* avoid long wait if did not send preqs for a long time |
| 812 | * and jiffies wrapped around | 812 | * and jiffies wrapped around |
| 813 | */ | 813 | */ |
| 814 | ifmsh->last_preq = jiffies - min_preq_int_jiff(sdata) - 1; | 814 | ifmsh->last_preq = jiffies - min_preq_int_jiff(sdata) - 1; |
| 815 | ieee80211_queue_work(&sdata->local->hw, &ifmsh->work); | 815 | ieee80211_queue_work(&sdata->local->hw, &sdata->work); |
| 816 | } else | 816 | } else |
| 817 | mod_timer(&ifmsh->mesh_path_timer, ifmsh->last_preq + | 817 | mod_timer(&ifmsh->mesh_path_timer, ifmsh->last_preq + |
| 818 | min_preq_int_jiff(sdata)); | 818 | min_preq_int_jiff(sdata)); |
| @@ -890,7 +890,7 @@ void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata) | |||
| 890 | target_flags = MP_F_RF; | 890 | target_flags = MP_F_RF; |
| 891 | 891 | ||
| 892 | spin_unlock_bh(&mpath->state_lock); | 892 | spin_unlock_bh(&mpath->state_lock); |
| 893 | mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->dev->dev_addr, | 893 | mesh_path_sel_frame_tx(MPATH_PREQ, 0, sdata->vif.addr, |
| 894 | cpu_to_le32(ifmsh->sn), target_flags, mpath->dst, | 894 | cpu_to_le32(ifmsh->sn), target_flags, mpath->dst, |
| 895 | cpu_to_le32(mpath->sn), broadcast_addr, 0, | 895 | cpu_to_le32(mpath->sn), broadcast_addr, 0, |
| 896 | ttl, cpu_to_le32(lifetime), 0, | 896 | ttl, cpu_to_le32(lifetime), 0, |
| @@ -939,7 +939,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb, | |||
| 939 | if (time_after(jiffies, | 939 | if (time_after(jiffies, |
| 940 | mpath->exp_time - | 940 | mpath->exp_time - |
| 941 | msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && | 941 | msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && |
| 942 | !memcmp(sdata->dev->dev_addr, hdr->addr4, ETH_ALEN) && | 942 | !memcmp(sdata->vif.addr, hdr->addr4, ETH_ALEN) && |
| 943 | !(mpath->flags & MESH_PATH_RESOLVING) && | 943 | !(mpath->flags & MESH_PATH_RESOLVING) && |
| 944 | !(mpath->flags & MESH_PATH_FIXED)) { | 944 | !(mpath->flags & MESH_PATH_FIXED)) { |
| 945 | mesh_queue_preq(mpath, | 945 | mesh_queue_preq(mpath, |
| @@ -1010,7 +1010,7 @@ mesh_path_tx_root_frame(struct ieee80211_sub_if_data *sdata) | |||
| 1010 | { | 1010 | { |
| 1011 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | 1011 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; |
| 1012 | 1012 | ||
| 1013 | mesh_path_sel_frame_tx(MPATH_RANN, 0, sdata->dev->dev_addr, | 1013 | mesh_path_sel_frame_tx(MPATH_RANN, 0, sdata->vif.addr, |
| 1014 | cpu_to_le32(++ifmsh->sn), | 1014 | cpu_to_le32(++ifmsh->sn), |
| 1015 | 0, NULL, 0, broadcast_addr, | 1015 | 0, NULL, 0, broadcast_addr, |
| 1016 | 0, MESH_TTL, 0, 0, 0, sdata); | 1016 | 0, MESH_TTL, 0, 0, 0, sdata); |
