summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAyala Beker <ayala.beker@intel.com>2016-09-20 10:31:19 -0400
committerJohannes Berg <johannes.berg@intel.com>2016-09-30 07:21:43 -0400
commit5953ff6d6a3e92dd4f8d9d8e8a9359d7e180ae93 (patch)
tree4937110ed803a948987fc66bcb3b1d0f88c6fade /net
parent368e5a7b4ecb71b3d347799cb9351b0dce5dec70 (diff)
mac80211: implement nan_change_conf
Implement nan_change_conf callback which allows to change current NAN configuration (master preference and dual band operation). Store the current NAN configuration in sdata, so it can be used both to provide the driver the updated configuration with changes and also it will be used in hw reconfig flows in next patches. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/cfg.c31
-rw-r--r--net/mac80211/driver-ops.h21
-rw-r--r--net/mac80211/ieee80211_i.h10
-rw-r--r--net/mac80211/trace.h31
4 files changed, 93 insertions, 0 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 9aabb0932d24..38fdb539cab3 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -186,6 +186,36 @@ static void ieee80211_stop_nan(struct wiphy *wiphy,
186 ieee80211_sdata_stop(sdata); 186 ieee80211_sdata_stop(sdata);
187} 187}
188 188
189static int ieee80211_nan_change_conf(struct wiphy *wiphy,
190 struct wireless_dev *wdev,
191 struct cfg80211_nan_conf *conf,
192 u32 changes)
193{
194 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
195 struct cfg80211_nan_conf new_conf;
196 int ret = 0;
197
198 if (sdata->vif.type != NL80211_IFTYPE_NAN)
199 return -EOPNOTSUPP;
200
201 if (!ieee80211_sdata_running(sdata))
202 return -ENETDOWN;
203
204 new_conf = sdata->u.nan.conf;
205
206 if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
207 new_conf.master_pref = conf->master_pref;
208
209 if (changes & CFG80211_NAN_CONF_CHANGED_DUAL)
210 new_conf.dual = conf->dual;
211
212 ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
213 if (!ret)
214 sdata->u.nan.conf = new_conf;
215
216 return ret;
217}
218
189static int ieee80211_set_noack_map(struct wiphy *wiphy, 219static int ieee80211_set_noack_map(struct wiphy *wiphy,
190 struct net_device *dev, 220 struct net_device *dev,
191 u16 noack_map) 221 u16 noack_map)
@@ -3500,4 +3530,5 @@ const struct cfg80211_ops mac80211_config_ops = {
3500 .del_tx_ts = ieee80211_del_tx_ts, 3530 .del_tx_ts = ieee80211_del_tx_ts,
3501 .start_nan = ieee80211_start_nan, 3531 .start_nan = ieee80211_start_nan,
3502 .stop_nan = ieee80211_stop_nan, 3532 .stop_nan = ieee80211_stop_nan,
3533 .nan_change_conf = ieee80211_nan_change_conf,
3503}; 3534};
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index e52cfb855bd9..daaa409bec6f 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -1192,4 +1192,25 @@ static inline void drv_stop_nan(struct ieee80211_local *local,
1192 trace_drv_return_void(local); 1192 trace_drv_return_void(local);
1193} 1193}
1194 1194
1195static inline int drv_nan_change_conf(struct ieee80211_local *local,
1196 struct ieee80211_sub_if_data *sdata,
1197 struct cfg80211_nan_conf *conf,
1198 u32 changes)
1199{
1200 int ret;
1201
1202 might_sleep();
1203 check_sdata_in_driver(sdata);
1204
1205 if (!local->ops->nan_change_conf)
1206 return -EOPNOTSUPP;
1207
1208 trace_drv_nan_change_conf(local, sdata, conf, changes);
1209 ret = local->ops->nan_change_conf(&local->hw, &sdata->vif, conf,
1210 changes);
1211 trace_drv_return_int(local, ret);
1212
1213 return ret;
1214}
1215
1195#endif /* __MAC80211_DRIVER_OPS */ 1216#endif /* __MAC80211_DRIVER_OPS */
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index c71c73594790..712b20b05660 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -830,6 +830,15 @@ struct ieee80211_if_mntr {
830 u8 mu_follow_addr[ETH_ALEN] __aligned(2); 830 u8 mu_follow_addr[ETH_ALEN] __aligned(2);
831}; 831};
832 832
833/**
834 * struct ieee80211_if_nan - NAN state
835 *
836 * @conf: current NAN configuration
837 */
838struct ieee80211_if_nan {
839 struct cfg80211_nan_conf conf;
840};
841
833struct ieee80211_sub_if_data { 842struct ieee80211_sub_if_data {
834 struct list_head list; 843 struct list_head list;
835 844
@@ -929,6 +938,7 @@ struct ieee80211_sub_if_data {
929 struct ieee80211_if_mesh mesh; 938 struct ieee80211_if_mesh mesh;
930 struct ieee80211_if_ocb ocb; 939 struct ieee80211_if_ocb ocb;
931 struct ieee80211_if_mntr mntr; 940 struct ieee80211_if_mntr mntr;
941 struct ieee80211_if_nan nan;
932 } u; 942 } u;
933 943
934#ifdef CONFIG_MAC80211_DEBUGFS 944#ifdef CONFIG_MAC80211_DEBUGFS
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index deefbfb9f6fb..0bafe1159d01 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1750,6 +1750,37 @@ TRACE_EVENT(drv_stop_nan,
1750 ) 1750 )
1751); 1751);
1752 1752
1753TRACE_EVENT(drv_nan_change_conf,
1754 TP_PROTO(struct ieee80211_local *local,
1755 struct ieee80211_sub_if_data *sdata,
1756 struct cfg80211_nan_conf *conf,
1757 u32 changes),
1758
1759 TP_ARGS(local, sdata, conf, changes),
1760 TP_STRUCT__entry(
1761 LOCAL_ENTRY
1762 VIF_ENTRY
1763 __field(u8, master_pref)
1764 __field(u8, dual)
1765 __field(u32, changes)
1766 ),
1767
1768 TP_fast_assign(
1769 LOCAL_ASSIGN;
1770 VIF_ASSIGN;
1771 __entry->master_pref = conf->master_pref;
1772 __entry->dual = conf->dual;
1773 __entry->changes = changes;
1774 ),
1775
1776 TP_printk(
1777 LOCAL_PR_FMT VIF_PR_FMT
1778 ", master preference: %u, dual: %d, changes: 0x%x",
1779 LOCAL_PR_ARG, VIF_PR_ARG, __entry->master_pref,
1780 __entry->dual, __entry->changes
1781 )
1782);
1783
1753/* 1784/*
1754 * Tracing for API calls that drivers call. 1785 * Tracing for API calls that drivers call.
1755 */ 1786 */