Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next
[platform/kernel/linux-rpi.git] / net / mac80211 / mesh_sync.c
index a16b7b4..aa8d1e4 100644 (file)
@@ -43,7 +43,7 @@ struct sync_method {
 static bool mesh_peer_tbtt_adjusting(struct ieee802_11_elems *ie)
 {
        return (ie->mesh_config->meshconf_cap &
-           MESHCONF_CAPAB_TBTT_ADJUSTING) != 0;
+           IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING) != 0;
 }
 
 void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
@@ -116,43 +116,13 @@ static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
                goto no_sync;
        }
 
-       if (rx_status->flag & RX_FLAG_MACTIME_MPDU && rx_status->mactime) {
-               /*
-                * The mactime is defined as the time the first data symbol
-                * of the frame hits the PHY, and the timestamp of the beacon
-                * is defined as "the time that the data symbol containing the
-                * first bit of the timestamp is transmitted to the PHY plus
-                * the transmitting STA's delays through its local PHY from the
-                * MAC-PHY interface to its interface with the WM" (802.11
-                * 11.1.2)
-                *
-                * T_r, in 13.13.2.2.2, is just defined as "the frame reception
-                * time" but we unless we interpret that time to be the same
-                * time of the beacon timestamp, the offset calculation will be
-                * off.  Below we adjust t_r to be "the time at which the first
-                * symbol of the timestamp element in the beacon is received".
-                * This correction depends on the rate.
-                *
-                * Based on similar code in ibss.c
-                */
-               int rate;
-
-               if (rx_status->flag & RX_FLAG_HT) {
-                       /* TODO:
-                        * In principle there could be HT-beacons (Dual Beacon
-                        * HT Operation options), but for now ignore them and
-                        * just use the primary (i.e. non-HT) beacons for
-                        * synchronization.
-                        * */
-                       goto no_sync;
-               } else
-                       rate = local->hw.wiphy->bands[rx_status->band]->
-                               bitrates[rx_status->rate_idx].bitrate;
-
-               /* 24 bytes of header * 8 bits/byte *
-                * 10*(100 Kbps)/Mbps / rate (100 Kbps)*/
-               t_r = rx_status->mactime + (24 * 8 * 10 / rate);
-       }
+       if (ieee80211_have_rx_timestamp(rx_status))
+               /* time when timestamp field was received */
+               t_r = ieee80211_calculate_rx_timestamp(local, rx_status,
+                                                      24 + 12 +
+                                                      elems->total_len +
+                                                      FCS_LEN,
+                                                      24);
 
        /* Timing offset calculation (see 13.13.2.2.2) */
        t_t = le64_to_cpu(mgmt->u.beacon.timestamp);
@@ -225,58 +195,20 @@ static void mesh_sync_offset_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
                          ifmsh->sync_offset_clockdrift_max);
                set_bit(MESH_WORK_DRIFT_ADJUST,
                        &ifmsh->wrkq_flags);
+
+               ifmsh->adjusting_tbtt = true;
        } else {
                msync_dbg(sdata,
                          "TBTT : max clockdrift=%lld; too small to adjust\n",
                          (long long)ifmsh->sync_offset_clockdrift_max);
                ifmsh->sync_offset_clockdrift_max = 0;
+
+               ifmsh->adjusting_tbtt = false;
        }
        spin_unlock_bh(&ifmsh->sync_offset_lock);
 }
 
-static const u8 *mesh_get_vendor_oui(struct ieee80211_sub_if_data *sdata)
-{
-       struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-       u8 offset;
-
-       if (!ifmsh->ie || !ifmsh->ie_len)
-               return NULL;
-
-       offset = ieee80211_ie_split_vendor(ifmsh->ie,
-                                       ifmsh->ie_len, 0);
-
-       if (!offset)
-               return NULL;
-
-       return ifmsh->ie + offset + 2;
-}
-
-static void mesh_sync_vendor_rx_bcn_presp(struct ieee80211_sub_if_data *sdata,
-                                  u16 stype,
-                                  struct ieee80211_mgmt *mgmt,
-                                  struct ieee802_11_elems *elems,
-                                  struct ieee80211_rx_status *rx_status)
-{
-       const u8 *oui;
-
-       WARN_ON(sdata->u.mesh.mesh_sp_id != IEEE80211_SYNC_METHOD_VENDOR);
-       msync_dbg(sdata, "called mesh_sync_vendor_rx_bcn_presp\n");
-       oui = mesh_get_vendor_oui(sdata);
-       /*  here you would implement the vendor offset tracking for this oui */
-}
-
-static void mesh_sync_vendor_adjust_tbtt(struct ieee80211_sub_if_data *sdata)
-{
-       const u8 *oui;
-
-       WARN_ON(sdata->u.mesh.mesh_sp_id != IEEE80211_SYNC_METHOD_VENDOR);
-       msync_dbg(sdata, "called mesh_sync_vendor_adjust_tbtt\n");
-       oui = mesh_get_vendor_oui(sdata);
-       /*  here you would implement the vendor tsf adjustment for this oui */
-}
-
-/* global variable */
-static struct sync_method sync_methods[] = {
+static const struct sync_method sync_methods[] = {
        {
                .method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET,
                .ops = {
@@ -284,18 +216,11 @@ static struct sync_method sync_methods[] = {
                        .adjust_tbtt = &mesh_sync_offset_adjust_tbtt,
                }
        },
-       {
-               .method = IEEE80211_SYNC_METHOD_VENDOR,
-               .ops = {
-                       .rx_bcn_presp = &mesh_sync_vendor_rx_bcn_presp,
-                       .adjust_tbtt = &mesh_sync_vendor_adjust_tbtt,
-               }
-       },
 };
 
-struct ieee80211_mesh_sync_ops *ieee80211_mesh_sync_ops_get(u8 method)
+const struct ieee80211_mesh_sync_ops *ieee80211_mesh_sync_ops_get(u8 method)
 {
-       struct ieee80211_mesh_sync_ops *ops = NULL;
+       const struct ieee80211_mesh_sync_ops *ops = NULL;
        u8 i;
 
        for (i = 0 ; i < ARRAY_SIZE(sync_methods); ++i) {