aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPradeep Kumar Chitrapu <pradeepc@codeaurora.org>2018-10-03 23:19:20 -0400
committerJohannes Berg <johannes.berg@intel.com>2018-10-12 06:46:09 -0400
commitbc847970f43281cb07c9f7d0897ee08cd1e08cf3 (patch)
treed9e0f3b2a0463ef7760e2ae574a9de686c935243
parentefb543e61cc3a2e75ffbe52f9b4cfcb850d812fd (diff)
mac80211: support FTM responder configuration/statistics
New bss param ftm_responder is used to notify the driver to enable fine timing request (FTM) responder role in AP mode. Plumb the new cfg80211 API for FTM responder statistics through to the driver API in mac80211. Signed-off-by: David Spinadel <david.spinadel@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--include/net/mac80211.h28
-rw-r--r--net/mac80211/cfg.c85
-rw-r--r--net/mac80211/driver-ops.h16
-rw-r--r--net/mac80211/trace.h23
-rw-r--r--net/mac80211/util.c5
5 files changed, 157 insertions, 0 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index c4fadbafbf21..2ccd4d1bef89 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -309,6 +309,8 @@ struct ieee80211_vif_chanctx_switch {
309 * @BSS_CHANGED_KEEP_ALIVE: keep alive options (idle period or protected 309 * @BSS_CHANGED_KEEP_ALIVE: keep alive options (idle period or protected
310 * keep alive) changed. 310 * keep alive) changed.
311 * @BSS_CHANGED_MCAST_RATE: Multicast Rate setting changed for this interface 311 * @BSS_CHANGED_MCAST_RATE: Multicast Rate setting changed for this interface
312 * @BSS_CHANGED_FTM_RESPONDER: fime timing reasurement request responder
313 * functionality changed for this BSS (AP mode).
312 * 314 *
313 */ 315 */
314enum ieee80211_bss_change { 316enum ieee80211_bss_change {
@@ -338,6 +340,7 @@ enum ieee80211_bss_change {
338 BSS_CHANGED_MU_GROUPS = 1<<23, 340 BSS_CHANGED_MU_GROUPS = 1<<23,
339 BSS_CHANGED_KEEP_ALIVE = 1<<24, 341 BSS_CHANGED_KEEP_ALIVE = 1<<24,
340 BSS_CHANGED_MCAST_RATE = 1<<25, 342 BSS_CHANGED_MCAST_RATE = 1<<25,
343 BSS_CHANGED_FTM_RESPONDER = 1<<26,
341 344
342 /* when adding here, make sure to change ieee80211_reconfig */ 345 /* when adding here, make sure to change ieee80211_reconfig */
343}; 346};
@@ -464,6 +467,21 @@ struct ieee80211_mu_group_data {
464}; 467};
465 468
466/** 469/**
470 * ieee80211_ftm_responder_params - FTM responder parameters
471 *
472 * @lci: LCI subelement content
473 * @civicloc: CIVIC location subelement content
474 * @lci_len: LCI data length
475 * @civicloc_len: Civic data length
476 */
477struct ieee80211_ftm_responder_params {
478 const u8 *lci;
479 const u8 *civicloc;
480 size_t lci_len;
481 size_t civicloc_len;
482};
483
484/**
467 * struct ieee80211_bss_conf - holds the BSS's changing parameters 485 * struct ieee80211_bss_conf - holds the BSS's changing parameters
468 * 486 *
469 * This structure keeps information about a BSS (and an association 487 * This structure keeps information about a BSS (and an association
@@ -562,6 +580,9 @@ struct ieee80211_mu_group_data {
562 * @protected_keep_alive: if set, indicates that the station should send an RSN 580 * @protected_keep_alive: if set, indicates that the station should send an RSN
563 * protected frame to the AP to reset the idle timer at the AP for the 581 * protected frame to the AP to reset the idle timer at the AP for the
564 * station. 582 * station.
583 * @ftm_responder: whether to enable or disable fine timing measurement FTM
584 * responder functionality.
585 * @ftmr_params: configurable lci/civic parameter when enabling FTM responder.
565 */ 586 */
566struct ieee80211_bss_conf { 587struct ieee80211_bss_conf {
567 const u8 *bssid; 588 const u8 *bssid;
@@ -612,6 +633,8 @@ struct ieee80211_bss_conf {
612 bool allow_p2p_go_ps; 633 bool allow_p2p_go_ps;
613 u16 max_idle_period; 634 u16 max_idle_period;
614 bool protected_keep_alive; 635 bool protected_keep_alive;
636 bool ftm_responder;
637 struct ieee80211_ftm_responder_params *ftmr_params;
615}; 638};
616 639
617/** 640/**
@@ -3598,6 +3621,8 @@ enum ieee80211_reconfig_type {
3598 * aggregating two specific frames in the same A-MSDU. The relation 3621 * aggregating two specific frames in the same A-MSDU. The relation
3599 * between the skbs should be symmetric and transitive. Note that while 3622 * between the skbs should be symmetric and transitive. Note that while
3600 * skb is always a real frame, head may or may not be an A-MSDU. 3623 * skb is always a real frame, head may or may not be an A-MSDU.
3624 * @get_ftm_responder_stats: Retrieve FTM responder statistics, if available.
3625 * Statistics should be cumulative, currently no way to reset is provided.
3601 */ 3626 */
3602struct ieee80211_ops { 3627struct ieee80211_ops {
3603 void (*tx)(struct ieee80211_hw *hw, 3628 void (*tx)(struct ieee80211_hw *hw,
@@ -3883,6 +3908,9 @@ struct ieee80211_ops {
3883 bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *hw, 3908 bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *hw,
3884 struct sk_buff *head, 3909 struct sk_buff *head,
3885 struct sk_buff *skb); 3910 struct sk_buff *skb);
3911 int (*get_ftm_responder_stats)(struct ieee80211_hw *hw,
3912 struct ieee80211_vif *vif,
3913 struct cfg80211_ftm_responder_stats *ftm_stats);
3886}; 3914};
3887 3915
3888/** 3916/**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 914aef7e7afd..51622333d460 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -790,6 +790,48 @@ static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
790 return 0; 790 return 0;
791} 791}
792 792
793static int ieee80211_set_ftm_responder_params(
794 struct ieee80211_sub_if_data *sdata,
795 const u8 *lci, size_t lci_len,
796 const u8 *civicloc, size_t civicloc_len)
797{
798 struct ieee80211_ftm_responder_params *new, *old;
799 struct ieee80211_bss_conf *bss_conf;
800 u8 *pos;
801 int len;
802
803 if ((!lci || !lci_len) && (!civicloc || !civicloc_len))
804 return 1;
805
806 bss_conf = &sdata->vif.bss_conf;
807 old = bss_conf->ftmr_params;
808 len = lci_len + civicloc_len;
809
810 new = kzalloc(sizeof(*new) + len, GFP_KERNEL);
811 if (!new)
812 return -ENOMEM;
813
814 pos = (u8 *)(new + 1);
815 if (lci_len) {
816 new->lci_len = lci_len;
817 new->lci = pos;
818 memcpy(pos, lci, lci_len);
819 pos += lci_len;
820 }
821
822 if (civicloc_len) {
823 new->civicloc_len = civicloc_len;
824 new->civicloc = pos;
825 memcpy(pos, civicloc, civicloc_len);
826 pos += civicloc_len;
827 }
828
829 bss_conf->ftmr_params = new;
830 kfree(old);
831
832 return 0;
833}
834
793static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, 835static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
794 struct cfg80211_beacon_data *params, 836 struct cfg80211_beacon_data *params,
795 const struct ieee80211_csa_settings *csa) 837 const struct ieee80211_csa_settings *csa)
@@ -863,6 +905,20 @@ static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
863 if (err == 0) 905 if (err == 0)
864 changed |= BSS_CHANGED_AP_PROBE_RESP; 906 changed |= BSS_CHANGED_AP_PROBE_RESP;
865 907
908 if (params->ftm_responder != -1) {
909 sdata->vif.bss_conf.ftm_responder = params->ftm_responder;
910 err = ieee80211_set_ftm_responder_params(sdata,
911 params->lci,
912 params->lci_len,
913 params->civicloc,
914 params->civicloc_len);
915
916 if (err < 0)
917 return err;
918
919 changed |= BSS_CHANGED_FTM_RESPONDER;
920 }
921
866 rcu_assign_pointer(sdata->u.ap.beacon, new); 922 rcu_assign_pointer(sdata->u.ap.beacon, new);
867 923
868 if (old) 924 if (old)
@@ -1063,6 +1119,9 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
1063 kfree_rcu(old_probe_resp, rcu_head); 1119 kfree_rcu(old_probe_resp, rcu_head);
1064 sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; 1120 sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
1065 1121
1122 kfree(sdata->vif.bss_conf.ftmr_params);
1123 sdata->vif.bss_conf.ftmr_params = NULL;
1124
1066 __sta_info_flush(sdata, true); 1125 __sta_info_flush(sdata, true);
1067 ieee80211_free_keys(sdata, true); 1126 ieee80211_free_keys(sdata, true);
1068 1127
@@ -2875,6 +2934,20 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
2875 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); 2934 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
2876 pos += beacon->probe_resp_len; 2935 pos += beacon->probe_resp_len;
2877 } 2936 }
2937 if (beacon->ftm_responder)
2938 new_beacon->ftm_responder = beacon->ftm_responder;
2939 if (beacon->lci) {
2940 new_beacon->lci_len = beacon->lci_len;
2941 new_beacon->lci = pos;
2942 memcpy(pos, beacon->lci, beacon->lci_len);
2943 pos += beacon->lci_len;
2944 }
2945 if (beacon->civicloc) {
2946 new_beacon->civicloc_len = beacon->civicloc_len;
2947 new_beacon->civicloc = pos;
2948 memcpy(pos, beacon->civicloc, beacon->civicloc_len);
2949 pos += beacon->civicloc_len;
2950 }
2878 2951
2879 return new_beacon; 2952 return new_beacon;
2880} 2953}
@@ -3765,6 +3838,17 @@ out:
3765 return ret; 3838 return ret;
3766} 3839}
3767 3840
3841static int
3842ieee80211_get_ftm_responder_stats(struct wiphy *wiphy,
3843 struct net_device *dev,
3844 struct cfg80211_ftm_responder_stats *ftm_stats)
3845{
3846 struct ieee80211_local *local = wiphy_priv(wiphy);
3847 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3848
3849 return drv_get_ftm_responder_stats(local, sdata, ftm_stats);
3850}
3851
3768const struct cfg80211_ops mac80211_config_ops = { 3852const struct cfg80211_ops mac80211_config_ops = {
3769 .add_virtual_intf = ieee80211_add_iface, 3853 .add_virtual_intf = ieee80211_add_iface,
3770 .del_virtual_intf = ieee80211_del_iface, 3854 .del_virtual_intf = ieee80211_del_iface,
@@ -3859,4 +3943,5 @@ const struct cfg80211_ops mac80211_config_ops = {
3859 .set_multicast_to_unicast = ieee80211_set_multicast_to_unicast, 3943 .set_multicast_to_unicast = ieee80211_set_multicast_to_unicast,
3860 .tx_control_port = ieee80211_tx_control_port, 3944 .tx_control_port = ieee80211_tx_control_port,
3861 .get_txq_stats = ieee80211_get_txq_stats, 3945 .get_txq_stats = ieee80211_get_txq_stats,
3946 .get_ftm_responder_stats = ieee80211_get_ftm_responder_stats,
3862}; 3947};
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index e42c641b6190..0b1747a2313d 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -1183,6 +1183,22 @@ static inline int drv_can_aggregate_in_amsdu(struct ieee80211_local *local,
1183 return local->ops->can_aggregate_in_amsdu(&local->hw, head, skb); 1183 return local->ops->can_aggregate_in_amsdu(&local->hw, head, skb);
1184} 1184}
1185 1185
1186static inline int
1187drv_get_ftm_responder_stats(struct ieee80211_local *local,
1188 struct ieee80211_sub_if_data *sdata,
1189 struct cfg80211_ftm_responder_stats *ftm_stats)
1190{
1191 u32 ret = -EOPNOTSUPP;
1192
1193 if (local->ops->get_ftm_responder_stats)
1194 ret = local->ops->get_ftm_responder_stats(&local->hw,
1195 &sdata->vif,
1196 ftm_stats);
1197 trace_drv_get_ftm_responder_stats(local, sdata, ftm_stats);
1198
1199 return ret;
1200}
1201
1186static inline int drv_start_nan(struct ieee80211_local *local, 1202static inline int drv_start_nan(struct ieee80211_local *local,
1187 struct ieee80211_sub_if_data *sdata, 1203 struct ieee80211_sub_if_data *sdata,
1188 struct cfg80211_nan_conf *conf) 1204 struct cfg80211_nan_conf *conf)
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 0ab69a1964f8..588c51a67c89 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -2600,6 +2600,29 @@ TRACE_EVENT(drv_wake_tx_queue,
2600 ) 2600 )
2601); 2601);
2602 2602
2603TRACE_EVENT(drv_get_ftm_responder_stats,
2604 TP_PROTO(struct ieee80211_local *local,
2605 struct ieee80211_sub_if_data *sdata,
2606 struct cfg80211_ftm_responder_stats *ftm_stats),
2607
2608 TP_ARGS(local, sdata, ftm_stats),
2609
2610 TP_STRUCT__entry(
2611 LOCAL_ENTRY
2612 VIF_ENTRY
2613 ),
2614
2615 TP_fast_assign(
2616 LOCAL_ASSIGN;
2617 VIF_ASSIGN;
2618 ),
2619
2620 TP_printk(
2621 LOCAL_PR_FMT VIF_PR_FMT,
2622 LOCAL_PR_ARG, VIF_PR_ARG
2623 )
2624);
2625
2603#endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ 2626#endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
2604 2627
2605#undef TRACE_INCLUDE_PATH 2628#undef TRACE_INCLUDE_PATH
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index ef5d1f60a63b..bec424316ea4 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2178,6 +2178,11 @@ int ieee80211_reconfig(struct ieee80211_local *local)
2178 case NL80211_IFTYPE_AP: 2178 case NL80211_IFTYPE_AP:
2179 changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS; 2179 changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS;
2180 2180
2181 if (sdata->vif.bss_conf.ftm_responder == 1 &&
2182 wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2183 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
2184 changed |= BSS_CHANGED_FTM_RESPONDER;
2185
2181 if (sdata->vif.type == NL80211_IFTYPE_AP) { 2186 if (sdata->vif.type == NL80211_IFTYPE_AP) {
2182 changed |= BSS_CHANGED_AP_PROBE_RESP; 2187 changed |= BSS_CHANGED_AP_PROBE_RESP;
2183 2188