123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- From: Hante Meuleman <hante.meuleman@broadcom.com>
- Date: Wed, 17 Feb 2016 11:27:09 +0100
- Subject: [PATCH] brcmfmac: integrate add_keyext in add_key
- brcmf_add_keyext is called when a key is configured for a specific
- mac address. This function is very similar to the calling function
- brcmf_add_key. Integrate this function and also use existing del_key
- function in case key is to be cleared.
- Reviewed-by: Arend Van Spriel <arend.van@broadcom.com>
- Reviewed-by: Franky (Zhenhui) Lin <franky.lin@broadcom.com>
- Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
- Signed-off-by: Hante Meuleman <hante.meuleman@broadcom.com>
- Signed-off-by: Arend van Spriel <arend@broadcom.com>
- Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
- ---
- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
- +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
- @@ -2073,84 +2073,34 @@ done:
- }
-
- static s32
- -brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev,
- - u8 key_idx, const u8 *mac_addr, struct key_params *params)
- +brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
- + u8 key_idx, bool pairwise, const u8 *mac_addr)
- {
- struct brcmf_if *ifp = netdev_priv(ndev);
- struct brcmf_wsec_key key;
- s32 err = 0;
- - u8 keybuf[8];
- +
- + brcmf_dbg(TRACE, "Enter\n");
- + if (!check_vif_up(ifp->vif))
- + return -EIO;
- +
- + if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
- + /* we ignore this key index in this case */
- + return -EINVAL;
- + }
-
- memset(&key, 0, sizeof(key));
- - key.index = (u32) key_idx;
- - /* Instead of bcast for ea address for default wep keys,
- - driver needs it to be Null */
- - if (!is_multicast_ether_addr(mac_addr))
- - memcpy((char *)&key.ea, (void *)mac_addr, ETH_ALEN);
- - key.len = (u32) params->key_len;
- - /* check for key index change */
- - if (key.len == 0) {
- - /* key delete */
- - err = send_key_to_dongle(ifp, &key);
- - if (err)
- - brcmf_err("key delete error (%d)\n", err);
- - } else {
- - if (key.len > sizeof(key.data)) {
- - brcmf_err("Invalid key length (%d)\n", key.len);
- - return -EINVAL;
- - }
-
- - brcmf_dbg(CONN, "Setting the key index %d\n", key.index);
- - memcpy(key.data, params->key, key.len);
- + key.index = (u32)key_idx;
- + key.flags = BRCMF_PRIMARY_KEY;
- + key.algo = CRYPTO_ALGO_OFF;
-
- - if (!brcmf_is_apmode(ifp->vif) &&
- - (params->cipher == WLAN_CIPHER_SUITE_TKIP)) {
- - brcmf_dbg(CONN, "Swapping RX/TX MIC key\n");
- - memcpy(keybuf, &key.data[24], sizeof(keybuf));
- - memcpy(&key.data[24], &key.data[16], sizeof(keybuf));
- - memcpy(&key.data[16], keybuf, sizeof(keybuf));
- - }
- + brcmf_dbg(CONN, "key index (%d)\n", key_idx);
-
- - /* if IW_ENCODE_EXT_RX_SEQ_VALID set */
- - if (params->seq && params->seq_len == 6) {
- - /* rx iv */
- - u8 *ivptr;
- - ivptr = (u8 *) params->seq;
- - key.rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) |
- - (ivptr[3] << 8) | ivptr[2];
- - key.rxiv.lo = (ivptr[1] << 8) | ivptr[0];
- - key.iv_initialized = true;
- - }
- + /* Set the new key/index */
- + err = send_key_to_dongle(ifp, &key);
-
- - switch (params->cipher) {
- - case WLAN_CIPHER_SUITE_WEP40:
- - key.algo = CRYPTO_ALGO_WEP1;
- - brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n");
- - break;
- - case WLAN_CIPHER_SUITE_WEP104:
- - key.algo = CRYPTO_ALGO_WEP128;
- - brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n");
- - break;
- - case WLAN_CIPHER_SUITE_TKIP:
- - key.algo = CRYPTO_ALGO_TKIP;
- - brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n");
- - break;
- - case WLAN_CIPHER_SUITE_AES_CMAC:
- - key.algo = CRYPTO_ALGO_AES_CCM;
- - brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n");
- - break;
- - case WLAN_CIPHER_SUITE_CCMP:
- - key.algo = CRYPTO_ALGO_AES_CCM;
- - brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_CCMP\n");
- - break;
- - default:
- - brcmf_err("Invalid cipher (0x%x)\n", params->cipher);
- - return -EINVAL;
- - }
- - err = send_key_to_dongle(ifp, &key);
- - if (err)
- - brcmf_err("wsec_key error (%d)\n", err);
- - }
- + brcmf_dbg(TRACE, "Exit\n");
- return err;
- }
-
- @@ -2163,8 +2113,9 @@ brcmf_cfg80211_add_key(struct wiphy *wip
- struct brcmf_wsec_key *key;
- s32 val;
- s32 wsec;
- - s32 err = 0;
- + s32 err;
- u8 keybuf[8];
- + bool ext_key;
-
- brcmf_dbg(TRACE, "Enter\n");
- brcmf_dbg(CONN, "key index (%d)\n", key_idx);
- @@ -2177,27 +2128,32 @@ brcmf_cfg80211_add_key(struct wiphy *wip
- return -EINVAL;
- }
-
- - if (mac_addr &&
- - (params->cipher != WLAN_CIPHER_SUITE_WEP40) &&
- - (params->cipher != WLAN_CIPHER_SUITE_WEP104)) {
- - brcmf_dbg(TRACE, "Exit");
- - return brcmf_add_keyext(wiphy, ndev, key_idx, mac_addr, params);
- - }
- -
- - key = &ifp->vif->profile.key[key_idx];
- - memset(key, 0, sizeof(*key));
- + if (params->key_len == 0)
- + return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise,
- + mac_addr);
-
- if (params->key_len > sizeof(key->data)) {
- brcmf_err("Too long key length (%u)\n", params->key_len);
- - err = -EINVAL;
- - goto done;
- + return -EINVAL;
- + }
- +
- + ext_key = false;
- + if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) &&
- + (params->cipher != WLAN_CIPHER_SUITE_WEP104)) {
- + brcmf_dbg(TRACE, "Ext key, mac %pM", mac_addr);
- + ext_key = true;
- }
- +
- + key = &ifp->vif->profile.key[key_idx];
- + memset(key, 0, sizeof(*key));
- + if ((ext_key) && (!is_multicast_ether_addr(mac_addr)))
- + memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN);
- key->len = params->key_len;
- key->index = key_idx;
- -
- memcpy(key->data, params->key, key->len);
- + if (!ext_key)
- + key->flags = BRCMF_PRIMARY_KEY;
-
- - key->flags = BRCMF_PRIMARY_KEY;
- switch (params->cipher) {
- case WLAN_CIPHER_SUITE_WEP40:
- key->algo = CRYPTO_ALGO_WEP1;
- @@ -2237,7 +2193,7 @@ brcmf_cfg80211_add_key(struct wiphy *wip
- }
-
- err = send_key_to_dongle(ifp, key);
- - if (err)
- + if (ext_key || err)
- goto done;
-
- err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
- @@ -2256,38 +2212,6 @@ done:
- brcmf_dbg(TRACE, "Exit\n");
- return err;
- }
- -
- -static s32
- -brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
- - u8 key_idx, bool pairwise, const u8 *mac_addr)
- -{
- - struct brcmf_if *ifp = netdev_priv(ndev);
- - struct brcmf_wsec_key key;
- - s32 err = 0;
- -
- - brcmf_dbg(TRACE, "Enter\n");
- - if (!check_vif_up(ifp->vif))
- - return -EIO;
- -
- - if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
- - /* we ignore this key index in this case */
- - return -EINVAL;
- - }
- -
- - memset(&key, 0, sizeof(key));
- -
- - key.index = (u32) key_idx;
- - key.flags = BRCMF_PRIMARY_KEY;
- - key.algo = CRYPTO_ALGO_OFF;
- -
- - brcmf_dbg(CONN, "key index (%d)\n", key_idx);
- -
- - /* Set the new key/index */
- - err = send_key_to_dongle(ifp, &key);
- -
- - brcmf_dbg(TRACE, "Exit\n");
- - return err;
- -}
-
- static s32
- brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|