• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Broadcom Dongle Host Driver (DHD), RTT
3  *
4  * Copyright (C) 1999-2019, Broadcom.
5  *
6  *      Unless you and Broadcom execute a separate written software license
7  * agreement governing use of this software, this software is licensed to you
8  * under the terms of the GNU General Public License version 2 (the "GPL"),
9  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10  * following added to such license:
11  *
12  *      As a special exception, the copyright holders of this software give you
13  * permission to link this software with independent modules, and to copy and
14  * distribute the resulting executable under terms of your choice, provided that
15  * you also meet, for each linked independent module, the terms and conditions
16  * of the license of that module.  An independent module is a module which is
17  * not derived from this software.  The special exception does not apply to any
18  * modifications of the software.
19  *
20  *      Notwithstanding the above, under no circumstances may you combine this
21  * software in any way with any other Broadcom software provided under a license
22  * other than the GPL, without Broadcom's express prior written consent.
23  *
24  *
25  * <<Broadcom-WL-IPTag/Open:>>
26  *
27  * $Id$
28  */
29 #ifndef __DHD_RTT_H__
30 #define __DHD_RTT_H__
31 
32 #include "dngl_stats.h"
33 
34 #define RTT_MAX_TARGET_CNT 50
35 #define RTT_MAX_FRAME_CNT 25
36 #define RTT_MAX_RETRY_CNT 10
37 #define DEFAULT_FTM_CNT 6
38 #define DEFAULT_RETRY_CNT 6
39 #define DEFAULT_FTM_FREQ 5180
40 #define DEFAULT_FTM_CNTR_FREQ0 5210
41 #define RTT_MAX_GEOFENCE_TARGET_CNT 8
42 
43 #define TARGET_INFO_SIZE(count) (sizeof(rtt_target_info_t) * count)
44 
45 #define TARGET_TYPE(target) (target->type)
46 
47 #define RTT_IS_ENABLED(rtt_status) (rtt_status->status == RTT_ENABLED)
48 #define RTT_IS_STOPPED(rtt_status) (rtt_status->status == RTT_STOPPED)
49 
50 #define GEOFENCE_RTT_LOCK(rtt_status) mutex_lock(&(rtt_status)->geofence_mutex)
51 #define GEOFENCE_RTT_UNLOCK(rtt_status)                                        \
52     mutex_unlock(&(rtt_status)->geofence_mutex)
53 
54 #ifndef BIT
55 #define BIT(x) (1 << (x))
56 #endif // endif
57 
58 /* DSSS, CCK and 802.11n rates in [500kbps] units */
59 #define WL_MAXRATE 108  /* in 500kbps units */
60 #define WL_RATE_1M 2    /* in 500kbps units */
61 #define WL_RATE_2M 4    /* in 500kbps units */
62 #define WL_RATE_5M5 11  /* in 500kbps units */
63 #define WL_RATE_11M 22  /* in 500kbps units */
64 #define WL_RATE_6M 12   /* in 500kbps units */
65 #define WL_RATE_9M 18   /* in 500kbps units */
66 #define WL_RATE_12M 24  /* in 500kbps units */
67 #define WL_RATE_18M 36  /* in 500kbps units */
68 #define WL_RATE_24M 48  /* in 500kbps units */
69 #define WL_RATE_36M 72  /* in 500kbps units */
70 #define WL_RATE_48M 96  /* in 500kbps units */
71 #define WL_RATE_54M 108 /* in 500kbps units */
72 #define GET_RTTSTATE(dhd) ((rtt_status_info_t *)dhd->rtt_state)
73 
74 #ifdef WL_NAN
75 /* RTT Retry Timer Interval */
76 #define DHD_RTT_RETRY_TIMER_INTERVAL_MS 3000u
77 #endif /* WL_NAN */
78 
79 #define DHD_RTT_INVALID_TARGET_INDEX -1
80 
81 enum rtt_role { RTT_INITIATOR = 0, RTT_TARGET = 1 };
82 enum rtt_status { RTT_STOPPED = 0, RTT_STARTED = 1, RTT_ENABLED = 2 };
83 typedef int64_t wifi_timestamp; /* In microseconds (us) */
84 typedef int64_t wifi_timespan;
85 typedef int32 wifi_rssi_rtt;
86 
87 typedef enum { RTT_INVALID, RTT_ONE_WAY, RTT_TWO_WAY, RTT_AUTO } rtt_type_t;
88 
89 /* RTT peer type */
90 typedef enum {
91     RTT_PEER_AP = 0x1,
92     RTT_PEER_STA = 0x2,
93     RTT_PEER_P2P_GO = 0x3,
94     RTT_PEER_P2P_CLIENT = 0x4,
95     RTT_PEER_NAN = 0x5,
96     RTT_PEER_INVALID = 0x6
97 } rtt_peer_type_t;
98 
99 /* Ranging status */
100 typedef enum rtt_reason {
101     RTT_STATUS_SUCCESS = 0,
102     RTT_STATUS_FAILURE = 1,     // general failure status
103     RTT_STATUS_FAIL_NO_RSP = 2, // target STA does not respond to request
104     RTT_STATUS_FAIL_REJECTED =
105         3, // request rejected. Applies to 2-sided RTT only
106     RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4,
107     RTT_STATUS_FAIL_TM_TIMEOUT = 5, // timing measurement times out
108     RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL =
109         6, // Target on different channel, cannot range
110     RTT_STATUS_FAIL_NO_CAPABILITY = 7, // ranging not supported
111     RTT_STATUS_ABORTED = 8,            // request aborted for unknown reason
112     RTT_STATUS_FAIL_INVALID_TS = 9,    // Invalid T1-T4 timestamp
113     RTT_STATUS_FAIL_PROTOCOL = 10,     // 11mc protocol failed
114     RTT_STATUS_FAIL_SCHEDULE = 11,     // request could not be scheduled
115     RTT_STATUS_FAIL_BUSY_TRY_LATER =
116         12, // responder cannot collaborate at time of request
117     RTT_STATUS_INVALID_REQ = 13, // bad request args
118     RTT_STATUS_NO_WIFI = 14, // WiFi not enabled Responder overrides param info
119                              // cannot range with new params
120     RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15
121 } rtt_reason_t;
122 
123 enum {
124     RTT_CAP_ONE_WAY = BIT(0),
125     /* IEEE802.11mc */
126     RTT_CAP_FTM_WAY = BIT(1)
127 };
128 
129 enum {
130     RTT_FEATURE_LCI = BIT(0),
131     RTT_FEATURE_LCR = BIT(1),
132     RTT_FEATURE_PREAMBLE = BIT(2),
133     RTT_FEATURE_BW = BIT(3)
134 };
135 
136 enum {
137     RTT_PREAMBLE_LEGACY = BIT(0),
138     RTT_PREAMBLE_HT = BIT(1),
139     RTT_PREAMBLE_VHT = BIT(2)
140 };
141 
142 enum {
143     RTT_BW_5 = BIT(0),
144     RTT_BW_10 = BIT(1),
145     RTT_BW_20 = BIT(2),
146     RTT_BW_40 = BIT(3),
147     RTT_BW_80 = BIT(4),
148     RTT_BW_160 = BIT(5)
149 };
150 
151 enum rtt_rate_bw { RTT_RATE_20M, RTT_RATE_40M, RTT_RATE_80M, RTT_RATE_160M };
152 
153 typedef enum ranging_type {
154     RTT_TYPE_INVALID = 0,
155     RTT_TYPE_LEGACY = 1,
156     RTT_TYPE_NAN_DIRECTED = 2,
157     RTT_TYPE_NAN_GEOFENCE = 3
158 } ranging_type_t;
159 
160 #define FTM_MAX_NUM_BURST_EXP 14
161 #define HAS_11MC_CAP(cap) (cap & RTT_CAP_FTM_WAY)
162 #define HAS_ONEWAY_CAP(cap) (cap & RTT_CAP_ONE_WAY)
163 #define HAS_RTT_CAP(cap) (HAS_ONEWAY_CAP(cap) || HAS_11MC_CAP(cap))
164 
165 typedef struct wifi_channel_info {
166     wifi_channel_width_t width;
167     wifi_channel center_freq;  /* primary 20 MHz channel */
168     wifi_channel center_freq0; /* center freq (MHz) first segment */
169     wifi_channel
170         center_freq1; /* center freq (MHz) second segment valid for 80 + 80 */
171 } wifi_channel_info_t;
172 
173 typedef struct wifi_rate {
174     uint32 preamble : 3; /* 0: OFDM, 1: CCK, 2 : HT, 3: VHT, 4..7 reserved */
175     uint32 nss : 2;      /* 1 : 1x1, 2: 2x2, 3: 3x3, 4: 4x4 */
176     uint32 bw : 3;       /* 0: 20Mhz, 1: 40Mhz, 2: 80Mhz, 3: 160Mhz */
177     /* OFDM/CCK rate code would be as per IEEE std in the unit of 0.5 mb
178      * HT/VHT it would be mcs index
179      */
180     uint32 rateMcsIdx : 8;
181     uint32 reserved : 16; /* reserved */
182     uint32 bitrate;       /* unit of 100 Kbps */
183 } wifi_rate_t;
184 
185 typedef struct rtt_target_info {
186     struct ether_addr addr;
187     struct ether_addr local_addr;
188     rtt_type_t type;             /* rtt_type */
189     rtt_peer_type_t peer;        /* peer type */
190     wifi_channel_info_t channel; /* channel information */
191     chanspec_t chanspec;         /* chanspec for channel */
192     bool disable;                /* disable for RTT measurement */
193     /*
194      * Time interval between bursts (units: 100 ms).
195      * Applies to 1-sided and 2-sided RTT multi-burst requests.
196      * Range: 0-31, 0: no preference by initiator (2-sided RTT)
197      */
198     uint32 burst_period;
199     /*
200      * Total number of RTT bursts to be executed. It will be
201      * specified in the same way as the parameter "Number of
202      * Burst Exponent" found in the FTM frame format. It
203      * applies to both: 1-sided RTT and 2-sided RTT. Valid
204      * values are 0 to 15 as defined in 802.11mc std.
205      * 0 means single shot
206      * The implication of this parameter on the maximum
207      * number of RTT results is the following:
208      * for 1-sided RTT: max num of RTT results =
209      * (2^num_burst)*(num_frames_per_burst) for 2-sided RTT: max num of RTT
210      * results = (2^num_burst)*(num_frames_per_burst - 1)
211      */
212     uint16 num_burst;
213     /*
214      * num of frames per burst.
215      * Minimum value = 1, Maximum value = 31
216      * For 2-sided this equals the number of FTM frames
217      * to be attempted in a single burst. This also
218      * equals the number of FTM frames that the
219      * initiator will request that the responder send
220      * in a single frame
221      */
222     uint32 num_frames_per_burst;
223     /*
224      * num of frames in each RTT burst
225      * for single side, measurement result num = frame number
226      * for 2 side RTT, measurement result num  = frame number - 1
227      */
228     uint32 num_retries_per_ftm; /* retry time for RTT measurment frame */
229     /* following fields are only valid for 2 side RTT */
230     uint32 num_retries_per_ftmr;
231     uint8 LCI_request;
232     uint8 LCR_request;
233     /*
234      * Applies to 1-sided and 2-sided RTT. Valid values will
235      * be 2-11 and 15 as specified by the 802.11mc std for
236      * the FTM parameter burst duration. In a multi-burst
237      * request, if responder overrides with larger value,
238      * the initiator will return failure. In a single-burst
239      * request if responder overrides with larger value,
240      * the initiator will sent TMR_STOP to terminate RTT
241      * at the end of the burst_duration it requested.
242      */
243     uint32 burst_duration;
244     uint32 burst_timeout;
245     uint8 preamble; /* 1 - Legacy, 2 - HT, 4 - VHT */
246     uint8 bw;       /* 5, 10, 20, 40, 80, 160 */
247 } rtt_target_info_t;
248 
249 typedef struct rtt_goefence_target_info {
250     bool valid;
251     struct ether_addr peer_addr;
252 } rtt_geofence_target_info_t;
253 
254 typedef struct rtt_config_params {
255     int8 rtt_target_cnt;
256     rtt_target_info_t *target_info;
257 } rtt_config_params_t;
258 
259 typedef struct rtt_geofence_cfg {
260     int8 geofence_target_cnt;
261     bool rtt_in_progress;
262     bool role_concurr_state;
263     int8 cur_target_idx;
264     rtt_geofence_target_info_t
265         geofence_target_info[RTT_MAX_GEOFENCE_TARGET_CNT];
266     int geofence_rtt_interval;
267 #ifdef RTT_GEOFENCE_CONT
268     bool geofence_cont;
269 #endif /* RTT_GEOFENCE_CONT */
270 } rtt_geofence_cfg_t;
271 
272 /*
273  * Keep Adding more reasons
274  * going forward if needed
275  */
276 enum rtt_schedule_reason {
277     RTT_SCHED_HOST_TRIGGER = 1,     /* On host command for directed RTT */
278     RTT_SCHED_SUB_MATCH = 2,        /* on Sub Match for svc with range req */
279     RTT_SCHED_DIR_TRIGGER_FAIL = 3, /* On failure of Directed RTT Trigger */
280     RTT_SCHED_DP_END = 4,           /* ON NDP End event from fw */
281     RTT_SCHED_DP_REJECTED = 5,      /* On receving reject dp event from fw */
282     RTT_SCHED_RNG_RPT_DIRECTED = 6, /* On Ranging report for directed RTT */
283     RTT_SCHED_RNG_TERM = 7,         /* On Range Term Indicator */
284     RTT_SHCED_HOST_DIRECTED_TERM =
285         8, /* On host terminating directed RTT sessions */
286     RTT_SCHED_RNG_RPT_GEOFENCE = 9,    /* On Ranging report for geofence RTT */
287     RTT_SCHED_RTT_RETRY_GEOFENCE = 10, /* On Geofence Retry */
288     RTT_SCHED_RNG_TERM_PEND_ROLE_CHANGE =
289         11 /* On Rng Term, while pending role change */
290 };
291 
292 /*
293  * Keep Adding more invalid RTT states
294  * going forward if needed
295  */
296 enum rtt_invalid_state {
297     RTT_STATE_VALID = 0,               /* RTT state is valid */
298     RTT_STATE_INV_REASON_NDP_EXIST = 1 /* RTT state invalid as ndp exists */
299 };
300 
301 typedef struct rtt_status_info {
302     dhd_pub_t *dhd;
303     int8 status;     /* current status for the current entry */
304     int8 txchain;    /* current device tx chain */
305     int pm;          /* to save current value of pm */
306     int8 pm_restore; /* flag to reset the old value of pm */
307     int8 cur_idx;    /* current entry to do RTT */
308     bool all_cancel; /* cancel all request once we got the cancel requet */
309     uint32 flags;    /* indicate whether device is configured as initiator or
310                         target */
311     struct capability {
312         int32 proto : 8;
313         int32 feature : 8;
314         int32 preamble : 8;
315         int32 bw : 8;
316     } rtt_capa; /* rtt capability */
317     struct mutex rtt_mutex;
318     struct mutex rtt_work_mutex;
319     struct mutex geofence_mutex;
320     rtt_config_params_t rtt_config;
321     rtt_geofence_cfg_t geofence_cfg;
322     struct work_struct work;
323     struct list_head noti_fn_list;
324     struct list_head rtt_results_cache; /* store results for RTT */
325     int rtt_sched_reason; /* rtt_schedule_reason: what scheduled RTT */
326     struct delayed_work proxd_timeout; /* Proxd Timeout work */
327     struct delayed_work
328         rtt_retry_timer; /* Timer for retry RTT after all targets done */
329 } rtt_status_info_t;
330 
331 typedef struct rtt_report {
332     struct ether_addr addr;
333     unsigned int burst_num;   /* # of burst inside a multi-burst request */
334     unsigned int ftm_num;     /* total RTT measurement frames attempted */
335     unsigned int success_num; /* total successful RTT measurement frames */
336     uint8 num_per_burst_peer; /* max number of FTM number per burst the peer
337                                  support */
338     rtt_reason_t status;      /* raging status */
339     /* in s, 11mc only, only for RTT_REASON_FAIL_BUSY_TRY_LATER, 1- 31s */
340     uint8 retry_after_duration;
341     rtt_type_t type; /* rtt type */
342     wifi_rssi_rtt
343         rssi; /* average rssi in 0.5 dB steps e.g. 143 implies -71.5 dB */
344     wifi_rssi_rtt
345         rssi_spread; /* rssi spread in 0.5 db steps e.g. 5 implies 2.5 spread */
346     /*
347      * 1-sided RTT: TX rate of RTT frame.
348      * 2-sided RTT: TX rate of initiator's Ack in response to FTM frame.
349      */
350     wifi_rate_t tx_rate;
351     /*
352      * 1-sided RTT: TX rate of Ack from other side.
353      * 2-sided RTT: TX rate of FTM frame coming from responder.
354      */
355     wifi_rate_t rx_rate;
356     wifi_timespan rtt;    /*  round trip time in 0.1 nanoseconds */
357     wifi_timespan rtt_sd; /* rtt standard deviation in 0.1 nanoseconds */
358     wifi_timespan
359         rtt_spread;      /* difference between max and min rtt times recorded */
360     int distance;        /* distance in cm (optional) */
361     int distance_sd;     /* standard deviation in cm (optional) */
362     int distance_spread; /* difference between max and min distance recorded
363                             (optional) */
364     wifi_timestamp
365         ts; /* time of the measurement (in microseconds since boot) */
366     int burst_duration; /* in ms, how long the FW time is to fininish one burst
367                            measurement */
368     int negotiated_burst_num; /* Number of bursts allowed by the responder */
369     bcm_tlv_t *LCI;           /* LCI Report */
370     bcm_tlv_t *LCR;           /* Location Civic Report */
371 } rtt_report_t;
372 #define RTT_REPORT_SIZE (sizeof(rtt_report_t))
373 
374 /* rtt_results_header to maintain rtt result list per mac address */
375 typedef struct rtt_results_header {
376     struct ether_addr peer_mac;
377     uint32 result_cnt;
378     uint32 result_tot_len; /* sum of report_len of rtt_result */
379     struct list_head list;
380     struct list_head result_list;
381 } rtt_results_header_t;
382 struct rtt_result_detail {
383     uint8 num_ota_meas;
384     uint32 result_flags;
385 };
386 /* rtt_result to link all of rtt_report */
387 typedef struct rtt_result {
388     struct list_head list;
389     struct rtt_report report;
390     int32 report_len; /* total length of rtt_report */
391     struct rtt_result_detail rtt_detail;
392     int32 detail_len;
393 } rtt_result_t;
394 
395 /* RTT Capabilities */
396 typedef struct rtt_capabilities {
397     uint8 rtt_one_sided_supported; /* if 1-sided rtt data collection is
398                                       supported */
399     uint8 rtt_ftm_supported;       /* if ftm rtt data collection is supported */
400     uint8 lci_support;             /* location configuration information */
401     uint8 lcr_support;             /* Civic Location */
402     uint8 preamble_support; /* bit mask indicate what preamble is supported */
403     uint8 bw_support;       /* bit mask indicate what BW is supported */
404 } rtt_capabilities_t;
405 
406 /* RTT responder information */
407 typedef struct wifi_rtt_responder {
408     wifi_channel_info channel; /* channel of responder */
409     uint8 preamble;            /* preamble supported by responder */
410 } wifi_rtt_responder_t;
411 
412 typedef void (*dhd_rtt_compl_noti_fn)(void *ctx, void *rtt_data);
413 /* Linux wrapper to call common dhd_rtt_set_cfg */
414 int dhd_dev_rtt_set_cfg(struct net_device *dev, void *buf);
415 
416 int dhd_dev_rtt_cancel_cfg(struct net_device *dev, struct ether_addr *mac_list,
417                            int mac_cnt);
418 
419 int dhd_dev_rtt_register_noti_callback(struct net_device *dev, void *ctx,
420                                        dhd_rtt_compl_noti_fn noti_fn);
421 
422 int dhd_dev_rtt_unregister_noti_callback(struct net_device *dev,
423                                          dhd_rtt_compl_noti_fn noti_fn);
424 
425 int dhd_dev_rtt_capability(struct net_device *dev, rtt_capabilities_t *capa);
426 
427 int dhd_dev_rtt_avail_channel(struct net_device *dev,
428                               wifi_channel_info *channel_info);
429 
430 int dhd_dev_rtt_enable_responder(struct net_device *dev,
431                                  wifi_channel_info *channel_info);
432 
433 int dhd_dev_rtt_cancel_responder(struct net_device *dev);
434 /* export to upper layer */
435 chanspec_t dhd_rtt_convert_to_chspec(wifi_channel_info_t channel);
436 
437 int dhd_rtt_idx_to_burst_duration(uint idx);
438 
439 int dhd_rtt_set_cfg(dhd_pub_t *dhd, rtt_config_params_t *params);
440 
441 #ifdef WL_NAN
442 void dhd_rtt_initialize_geofence_cfg(dhd_pub_t *dhd);
443 #ifdef RTT_GEOFENCE_CONT
444 void dhd_rtt_set_geofence_cont_ind(dhd_pub_t *dhd, bool geofence_cont);
445 
446 void dhd_rtt_get_geofence_cont_ind(dhd_pub_t *dhd, bool *geofence_cont);
447 #endif /* RTT_GEOFENCE_CONT */
448 
449 #ifdef RTT_GEOFENCE_INTERVAL
450 void dhd_rtt_set_geofence_rtt_interval(dhd_pub_t *dhd, int interval);
451 #endif /* RTT_GEOFENCE_INTERVAL */
452 
453 void dhd_rtt_set_role_concurrency_state(dhd_pub_t *dhd, bool state);
454 
455 bool dhd_rtt_get_role_concurrency_state(dhd_pub_t *dhd);
456 
457 int8 dhd_rtt_get_geofence_target_cnt(dhd_pub_t *dhd);
458 
459 void dhd_rtt_set_geofence_rtt_state(dhd_pub_t *dhd, bool state);
460 
461 bool dhd_rtt_get_geofence_rtt_state(dhd_pub_t *dhd);
462 
463 rtt_geofence_target_info_t *dhd_rtt_get_geofence_target_head(dhd_pub_t *dhd);
464 
465 rtt_geofence_target_info_t *dhd_rtt_get_geofence_current_target(dhd_pub_t *dhd);
466 
467 rtt_geofence_target_info_t *
468 dhd_rtt_get_geofence_target(dhd_pub_t *dhd, struct ether_addr *peer_addr,
469                             int8 *index);
470 
471 int dhd_rtt_add_geofence_target(dhd_pub_t *dhd,
472                                 rtt_geofence_target_info_t *target);
473 
474 int dhd_rtt_remove_geofence_target(dhd_pub_t *dhd,
475                                    struct ether_addr *peer_addr);
476 
477 int dhd_rtt_delete_geofence_target_list(dhd_pub_t *dhd);
478 
479 int dhd_rtt_delete_nan_session(dhd_pub_t *dhd);
480 #endif /* WL_NAN */
481 
482 uint8 dhd_rtt_invalid_states(struct net_device *ndev,
483                              struct ether_addr *peer_addr);
484 
485 void dhd_rtt_schedule_rtt_work_thread(dhd_pub_t *dhd, int sched_reason);
486 
487 int dhd_rtt_stop(dhd_pub_t *dhd, struct ether_addr *mac_list, int mac_cnt);
488 
489 int dhd_rtt_register_noti_callback(dhd_pub_t *dhd, void *ctx,
490                                    dhd_rtt_compl_noti_fn noti_fn);
491 
492 int dhd_rtt_unregister_noti_callback(dhd_pub_t *dhd,
493                                      dhd_rtt_compl_noti_fn noti_fn);
494 
495 int dhd_rtt_event_handler(dhd_pub_t *dhd, wl_event_msg_t *event,
496                           void *event_data);
497 
498 int dhd_rtt_capability(dhd_pub_t *dhd, rtt_capabilities_t *capa);
499 
500 int dhd_rtt_avail_channel(dhd_pub_t *dhd, wifi_channel_info *channel_info);
501 
502 int dhd_rtt_enable_responder(dhd_pub_t *dhd, wifi_channel_info *channel_info);
503 
504 int dhd_rtt_cancel_responder(dhd_pub_t *dhd);
505 
506 int dhd_rtt_init(dhd_pub_t *dhd);
507 
508 int dhd_rtt_deinit(dhd_pub_t *dhd);
509 
510 #ifdef WL_CFG80211
511 int dhd_rtt_handle_nan_rtt_session_end(dhd_pub_t *dhd, struct ether_addr *peer);
512 
513 void dhd_rtt_move_geofence_cur_target_idx_to_next(dhd_pub_t *dhd);
514 
515 int8 dhd_rtt_get_geofence_cur_target_idx(dhd_pub_t *dhd);
516 #endif /* WL_CFG80211 */
517 
518 #endif /* __DHD_RTT_H__ */
519