diff options
Diffstat (limited to 'net/mac80211/mesh.c')
-rw-r--r-- | net/mac80211/mesh.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index b05fa9ef866c..386dbca1eab3 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -13,9 +13,6 @@ | |||
13 | #include "ieee80211_i.h" | 13 | #include "ieee80211_i.h" |
14 | #include "mesh.h" | 14 | #include "mesh.h" |
15 | 15 | ||
16 | #define MESHCONF_CAPAB_ACCEPT_PLINKS 0x01 | ||
17 | #define MESHCONF_CAPAB_FORWARDING 0x08 | ||
18 | |||
19 | #define TMR_RUNNING_HK 0 | 16 | #define TMR_RUNNING_HK 0 |
20 | #define TMR_RUNNING_MP 1 | 17 | #define TMR_RUNNING_MP 1 |
21 | #define TMR_RUNNING_MPR 2 | 18 | #define TMR_RUNNING_MPR 2 |
@@ -251,8 +248,10 @@ mesh_add_meshconf_ie(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) | |||
251 | /* Mesh capability */ | 248 | /* Mesh capability */ |
252 | ifmsh->accepting_plinks = mesh_plink_availables(sdata); | 249 | ifmsh->accepting_plinks = mesh_plink_availables(sdata); |
253 | *pos = MESHCONF_CAPAB_FORWARDING; | 250 | *pos = MESHCONF_CAPAB_FORWARDING; |
254 | *pos++ |= ifmsh->accepting_plinks ? | 251 | *pos |= ifmsh->accepting_plinks ? |
255 | MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; | 252 | MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; |
253 | *pos++ |= ifmsh->adjusting_tbtt ? | ||
254 | MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00; | ||
256 | *pos++ = 0x00; | 255 | *pos++ = 0x00; |
257 | 256 | ||
258 | return 0; | 257 | return 0; |
@@ -573,8 +572,11 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) | |||
573 | ieee80211_configure_filter(local); | 572 | ieee80211_configure_filter(local); |
574 | 573 | ||
575 | ifmsh->mesh_cc_id = 0; /* Disabled */ | 574 | ifmsh->mesh_cc_id = 0; /* Disabled */ |
576 | ifmsh->mesh_sp_id = 0; /* Neighbor Offset */ | ||
577 | ifmsh->mesh_auth_id = 0; /* Disabled */ | 575 | ifmsh->mesh_auth_id = 0; /* Disabled */ |
576 | /* register sync ops from extensible synchronization framework */ | ||
577 | ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id); | ||
578 | ifmsh->adjusting_tbtt = false; | ||
579 | ifmsh->sync_offset_clockdrift_max = 0; | ||
578 | set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); | 580 | set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); |
579 | ieee80211_mesh_root_setup(ifmsh); | 581 | ieee80211_mesh_root_setup(ifmsh); |
580 | ieee80211_queue_work(&local->hw, &sdata->work); | 582 | ieee80211_queue_work(&local->hw, &sdata->work); |
@@ -616,6 +618,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | |||
616 | struct ieee80211_rx_status *rx_status) | 618 | struct ieee80211_rx_status *rx_status) |
617 | { | 619 | { |
618 | struct ieee80211_local *local = sdata->local; | 620 | struct ieee80211_local *local = sdata->local; |
621 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | ||
619 | struct ieee802_11_elems elems; | 622 | struct ieee802_11_elems elems; |
620 | struct ieee80211_channel *channel; | 623 | struct ieee80211_channel *channel; |
621 | u32 supp_rates = 0; | 624 | u32 supp_rates = 0; |
@@ -654,6 +657,10 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | |||
654 | supp_rates = ieee80211_sta_get_rates(local, &elems, band); | 657 | supp_rates = ieee80211_sta_get_rates(local, &elems, band); |
655 | mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems); | 658 | mesh_neighbour_update(mgmt->sa, supp_rates, sdata, &elems); |
656 | } | 659 | } |
660 | |||
661 | if (ifmsh->sync_ops) | ||
662 | ifmsh->sync_ops->rx_bcn_presp(sdata, | ||
663 | stype, mgmt, &elems, rx_status); | ||
657 | } | 664 | } |
658 | 665 | ||
659 | static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, | 666 | static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, |
@@ -721,6 +728,9 @@ void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) | |||
721 | 728 | ||
722 | if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags)) | 729 | if (test_and_clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags)) |
723 | ieee80211_mesh_rootpath(sdata); | 730 | ieee80211_mesh_rootpath(sdata); |
731 | |||
732 | if (test_and_clear_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags)) | ||
733 | mesh_sync_adjust_tbtt(sdata); | ||
724 | } | 734 | } |
725 | 735 | ||
726 | void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) | 736 | void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) |
@@ -761,4 +771,5 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) | |||
761 | (unsigned long) sdata); | 771 | (unsigned long) sdata); |
762 | INIT_LIST_HEAD(&ifmsh->preq_queue.list); | 772 | INIT_LIST_HEAD(&ifmsh->preq_queue.list); |
763 | spin_lock_init(&ifmsh->mesh_preq_queue_lock); | 773 | spin_lock_init(&ifmsh->mesh_preq_queue_lock); |
774 | spin_lock_init(&ifmsh->sync_offset_lock); | ||
764 | } | 775 | } |