aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-03-05 16:18:41 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-06 15:16:05 -0500
commit804483e90794256f9ed53e795ffbf1e94de237c8 (patch)
tree22a4d8ade674bb42aaf4d3e878dfd6a73b618dcc /net
parent769009b89d8c29c410a99eee3cd63764b1fff869 (diff)
cfg80211/mac80211: report signal strength for mgmt frames
Add the signal strength (in dBm only for now) to frames that are received via nl80211's various frame APIs. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Acked-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/rx.c13
-rw-r--r--net/wireless/mlme.c7
-rw-r--r--net/wireless/nl80211.c9
-rw-r--r--net/wireless/nl80211.h3
4 files changed, 24 insertions, 8 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 10bbbd33b314..5f6e32ca0858 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2188,9 +2188,14 @@ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
2188 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && 2188 if (rx->sdata->vif.type == NL80211_IFTYPE_AP &&
2189 ieee80211_is_beacon(mgmt->frame_control) && 2189 ieee80211_is_beacon(mgmt->frame_control) &&
2190 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) { 2190 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
2191 int sig = 0;
2192
2193 if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
2194 sig = status->signal;
2195
2191 cfg80211_report_obss_beacon(rx->local->hw.wiphy, 2196 cfg80211_report_obss_beacon(rx->local->hw.wiphy,
2192 rx->skb->data, rx->skb->len, 2197 rx->skb->data, rx->skb->len,
2193 status->freq, GFP_ATOMIC); 2198 status->freq, sig, GFP_ATOMIC);
2194 rx->flags |= IEEE80211_RX_BEACON_REPORTED; 2199 rx->flags |= IEEE80211_RX_BEACON_REPORTED;
2195 } 2200 }
2196 2201
@@ -2414,6 +2419,7 @@ static ieee80211_rx_result debug_noinline
2414ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx) 2419ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
2415{ 2420{
2416 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); 2421 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
2422 int sig = 0;
2417 2423
2418 /* skip known-bad action frames and return them in the next handler */ 2424 /* skip known-bad action frames and return them in the next handler */
2419 if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM) 2425 if (status->rx_flags & IEEE80211_RX_MALFORMED_ACTION_FRM)
@@ -2426,7 +2432,10 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx)
2426 * it transmitted were processed or returned. 2432 * it transmitted were processed or returned.
2427 */ 2433 */
2428 2434
2429 if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq, 2435 if (rx->local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
2436 sig = status->signal;
2437
2438 if (cfg80211_rx_mgmt(rx->sdata->dev, status->freq, sig,
2430 rx->skb->data, rx->skb->len, 2439 rx->skb->data, rx->skb->len,
2431 GFP_ATOMIC)) { 2440 GFP_ATOMIC)) {
2432 if (rx->sta) 2441 if (rx->sta)
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index fb1e72179117..f5a7ac3a0939 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -814,8 +814,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
814 cookie); 814 cookie);
815} 815}
816 816
817bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf, 817bool cfg80211_rx_mgmt(struct net_device *dev, int freq, int sig_mbm,
818 size_t len, gfp_t gfp) 818 const u8 *buf, size_t len, gfp_t gfp)
819{ 819{
820 struct wireless_dev *wdev = dev->ieee80211_ptr; 820 struct wireless_dev *wdev = dev->ieee80211_ptr;
821 struct wiphy *wiphy = wdev->wiphy; 821 struct wiphy *wiphy = wdev->wiphy;
@@ -854,7 +854,8 @@ bool cfg80211_rx_mgmt(struct net_device *dev, int freq, const u8 *buf,
854 /* found match! */ 854 /* found match! */
855 855
856 /* Indicate the received Action frame to user space */ 856 /* Indicate the received Action frame to user space */
857 if (nl80211_send_mgmt(rdev, dev, reg->nlpid, freq, 857 if (nl80211_send_mgmt(rdev, dev, reg->nlpid,
858 freq, sig_mbm,
858 buf, len, gfp)) 859 buf, len, gfp))
859 continue; 860 continue;
860 861
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 4b6afc338aac..39dbdf2adb12 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -7686,7 +7686,8 @@ bool nl80211_unexpected_4addr_frame(struct net_device *dev,
7686 7686
7687int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 7687int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
7688 struct net_device *netdev, u32 nlpid, 7688 struct net_device *netdev, u32 nlpid,
7689 int freq, const u8 *buf, size_t len, gfp_t gfp) 7689 int freq, int sig_dbm,
7690 const u8 *buf, size_t len, gfp_t gfp)
7690{ 7691{
7691 struct sk_buff *msg; 7692 struct sk_buff *msg;
7692 void *hdr; 7693 void *hdr;
@@ -7704,6 +7705,8 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
7704 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); 7705 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7705 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex); 7706 NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex);
7706 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); 7707 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7708 if (sig_dbm)
7709 NLA_PUT_U32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm);
7707 NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf); 7710 NLA_PUT(msg, NL80211_ATTR_FRAME, len, buf);
7708 7711
7709 genlmsg_end(msg, hdr); 7712 genlmsg_end(msg, hdr);
@@ -7965,7 +7968,7 @@ EXPORT_SYMBOL(cfg80211_probe_status);
7965 7968
7966void cfg80211_report_obss_beacon(struct wiphy *wiphy, 7969void cfg80211_report_obss_beacon(struct wiphy *wiphy,
7967 const u8 *frame, size_t len, 7970 const u8 *frame, size_t len,
7968 int freq, gfp_t gfp) 7971 int freq, int sig_dbm, gfp_t gfp)
7969{ 7972{
7970 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); 7973 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
7971 struct sk_buff *msg; 7974 struct sk_buff *msg;
@@ -7988,6 +7991,8 @@ void cfg80211_report_obss_beacon(struct wiphy *wiphy,
7988 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx); 7991 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx);
7989 if (freq) 7992 if (freq)
7990 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); 7993 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
7994 if (sig_dbm)
7995 NLA_PUT_U32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm);
7991 NLA_PUT(msg, NL80211_ATTR_FRAME, len, frame); 7996 NLA_PUT(msg, NL80211_ATTR_FRAME, len, frame);
7992 7997
7993 genlmsg_end(msg, hdr); 7998 genlmsg_end(msg, hdr);
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h
index 12bf4d185abe..4ffe50df9f31 100644
--- a/net/wireless/nl80211.h
+++ b/net/wireless/nl80211.h
@@ -92,7 +92,8 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev,
92 gfp_t gfp); 92 gfp_t gfp);
93 93
94int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 94int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
95 struct net_device *netdev, u32 nlpid, int freq, 95 struct net_device *netdev, u32 nlpid,
96 int freq, int sig_dbm,
96 const u8 *buf, size_t len, gfp_t gfp); 97 const u8 *buf, size_t len, gfp_t gfp);
97void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev, 98void nl80211_send_mgmt_tx_status(struct cfg80211_registered_device *rdev,
98 struct net_device *netdev, u64 cookie, 99 struct net_device *netdev, u64 cookie,