diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/ibss.c | 12 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 12 | ||||
-rw-r--r-- | net/wireless/scan.c | 28 |
3 files changed, 23 insertions, 29 deletions
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index e458ca0dffec..06d28787945b 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -991,7 +991,6 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
991 | struct ieee802_11_elems *elems) | 991 | struct ieee802_11_elems *elems) |
992 | { | 992 | { |
993 | struct ieee80211_local *local = sdata->local; | 993 | struct ieee80211_local *local = sdata->local; |
994 | int freq; | ||
995 | struct cfg80211_bss *cbss; | 994 | struct cfg80211_bss *cbss; |
996 | struct ieee80211_bss *bss; | 995 | struct ieee80211_bss *bss; |
997 | struct sta_info *sta; | 996 | struct sta_info *sta; |
@@ -1003,15 +1002,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
1003 | struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; | 1002 | struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; |
1004 | bool rates_updated = false; | 1003 | bool rates_updated = false; |
1005 | 1004 | ||
1006 | if (elems->ds_params) | 1005 | channel = ieee80211_get_channel(local->hw.wiphy, rx_status->freq); |
1007 | freq = ieee80211_channel_to_frequency(elems->ds_params[0], | 1006 | if (!channel) |
1008 | band); | ||
1009 | else | ||
1010 | freq = rx_status->freq; | ||
1011 | |||
1012 | channel = ieee80211_get_channel(local->hw.wiphy, freq); | ||
1013 | |||
1014 | if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) | ||
1015 | return; | 1007 | return; |
1016 | 1008 | ||
1017 | if (sdata->vif.type == NL80211_IFTYPE_ADHOC && | 1009 | if (sdata->vif.type == NL80211_IFTYPE_ADHOC && |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 6d24e6c8f320..bbc2175e4bfe 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2760,21 +2760,13 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
2760 | struct ieee802_11_elems *elems) | 2760 | struct ieee802_11_elems *elems) |
2761 | { | 2761 | { |
2762 | struct ieee80211_local *local = sdata->local; | 2762 | struct ieee80211_local *local = sdata->local; |
2763 | int freq; | ||
2764 | struct ieee80211_bss *bss; | 2763 | struct ieee80211_bss *bss; |
2765 | struct ieee80211_channel *channel; | 2764 | struct ieee80211_channel *channel; |
2766 | 2765 | ||
2767 | sdata_assert_lock(sdata); | 2766 | sdata_assert_lock(sdata); |
2768 | 2767 | ||
2769 | if (elems->ds_params) | 2768 | channel = ieee80211_get_channel(local->hw.wiphy, rx_status->freq); |
2770 | freq = ieee80211_channel_to_frequency(elems->ds_params[0], | 2769 | if (!channel) |
2771 | rx_status->band); | ||
2772 | else | ||
2773 | freq = rx_status->freq; | ||
2774 | |||
2775 | channel = ieee80211_get_channel(local->hw.wiphy, freq); | ||
2776 | |||
2777 | if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) | ||
2778 | return; | 2770 | return; |
2779 | 2771 | ||
2780 | bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems, | 2772 | bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems, |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index d1ed4aebbbb7..7d9f5264a63c 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -680,7 +680,8 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *dev, | |||
680 | /* Returned bss is reference counted and must be cleaned up appropriately. */ | 680 | /* Returned bss is reference counted and must be cleaned up appropriately. */ |
681 | static struct cfg80211_internal_bss * | 681 | static struct cfg80211_internal_bss * |
682 | cfg80211_bss_update(struct cfg80211_registered_device *dev, | 682 | cfg80211_bss_update(struct cfg80211_registered_device *dev, |
683 | struct cfg80211_internal_bss *tmp) | 683 | struct cfg80211_internal_bss *tmp, |
684 | bool signal_valid) | ||
684 | { | 685 | { |
685 | struct cfg80211_internal_bss *found = NULL; | 686 | struct cfg80211_internal_bss *found = NULL; |
686 | 687 | ||
@@ -765,7 +766,12 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev, | |||
765 | } | 766 | } |
766 | 767 | ||
767 | found->pub.beacon_interval = tmp->pub.beacon_interval; | 768 | found->pub.beacon_interval = tmp->pub.beacon_interval; |
768 | found->pub.signal = tmp->pub.signal; | 769 | /* |
770 | * don't update the signal if beacon was heard on | ||
771 | * adjacent channel. | ||
772 | */ | ||
773 | if (signal_valid) | ||
774 | found->pub.signal = tmp->pub.signal; | ||
769 | found->pub.capability = tmp->pub.capability; | 775 | found->pub.capability = tmp->pub.capability; |
770 | found->ts = tmp->ts; | 776 | found->ts = tmp->ts; |
771 | } else { | 777 | } else { |
@@ -869,13 +875,14 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen, | |||
869 | /* Returned bss is reference counted and must be cleaned up appropriately. */ | 875 | /* Returned bss is reference counted and must be cleaned up appropriately. */ |
870 | struct cfg80211_bss* | 876 | struct cfg80211_bss* |
871 | cfg80211_inform_bss_width(struct wiphy *wiphy, | 877 | cfg80211_inform_bss_width(struct wiphy *wiphy, |
872 | struct ieee80211_channel *channel, | 878 | struct ieee80211_channel *rx_channel, |
873 | enum nl80211_bss_scan_width scan_width, | 879 | enum nl80211_bss_scan_width scan_width, |
874 | const u8 *bssid, u64 tsf, u16 capability, | 880 | const u8 *bssid, u64 tsf, u16 capability, |
875 | u16 beacon_interval, const u8 *ie, size_t ielen, | 881 | u16 beacon_interval, const u8 *ie, size_t ielen, |
876 | s32 signal, gfp_t gfp) | 882 | s32 signal, gfp_t gfp) |
877 | { | 883 | { |
878 | struct cfg80211_bss_ies *ies; | 884 | struct cfg80211_bss_ies *ies; |
885 | struct ieee80211_channel *channel; | ||
879 | struct cfg80211_internal_bss tmp = {}, *res; | 886 | struct cfg80211_internal_bss tmp = {}, *res; |
880 | 887 | ||
881 | if (WARN_ON(!wiphy)) | 888 | if (WARN_ON(!wiphy)) |
@@ -885,7 +892,7 @@ cfg80211_inform_bss_width(struct wiphy *wiphy, | |||
885 | (signal < 0 || signal > 100))) | 892 | (signal < 0 || signal > 100))) |
886 | return NULL; | 893 | return NULL; |
887 | 894 | ||
888 | channel = cfg80211_get_bss_channel(wiphy, ie, ielen, channel); | 895 | channel = cfg80211_get_bss_channel(wiphy, ie, ielen, rx_channel); |
889 | if (!channel) | 896 | if (!channel) |
890 | return NULL; | 897 | return NULL; |
891 | 898 | ||
@@ -913,7 +920,8 @@ cfg80211_inform_bss_width(struct wiphy *wiphy, | |||
913 | rcu_assign_pointer(tmp.pub.beacon_ies, ies); | 920 | rcu_assign_pointer(tmp.pub.beacon_ies, ies); |
914 | rcu_assign_pointer(tmp.pub.ies, ies); | 921 | rcu_assign_pointer(tmp.pub.ies, ies); |
915 | 922 | ||
916 | res = cfg80211_bss_update(wiphy_to_dev(wiphy), &tmp); | 923 | res = cfg80211_bss_update(wiphy_to_dev(wiphy), &tmp, |
924 | rx_channel == channel); | ||
917 | if (!res) | 925 | if (!res) |
918 | return NULL; | 926 | return NULL; |
919 | 927 | ||
@@ -929,20 +937,21 @@ EXPORT_SYMBOL(cfg80211_inform_bss_width); | |||
929 | /* Returned bss is reference counted and must be cleaned up appropriately. */ | 937 | /* Returned bss is reference counted and must be cleaned up appropriately. */ |
930 | struct cfg80211_bss * | 938 | struct cfg80211_bss * |
931 | cfg80211_inform_bss_width_frame(struct wiphy *wiphy, | 939 | cfg80211_inform_bss_width_frame(struct wiphy *wiphy, |
932 | struct ieee80211_channel *channel, | 940 | struct ieee80211_channel *rx_channel, |
933 | enum nl80211_bss_scan_width scan_width, | 941 | enum nl80211_bss_scan_width scan_width, |
934 | struct ieee80211_mgmt *mgmt, size_t len, | 942 | struct ieee80211_mgmt *mgmt, size_t len, |
935 | s32 signal, gfp_t gfp) | 943 | s32 signal, gfp_t gfp) |
936 | { | 944 | { |
937 | struct cfg80211_internal_bss tmp = {}, *res; | 945 | struct cfg80211_internal_bss tmp = {}, *res; |
938 | struct cfg80211_bss_ies *ies; | 946 | struct cfg80211_bss_ies *ies; |
947 | struct ieee80211_channel *channel; | ||
939 | size_t ielen = len - offsetof(struct ieee80211_mgmt, | 948 | size_t ielen = len - offsetof(struct ieee80211_mgmt, |
940 | u.probe_resp.variable); | 949 | u.probe_resp.variable); |
941 | 950 | ||
942 | BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) != | 951 | BUILD_BUG_ON(offsetof(struct ieee80211_mgmt, u.probe_resp.variable) != |
943 | offsetof(struct ieee80211_mgmt, u.beacon.variable)); | 952 | offsetof(struct ieee80211_mgmt, u.beacon.variable)); |
944 | 953 | ||
945 | trace_cfg80211_inform_bss_width_frame(wiphy, channel, scan_width, mgmt, | 954 | trace_cfg80211_inform_bss_width_frame(wiphy, rx_channel, scan_width, mgmt, |
946 | len, signal); | 955 | len, signal); |
947 | 956 | ||
948 | if (WARN_ON(!mgmt)) | 957 | if (WARN_ON(!mgmt)) |
@@ -959,7 +968,7 @@ cfg80211_inform_bss_width_frame(struct wiphy *wiphy, | |||
959 | return NULL; | 968 | return NULL; |
960 | 969 | ||
961 | channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable, | 970 | channel = cfg80211_get_bss_channel(wiphy, mgmt->u.beacon.variable, |
962 | ielen, channel); | 971 | ielen, rx_channel); |
963 | if (!channel) | 972 | if (!channel) |
964 | return NULL; | 973 | return NULL; |
965 | 974 | ||
@@ -983,7 +992,8 @@ cfg80211_inform_bss_width_frame(struct wiphy *wiphy, | |||
983 | tmp.pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int); | 992 | tmp.pub.beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int); |
984 | tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info); | 993 | tmp.pub.capability = le16_to_cpu(mgmt->u.probe_resp.capab_info); |
985 | 994 | ||
986 | res = cfg80211_bss_update(wiphy_to_dev(wiphy), &tmp); | 995 | res = cfg80211_bss_update(wiphy_to_dev(wiphy), &tmp, |
996 | rx_channel == channel); | ||
987 | if (!res) | 997 | if (!res) |
988 | return NULL; | 998 | return NULL; |
989 | 999 | ||