123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- From debian
- ---
- src/wl/sys/wl_cfg80211_hybrid.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
- 1 file changed, 60 insertions(+), 27 deletions(-)
- diff -Nurp broadcom-wl-6.30.223.271.orig/src/wl/sys/wl_cfg80211_hybrid.c broadcom-wl-6.30.223.271/src/wl/sys/wl_cfg80211_hybrid.c
- --- broadcom-wl-6.30.223.271.orig/src/wl/sys/wl_cfg80211_hybrid.c 2020-01-11 01:53:58.508062673 +0200
- +++ broadcom-wl-6.30.223.271/src/wl/sys/wl_cfg80211_hybrid.c 2020-01-11 01:55:42.011784473 +0200
- @@ -1984,7 +1984,7 @@ static s32 wl_inform_single_bss(struct w
-
- if (dtoh32(bi->length) > WL_BSS_INFO_MAX) {
- WL_DBG(("Beacon is larger than buffer. Discarding\n"));
- - return err;
- + return -E2BIG;
- }
- notif_bss_info = kzalloc(sizeof(*notif_bss_info) + sizeof(*mgmt) - sizeof(u8) +
- WL_BSS_INFO_MAX, GFP_KERNEL);
- @@ -2008,9 +2008,15 @@ static s32 wl_inform_single_bss(struct w
- beacon_proberesp->capab_info = cpu_to_le16(bi->capability);
- wl_rst_ie(wl);
-
- - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
- - wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
- + err = wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
- + if (err)
- + goto inform_single_bss_out;
- +
- + err = wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
- offsetof(struct wl_cfg80211_bss_info, frame_buf));
- + if (err)
- + goto inform_single_bss_out;
- +
- notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, u.beacon.variable) +
- wl_get_ielen(wl);
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
- @@ -2022,14 +2028,14 @@ static s32 wl_inform_single_bss(struct w
- #endif
- if (freq == 0) {
- WL_ERR(("Invalid channel, fail to chcnage channel to freq\n"));
- - kfree(notif_bss_info);
- - return -EINVAL;
- + err = -EINVAL;
- + goto inform_single_bss_out;
- }
- channel = ieee80211_get_channel(wiphy, freq);
- if (unlikely(!channel)) {
- WL_ERR(("ieee80211_get_channel error\n"));
- - kfree(notif_bss_info);
- - return -EINVAL;
- + err = -EINVAL;
- + goto inform_single_bss_out;
- }
-
- WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x, bssid %pM\n",
- @@ -2037,28 +2043,37 @@ static s32 wl_inform_single_bss(struct w
- mgmt->u.beacon.capab_info, &bi->BSSID));
-
- signal = notif_bss_info->rssi * 100;
- - cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
- - le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
- - if (unlikely(!cbss)) {
- - WL_ERR(("cfg80211_inform_bss_frame error\n"));
- - kfree(notif_bss_info);
- - return -EINVAL;
- - }
-
- - notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
- - notify_ielen = le32_to_cpu(bi->ie_length);
- + if (!wl->scan_request) {
- + cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
- + le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
- + if (unlikely(!cbss)) {
- + WL_ERR(("cfg80211_inform_bss_frame error\n"));
- + err = -ENOMEM;
- + goto inform_single_bss_out;
- + }
- + } else {
- + notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
- + notify_ielen = le32_to_cpu(bi->ie_length);
- #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
- - cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
- - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
- - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
- + cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
- + 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
- + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
- #else
- - cbss = cfg80211_inform_bss(wiphy, channel, CFG80211_BSS_FTYPE_UNKNOWN, (const u8 *)(bi->BSSID.octet),
- - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
- - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
- + cbss = cfg80211_inform_bss(wiphy, channel,
- + wl->active_scan ?
- + CFG80211_BSS_FTYPE_PRESP : CFG80211_BSS_FTYPE_BEACON,
- + (const u8 *)(bi->BSSID.octet), 0,
- + beacon_proberesp->capab_info,
- + beacon_proberesp->beacon_int,
- + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
- #endif
- -
- - if (unlikely(!cbss))
- - return -ENOMEM;
- + if (unlikely(!cbss)) {
- + WL_ERR(("cfg80211_inform_bss error\n"));
- + err = -ENOMEM;
- + goto inform_single_bss_out;
- + }
- + }
-
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
- cfg80211_put_bss(wiphy, cbss);
- @@ -2066,6 +2081,7 @@ static s32 wl_inform_single_bss(struct w
- cfg80211_put_bss(cbss);
- #endif
-
- +inform_single_bss_out:
- kfree(notif_bss_info);
-
- return err;
- @@ -2332,6 +2348,9 @@ static s32 wl_update_bss_info(struct wl_
- if (err)
- goto update_bss_info_out;
-
- + bss = cfg80211_get_bss(wl_to_wiphy(wl), NULL, (s8 *)&wl->bssid,
- + ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
- +
- ie = ((u8 *)bi) + bi->ie_offset;
- ie_len = bi->ie_length;
- } else {
- @@ -2344,11 +2363,18 @@ static s32 wl_update_bss_info(struct wl_
- ie_len = bss->len_information_elements;
- #endif
- wl->conf->channel = *bss->channel;
- + }
- +
- + if (bss) {
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
- cfg80211_put_bss(wiphy, bss);
- #else
- cfg80211_put_bss(bss);
- #endif
- + } else {
- + WL_DBG(("Could not update BSS\n"));
- + err = -EINVAL;
- + goto update_bss_info_out;
- }
-
- tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
- @@ -2390,10 +2416,17 @@ wl_bss_roaming_done(struct wl_cfg80211_p
- #endif
- s32 err = 0;
-
- - wl_get_assoc_ies(wl);
- + err = wl_get_assoc_ies(wl);
- + if (err)
- + return err;
- +
- memcpy(wl->profile->bssid, &e->addr, ETHER_ADDR_LEN);
- memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN);
- - wl_update_bss_info(wl);
- +
- + err = wl_update_bss_info(wl);
- + if (err)
- + return err;
- +
- cfg80211_roamed(ndev,
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
- &roam_info,
|