aboutsummaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches/368-sta_ie_preserve.patch
blob: 7094a43258b7c9b555527a150a73c001d470145a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
--- a/net80211/ieee80211_scan_sta.c
+++ b/net80211/ieee80211_scan_sta.c
@@ -201,8 +201,10 @@
 }
 
 static void
-saveie(u_int8_t **iep, const u_int8_t *ie)
+saveie(u_int8_t **iep, const u_int8_t *ie, int preserve)
 {
+	if (preserve && *iep)
+		return;
 	if (ie == NULL)
 		*iep = NULL;
 	else
@@ -304,10 +306,10 @@
 		    (const struct ieee80211_tim_ie *) sp->tim;
 		ise->se_dtimperiod = tim->tim_period;
 	}
-	saveie(&ise->se_wme_ie, sp->wme);
-	saveie(&ise->se_wpa_ie, sp->wpa);
-	saveie(&ise->se_rsn_ie, sp->rsn);
-	saveie(&ise->se_ath_ie, sp->ath);
+	saveie(&ise->se_wme_ie, sp->wme, 0);
+	saveie(&ise->se_wpa_ie, sp->wpa, !sp->isprobe);
+	saveie(&ise->se_rsn_ie, sp->rsn, !sp->isprobe);
+	saveie(&ise->se_ath_ie, sp->ath, 0);
 
 	/* clear failure count after STA_FAIL_AGE passes */
 	if (se->se_fails && (jiffies - se->se_lastfail) > STA_FAILS_AGE*HZ) {
--- a/net80211/ieee80211_input.c
+++ b/net80211/ieee80211_input.c
@@ -3106,6 +3106,7 @@
 		 */
 		IEEE80211_VERIFY_LENGTH(efrm - frm, 12);
 		memset(&scan, 0, sizeof(scan));
+		scan.isprobe = (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) && IEEE80211_ADDR_EQ(wh->i_addr2, vap->iv_myaddr);
 		scan.tstamp  = frm;
 		frm += 8;
 		scan.bintval = le16toh(*(__le16 *)frm);
--- a/net80211/ieee80211_scan.h
+++ b/net80211/ieee80211_scan.h
@@ -133,6 +133,7 @@
 	u_int8_t erp;
 	u_int16_t bintval;
 	u_int8_t timoff;
+	u_int8_t isprobe;
 	u_int8_t *tim;
 	u_int8_t *tstamp;
 	u_int8_t *country;