cfg80211: send ack_signal to user in probe client response
authorVenkateswara Naralasetty <vnaralas@codeaurora.org>
Tue, 13 Feb 2018 05:33:06 +0000 (11:03 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 19 Feb 2018 12:21:23 +0000 (13:21 +0100)
This patch provides support to get ack signal in probe client response
and in station info from user.

Signed-off-by: Venkateswara Naralasetty <vnaralas@codeaurora.org>
[squash in compilation fixes]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/ath/wil6210/cfg80211.c
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/status.c
net/wireless/nl80211.c

index 768f63f..b799a53 100644 (file)
@@ -1599,7 +1599,8 @@ static void wil_probe_client_handle(struct wil6210_priv *wil,
         */
        bool alive = (sta->status == wil_sta_connected);
 
-       cfg80211_probe_status(ndev, sta->addr, req->cookie, alive, GFP_KERNEL);
+       cfg80211_probe_status(ndev, sta->addr, req->cookie, alive,
+                             0, false, GFP_KERNEL);
 }
 
 static struct list_head *next_probe_client(struct wil6210_priv *wil)
index 7d49cd0..56e905c 100644 (file)
@@ -1147,6 +1147,7 @@ struct cfg80211_tid_stats {
  * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
  * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
  *     (IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
+ * @ack_signal: signal strength (in dBm) of the last ACK frame.
  */
 struct station_info {
        u64 filled;
@@ -1191,6 +1192,7 @@ struct station_info {
        u64 rx_duration;
        u8 rx_beacon_signal_avg;
        struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1];
+       s8 ack_signal;
 };
 
 #if IS_ENABLED(CONFIG_CFG80211)
@@ -5838,10 +5840,13 @@ bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
  * @addr: the address of the peer
  * @cookie: the cookie filled in @probe_client previously
  * @acked: indicates whether probe was acked or not
+ * @ack_signal: signal strength (in dBm) of the ACK frame.
+ * @is_valid_ack_signal: indicates the ack_signal is valid or not.
  * @gfp: allocation flags
  */
 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
-                          u64 cookie, bool acked, gfp_t gfp);
+                          u64 cookie, bool acked, s32 ack_signal,
+                          bool is_valid_ack_signal, gfp_t gfp);
 
 /**
  * cfg80211_report_obss_beacon - report beacon from other APs
index ca3d5a6..c13c843 100644 (file)
@@ -2626,6 +2626,7 @@ enum nl80211_attrs {
        NL80211_ATTR_EXTERNAL_AUTH_SUPPORT,
 
        NL80211_ATTR_NSS,
+       NL80211_ATTR_ACK_SIGNAL,
 
        /* add attributes here, update the policy in nl80211.c */
 
@@ -2947,6 +2948,7 @@ enum nl80211_sta_bss_param {
  * @NL80211_STA_INFO_RX_DURATION: aggregate PPDU duration for all frames
  *     received from the station (u64, usec)
  * @NL80211_STA_INFO_PAD: attribute used for padding for 64-bit alignment
+ * @NL80211_STA_INFO_ACK_SIGNAL: signal strength of the last ACK frame(u8, dBm)
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -2985,6 +2987,7 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_TID_STATS,
        NL80211_STA_INFO_RX_DURATION,
        NL80211_STA_INFO_PAD,
+       NL80211_STA_INFO_ACK_SIGNAL,
 
        /* keep last */
        __NL80211_STA_INFO_AFTER_LAST,
index da7427a..d74d44e 100644 (file)
@@ -486,7 +486,7 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
                        if (ieee80211_is_nullfunc(hdr->frame_control) ||
                            ieee80211_is_qos_nullfunc(hdr->frame_control))
                                cfg80211_probe_status(sdata->dev, hdr->addr1,
-                                                     cookie, acked,
+                                                     cookie, acked, 0, false,
                                                      GFP_ATOMIC);
                        else
                                cfg80211_mgmt_tx_status(&sdata->wdev, cookie,
index c6f256b..050ff61 100644 (file)
@@ -4486,6 +4486,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
        PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
        PUT_SINFO_U64(BEACON_RX, rx_beacon);
        PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
+       PUT_SINFO(ACK_SIGNAL, ack_signal, u8);
 
 #undef PUT_SINFO
 #undef PUT_SINFO_U64
@@ -14984,7 +14985,8 @@ nla_put_failure:
 EXPORT_SYMBOL(cfg80211_sta_opmode_change_notify);
 
 void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
-                          u64 cookie, bool acked, gfp_t gfp)
+                          u64 cookie, bool acked, s32 ack_signal,
+                          bool is_valid_ack_signal, gfp_t gfp)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
@@ -15009,7 +15011,9 @@ void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
            nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, addr) ||
            nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, cookie,
                              NL80211_ATTR_PAD) ||
-           (acked && nla_put_flag(msg, NL80211_ATTR_ACK)))
+           (acked && nla_put_flag(msg, NL80211_ATTR_ACK)) ||
+           (is_valid_ack_signal && nla_put_s32(msg, NL80211_ATTR_ACK_SIGNAL,
+                                               ack_signal)))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);