Date: Tue, 1 Apr 2008 22:05:54 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 139170 for review Message-ID: <200804012205.m31M5s2S015478@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=139170 Change 139170 by sam@sam_ebb on 2008/04/01 22:05:16 split crypto capabilities into their own area and explicitly connect the bits to the cipher values; we were out of capability bits and the cipher caps need to grow too Affected files ... .. //depot/projects/vap/sbin/ifconfig/ifieee80211.c#17 edit .. //depot/projects/vap/sys/conf/files#27 edit .. //depot/projects/vap/sys/dev/ath/if_ath.c#55 edit .. //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#9 edit .. //depot/projects/vap/sys/dev/mwl/if_mwl.c#2 edit .. //depot/projects/vap/sys/dev/wi/if_wi.c#21 edit .. //depot/projects/vap/sys/net80211/ieee80211.c#32 edit .. //depot/projects/vap/sys/net80211/ieee80211_crypto.c#11 edit .. //depot/projects/vap/sys/net80211/ieee80211_crypto.h#11 edit .. //depot/projects/vap/sys/net80211/ieee80211_ddb.c#9 edit .. //depot/projects/vap/sys/net80211/ieee80211_ioctl.c#49 edit .. //depot/projects/vap/sys/net80211/ieee80211_ioctl.h#17 edit .. //depot/projects/vap/sys/net80211/ieee80211_var.h#35 edit Differences ... ==== //depot/projects/vap/sbin/ifconfig/ifieee80211.c#17 (text+ko) ==== @@ -3061,23 +3061,33 @@ } #define IEEE80211_C_BITS \ -"\020\1WEP\2TKIP\3AES\4AES_CCM\6CKIP\7FF\10TURBOP\11IBSS\12PMGT\13HOSTAP\14AHDEMO" \ -"\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE\21MONITOR\22TKIPMIC\30WPA1" \ -"\31WPA2\32BURST\33WME\34WDS\36BGSCAN\37TXFRAG" + "\20\7FF\10TURBOP\11IBSS\12PMGT" \ + "\13HOSTAP\14AHDEMO\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE" \ + "\21MONITOR\30WPA1\31WPA2\32BURST\33WME\34WDS\36BGSCAN" \ + "\37TXFRAG" + +#define IEEE80211_CRYPTO_BITS \ + "\20\1WEP\2TKIP\3AES\4AES_CCM\5TKIPMIC\6CKIP\12PMGT" + +#define IEEE80211_HTCAP_BITS \ + "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ + "\21AMPDU\22AMSDU\23HT" static void list_capabilities(int s) { - struct ieee80211req ireq; - u_int32_t caps; + struct ieee80211_devcaps_req dc; - (void) memset(&ireq, 0, sizeof(ireq)); - (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name)); - ireq.i_type = IEEE80211_IOC_DRIVER_CAPS; - if (ioctl(s, SIOCG80211, &ireq) < 0) - errx(1, "unable to get driver capabilities"); - caps = (((u_int16_t) ireq.i_val) << 16) | ((u_int16_t) ireq.i_len); - printb(name, caps, IEEE80211_C_BITS); + getdevcaps(s, &dc); + printb("drivercaps", dc.dc_drivercaps, IEEE80211_C_BITS); + if (dc.dc_cryptocaps != 0 || verbose) { + putchar('\n'); + printb("cryptocaps", dc.dc_cryptocaps, IEEE80211_CRYPTO_BITS); + } + if (dc.dc_htcaps != 0 || verbose) { + putchar('\n'); + printb("htcaps", dc.dc_htcaps, IEEE80211_HTCAP_BITS); + } putchar('\n'); } ==== //depot/projects/vap/sys/conf/files#27 (text+ko) ==== @@ -1161,6 +1161,7 @@ dev/usb/ufm.c optional ufm dev/usb/uftdi.c optional uftdi dev/usb/ugen.c optional ugen +dev/usb/ugencom.c optional ugencom dev/usb/uhci.c optional uhci dev/usb/uhci_pci.c optional uhci pci dev/usb/uhid.c optional uhid ==== //depot/projects/vap/sys/dev/ath/if_ath.c#55 (text+ko) ==== @@ -524,22 +524,22 @@ * Query the hal to figure out h/w crypto support. */ if (ath_hal_ciphersupported(ah, HAL_CIPHER_WEP)) - ic->ic_caps |= IEEE80211_C_WEP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); if (ath_hal_ciphersupported(ah, HAL_CIPHER_AES_OCB)) - ic->ic_caps |= IEEE80211_C_AES; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_AES_OCB); if (ath_hal_ciphersupported(ah, HAL_CIPHER_AES_CCM)) - ic->ic_caps |= IEEE80211_C_AES_CCM; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_AES_CCM); if (ath_hal_ciphersupported(ah, HAL_CIPHER_CKIP)) - ic->ic_caps |= IEEE80211_C_CKIP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_CKIP); if (ath_hal_ciphersupported(ah, HAL_CIPHER_TKIP)) { - ic->ic_caps |= IEEE80211_C_TKIP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIP); /* * Check if h/w does the MIC and/or whether the * separate key cache entries are required to * handle both tx+rx MIC keys. */ if (ath_hal_ciphersupported(ah, HAL_CIPHER_MIC)) - ic->ic_caps |= IEEE80211_C_TKIPMIC; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIPMIC); /* * If the h/w supports storing tx+rx MIC keys * in one cache slot automatically enable use. ==== //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#9 (text+ko) ==== @@ -872,20 +872,22 @@ arg = NDIS_80211_WEPSTAT_ENC3ENABLED; r = ndis_set_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &i); if (r == 0) { - ic->ic_caps |= IEEE80211_C_WEP|IEEE80211_C_TKIP| - IEEE80211_C_AES_CCM; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIP); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_AES_CCM); goto got_crypto; } arg = NDIS_80211_WEPSTAT_ENC2ENABLED; r = ndis_set_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &i); if (r == 0) { - ic->ic_caps |= IEEE80211_C_WEP|IEEE80211_C_TKIP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIP); goto got_crypto; } arg = NDIS_80211_WEPSTAT_ENC1ENABLED; r = ndis_set_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &i); if (r == 0) - ic->ic_caps |= IEEE80211_C_WEP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); got_crypto: i = sizeof(arg); r = ndis_get_info(sc, OID_802_11_POWER_MODE, &arg, &i); @@ -2061,19 +2063,19 @@ len = sizeof(arg); if (cipher == WPA_CSE_WEP40 || WPA_CSE_WEP104) { - if (!(ic->ic_caps & IEEE80211_C_WEP)) + if (!isset(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP)) return(ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC1ENABLED; } if (cipher == WPA_CSE_TKIP) { - if (!(ic->ic_caps & IEEE80211_C_TKIP)) + if (!isset(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIP)) return(ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC2ENABLED; } if (cipher == WPA_CSE_CCMP) { - if (!(ic->ic_caps & IEEE80211_C_AES_CCM)) + if (!isset(ic->ic_cryptocaps, IEEE80211_CIPHER_AES_CCM)) return(ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC3ENABLED; } ==== //depot/projects/vap/sys/dev/mwl/if_mwl.c#2 (text+ko) ==== @@ -440,15 +440,9 @@ | IEEE80211_C_WPA /* capable of WPA1+WPA2 */ | IEEE80211_C_BGSCAN /* capable of bg scanning */ | IEEE80211_C_TXFRAG /* handle tx frags */ - /* - * XXX no way to query h/w support. - */ - | IEEE80211_C_WEP /* h/w WEP supported */ - | IEEE80211_C_AES_CCM /* h/w AES supported */ - | IEEE80211_C_TKIP /* h/w TKIP supported */ - | IEEE80211_C_TKIPMIC /* h/w TKIP MIC supported */ | IEEE80211_C_TXPMGT /* capable of txpow mgt */ ; + ic->ic_htcaps = IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ | IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width */ @@ -471,6 +465,15 @@ ; /* + * Mark h/w crypto support. + * XXX no way to query h/w support. + */ + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_AES_CCM); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIP); + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_TKIPMIC); + + /* * Transmit requires space in the packet for a special * format transmit record and optional padding between * this record and the payload. Ask the net80211 layer ==== //depot/projects/vap/sys/dev/wi/if_wi.c#21 (text+ko) ==== @@ -407,7 +407,7 @@ buflen = sizeof(val); if (wi_read_rid(sc, WI_RID_WEP_AVAIL, &val, &buflen) == 0 && val != htole16(0)) - ic->ic_caps |= IEEE80211_C_WEP; + setbit(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP); /* Find supported rates. */ buflen = sizeof(ratebuf); @@ -826,7 +826,7 @@ ieee80211_chan2ieee(ic, bss->ni_chan)); /* Configure WEP. */ - if (ic->ic_caps & IEEE80211_C_WEP) + if (isset(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP)) wi_write_wep(sc, vap); else sc->sc_encryption = 0; @@ -916,7 +916,7 @@ wi_write_val(sc, WI_RID_PROMISC, 0); /* Configure WEP. */ - if (ic->ic_caps & IEEE80211_C_WEP) + if (isset(ic->ic_cryptocaps, IEEE80211_CIPHER_WEP)) wi_write_wep(sc, vap); else sc->sc_encryption = 0; ==== //depot/projects/vap/sys/net80211/ieee80211.c#32 (text+ko) ==== @@ -324,6 +324,13 @@ vap->iv_flags_ext = ic->ic_flags_ext; vap->iv_flags_ven = ic->ic_flags_ven; vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE; + vap->iv_cryptocaps[0] = ic->ic_cryptocaps[0]; +#if IEEE80211_CIPHER_MAX > 8 + vap->iv_cryptocaps[1] = ic->ic_cryptocaps[1]; +#endif +#if IEEE80211_CIPHER_MAX > 16 +#error "too many crypto capability bits" +#endif vap->iv_htcaps = ic->ic_htcaps; vap->iv_opmode = opmode; switch (opmode) { ==== //depot/projects/vap/sys/net80211/ieee80211_crypto.c#11 (text+ko) ==== @@ -240,6 +240,7 @@ "wlan_tkip", /* IEEE80211_CIPHER_TKIP */ "wlan_aes_ocb", /* IEEE80211_CIPHER_AES_OCB */ "wlan_ccmp", /* IEEE80211_CIPHER_AES_CCM */ + "#4", /* reserved */ "wlan_ckip", /* IEEE80211_CIPHER_CKIP */ "wlan_none", /* IEEE80211_CIPHER_NONE */ }; @@ -308,7 +309,7 @@ * If the hardware does not support the cipher then * fallback to a host-based implementation. */ - if ((vap->iv_caps & (1<<cipher)) == 0) { + if (!isset(vap->iv_cryptocaps, cipher)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO, "%s: no h/w support for cipher %s, falling back to s/w\n", __func__, cip->ic_name); @@ -320,7 +321,7 @@ * the cipher modules honor it. */ if (cipher == IEEE80211_CIPHER_TKIP && - (vap->iv_caps & IEEE80211_C_TKIPMIC) == 0) { + !isset(vap->iv_cryptocaps, IEEE80211_CIPHER_TKIPMIC)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO, "%s: no h/w support for TKIP MIC, falling back to s/w\n", __func__); ==== //depot/projects/vap/sys/net80211/ieee80211_crypto.h#11 (text+ko) ==== @@ -96,13 +96,16 @@ /* * NB: these values are ordered carefully; there are lots of - * of implications in any reordering. In particular beware - * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY. + * of implications in any reordering. Beware that 4 is used + * only to indicate h/w TKIP MIC support in driver capabilities; + * there is no separate cipher support (it's rolled into the + * TKIP cipher support). */ #define IEEE80211_CIPHER_WEP 0 #define IEEE80211_CIPHER_TKIP 1 #define IEEE80211_CIPHER_AES_OCB 2 #define IEEE80211_CIPHER_AES_CCM 3 +#define IEEE80211_CIPHER_TKIPMIC 4 /* TKIP MIC capability */ #define IEEE80211_CIPHER_CKIP 5 #define IEEE80211_CIPHER_NONE 6 /* pseudo value */ ==== //depot/projects/vap/sys/net80211/ieee80211_ddb.c#9 (text+ko) ==== @@ -71,11 +71,14 @@ #define IEEE80211_FVEN_BITS "\20" #define IEEE80211_C_BITS \ - "\20\1WEP\2TKIP\3AES\4AES_CCM\6CKIP\7FF\10TURBOP\11IBSS\12PMGT" \ + "\20\7FF\10TURBOP\11IBSS\12PMGT" \ "\13HOSTAP\14AHDEMO\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE" \ - "\21MONITOR\22TKIPMIC\30WPA1\31WPA2\32BURST\33WME\34WDS\36BGSCAN" \ + "\21MONITOR\30WPA1\31WPA2\32BURST\33WME\34WDS\36BGSCAN" \ "\37TXFRAG" +#define IEEE80211_C_CRYPTO_BITS \ + "\20\1WEP\2TKIP\3AES\4AES_CCM\5TKIPMIC\6CKIP\12PMGT" + #define IEEE80211_C_HTCAP_BITS \ "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ "\21AMPDU\22AMSDU\23HT" @@ -327,6 +330,8 @@ db_printf("\tflags_ext=%b\n", vap->iv_flags_ext, IEEE80211_FEXT_BITS); db_printf("\tflags_ven=%b\n", vap->iv_flags_ven, IEEE80211_FVEN_BITS); db_printf("\tcaps=%b\n", vap->iv_caps, IEEE80211_C_BITS); + db_printf("\tcryptocaps=%b\n", + vap->iv_cryptocaps[0], IEEE80211_C_CRYPTO_BITS); db_printf("\thtcaps=%b\n", vap->iv_htcaps, IEEE80211_C_HTCAP_BITS); _db_show_stats(&vap->iv_stats); @@ -484,6 +489,8 @@ db_printf("\tflags_ext=%b\n", ic->ic_flags_ext, IEEE80211_FEXT_BITS); db_printf("\tflags_ven=%b\n", ic->ic_flags_ven, IEEE80211_FVEN_BITS); db_printf("\tcaps=%b\n", ic->ic_caps, IEEE80211_C_BITS); + db_printf("\tcryptocaps=%b\n", + ic->ic_cryptocaps[0], IEEE80211_C_CRYPTO_BITS); db_printf("\thtcaps=%b\n", ic->ic_htcaps, IEEE80211_HTCAP_BITS); #if 0 ==== //depot/projects/vap/sys/net80211/ieee80211_ioctl.c#49 (text+ko) ==== @@ -700,9 +700,14 @@ sizeof(struct ieee80211_devcaps_req), M_TEMP, M_NOWAIT | M_ZERO); if (dc == NULL) return ENOMEM; - /* XXX temp until crypto caps split out of ic_caps */ - dc->dc_drivercaps = ic->ic_caps &~ IEEE80211_C_CRYPTO; - dc->dc_cryptocaps = ic->ic_caps & IEEE80211_C_CRYPTO; + dc->dc_drivercaps = ic->ic_caps; +#if IEEE80211_CIPHER_MAX <= 8 + dc->dc_cryptocaps = ic->ic_cryptocaps[0]; +#elif IEEE80211_CIPHER_MAX <= 16 + dc->dc_cryptocaps = (ic->ic_cryptocaps[0]<<8) | ic->ic_cryptocaps[1]; +#else +#error "too many crypto capability bits" +#endif dc->dc_htcaps = ic->ic_htcaps; ci = &dc->dc_chaninfo; ic->ic_getradiocaps(ic, &ci->ic_nchans, ci->ic_chans); @@ -877,10 +882,6 @@ case IEEE80211_IOC_COUNTERMEASURES: ireq->i_val = (vap->iv_flags & IEEE80211_F_COUNTERM) != 0; break; - case IEEE80211_IOC_DRIVER_CAPS: - ireq->i_val = vap->iv_caps>>16; - ireq->i_len = vap->iv_caps&0xffff; - break; case IEEE80211_IOC_WME: ireq->i_val = (vap->iv_flags & IEEE80211_F_WME) != 0; break; @@ -2680,11 +2681,6 @@ else vap->iv_flags &= ~IEEE80211_F_NOBRIDGE; break; - case IEEE80211_IOC_DRIVER_CAPS: - /* NB: for testing */ - vap->iv_caps = (((uint16_t) ireq->i_val) << 16) | - ((uint16_t) ireq->i_len); - break; case IEEE80211_IOC_BSSID: if (ireq->i_len != sizeof(tmpbssid)) return EINVAL; ==== //depot/projects/vap/sys/net80211/ieee80211_ioctl.h#17 (text+ko) ==== @@ -544,7 +544,7 @@ #define IEEE80211_IOC_HIDESSID 29 /* hide SSID mode (on, off) */ #define IEEE80211_IOC_APBRIDGE 30 /* AP inter-sta bridging */ /* 31-35,37-38 were for WPA authenticator settings */ -#define IEEE80211_IOC_DRIVER_CAPS 36 /* driver capabilities */ +/* 36 was IEEE80211_IOC_DRIVER_CAPS */ #define IEEE80211_IOC_WPAIE 39 /* WPA information element */ #define IEEE80211_IOC_STA_STATS 40 /* per-station statistics */ #define IEEE80211_IOC_MACCMD 41 /* MAC ACL operation */ ==== //depot/projects/vap/sys/net80211/ieee80211_var.h#35 (text+ko) ==== @@ -122,6 +122,7 @@ uint32_t ic_flags_ven; /* vendor state flags */ uint32_t ic_caps; /* capabilities */ uint32_t ic_htcaps; /* HT capabilities */ + uint8_t ic_cryptocaps[1];/* crypto capabilities */ uint8_t ic_modecaps[2]; /* set of mode capabilities */ uint8_t ic_promisc; /* vap's needing promisc mode */ uint8_t ic_allmulti; /* vap's needing all multicast*/ @@ -292,6 +293,7 @@ uint32_t iv_flags_ven; /* vendor state flags */ uint32_t iv_caps; /* capabilities */ uint32_t iv_htcaps; /* HT capabilities */ + uint8_t iv_cryptocaps[1];/* crypto capabilities */ enum ieee80211_opmode iv_opmode; /* operation mode */ enum ieee80211_state iv_state; /* state machine state */ void (*iv_newstate_cb)(struct ieee80211vap *, @@ -490,11 +492,7 @@ #define IEEE80211_FEXT_HTCOMPAT 0x10000000 /* CONF: HT vendor OUI's */ /* ic_caps/iv_caps: device driver capabilities */ -#define IEEE80211_C_WEP 0x00000001 /* CAPABILITY: WEP available */ -#define IEEE80211_C_TKIP 0x00000002 /* CAPABILITY: TKIP available */ -#define IEEE80211_C_AES 0x00000004 /* CAPABILITY: AES OCB avail */ -#define IEEE80211_C_AES_CCM 0x00000008 /* CAPABILITY: AES CCM avail */ -#define IEEE80211_C_CKIP 0x00000020 /* CAPABILITY: CKIP available */ +/* 0x2f available */ #define IEEE80211_C_FF 0x00000040 /* CAPABILITY: ATH FF avail */ #define IEEE80211_C_TURBOP 0x00000080 /* CAPABILITY: ATH Turbo avail*/ #define IEEE80211_C_IBSS 0x00000100 /* CAPABILITY: IBSS available */ @@ -506,7 +504,7 @@ #define IEEE80211_C_SHSLOT 0x00004000 /* CAPABILITY: short slottime */ #define IEEE80211_C_SHPREAMBLE 0x00008000 /* CAPABILITY: short preamble */ #define IEEE80211_C_MONITOR 0x00010000 /* CAPABILITY: monitor mode */ -#define IEEE80211_C_TKIPMIC 0x00020000 /* CAPABILITY: TKIP MIC avail */ +/* 0x20000 available */ #define IEEE80211_C_WPA1 0x00800000 /* CAPABILITY: WPA1 avail */ #define IEEE80211_C_WPA2 0x01000000 /* CAPABILITY: WPA2 avail */ #define IEEE80211_C_WPA 0x01800000 /* CAPABILITY: WPA1+WPA2 avail*/ @@ -518,8 +516,6 @@ #define IEEE80211_C_TXFRAG 0x40000000 /* CAPABILITY: tx fragments */ /* XXX protection/barker? */ -#define IEEE80211_C_CRYPTO 0x0000002f /* CAPABILITY: crypto alg's */ - /* * ic_htcaps/iv_htcaps: HT-specific device/driver capabilities *
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804012205.m31M5s2S015478>