aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2014-11-26 06:42:02 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-11-26 14:56:42 -0500
commit98f0334263f177dd22ca7c685cde04b47cc57b05 (patch)
treeb91346fbd400ceb756d02aacb4f050398c9c7a38
parent5b97f49d653d366d8cb03cab40f8c45eb59dc70c (diff)
cfg80211: clean up beacon loss CQM event
Having it as a sub-event for RSSI thresholds is very ugly, but luckily no userspace actually uses the events yet. Move the event to its own function call internally and to its own event attribute in nl80211. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--drivers/net/wireless/ti/wlcore/event.c5
-rw-r--r--include/net/cfg80211.h9
-rw-r--r--include/net/mac80211.h8
-rw-r--r--include/uapi/linux/nl80211.h7
-rw-r--r--net/mac80211/mlme.c14
-rw-r--r--net/mac80211/trace.h6
-rw-r--r--net/wireless/nl80211.c23
7 files changed, 62 insertions, 10 deletions
diff --git a/drivers/net/wireless/ti/wlcore/event.c b/drivers/net/wireless/ti/wlcore/event.c
index 16d10281798d..5153640f4532 100644
--- a/drivers/net/wireless/ti/wlcore/event.c
+++ b/drivers/net/wireless/ti/wlcore/event.c
@@ -259,10 +259,7 @@ void wlcore_event_beacon_loss(struct wl1271 *wl, unsigned long roles_bitmap)
259 &wlvif->connection_loss_work, 259 &wlvif->connection_loss_work,
260 msecs_to_jiffies(delay)); 260 msecs_to_jiffies(delay));
261 261
262 ieee80211_cqm_rssi_notify( 262 ieee80211_cqm_beacon_loss_notify(vif, GFP_KERNEL);
263 vif,
264 NL80211_CQM_RSSI_BEACON_LOSS_EVENT,
265 GFP_KERNEL);
266 } 263 }
267} 264}
268EXPORT_SYMBOL_GPL(wlcore_event_beacon_loss); 265EXPORT_SYMBOL_GPL(wlcore_event_beacon_loss);
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 1d15f1dfdaa7..4ebb816241fa 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4670,6 +4670,15 @@ void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer,
4670 u32 num_packets, u32 rate, u32 intvl, gfp_t gfp); 4670 u32 num_packets, u32 rate, u32 intvl, gfp_t gfp);
4671 4671
4672/** 4672/**
4673 * cfg80211_cqm_beacon_loss_notify - beacon loss event
4674 * @dev: network device
4675 * @gfp: context flags
4676 *
4677 * Notify userspace about beacon loss from the connected AP.
4678 */
4679void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp);
4680
4681/**
4673 * cfg80211_radar_event - radar detection event 4682 * cfg80211_radar_event - radar detection event
4674 * @wiphy: the wiphy 4683 * @wiphy: the wiphy
4675 * @chandef: chandef for the current channel 4684 * @chandef: chandef for the current channel
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index cff3a26a9dae..66cbfe46428d 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -4672,6 +4672,14 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
4672 gfp_t gfp); 4672 gfp_t gfp);
4673 4673
4674/** 4674/**
4675 * ieee80211_cqm_beacon_loss_notify - inform CQM of beacon loss
4676 *
4677 * @vif: &struct ieee80211_vif pointer from the add_interface callback.
4678 * @gfp: context flags
4679 */
4680void ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp);
4681
4682/**
4675 * ieee80211_radar_detected - inform that a radar was detected 4683 * ieee80211_radar_detected - inform that a radar was detected
4676 * 4684 *
4677 * @hw: pointer as obtained from ieee80211_alloc_hw() 4685 * @hw: pointer as obtained from ieee80211_alloc_hw()
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index d77524510435..b37bd5a1cb82 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -3451,6 +3451,8 @@ enum nl80211_ps_state {
3451 * interval in which %NL80211_ATTR_CQM_TXE_PKTS and 3451 * interval in which %NL80211_ATTR_CQM_TXE_PKTS and
3452 * %NL80211_ATTR_CQM_TXE_RATE must be satisfied before generating an 3452 * %NL80211_ATTR_CQM_TXE_RATE must be satisfied before generating an
3453 * %NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting. 3453 * %NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting.
3454 * @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon
3455 * loss event
3454 * @__NL80211_ATTR_CQM_AFTER_LAST: internal 3456 * @__NL80211_ATTR_CQM_AFTER_LAST: internal
3455 * @NL80211_ATTR_CQM_MAX: highest key attribute 3457 * @NL80211_ATTR_CQM_MAX: highest key attribute
3456 */ 3458 */
@@ -3463,6 +3465,7 @@ enum nl80211_attr_cqm {
3463 NL80211_ATTR_CQM_TXE_RATE, 3465 NL80211_ATTR_CQM_TXE_RATE,
3464 NL80211_ATTR_CQM_TXE_PKTS, 3466 NL80211_ATTR_CQM_TXE_PKTS,
3465 NL80211_ATTR_CQM_TXE_INTVL, 3467 NL80211_ATTR_CQM_TXE_INTVL,
3468 NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
3466 3469
3467 /* keep last */ 3470 /* keep last */
3468 __NL80211_ATTR_CQM_AFTER_LAST, 3471 __NL80211_ATTR_CQM_AFTER_LAST,
@@ -3475,9 +3478,7 @@ enum nl80211_attr_cqm {
3475 * configured threshold 3478 * configured threshold
3476 * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the 3479 * @NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH: The RSSI is higher than the
3477 * configured threshold 3480 * configured threshold
3478 * @NL80211_CQM_RSSI_BEACON_LOSS_EVENT: The device experienced beacon loss. 3481 * @NL80211_CQM_RSSI_BEACON_LOSS_EVENT: (reserved, never sent)
3479 * (Note that deauth/disassoc will still follow if the AP is not
3480 * available. This event might get used as roaming event, etc.)
3481 */ 3482 */
3482enum nl80211_cqm_rssi_threshold_event { 3483enum nl80211_cqm_rssi_threshold_event {
3483 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW, 3484 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 36e39ed4dfd9..8a23a64b9a61 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -2266,9 +2266,7 @@ static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
2266 "detected beacon loss from AP (missed %d beacons) - probing\n", 2266 "detected beacon loss from AP (missed %d beacons) - probing\n",
2267 beacon_loss_count); 2267 beacon_loss_count);
2268 2268
2269 ieee80211_cqm_rssi_notify(&sdata->vif, 2269 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL);
2270 NL80211_CQM_RSSI_BEACON_LOSS_EVENT,
2271 GFP_KERNEL);
2272 } 2270 }
2273 2271
2274 /* 2272 /*
@@ -4901,3 +4899,13 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
4901 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp); 4899 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp);
4902} 4900}
4903EXPORT_SYMBOL(ieee80211_cqm_rssi_notify); 4901EXPORT_SYMBOL(ieee80211_cqm_rssi_notify);
4902
4903void ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp)
4904{
4905 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
4906
4907 trace_api_cqm_beacon_loss_notify(sdata->local, sdata);
4908
4909 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp);
4910}
4911EXPORT_SYMBOL(ieee80211_cqm_beacon_loss_notify);
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 85ccfbe863db..8e461a02c6a8 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1829,6 +1829,12 @@ TRACE_EVENT(api_cqm_rssi_notify,
1829 ) 1829 )
1830); 1830);
1831 1831
1832DEFINE_EVENT(local_sdata_evt, api_cqm_beacon_loss_notify,
1833 TP_PROTO(struct ieee80211_local *local,
1834 struct ieee80211_sub_if_data *sdata),
1835 TP_ARGS(local, sdata)
1836);
1837
1832TRACE_EVENT(api_scan_completed, 1838TRACE_EVENT(api_scan_completed,
1833 TP_PROTO(struct ieee80211_local *local, bool aborted), 1839 TP_PROTO(struct ieee80211_local *local, bool aborted),
1834 1840
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 9c4d0102d34d..e11980e74a04 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -11826,6 +11826,10 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
11826 11826
11827 trace_cfg80211_cqm_rssi_notify(dev, rssi_event); 11827 trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
11828 11828
11829 if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
11830 rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
11831 return;
11832
11829 msg = cfg80211_prepare_cqm(dev, NULL, gfp); 11833 msg = cfg80211_prepare_cqm(dev, NULL, gfp);
11830 if (!msg) 11834 if (!msg)
11831 return; 11835 return;
@@ -11892,6 +11896,25 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev,
11892} 11896}
11893EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); 11897EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify);
11894 11898
11899void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp)
11900{
11901 struct sk_buff *msg;
11902
11903 msg = cfg80211_prepare_cqm(dev, NULL, gfp);
11904 if (!msg)
11905 return;
11906
11907 if (nla_put_flag(msg, NL80211_ATTR_CQM_BEACON_LOSS_EVENT))
11908 goto nla_put_failure;
11909
11910 cfg80211_send_cqm(msg, gfp);
11911 return;
11912
11913 nla_put_failure:
11914 nlmsg_free(msg);
11915}
11916EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify);
11917
11895static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, 11918static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev,
11896 struct net_device *netdev, const u8 *bssid, 11919 struct net_device *netdev, const u8 *bssid,
11897 const u8 *replay_ctr, gfp_t gfp) 11920 const u8 *replay_ctr, gfp_t gfp)