diff options
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index df7b1332a1ec..3011401f52c0 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -6033,7 +6033,6 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, | |||
6033 | const struct cfg80211_bss_ies *ies; | 6033 | const struct cfg80211_bss_ies *ies; |
6034 | void *hdr; | 6034 | void *hdr; |
6035 | struct nlattr *bss; | 6035 | struct nlattr *bss; |
6036 | bool tsf = false; | ||
6037 | 6036 | ||
6038 | ASSERT_WDEV_LOCK(wdev); | 6037 | ASSERT_WDEV_LOCK(wdev); |
6039 | 6038 | ||
@@ -6060,18 +6059,27 @@ static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb, | |||
6060 | goto nla_put_failure; | 6059 | goto nla_put_failure; |
6061 | 6060 | ||
6062 | rcu_read_lock(); | 6061 | rcu_read_lock(); |
6062 | /* indicate whether we have probe response data or not */ | ||
6063 | if (rcu_access_pointer(res->proberesp_ies) && | ||
6064 | nla_put_flag(msg, NL80211_BSS_PRESP_DATA)) | ||
6065 | goto fail_unlock_rcu; | ||
6066 | |||
6067 | /* this pointer prefers to be pointed to probe response data | ||
6068 | * but is always valid | ||
6069 | */ | ||
6063 | ies = rcu_dereference(res->ies); | 6070 | ies = rcu_dereference(res->ies); |
6064 | if (ies) { | 6071 | if (ies) { |
6065 | if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf)) | 6072 | if (nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf)) |
6066 | goto fail_unlock_rcu; | 6073 | goto fail_unlock_rcu; |
6067 | tsf = true; | ||
6068 | if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, | 6074 | if (ies->len && nla_put(msg, NL80211_BSS_INFORMATION_ELEMENTS, |
6069 | ies->len, ies->data)) | 6075 | ies->len, ies->data)) |
6070 | goto fail_unlock_rcu; | 6076 | goto fail_unlock_rcu; |
6071 | } | 6077 | } |
6078 | |||
6079 | /* and this pointer is always (unless driver didn't know) beacon data */ | ||
6072 | ies = rcu_dereference(res->beacon_ies); | 6080 | ies = rcu_dereference(res->beacon_ies); |
6073 | if (ies) { | 6081 | if (ies && ies->from_beacon) { |
6074 | if (!tsf && nla_put_u64(msg, NL80211_BSS_TSF, ies->tsf)) | 6082 | if (nla_put_u64(msg, NL80211_BSS_BEACON_TSF, ies->tsf)) |
6075 | goto fail_unlock_rcu; | 6083 | goto fail_unlock_rcu; |
6076 | if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, | 6084 | if (ies->len && nla_put(msg, NL80211_BSS_BEACON_IES, |
6077 | ies->len, ies->data)) | 6085 | ies->len, ies->data)) |