diff options
-rw-r--r-- | drivers/net/wireless/ti/wlcore/event.c | 5 | ||||
-rw-r--r-- | include/net/cfg80211.h | 9 | ||||
-rw-r--r-- | include/net/mac80211.h | 8 | ||||
-rw-r--r-- | include/uapi/linux/nl80211.h | 7 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 14 | ||||
-rw-r--r-- | net/mac80211/trace.h | 6 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 23 |
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 | } |
268 | EXPORT_SYMBOL_GPL(wlcore_event_beacon_loss); | 265 | EXPORT_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 | */ | ||
4679 | void 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 | */ | ||
4680 | void 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 | */ |
3482 | enum nl80211_cqm_rssi_threshold_event { | 3483 | enum 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 | } |
4903 | EXPORT_SYMBOL(ieee80211_cqm_rssi_notify); | 4901 | EXPORT_SYMBOL(ieee80211_cqm_rssi_notify); |
4902 | |||
4903 | void 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 | } | ||
4911 | EXPORT_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 | ||
1832 | DEFINE_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 | |||
1832 | TRACE_EVENT(api_scan_completed, | 1838 | TRACE_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 | } |
11893 | EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); | 11897 | EXPORT_SYMBOL(cfg80211_cqm_pktloss_notify); |
11894 | 11898 | ||
11899 | void 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 | } | ||
11916 | EXPORT_SYMBOL(cfg80211_cqm_beacon_loss_notify); | ||
11917 | |||
11895 | static void nl80211_gtk_rekey_notify(struct cfg80211_registered_device *rdev, | 11918 | static 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) |