aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mesh.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/mesh.c')
-rw-r--r--net/mac80211/mesh.c21
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
659static void ieee80211_mesh_rx_mgmt_action(struct ieee80211_sub_if_data *sdata, 666static 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
726void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) 736void 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}