diff options
Diffstat (limited to 'sys/net80211/ieee80211_crypto.h')
-rw-r--r-- | sys/net80211/ieee80211_crypto.h | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/sys/net80211/ieee80211_crypto.h b/sys/net80211/ieee80211_crypto.h index 19b6dcd..f006a7a 100644 --- a/sys/net80211/ieee80211_crypto.h +++ b/sys/net80211/ieee80211_crypto.h @@ -66,18 +66,19 @@ struct ieee80211_cipher; * Ciphers such as TKIP may also support mixed hardware/software * encrypt/decrypt and MIC processing. */ -/* XXX need key index typedef */ -/* XXX pack better? */ -/* XXX 48-bit rsc/tsc */ +typedef u_int16_t ieee80211_keyix; /* h/w key index */ + struct ieee80211_key { u_int8_t wk_keylen; /* key length in bytes */ - u_int8_t wk_flags; + u_int8_t wk_pad; + u_int16_t wk_flags; #define IEEE80211_KEY_XMIT 0x01 /* key used for xmit */ #define IEEE80211_KEY_RECV 0x02 /* key used for recv */ #define IEEE80211_KEY_GROUP 0x04 /* key used for WPA group operation */ #define IEEE80211_KEY_SWCRYPT 0x10 /* host-based encrypt/decrypt */ #define IEEE80211_KEY_SWMIC 0x20 /* host-based enmic/demic */ - u_int16_t wk_keyix; /* key index */ + ieee80211_keyix wk_keyix; /* h/w key index */ + ieee80211_keyix wk_rxkeyix; /* optional h/w rx key index */ u_int8_t wk_key[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; #define wk_txmic wk_key+IEEE80211_KEYBUF_SIZE+0 /* XXX can't () right */ #define wk_rxmic wk_key+IEEE80211_KEYBUF_SIZE+8 /* XXX can't () right */ @@ -103,7 +104,7 @@ struct ieee80211_key { #define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1) -#define IEEE80211_KEYIX_NONE ((u_int16_t) -1) +#define IEEE80211_KEYIX_NONE ((ieee80211_keyix) -1) #if defined(__KERNEL__) || defined(_KERNEL) @@ -120,10 +121,12 @@ struct mbuf; */ struct ieee80211_crypto_state { struct ieee80211_key cs_nw_keys[IEEE80211_WEP_NKID]; - u_int16_t cs_def_txkey; /* default/group tx key index */ + ieee80211_keyix cs_def_txkey; /* default/group tx key index */ + u_int16_t cs_max_keyix; /* max h/w key index */ int (*cs_key_alloc)(struct ieee80211com *, - const struct ieee80211_key *); + const struct ieee80211_key *, + ieee80211_keyix *, ieee80211_keyix *); int (*cs_key_delete)(struct ieee80211com *, const struct ieee80211_key *); int (*cs_key_set)(struct ieee80211com *, @@ -204,11 +207,11 @@ ieee80211_crypto_enmic(struct ieee80211com *ic, */ static __inline void ieee80211_crypto_resetkey(struct ieee80211com *ic, - struct ieee80211_key *k, u_int16_t ix) + struct ieee80211_key *k, ieee80211_keyix ix) { k->wk_cipher = &ieee80211_cipher_none;; k->wk_private = k->wk_cipher->ic_attach(ic, k); - k->wk_keyix = ix; + k->wk_keyix = k->wk_rxkeyix = ix; k->wk_flags = IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV; } |