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