[PATCH] ieee80211: Mixed PTK/GTK CCMP/TKIP support
tree 5c7559a1216ae1121487f6aed94a6017490729b3 parent c1ff4c22e5622c8987bf96c09158c4924cde98c2 author Hong Liu <hong.liu@intel.com> 1125482767 +0800 committer James Ketrenos <jketreno@linux.intel.com> 1127314427 -0500 Mixed PTK/GTK CCMP/TKIP support. Signed-off-by: Hong Liu <hong.liu@intel.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
parent
42c94e43be
commit
ccd0fda3a6
|
@ -851,6 +851,9 @@ struct ieee80211_device {
|
|||
int host_encrypt;
|
||||
int host_encrypt_msdu;
|
||||
int host_decrypt;
|
||||
/* host performs multicast decryption */
|
||||
int host_mc_decrypt;
|
||||
|
||||
int host_open_frag;
|
||||
int ieee802_1x; /* is IEEE 802.1X used */
|
||||
|
||||
|
|
|
@ -133,6 +133,8 @@ struct net_device *alloc_ieee80211(int sizeof_priv)
|
|||
/* Default to enabling full open WEP with host based encrypt/decrypt */
|
||||
ieee->host_encrypt = 1;
|
||||
ieee->host_decrypt = 1;
|
||||
ieee->host_mc_decrypt = 1;
|
||||
|
||||
/* Host fragementation in Open mode. Default is enabled.
|
||||
* Note: host fragmentation is always enabled if host encryption
|
||||
* is enabled. For cards can do hardware encryption, they must do
|
||||
|
|
|
@ -409,7 +409,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (ieee->host_decrypt) {
|
||||
if (is_multicast_ether_addr(hdr->addr1) ? ieee->host_mc_decrypt :
|
||||
ieee->host_decrypt) {
|
||||
int idx = 0;
|
||||
if (skb->len >= hdrlen + 3)
|
||||
idx = skb->data[hdrlen + 3] >> 6;
|
||||
|
|
|
@ -493,6 +493,7 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
|
|||
struct iw_point *encoding = &wrqu->encoding;
|
||||
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
|
||||
int i, idx, ret = 0;
|
||||
int group_key = 0;
|
||||
const char *alg, *module;
|
||||
struct ieee80211_crypto_ops *ops;
|
||||
struct ieee80211_crypt_data **crypt;
|
||||
|
@ -509,9 +510,10 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
|
|||
} else
|
||||
idx = ieee->tx_keyidx;
|
||||
|
||||
if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
|
||||
if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
|
||||
crypt = &ieee->crypt[idx];
|
||||
else {
|
||||
group_key = 1;
|
||||
} else {
|
||||
if (idx != 0)
|
||||
return -EINVAL;
|
||||
if (ieee->iw_mode == IW_MODE_INFRA)
|
||||
|
@ -542,7 +544,9 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
|
|||
sec.enabled = 1;
|
||||
sec.encrypt = 1;
|
||||
|
||||
if (!(ieee->host_encrypt || ieee->host_decrypt))
|
||||
if (group_key ? !ieee->host_mc_decrypt :
|
||||
!(ieee->host_encrypt || ieee->host_decrypt ||
|
||||
ieee->host_encrypt_msdu))
|
||||
goto skip_host_crypt;
|
||||
|
||||
switch (ext->alg) {
|
||||
|
@ -632,6 +636,9 @@ int ieee80211_wx_set_encodeext(struct ieee80211_device *ieee,
|
|||
sec.flags |= SEC_LEVEL;
|
||||
sec.level = SEC_LEVEL_3;
|
||||
}
|
||||
/* Don't set sec level for group keys. */
|
||||
if (group_key)
|
||||
sec.flags &= ~SEC_LEVEL;
|
||||
}
|
||||
done:
|
||||
if (ieee->set_security)
|
||||
|
|
Loading…
Reference in New Issue