From owner-p4-projects@FreeBSD.ORG Sun Jan 20 04:22:19 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 376C716A420; Sun, 20 Jan 2008 04:22:19 +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 E7AAB16A419 for ; Sun, 20 Jan 2008 04:22:18 +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 C9FC013C468 for ; Sun, 20 Jan 2008 04:22:18 +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 m0K4MIbL037984 for ; Sun, 20 Jan 2008 04:22:18 GMT (envelope-from sephe@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0K4MIA2037981 for perforce@freebsd.org; Sun, 20 Jan 2008 04:22:18 GMT (envelope-from sephe@FreeBSD.org) Date: Sun, 20 Jan 2008 04:22:18 GMT Message-Id: <200801200422.m0K4MIA2037981@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 133706 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: Sun, 20 Jan 2008 04:22:19 -0000 http://perforce.freebsd.org/chv.cgi?CH=133706 Change 133706 by sephe@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);