]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
cfg80211: Pass new RSSI level in CQM RSSI notification
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>
Wed, 25 Jan 2017 11:43:41 +0000 (12:43 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 8 Feb 2017 09:43:40 +0000 (10:43 +0100)
Update the drivers to pass the RSSI level as a cfg80211_cqm_rssi_notify
parameter and pass this value to userspace in a new nl80211 attribute.
This helps both userspace and also helps in the implementation of the
multiple RSSI thresholds CQM mechanism.

Note for marvell/mwifiex I pass 0 for the RSSI value because the new
RSSI value is not available to the driver at the time of the
cfg80211_cqm_rssi_notify call, but the driver queries the new value
immediately after that, so it is actually available just a moment later
if we wanted to defer caling cfg80211_cqm_rssi_notify until that moment.
Without this, the new cfg80211 code (patch 3) will call .get_station
which will send a duplicate HostCmd_CMD_RSSI_INFO command to the hardware.

Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/marvell/mwifiex/sta_event.c
drivers/net/wireless/rndis_wlan.c
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/mlme.c
net/wireless/nl80211.c
net/wireless/trace.h

index 9df0c4dc06ed9bc95b739f1fc11a79fe0c19a937..5cc3aa7c31cd9384b947d48073850a9bb5aec35e 100644 (file)
@@ -824,7 +824,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
        case EVENT_RSSI_LOW:
                cfg80211_cqm_rssi_notify(priv->netdev,
                                         NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
-                                        GFP_KERNEL);
+                                        0, GFP_KERNEL);
                mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
                                 HostCmd_ACT_GEN_GET, 0, NULL, false);
                priv->subsc_evt_rssi_state = RSSI_LOW_RECVD;
@@ -839,7 +839,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
        case EVENT_RSSI_HIGH:
                cfg80211_cqm_rssi_notify(priv->netdev,
                                         NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
-                                        GFP_KERNEL);
+                                        0, GFP_KERNEL);
                mwifiex_send_cmd(priv, HostCmd_CMD_RSSI_INFO,
                                 HostCmd_ACT_GEN_GET, 0, NULL, false);
                priv->subsc_evt_rssi_state = RSSI_HIGH_RECVD;
index 603c90470225d92a11a1e8e3b691bfecaf9058e9..785334f7a5386e82c32cd6fe41dee6d36b37b969 100644 (file)
@@ -3187,7 +3187,7 @@ static void rndis_do_cqm(struct usbnet *usbdev, s32 rssi)
                return;
 
        priv->last_cqm_event_rssi = rssi;
-       cfg80211_cqm_rssi_notify(usbdev->net, event, GFP_KERNEL);
+       cfg80211_cqm_rssi_notify(usbdev->net, event, rssi, GFP_KERNEL);
 }
 
 #define DEVICE_POLLER_JIFFIES (HZ)
index 5cfd2806a0786f8a9da86407daf1dbc94080e445..a2c18b53e05356d6b322aed8bb3566128a9f930e 100644 (file)
@@ -5390,6 +5390,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
  * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
  * @dev: network device
  * @rssi_event: the triggered RSSI event
+ * @rssi_level: new RSSI level value or 0 if not available
  * @gfp: context flags
  *
  * This function is called when a configured connection quality monitoring
@@ -5397,7 +5398,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
  */
 void cfg80211_cqm_rssi_notify(struct net_device *dev,
                              enum nl80211_cqm_rssi_threshold_event rssi_event,
-                             gfp_t gfp);
+                             s32 rssi_level, gfp_t gfp);
 
 /**
  * cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer
index d6c62ee9bd1dcd89fba555382b23398ab6d6a00e..cd547b864595aeadd68d097865d2067536874bcd 100644 (file)
@@ -3952,6 +3952,8 @@ enum nl80211_ps_state {
  *     %NL80211_CMD_NOTIFY_CQM. Set to 0 to turn off TX error reporting.
  * @NL80211_ATTR_CQM_BEACON_LOSS_EVENT: flag attribute that's set in a beacon
  *     loss event
+ * @NL80211_ATTR_CQM_RSSI_LEVEL: the RSSI value in dBm that triggered the
+ *     RSSI threshold event.
  * @__NL80211_ATTR_CQM_AFTER_LAST: internal
  * @NL80211_ATTR_CQM_MAX: highest key attribute
  */
@@ -3965,6 +3967,7 @@ enum nl80211_attr_cqm {
        NL80211_ATTR_CQM_TXE_PKTS,
        NL80211_ATTR_CQM_TXE_INTVL,
        NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
+       NL80211_ATTR_CQM_RSSI_LEVEL,
 
        /* keep last */
        __NL80211_ATTR_CQM_AFTER_LAST,
index ee423688c92e1b41b89f510640db5a12e5c44139..6e90301154d5a6ba4a7e9bb612ac8243cf09a23c 100644 (file)
@@ -5048,7 +5048,7 @@ void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
 
        trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level);
 
-       cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp);
+       cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp);
 }
 EXPORT_SYMBOL(ieee80211_cqm_rssi_notify);
 
index b455898df63c5d8b53913ab0c19ff45b337b349b..9d738f75bd4e7830a516cb3cc35e2190402d6617 100644 (file)
@@ -9474,6 +9474,7 @@ nl80211_attr_cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
        [NL80211_ATTR_CQM_TXE_RATE] = { .type = NLA_U32 },
        [NL80211_ATTR_CQM_TXE_PKTS] = { .type = NLA_U32 },
        [NL80211_ATTR_CQM_TXE_INTVL] = { .type = NLA_U32 },
+       [NL80211_ATTR_CQM_RSSI_LEVEL] = { .type = NLA_S32 },
 };
 
 static int nl80211_set_cqm_txe(struct genl_info *info,
@@ -13959,11 +13960,11 @@ static void cfg80211_send_cqm(struct sk_buff *msg, gfp_t gfp)
 
 void cfg80211_cqm_rssi_notify(struct net_device *dev,
                              enum nl80211_cqm_rssi_threshold_event rssi_event,
-                             gfp_t gfp)
+                             s32 rssi_level, gfp_t gfp)
 {
        struct sk_buff *msg;
 
-       trace_cfg80211_cqm_rssi_notify(dev, rssi_event);
+       trace_cfg80211_cqm_rssi_notify(dev, rssi_event, rssi_level);
 
        if (WARN_ON(rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW &&
                    rssi_event != NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH))
@@ -13977,6 +13978,10 @@ void cfg80211_cqm_rssi_notify(struct net_device *dev,
                        rssi_event))
                goto nla_put_failure;
 
+       if (rssi_level && nla_put_s32(msg, NL80211_ATTR_CQM_RSSI_LEVEL,
+                                     rssi_level))
+               goto nla_put_failure;
+
        cfg80211_send_cqm(msg, gfp);
 
        return;
index ea1b47e04fa474b601bd34a77d1e6cc05cf0e176..2419c390f150bf146fd836f7eb68dcace9dd4ca8 100644 (file)
@@ -2490,18 +2490,21 @@ TRACE_EVENT(cfg80211_mgmt_tx_status,
 
 TRACE_EVENT(cfg80211_cqm_rssi_notify,
        TP_PROTO(struct net_device *netdev,
-                enum nl80211_cqm_rssi_threshold_event rssi_event),
-       TP_ARGS(netdev, rssi_event),
+                enum nl80211_cqm_rssi_threshold_event rssi_event,
+                s32 rssi_level),
+       TP_ARGS(netdev, rssi_event, rssi_level),
        TP_STRUCT__entry(
                NETDEV_ENTRY
                __field(enum nl80211_cqm_rssi_threshold_event, rssi_event)
+               __field(s32, rssi_level)
        ),
        TP_fast_assign(
                NETDEV_ASSIGN;
                __entry->rssi_event = rssi_event;
+               __entry->rssi_level = rssi_level;
        ),
-       TP_printk(NETDEV_PR_FMT ", rssi event: %d",
-                 NETDEV_PR_ARG, __entry->rssi_event)
+       TP_printk(NETDEV_PR_FMT ", rssi event: %d, level: %d",
+                 NETDEV_PR_ARG, __entry->rssi_event, __entry->rssi_level)
 );
 
 TRACE_EVENT(cfg80211_reg_can_beacon,