[PATCH 1/2] Configure bss when encryption is set

Eugene Krasnikov k.eugene.e at gmail.com
Wed Jun 26 06:57:33 EDT 2013


and pull request https://github.com/KrasnikovEugene/wcn36xx/pull/60

2013/6/26 Eugene Krasnikov <k.eugene.e at gmail.com>:
> Before setting keys update HW with encryption type.
>
> Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
> ---
>  main.c    | 21 ++++++++++++++-------
>  smd.c     |  2 +-
>  wcn36xx.h |  2 +-
>  3 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/main.c b/main.c
> index 00d6931..cd8d525 100644
> --- a/main.c
> +++ b/main.c
> @@ -355,7 +355,6 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>  {
>         struct wcn36xx *wcn = hw->priv;
>         int ret = 0;
> -       enum ani_ed_type enc_type;
>         wcn36xx_dbg(WCN36XX_DBG_MAC, "mac80211 set key");
>         wcn36xx_dbg(WCN36XX_DBG_MAC, "Key: cmd=0x%x algo:0x%x, "
>                     "id:%d, len:%d flags 0x%x",
> @@ -367,10 +366,10 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>
>         switch (key_conf->cipher) {
>         case WLAN_CIPHER_SUITE_CCMP:
> -               enc_type = WCN36XX_HAL_ED_CCMP;
> +               wcn->encrypt_type = WCN36XX_HAL_ED_CCMP;
>                 break;
>         case WLAN_CIPHER_SUITE_TKIP:
> -               enc_type = WCN36XX_HAL_ED_TKIP;
> +               wcn->encrypt_type = WCN36XX_HAL_ED_TKIP;
>                 break;
>         default:
>                 wcn36xx_error("Unsupported key type 0x%x",
> @@ -382,16 +381,24 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>
>         switch (cmd) {
>         case SET_KEY:
> +               /* Reconfigure bss with encrypt_type */
> +               if (IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)
> +                       wcn36xx_smd_config_bss(wcn,
> +                                              NL80211_IFTYPE_STATION,
> +                                              sta->addr,
> +                                              true,
> +                                              wcn->beacon_interval);
> +
>                 if (WCN36XX_STA_KEY == wcn->en_state) {
>                         wcn36xx_smd_set_stakey(wcn,
> -                               enc_type,
> +                               wcn->encrypt_type,
>                                 key_conf->keyidx,
>                                 key_conf->keylen,
>                                 key_conf->key);
>                         wcn->en_state = WCN36XX_BSS_KEY;
>                 } else {
>                         wcn36xx_smd_set_bsskey(wcn,
> -                               enc_type,
> +                               wcn->encrypt_type,
>                                 key_conf->keyidx,
>                                 key_conf->keylen,
>                                 key_conf->key);
> @@ -400,14 +407,14 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
>         case DISABLE_KEY:
>                 if (WCN36XX_BSS_KEY == wcn->en_state) {
>                         wcn36xx_smd_remove_bsskey(wcn,
> -                               enc_type,
> +                               wcn->encrypt_type,
>                                 key_conf->keyidx);
>                         wcn->en_state = WCN36XX_STA_KEY;
>                 } else {
>                         /* do not remove key if disassociated */
>                         if (wcn->aid)
>                                 wcn36xx_smd_remove_stakey(wcn,
> -                                                         enc_type,
> +                                                         wcn->encrypt_type,
>                                                           key_conf->keyidx);
>                 }
>                 break;
> diff --git a/smd.c b/smd.c
> index 2bb272a..1f64a67 100644
> --- a/smd.c
> +++ b/smd.c
> @@ -763,7 +763,7 @@ int wcn36xx_smd_config_bss(struct wcn36xx *wcn, enum nl80211_iftype type,
>                sizeof(wcn->supported_rates));
>
>         sta->rmf = 0;
> -       sta->encrypt_type = 0;
> +       sta->encrypt_type = wcn->encrypt_type;
>         sta->action = 0;
>         sta->uapsd = 0;
>         sta->max_sp_len = 0;
> diff --git a/wcn36xx.h b/wcn36xx.h
> index a81ef84..c0bf667 100644
> --- a/wcn36xx.h
> +++ b/wcn36xx.h
> @@ -116,7 +116,7 @@ struct wcn36xx {
>         u16                     aid;
>         struct wcn36xx_vif      *current_vif;
>         u16                     beacon_interval;
> -
> +       enum ani_ed_type        encrypt_type;
>         u8                      fw_revision;
>         u8                      fw_version;
>         u8                      fw_minor;
> --
> 1.7.11.3
>



-- 
Best regards,
Eugene



More information about the wcn36xx mailing list