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