cfg80211: clean up signal type
It wasn't a good idea to make the signal type a per-BSS option, although then it is closer to the actual value. Move it to be a per-wiphy setting, update mac80211 to match. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
630e64c487
commit
77965c970d
|
@ -577,8 +577,7 @@ enum cfg80211_signal_type {
|
||||||
* @information_elements: the information elements (Note that there
|
* @information_elements: the information elements (Note that there
|
||||||
* is no guarantee that these are well-formed!)
|
* is no guarantee that these are well-formed!)
|
||||||
* @len_information_elements: total length of the information elements
|
* @len_information_elements: total length of the information elements
|
||||||
* @signal: signal strength value
|
* @signal: signal strength value (type depends on the wiphy's signal_type)
|
||||||
* @signal_type: signal type
|
|
||||||
* @free_priv: function pointer to free private data
|
* @free_priv: function pointer to free private data
|
||||||
* @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
|
* @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
|
||||||
*/
|
*/
|
||||||
|
@ -593,7 +592,6 @@ struct cfg80211_bss {
|
||||||
size_t len_information_elements;
|
size_t len_information_elements;
|
||||||
|
|
||||||
s32 signal;
|
s32 signal;
|
||||||
enum cfg80211_signal_type signal_type;
|
|
||||||
|
|
||||||
void (*free_priv)(struct cfg80211_bss *bss);
|
void (*free_priv)(struct cfg80211_bss *bss);
|
||||||
u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
|
u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
|
||||||
|
@ -782,6 +780,7 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted);
|
||||||
*
|
*
|
||||||
* @wiphy: the wiphy reporting the BSS
|
* @wiphy: the wiphy reporting the BSS
|
||||||
* @bss: the found BSS
|
* @bss: the found BSS
|
||||||
|
* @signal: the signal strength, type depends on the wiphy's signal_type
|
||||||
* @gfp: context flags
|
* @gfp: context flags
|
||||||
*
|
*
|
||||||
* This informs cfg80211 that BSS information was found and
|
* This informs cfg80211 that BSS information was found and
|
||||||
|
@ -791,8 +790,7 @@ struct cfg80211_bss*
|
||||||
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
||||||
struct ieee80211_channel *channel,
|
struct ieee80211_channel *channel,
|
||||||
struct ieee80211_mgmt *mgmt, size_t len,
|
struct ieee80211_mgmt *mgmt, size_t len,
|
||||||
s32 signal, enum cfg80211_signal_type sigtype,
|
s32 signal, gfp_t gfp);
|
||||||
gfp_t gfp);
|
|
||||||
|
|
||||||
struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
|
struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
|
||||||
struct ieee80211_channel *channel,
|
struct ieee80211_channel *channel,
|
||||||
|
|
|
@ -200,6 +200,7 @@ struct ieee80211_supported_band {
|
||||||
* the regulatory_hint() API. This can be used by the driver
|
* the regulatory_hint() API. This can be used by the driver
|
||||||
* on the reg_notifier() if it chooses to ignore future
|
* on the reg_notifier() if it chooses to ignore future
|
||||||
* regulatory domain changes caused by other drivers.
|
* regulatory domain changes caused by other drivers.
|
||||||
|
* @signal_type: signal type reported in &struct cfg80211_bss.
|
||||||
*/
|
*/
|
||||||
struct wiphy {
|
struct wiphy {
|
||||||
/* assign these fields before you register the wiphy */
|
/* assign these fields before you register the wiphy */
|
||||||
|
@ -213,6 +214,8 @@ struct wiphy {
|
||||||
bool custom_regulatory;
|
bool custom_regulatory;
|
||||||
bool strict_regulatory;
|
bool strict_regulatory;
|
||||||
|
|
||||||
|
enum cfg80211_signal_type signal_type;
|
||||||
|
|
||||||
int bss_priv_size;
|
int bss_priv_size;
|
||||||
u8 max_scan_ssids;
|
u8 max_scan_ssids;
|
||||||
|
|
||||||
|
|
|
@ -861,6 +861,11 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||||
/* mac80211 always supports monitor */
|
/* mac80211 always supports monitor */
|
||||||
local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
local->hw.wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
||||||
|
|
||||||
|
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||||
|
local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
|
||||||
|
else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
|
||||||
|
local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
|
||||||
|
|
||||||
result = wiphy_register(local->hw.wiphy);
|
result = wiphy_register(local->hw.wiphy);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
goto fail_wiphy_register;
|
goto fail_wiphy_register;
|
||||||
|
|
|
@ -63,20 +63,15 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
||||||
{
|
{
|
||||||
struct ieee80211_bss *bss;
|
struct ieee80211_bss *bss;
|
||||||
int clen;
|
int clen;
|
||||||
enum cfg80211_signal_type sigtype = CFG80211_SIGNAL_TYPE_NONE;
|
|
||||||
s32 signal = 0;
|
s32 signal = 0;
|
||||||
|
|
||||||
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
|
if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
|
||||||
sigtype = CFG80211_SIGNAL_TYPE_MBM;
|
|
||||||
signal = rx_status->signal * 100;
|
signal = rx_status->signal * 100;
|
||||||
} else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) {
|
else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
|
||||||
sigtype = CFG80211_SIGNAL_TYPE_UNSPEC;
|
|
||||||
signal = (rx_status->signal * 100) / local->hw.max_signal;
|
signal = (rx_status->signal * 100) / local->hw.max_signal;
|
||||||
}
|
|
||||||
|
|
||||||
bss = (void *)cfg80211_inform_bss_frame(local->hw.wiphy, channel,
|
bss = (void *)cfg80211_inform_bss_frame(local->hw.wiphy, channel,
|
||||||
mgmt, len, signal, sigtype,
|
mgmt, len, signal, GFP_ATOMIC);
|
||||||
GFP_ATOMIC);
|
|
||||||
|
|
||||||
if (!bss)
|
if (!bss)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -2457,7 +2457,7 @@ static int nl80211_send_bss(struct sk_buff *msg, u32 pid, u32 seq, int flags,
|
||||||
NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
|
NLA_PUT_U16(msg, NL80211_BSS_CAPABILITY, res->capability);
|
||||||
NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
|
NLA_PUT_U32(msg, NL80211_BSS_FREQUENCY, res->channel->center_freq);
|
||||||
|
|
||||||
switch (res->signal_type) {
|
switch (rdev->wiphy.signal_type) {
|
||||||
case CFG80211_SIGNAL_TYPE_MBM:
|
case CFG80211_SIGNAL_TYPE_MBM:
|
||||||
NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
|
NLA_PUT_U32(msg, NL80211_BSS_SIGNAL_MBM, res->signal);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -370,7 +370,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
|
||||||
found->pub.beacon_interval = res->pub.beacon_interval;
|
found->pub.beacon_interval = res->pub.beacon_interval;
|
||||||
found->pub.tsf = res->pub.tsf;
|
found->pub.tsf = res->pub.tsf;
|
||||||
found->pub.signal = res->pub.signal;
|
found->pub.signal = res->pub.signal;
|
||||||
found->pub.signal_type = res->pub.signal_type;
|
|
||||||
found->pub.capability = res->pub.capability;
|
found->pub.capability = res->pub.capability;
|
||||||
found->ts = res->ts;
|
found->ts = res->ts;
|
||||||
kref_put(&res->ref, bss_release);
|
kref_put(&res->ref, bss_release);
|
||||||
|
@ -392,8 +391,7 @@ struct cfg80211_bss *
|
||||||
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
||||||
struct ieee80211_channel *channel,
|
struct ieee80211_channel *channel,
|
||||||
struct ieee80211_mgmt *mgmt, size_t len,
|
struct ieee80211_mgmt *mgmt, size_t len,
|
||||||
s32 signal, enum cfg80211_signal_type sigtype,
|
s32 signal, gfp_t gfp)
|
||||||
gfp_t gfp)
|
|
||||||
{
|
{
|
||||||
struct cfg80211_internal_bss *res;
|
struct cfg80211_internal_bss *res;
|
||||||
size_t ielen = len - offsetof(struct ieee80211_mgmt,
|
size_t ielen = len - offsetof(struct ieee80211_mgmt,
|
||||||
|
@ -401,7 +399,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
||||||
bool overwrite;
|
bool overwrite;
|
||||||
size_t privsz = wiphy->bss_priv_size;
|
size_t privsz = wiphy->bss_priv_size;
|
||||||
|
|
||||||
if (WARN_ON(sigtype == NL80211_BSS_SIGNAL_UNSPEC &&
|
if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
|
||||||
(signal < 0 || signal > 100)))
|
(signal < 0 || signal > 100)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -415,7 +413,6 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
||||||
|
|
||||||
memcpy(res->pub.bssid, mgmt->bssid, ETH_ALEN);
|
memcpy(res->pub.bssid, mgmt->bssid, ETH_ALEN);
|
||||||
res->pub.channel = channel;
|
res->pub.channel = channel;
|
||||||
res->pub.signal_type = sigtype;
|
|
||||||
res->pub.signal = signal;
|
res->pub.signal = signal;
|
||||||
res->pub.tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
|
res->pub.tsf = le64_to_cpu(mgmt->u.probe_resp.timestamp);
|
||||||
res->pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
|
res->pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
|
||||||
|
@ -607,9 +604,9 @@ static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
ieee80211_bss(struct iw_request_info *info,
|
ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
|
||||||
struct cfg80211_internal_bss *bss,
|
struct cfg80211_internal_bss *bss, char *current_ev,
|
||||||
char *current_ev, char *end_buf)
|
char *end_buf)
|
||||||
{
|
{
|
||||||
struct iw_event iwe;
|
struct iw_event iwe;
|
||||||
u8 *buf, *cfg, *p;
|
u8 *buf, *cfg, *p;
|
||||||
|
@ -638,13 +635,13 @@ ieee80211_bss(struct iw_request_info *info,
|
||||||
current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
|
current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
|
||||||
IW_EV_FREQ_LEN);
|
IW_EV_FREQ_LEN);
|
||||||
|
|
||||||
if (bss->pub.signal_type != CFG80211_SIGNAL_TYPE_NONE) {
|
if (wiphy->signal_type != CFG80211_SIGNAL_TYPE_NONE) {
|
||||||
memset(&iwe, 0, sizeof(iwe));
|
memset(&iwe, 0, sizeof(iwe));
|
||||||
iwe.cmd = IWEVQUAL;
|
iwe.cmd = IWEVQUAL;
|
||||||
iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
|
iwe.u.qual.updated = IW_QUAL_LEVEL_UPDATED |
|
||||||
IW_QUAL_NOISE_INVALID |
|
IW_QUAL_NOISE_INVALID |
|
||||||
IW_QUAL_QUAL_UPDATED;
|
IW_QUAL_QUAL_UPDATED;
|
||||||
switch (bss->pub.signal_type) {
|
switch (wiphy->signal_type) {
|
||||||
case CFG80211_SIGNAL_TYPE_MBM:
|
case CFG80211_SIGNAL_TYPE_MBM:
|
||||||
sig = bss->pub.signal / 100;
|
sig = bss->pub.signal / 100;
|
||||||
iwe.u.qual.level = sig;
|
iwe.u.qual.level = sig;
|
||||||
|
@ -823,8 +820,8 @@ static int ieee80211_scan_results(struct cfg80211_registered_device *dev,
|
||||||
spin_unlock_bh(&dev->bss_lock);
|
spin_unlock_bh(&dev->bss_lock);
|
||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
}
|
}
|
||||||
current_ev = ieee80211_bss(info, bss,
|
current_ev = ieee80211_bss(&dev->wiphy, info, bss,
|
||||||
current_ev, end_buf);
|
current_ev, end_buf);
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&dev->bss_lock);
|
spin_unlock_bh(&dev->bss_lock);
|
||||||
return current_ev - buf;
|
return current_ev - buf;
|
||||||
|
|
Loading…
Reference in New Issue