PERFORCE change 133706 for review

Sepherosa Ziehau sephe at FreeBSD.org
Sat Jan 19 20:22:19 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=133706

Change 133706 by sephe at sephe_zealot:sam_wifi on 2008/01/20 04:21:47

	Unbreak RELENG_7 ABI compat:
	- Use {isr,isi}_ie_off as structure version
	- Embed new capinfo immediately before {isr,isi}_ie_off
	
	Pointed out by: sam

Affected files ...

.. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#72 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#86 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#47 edit
.. //depot/projects/wifi/usr.sbin/wpa/wpa_supplicant/driver_freebsd.c#11 edit

Differences ...

==== //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#72 (text+ko) ====

@@ -1949,12 +1949,21 @@
 		, "INT"
 		, "CAPS"
 	);
+
 	cp = buf;
 	do {
 		const struct ieee80211req_scan_result *sr;
+		const uint16_t *capinfo;
 		const uint8_t *vp;
 
 		sr = (const struct ieee80211req_scan_result *) cp;
+		if (sr->isr_ie_off == sizeof(struct ieee80211req_scan_result)) {
+			/* Old scan_result, i.e. no capinfo */
+			capinfo = NULL;
+		} else {
+			capinfo = (const uint16_t *)
+			    (cp + sizeof(struct ieee80211req_scan_result));
+		}
 		vp = cp + sr->isr_ie_off;
 		printf("%-*.*s  %s  %3d  %3dM %3d:%-3d  %3d %-4.4s"
 			, ssidmax
@@ -1965,7 +1974,7 @@
 			, getmaxrate(sr->isr_rates, sr->isr_nrates)
 			, (sr->isr_rssi/2)+sr->isr_noise, sr->isr_noise
 			, sr->isr_intval
-			, getcaps(sr->isr_capinfo2)
+			, getcaps(capinfo == NULL ? sr->isr_capinfo : *capinfo)
 		);
 		printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24);
 		printf("\n");
@@ -2108,10 +2117,18 @@
 	cp = (const uint8_t *) u.req.info;
 	do {
 		const struct ieee80211req_sta_info *si;
+		const uint16_t *capinfo;
 
 		si = (const struct ieee80211req_sta_info *) cp;
 		if (si->isi_len < sizeof(*si))
 			break;
+		if (si->isi_ie_off == sizeof(struct ieee80211req_sta_info)) {
+			/* Old sta info, i.e. no capinfo */
+			capinfo = NULL;
+		} else {
+			capinfo = (const uint16_t *)
+				  (cp + sizeof(struct ieee80211req_sta_info));
+		}
 		printf("%s %4u %4d %3dM %3.1f %4d %6d %6d %-4.4s %-4.4s"
 			, ether_ntoa((const struct ether_addr*) si->isi_macaddr)
 			, IEEE80211_AID(si->isi_associd)
@@ -2121,7 +2138,7 @@
 			, si->isi_inact
 			, gettxseq(si)
 			, getrxseq(si)
-			, getcaps(si->isi_capinfo2)
+			, getcaps(capinfo == NULL ? si->isi_capinfo : *capinfo)
 			, getflags(si->isi_state)
 		);
 		printies(cp + si->isi_ie_off, si->isi_ie_len, 24);

==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#86 (text+ko) ====

@@ -378,6 +378,9 @@
 }
 #endif /* COMPAT_FREEBSD6 */
 
+/* capinfo */
+#define SCANRESULT_EXTRA_SIZE	sizeof(uint16_t)
+
 struct scanreq {
 	struct ieee80211req_scan_result *sr;
 	size_t space;
@@ -402,7 +405,9 @@
 	 * packet is <3Kbytes so we are sure this doesn't overflow
 	 * 16-bits; if this is a concern we can drop the ie's.
 	 */
-	len = sizeof(struct ieee80211req_scan_result) + se->se_ssid[1] + *ielen;
+	len = sizeof(struct ieee80211req_scan_result)
+	    + SCANRESULT_EXTRA_SIZE
+	    + se->se_ssid[1] + *ielen;
 	return roundup(len, sizeof(uint32_t));
 }
 
@@ -430,7 +435,8 @@
 	sr = req->sr;
 	KASSERT(len <= 65535 && ielen <= 65535,
 	    ("len %u ssid %u ie %u", len, se->se_ssid[1], ielen));
-	sr->isr_ie_off = sizeof(struct ieee80211req_scan_result);
+	sr->isr_ie_off = sizeof(struct ieee80211req_scan_result)
+		       + SCANRESULT_EXTRA_SIZE;
 	sr->isr_ie_len = ielen;
 	sr->isr_len = len;
 	sr->isr_freq = se->se_chan->ic_freq;
@@ -438,8 +444,7 @@
 	sr->isr_rssi = se->se_rssi;
 	sr->isr_noise = se->se_noise;
 	sr->isr_intval = se->se_intval;
-	sr->isr_capinfo = se->se_capinfo;	/* deprecated */
-	sr->isr_capinfo2 = se->se_capinfo;
+	sr->isr_capinfo = se->se_capinfo; /* deprecated */
 	sr->isr_erp = se->se_erp;
 	IEEE80211_ADDR_COPY(sr->isr_bssid, se->se_bssid);
 	nr = min(se->se_rates[1], IEEE80211_RATE_MAXSIZE);
@@ -448,6 +453,10 @@
 	memcpy(sr->isr_rates+nr, se->se_xrates+2, nxr);
 	sr->isr_nrates = nr + nxr;
 
+	/* Extra data */
+	cp = ((uint8_t *)sr + sizeof(struct ieee80211req_scan_result));
+	*((uint16_t *)cp) = se->se_capinfo;	/* capinfo */
+
 	sr->isr_ssid_len = se->se_ssid[1];
 	cp = ((uint8_t *)sr) + sr->isr_ie_off;
 	memcpy(cp, se->se_ssid+2, sr->isr_ssid_len);
@@ -505,6 +514,9 @@
 	size_t	space;
 };
 
+/* capinfo */
+#define STAINFO_EXTRA_SIZE	sizeof(uint16_t)
+
 static size_t
 sta_space(const struct ieee80211_node *ni, size_t *ielen)
 {
@@ -517,7 +529,8 @@
 		*ielen += 2+ni->ni_wme_ie[1];
 	if (ni->ni_ath_ie != NULL)
 		*ielen += 2+ni->ni_ath_ie[1];
-	return roundup(sizeof(struct ieee80211req_sta_info) + *ielen,
+	return roundup(sizeof(struct ieee80211req_sta_info) +
+		      STAINFO_EXTRA_SIZE + *ielen,
 		      sizeof(uint32_t));
 }
 
@@ -553,7 +566,8 @@
 		return;
 	si = req->si;
 	si->isi_len = len;
-	si->isi_ie_off = sizeof(struct ieee80211req_sta_info);
+	si->isi_ie_off = sizeof(struct ieee80211req_sta_info)
+		       + STAINFO_EXTRA_SIZE;
 	si->isi_ie_len = ielen;
 	si->isi_freq = ni->ni_chan->ic_freq;
 	si->isi_flags = ni->ni_chan->ic_flags;
@@ -561,8 +575,7 @@
 	si->isi_authmode = ni->ni_authmode;
 	ic->ic_node_getsignal(ni, &si->isi_rssi, &si->isi_noise);
 	si->isi_noise = 0;		/* XXX */
-	si->isi_capinfo = ni->ni_capinfo;	/* deprecated */
-	si->isi_capinfo2 = ni->ni_capinfo;
+	si->isi_capinfo = ni->ni_capinfo; /* deprecated */
 	si->isi_erp = ni->ni_erp;
 	IEEE80211_ADDR_COPY(si->isi_macaddr, ni->ni_macaddr);
 	si->isi_nrates = ni->ni_rates.rs_nrates;
@@ -590,6 +603,10 @@
 		si->isi_inact = ic->ic_inact_init;
 	si->isi_inact = (si->isi_inact - ni->ni_inact) * IEEE80211_INACT_WAIT;
 
+	/* Extra data */
+	cp = ((uint8_t *)si + sizeof(struct ieee80211req_sta_info));
+	*((uint16_t *)cp) = ni->ni_capinfo;	/* capinfo */
+
 	if (ielen) {
 		cp = ((uint8_t *)si) + si->isi_ie_off;
 		cp = copyie(cp, ni->ni_wpa_ie);

==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#47 (text+ko) ====

@@ -358,8 +358,8 @@
 	uint16_t	isi_txseqs[IEEE80211_TID_SIZE];/* tx seq #/TID */
 	uint16_t	isi_rxseqs[IEEE80211_TID_SIZE];/* rx seq#/TID */
 	uint16_t	isi_inact;		/* inactivity timer */
-	uint16_t	isi_capinfo2;		/* capabilities */
 	/* XXX frag state? */
+	/* 2 bytes capinfo in host byte order */
 	/* variable length IE data */
 };
 
@@ -538,7 +538,7 @@
 	uint8_t		isr_nrates;
 	uint8_t		isr_rates[IEEE80211_RATE_MAXSIZE];
 	uint8_t		isr_ssid_len;		/* SSID length */
-	uint16_t	isr_capinfo2;		/* capabilities */
+	/* 2 bytes capinfo in host byte order */
 	/* variable length SSID followed by IE data */
 };
 

==== //depot/projects/wifi/usr.sbin/wpa/wpa_supplicant/driver_freebsd.c#11 (text+ko) ====

@@ -634,14 +634,23 @@
 	cp = buf;
 	wsr = results;
 	while (len >= sizeof(struct ieee80211req_scan_result)) {
+		const uint16_t *capinfo;
+
 		sr = (const struct ieee80211req_scan_result *) cp;
+		if (sr->isr_ie_off == sizeof(struct ieee80211req_scan_result)) {
+			capinfo = NULL;
+		} else {
+			capinfo = (const uint16_t *)
+			    (cp + sizeof(struct ieee80211req_scan_result));
+		}
+
 		memcpy(wsr->bssid, sr->isr_bssid, IEEE80211_ADDR_LEN);
 		wsr->ssid_len = sr->isr_ssid_len;
 		wsr->freq = sr->isr_freq;
 		wsr->noise = sr->isr_noise;
 		wsr->qual = sr->isr_rssi;
 		wsr->level = 0;		/* XXX? */
-		wsr->caps = sr->isr_capinfo2;
+		wsr->caps = capinfo == NULL ? sr->isr_capinfo : *capinfo;
 		wsr->maxrate = getmaxrate(sr->isr_rates, sr->isr_nrates);
 		vp = ((u_int8_t *)sr) + sr->isr_ie_off;
 		memcpy(wsr->ssid, vp, sr->isr_ssid_len);


More information about the p4-projects mailing list