PERFORCE change 133975 for review

Sepherosa Ziehau sephe at FreeBSD.org
Wed Jan 23 23:05:27 PST 2008


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

Change 133975 by sephe at sephe_zealot:sam_wifi on 2008/01/24 07:04:31

	Duplicate the ieee80211_{scan_result,sta_info} structure and add
	{isr,isi}_capinfo2 at the end of the structure.  Rename old
	structure to structure_name_v1.
	
	Suggested by: jhb

Affected files ...

.. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#73 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#87 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#48 edit
.. //depot/projects/wifi/usr.sbin/wpa/wpa_supplicant/driver_freebsd.c#12 edit

Differences ...

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

@@ -1953,17 +1953,15 @@
 	cp = buf;
 	do {
 		const struct ieee80211req_scan_result *sr;
-		const uint16_t *capinfo;
 		const uint8_t *vp;
+		uint16_t capinfo;
 
 		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));
-		}
+		if (sr->isr_ie_off ==
+		    sizeof(struct ieee80211req_scan_result_v1))
+		    	capinfo = sr->isr_capinfo;
+		else
+			capinfo = sr->isr_capinfo2;
 		vp = cp + sr->isr_ie_off;
 		printf("%-*.*s  %s  %3d  %3dM %3d:%-3d  %3d %-4.4s"
 			, ssidmax
@@ -1974,7 +1972,7 @@
 			, getmaxrate(sr->isr_rates, sr->isr_nrates)
 			, (sr->isr_rssi/2)+sr->isr_noise, sr->isr_noise
 			, sr->isr_intval
-			, getcaps(capinfo == NULL ? sr->isr_capinfo : *capinfo)
+			, getcaps(capinfo)
 		);
 		printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24);
 		printf("\n");
@@ -2117,18 +2115,15 @@
 	cp = (const uint8_t *) u.req.info;
 	do {
 		const struct ieee80211req_sta_info *si;
-		const uint16_t *capinfo;
+		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));
-		}
+		if (si->isi_ie_off == sizeof(struct ieee80211req_sta_info_v1))
+			capinfo = si->isi_capinfo;
+		else
+			capinfo = si->isi_capinfo2;
 		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)
@@ -2138,7 +2133,7 @@
 			, si->isi_inact
 			, gettxseq(si)
 			, getrxseq(si)
-			, getcaps(capinfo == NULL ? si->isi_capinfo : *capinfo)
+			, getcaps(capinfo)
 			, getflags(si->isi_state)
 		);
 		printies(cp + si->isi_ie_off, si->isi_ie_len, 24);

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

@@ -378,9 +378,6 @@
 }
 #endif /* COMPAT_FREEBSD6 */
 
-/* capinfo */
-#define SCANRESULT_EXTRA_SIZE	sizeof(uint16_t)
-
 struct scanreq {
 	struct ieee80211req_scan_result *sr;
 	size_t space;
@@ -405,9 +402,7 @@
 	 * 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)
-	    + SCANRESULT_EXTRA_SIZE
-	    + se->se_ssid[1] + *ielen;
+	len = sizeof(struct ieee80211req_scan_result) + se->se_ssid[1] + *ielen;
 	return roundup(len, sizeof(uint32_t));
 }
 
@@ -435,8 +430,7 @@
 	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)
-		       + SCANRESULT_EXTRA_SIZE;
+	sr->isr_ie_off = sizeof(struct ieee80211req_scan_result);
 	sr->isr_ie_len = ielen;
 	sr->isr_len = len;
 	sr->isr_freq = se->se_chan->ic_freq;
@@ -445,6 +439,7 @@
 	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_erp = se->se_erp;
 	IEEE80211_ADDR_COPY(sr->isr_bssid, se->se_bssid);
 	nr = min(se->se_rates[1], IEEE80211_RATE_MAXSIZE);
@@ -453,10 +448,6 @@
 	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);
@@ -514,9 +505,6 @@
 	size_t	space;
 };
 
-/* capinfo */
-#define STAINFO_EXTRA_SIZE	sizeof(uint16_t)
-
 static size_t
 sta_space(const struct ieee80211_node *ni, size_t *ielen)
 {
@@ -529,8 +517,7 @@
 		*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) +
-		      STAINFO_EXTRA_SIZE + *ielen,
+	return roundup(sizeof(struct ieee80211req_sta_info) + *ielen,
 		      sizeof(uint32_t));
 }
 
@@ -566,8 +553,7 @@
 		return;
 	si = req->si;
 	si->isi_len = len;
-	si->isi_ie_off = sizeof(struct ieee80211req_sta_info)
-		       + STAINFO_EXTRA_SIZE;
+	si->isi_ie_off = sizeof(struct ieee80211req_sta_info);
 	si->isi_ie_len = ielen;
 	si->isi_freq = ni->ni_chan->ic_freq;
 	si->isi_flags = ni->ni_chan->ic_flags;
@@ -576,6 +562,7 @@
 	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_erp = ni->ni_erp;
 	IEEE80211_ADDR_COPY(si->isi_macaddr, ni->ni_macaddr);
 	si->isi_nrates = ni->ni_rates.rs_nrates;
@@ -603,10 +590,6 @@
 		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#48 (text+ko) ====

@@ -334,6 +334,34 @@
  * Station information block; the mac address is used
  * to retrieve other data like stats, unicast key, etc.
  */
+struct ieee80211req_sta_info_v1 {
+	uint16_t	isi_len;		/* length (mult of 4) */
+	uint16_t	isi_ie_off;		/* offset to IE data */
+	uint16_t	isi_ie_len;		/* IE length */
+	uint16_t	isi_freq;		/* MHz */
+	uint32_t	isi_flags;		/* channel flags */
+	uint16_t	isi_state;		/* state flags */
+	uint8_t		isi_authmode;		/* authentication algorithm */
+	int8_t		isi_rssi;		/* receive signal strength */
+	int8_t		isi_noise;		/* noise floor */
+	uint8_t		isi_capinfo;		/* capabilities */
+	uint8_t		isi_erp;		/* ERP element */
+	uint8_t		isi_macaddr[IEEE80211_ADDR_LEN];
+	uint8_t		isi_nrates;
+						/* negotiated rates */
+	uint8_t		isi_rates[IEEE80211_RATE_MAXSIZE];
+	uint8_t		isi_txrate;		/* index to isi_rates[] */
+	uint16_t	isi_associd;		/* assoc response */
+	uint16_t	isi_txpower;		/* current tx power */
+	uint16_t	isi_vlan;		/* vlan tag */
+	/* NB: [IEEE80211_NONQOS_TID] holds seq#'s for non-QoS stations */
+	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 */
+	/* XXX frag state? */
+	/* variable length IE data */
+};
+
 struct ieee80211req_sta_info {
 	uint16_t	isi_len;		/* length (mult of 4) */
 	uint16_t	isi_ie_off;		/* offset to IE data */
@@ -358,8 +386,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 */
 };
 
@@ -523,6 +551,24 @@
  * size structure and the entire length of the record is specified
  * in isr_len.  Result records are rounded to a multiple of 4 bytes.
  */
+struct ieee80211req_scan_result_v1 {
+	uint16_t	isr_len;		/* length (mult of 4) */
+	uint16_t	isr_ie_off;		/* offset to IE data */
+	uint16_t	isr_ie_len;		/* IE length */
+	uint16_t	isr_freq;		/* MHz */
+	uint16_t	isr_flags;		/* channel flags */
+	int8_t		isr_noise;
+	int8_t		isr_rssi;
+	uint8_t		isr_intval;		/* beacon interval */
+	uint8_t		isr_capinfo;		/* capabilities */
+	uint8_t		isr_erp;		/* ERP element */
+	uint8_t		isr_bssid[IEEE80211_ADDR_LEN];
+	uint8_t		isr_nrates;
+	uint8_t		isr_rates[IEEE80211_RATE_MAXSIZE];
+	uint8_t		isr_ssid_len;		/* SSID length */
+	/* variable length SSID followed by IE data */
+};
+
 struct ieee80211req_scan_result {
 	uint16_t	isr_len;		/* length (mult of 4) */
 	uint16_t	isr_ie_off;		/* offset to IE data */
@@ -538,7 +584,7 @@
 	uint8_t		isr_nrates;
 	uint8_t		isr_rates[IEEE80211_RATE_MAXSIZE];
 	uint8_t		isr_ssid_len;		/* SSID length */
-	/* 2 bytes capinfo in host byte order */
+	uint16_t	isr_capinfo2;		/* capabilities */
 	/* variable length SSID followed by IE data */
 };
 

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

@@ -634,15 +634,14 @@
 	cp = buf;
 	wsr = results;
 	while (len >= sizeof(struct ieee80211req_scan_result)) {
-		const uint16_t *capinfo;
+		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));
-		}
+		if (sr->isr_ie_off ==
+		    sizeof(struct ieee80211req_scan_result_v1))
+			capinfo = sr->isr_capinfo;
+		else
+			capinfo = sr->isr_capinfo2;
 
 		memcpy(wsr->bssid, sr->isr_bssid, IEEE80211_ADDR_LEN);
 		wsr->ssid_len = sr->isr_ssid_len;
@@ -650,7 +649,7 @@
 		wsr->noise = sr->isr_noise;
 		wsr->qual = sr->isr_rssi;
 		wsr->level = 0;		/* XXX? */
-		wsr->caps = capinfo == NULL ? sr->isr_capinfo : *capinfo;
+		wsr->caps = 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