PS3: gelic: Use the new PMK interface in the gelic driver
authorMasakazu Mokuno <mokuno@sm.sony.co.jp>
Fri, 30 May 2008 07:52:44 +0000 (16:52 +0900)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 3 Jun 2008 19:00:28 +0000 (15:00 -0400)
With the new WEXT flags, the PS3 wireless driver can tell the user space that
it would do handle 4-way handshake by itself and needs the PSK without private
ioctls.

Signed-off-by: Masakazu Mokuno <mokuno@sm.sony.co.jp>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/ps3_gelic_wireless.c

index 4bc6eaae23cafb450b8d91d316bfa672c70a3e68..5f698099e9b7029743ac0e5231d8bf7aefd2db7f 100644 (file)
@@ -350,7 +350,8 @@ static int gelic_wl_get_range(struct net_device *netdev,
 
        /* encryption capability */
        range->enc_capa = IW_ENC_CAPA_WPA |
-               IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
+               IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP |
+               IW_ENC_CAPA_4WAY_HANDSHAKE;
        if (wpa2_capable())
                range->enc_capa |= IW_ENC_CAPA_WPA2;
        range->encoding_size[0] = 5;    /* 40bit WEP */
@@ -1256,42 +1257,19 @@ static int gelic_wl_set_encodeext(struct net_device *netdev,
                set_bit(key_index, &wl->key_enabled);
                /* remember wep info changed */
                set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
-       } else if ((alg == IW_ENCODE_ALG_TKIP) || (alg == IW_ENCODE_ALG_CCMP)) {
-               pr_debug("%s: TKIP/CCMP requested alg=%d\n", __func__, alg);
-               /* check key length */
-               if (IW_ENCODING_TOKEN_MAX < ext->key_len) {
-                       pr_info("%s: key is too long %d\n", __func__,
-                               ext->key_len);
+       } else if (alg == IW_ENCODE_ALG_PMK) {
+               if (ext->key_len != WPA_PSK_LEN) {
+                       pr_err("%s: PSK length wrong %d\n", __func__,
+                              ext->key_len);
                        ret = -EINVAL;
                        goto done;
                }
-               if (alg == IW_ENCODE_ALG_CCMP) {
-                       pr_debug("%s: AES selected\n", __func__);
-                       wl->group_cipher_method = GELIC_WL_CIPHER_AES;
-                       wl->pairwise_cipher_method = GELIC_WL_CIPHER_AES;
-                       wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA2;
-               } else {
-                       pr_debug("%s: TKIP selected, WPA forced\n", __func__);
-                       wl->group_cipher_method = GELIC_WL_CIPHER_TKIP;
-                       wl->pairwise_cipher_method = GELIC_WL_CIPHER_TKIP;
-                       /* FIXME: how do we do if WPA2 + TKIP? */
-                       wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA;
-               }
-               if (flags & IW_ENCODE_RESTRICTED)
-                       BUG();
-               wl->auth_method = GELIC_EURUS_AUTH_OPEN;
-               /* We should use same key for both and unicast */
-               if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
-                       pr_debug("%s: group key \n", __func__);
-               else
-                       pr_debug("%s: unicast key \n", __func__);
-               /* OK, update the key */
-               wl->key_len[key_index] = ext->key_len;
-               memset(wl->key[key_index], 0, IW_ENCODING_TOKEN_MAX);
-               memcpy(wl->key[key_index], ext->key, ext->key_len);
-               set_bit(key_index, &wl->key_enabled);
-               /* remember info changed */
-               set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
+               memset(wl->psk, 0, sizeof(wl->psk));
+               memcpy(wl->psk, ext->key, ext->key_len);
+               wl->psk_len = ext->key_len;
+               wl->psk_type = GELIC_EURUS_WPA_PSK_BIN;
+               /* remember PSK configured */
+               set_bit(GELIC_WL_STAT_WPA_PSK_SET, &wl->stat);
        }
 done:
        spin_unlock_irqrestore(&wl->lock, irqflag);