rev |
line source |
shann@25643
|
1 --- a/src/wl/sys/wl_cfg80211_hybrid.c
|
shann@25643
|
2 +++ b/src/wl/sys/wl_cfg80211_hybrid.c
|
shann@25643
|
3 @@ -1968,7 +1968,7 @@
|
shann@25643
|
4
|
shann@25643
|
5 if (dtoh32(bi->length) > WL_BSS_INFO_MAX) {
|
shann@25643
|
6 WL_DBG(("Beacon is larger than buffer. Discarding\n"));
|
shann@25643
|
7 - return err;
|
shann@25643
|
8 + return -E2BIG;
|
shann@25643
|
9 }
|
shann@25643
|
10 notif_bss_info = kzalloc(sizeof(*notif_bss_info) + sizeof(*mgmt) - sizeof(u8) +
|
shann@25643
|
11 WL_BSS_INFO_MAX, GFP_KERNEL);
|
shann@25643
|
12 @@ -1992,9 +1992,15 @@
|
shann@25643
|
13 beacon_proberesp->capab_info = cpu_to_le16(bi->capability);
|
shann@25643
|
14 wl_rst_ie(wl);
|
shann@25643
|
15
|
shann@25643
|
16 - wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
|
shann@25643
|
17 - wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
|
shann@25643
|
18 + err = wl_mrg_ie(wl, ((u8 *) bi) + bi->ie_offset, bi->ie_length);
|
shann@25643
|
19 + if (err)
|
shann@25643
|
20 + goto inform_single_bss_out;
|
shann@25643
|
21 +
|
shann@25643
|
22 + err = wl_cp_ie(wl, beacon_proberesp->variable, WL_BSS_INFO_MAX -
|
shann@25643
|
23 offsetof(struct wl_cfg80211_bss_info, frame_buf));
|
shann@25643
|
24 + if (err)
|
shann@25643
|
25 + goto inform_single_bss_out;
|
shann@25643
|
26 +
|
shann@25643
|
27 notif_bss_info->frame_len = offsetof(struct ieee80211_mgmt, u.beacon.variable) +
|
shann@25643
|
28 wl_get_ielen(wl);
|
shann@25643
|
29 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
|
shann@25643
|
30 @@ -2006,14 +2012,14 @@
|
shann@25643
|
31 #endif
|
shann@25643
|
32 if (freq == 0) {
|
shann@25643
|
33 WL_ERR(("Invalid channel, fail to chcnage channel to freq\n"));
|
shann@25643
|
34 - kfree(notif_bss_info);
|
shann@25643
|
35 - return -EINVAL;
|
shann@25643
|
36 + err = -EINVAL;
|
shann@25643
|
37 + goto inform_single_bss_out;
|
shann@25643
|
38 }
|
shann@25643
|
39 channel = ieee80211_get_channel(wiphy, freq);
|
shann@25643
|
40 if (unlikely(!channel)) {
|
shann@25643
|
41 WL_ERR(("ieee80211_get_channel error\n"));
|
shann@25643
|
42 - kfree(notif_bss_info);
|
shann@25643
|
43 - return -EINVAL;
|
shann@25643
|
44 + err = -EINVAL;
|
shann@25643
|
45 + goto inform_single_bss_out;
|
shann@25643
|
46 }
|
shann@25643
|
47
|
shann@25643
|
48 WL_DBG(("SSID : \"%s\", rssi %d, channel %d, capability : 0x04%x, bssid %pM\n",
|
shann@25643
|
49 @@ -2021,28 +2027,37 @@
|
shann@25643
|
50 mgmt->u.beacon.capab_info, &bi->BSSID));
|
shann@25643
|
51
|
shann@25643
|
52 signal = notif_bss_info->rssi * 100;
|
shann@25643
|
53 - cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
|
shann@25643
|
54 - le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
|
shann@25643
|
55 - if (unlikely(!cbss)) {
|
shann@25643
|
56 - WL_ERR(("cfg80211_inform_bss_frame error\n"));
|
shann@25643
|
57 - kfree(notif_bss_info);
|
shann@25643
|
58 - return -EINVAL;
|
shann@25643
|
59 - }
|
shann@25643
|
60
|
shann@25643
|
61 - notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
|
shann@25643
|
62 - notify_ielen = le32_to_cpu(bi->ie_length);
|
shann@25643
|
63 + if (!wl->scan_request) {
|
shann@25643
|
64 + cbss = cfg80211_inform_bss_frame(wiphy, channel, mgmt,
|
shann@25643
|
65 + le16_to_cpu(notif_bss_info->frame_len), signal, GFP_KERNEL);
|
shann@25643
|
66 + if (unlikely(!cbss)) {
|
shann@25643
|
67 + WL_ERR(("cfg80211_inform_bss_frame error\n"));
|
shann@25643
|
68 + err = -ENOMEM;
|
shann@25643
|
69 + goto inform_single_bss_out;
|
shann@25643
|
70 + }
|
shann@25643
|
71 + } else {
|
shann@25643
|
72 + notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
|
shann@25643
|
73 + notify_ielen = le32_to_cpu(bi->ie_length);
|
shann@25643
|
74 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
|
shann@25643
|
75 - cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
|
shann@25643
|
76 - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
shann@25643
|
77 - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
shann@25643
|
78 + cbss = cfg80211_inform_bss(wiphy, channel, (const u8 *)(bi->BSSID.octet),
|
shann@25643
|
79 + 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
shann@25643
|
80 + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
shann@25643
|
81 #else
|
shann@25643
|
82 - cbss = cfg80211_inform_bss(wiphy, channel, CFG80211_BSS_FTYPE_UNKNOWN, (const u8 *)(bi->BSSID.octet),
|
shann@25643
|
83 - 0, beacon_proberesp->capab_info, beacon_proberesp->beacon_int,
|
shann@25643
|
84 - (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
shann@25643
|
85 + cbss = cfg80211_inform_bss(wiphy, channel,
|
shann@25643
|
86 + wl->active_scan ?
|
shann@25643
|
87 + CFG80211_BSS_FTYPE_PRESP : CFG80211_BSS_FTYPE_BEACON,
|
shann@25643
|
88 + (const u8 *)(bi->BSSID.octet), 0,
|
shann@25643
|
89 + beacon_proberesp->capab_info,
|
shann@25643
|
90 + beacon_proberesp->beacon_int,
|
shann@25643
|
91 + (const u8 *)notify_ie, notify_ielen, signal, GFP_KERNEL);
|
shann@25643
|
92 #endif
|
shann@25643
|
93 -
|
shann@25643
|
94 - if (unlikely(!cbss))
|
shann@25643
|
95 - return -ENOMEM;
|
shann@25643
|
96 + if (unlikely(!cbss)) {
|
shann@25643
|
97 + WL_ERR(("cfg80211_inform_bss error\n"));
|
shann@25643
|
98 + err = -ENOMEM;
|
shann@25643
|
99 + goto inform_single_bss_out;
|
shann@25643
|
100 + }
|
shann@25643
|
101 + }
|
shann@25643
|
102
|
shann@25643
|
103 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
shann@25643
|
104 cfg80211_put_bss(wiphy, cbss);
|
shann@25643
|
105 @@ -2050,6 +2065,7 @@
|
shann@25643
|
106 cfg80211_put_bss(cbss);
|
shann@25643
|
107 #endif
|
shann@25643
|
108
|
shann@25643
|
109 +inform_single_bss_out:
|
shann@25643
|
110 kfree(notif_bss_info);
|
shann@25643
|
111
|
shann@25643
|
112 return err;
|
shann@25643
|
113 @@ -2316,6 +2332,9 @@
|
shann@25643
|
114 if (err)
|
shann@25643
|
115 goto update_bss_info_out;
|
shann@25643
|
116
|
shann@25643
|
117 + bss = cfg80211_get_bss(wl_to_wiphy(wl), NULL, (s8 *)&wl->bssid,
|
shann@25643
|
118 + ssid->SSID, ssid->SSID_len, WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
|
shann@25643
|
119 +
|
shann@25643
|
120 ie = ((u8 *)bi) + bi->ie_offset;
|
shann@25643
|
121 ie_len = bi->ie_length;
|
shann@25643
|
122 } else {
|
shann@25643
|
123 @@ -2328,11 +2347,18 @@
|
shann@25643
|
124 ie_len = bss->len_information_elements;
|
shann@25643
|
125 #endif
|
shann@25643
|
126 wl->conf->channel = *bss->channel;
|
shann@25643
|
127 + }
|
shann@25643
|
128 +
|
shann@25643
|
129 + if (bss) {
|
shann@25643
|
130 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
shann@25643
|
131 cfg80211_put_bss(wiphy, bss);
|
shann@25643
|
132 #else
|
shann@25643
|
133 cfg80211_put_bss(bss);
|
shann@25643
|
134 #endif
|
shann@25643
|
135 + } else {
|
shann@25643
|
136 + WL_DBG(("Could not update BSS\n"));
|
shann@25643
|
137 + err = -EINVAL;
|
shann@25643
|
138 + goto update_bss_info_out;
|
shann@25643
|
139 }
|
shann@25643
|
140
|
shann@25643
|
141 tim = bcm_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
|
shann@25643
|
142 @@ -2360,10 +2386,17 @@
|
shann@25643
|
143 struct wl_cfg80211_connect_info *conn_info = wl_to_conn(wl);
|
shann@25643
|
144 s32 err = 0;
|
shann@25643
|
145
|
shann@25643
|
146 - wl_get_assoc_ies(wl);
|
shann@25643
|
147 + err = wl_get_assoc_ies(wl);
|
shann@25643
|
148 + if (err)
|
shann@25643
|
149 + return err;
|
shann@25643
|
150 +
|
shann@25643
|
151 memcpy(wl->profile->bssid, &e->addr, ETHER_ADDR_LEN);
|
shann@25643
|
152 memcpy(&wl->bssid, &e->addr, ETHER_ADDR_LEN);
|
shann@25643
|
153 - wl_update_bss_info(wl);
|
shann@25643
|
154 +
|
shann@25643
|
155 + err = wl_update_bss_info(wl);
|
shann@25643
|
156 + if (err)
|
shann@25643
|
157 + return err;
|
shann@25643
|
158 +
|
shann@25643
|
159 cfg80211_roamed(ndev,
|
shann@25643
|
160 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)
|
shann@25643
|
161 &wl->conf->channel,
|