[PATCH] ieee80211: Mixed PTK/GTK CCMP/TKIP support
authorJames Ketrenos <jketreno@linux.intel.com>
Wed, 21 Sep 2005 16:58:32 +0000 (11:58 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 22 Sep 2005 03:04:57 +0000 (23:04 -0400)
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>
include/net/ieee80211.h
net/ieee80211/ieee80211_module.c
net/ieee80211/ieee80211_rx.c
net/ieee80211/ieee80211_wx.c

index 931737eec6c67e88e968272bcd127a1e185e4e5c..ef85a96fce496e48b65b8abfa4262b0a3b440a91 100644 (file)
@@ -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 */
 
index dddc61647390a3fb69d2124c78d2a14e54ae83de..941f1a13fafac2ca49284c3661a73144ef6b3ec6 100644 (file)
@@ -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
index 8bcdbabae3a1ed3f3034ab262ea3bfa3878aa8cb..65315bcd6e0a0d245c33426b73ee0c65fd4fda51 100644 (file)
@@ -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;
@@ -1066,7 +1067,7 @@ static inline int ieee80211_network_init(struct ieee80211_device *ieee, struct i
        network->flags = 0;
        network->atim_window = 0;
        network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ?
-               0x3 : 0x0;
+           0x3 : 0x0;
 
        if (stats->freq == IEEE80211_52GHZ_BAND) {
                /* for A band (No DS info) */
index db66217699d517db6201a2f52e96cbd5bde14785..d710f47c4bd5869c703e9e315820d8296d266cf1 100644 (file)
@@ -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)