From owner-p4-projects@FreeBSD.ORG Thu Jan 24 07:05:27 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CA25716A41B; Thu, 24 Jan 2008 07:05:26 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8F0B416A417 for ; Thu, 24 Jan 2008 07:05:26 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 83C9413C469 for ; Thu, 24 Jan 2008 07:05:26 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0O75QoN085641 for ; Thu, 24 Jan 2008 07:05:26 GMT (envelope-from sephe@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0O75Q4o085638 for perforce@freebsd.org; Thu, 24 Jan 2008 07:05:26 GMT (envelope-from sephe@FreeBSD.org) Date: Thu, 24 Jan 2008 07:05:26 GMT Message-Id: <200801240705.m0O75Q4o085638@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau To: Perforce Change Reviews Cc: Subject: PERFORCE change 133975 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Jan 2008 07:05:27 -0000 http://perforce.freebsd.org/chv.cgi?CH=133975 Change 133975 by sephe@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);