source: trunk/package/mac80211/patches/571-ath9k_assign_unencrypted_ps_keyidx.patch @ 26712

Last change on this file since 26712 was 26712, checked in by nbd, 6 years ago

ath9k: assign a keycache slot per station for unencrypted links to fix powersave frame filtering

File size: 3.4 KB
  • drivers/net/wireless/ath/ath9k/ath9k.h

    a b struct ath_node { 
    256256#endif 
    257257        struct ath_atx_tid tid[WME_NUM_TID]; 
    258258        struct ath_atx_ac ac[WME_NUM_AC]; 
     259        int ps_key; 
     260 
    259261        u16 maxampdu; 
    260262        u8 mpdudensity; 
    261263 
  • drivers/net/wireless/ath/ath9k/main.c

    a b static int ath9k_sta_add(struct ieee8021 
    17751775                         struct ieee80211_sta *sta) 
    17761776{ 
    17771777        struct ath_softc *sc = hw->priv; 
     1778        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     1779        struct ath_node *an = (struct ath_node *) sta->drv_priv; 
     1780        struct ieee80211_key_conf ps_key = { }; 
    17781781 
    17791782        ath_node_attach(sc, sta); 
     1783        an->ps_key = ath_key_config(common, vif, sta, &ps_key); 
    17801784 
    17811785        return 0; 
    17821786} 
    17831787 
     1788static void ath9k_del_ps_key(struct ath_softc *sc, 
     1789                             struct ieee80211_vif *vif, 
     1790                             struct ieee80211_sta *sta) 
     1791{ 
     1792        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     1793        struct ath_node *an = (struct ath_node *) sta->drv_priv; 
     1794        struct ieee80211_key_conf ps_key = { .hw_key_idx = an->ps_key }; 
     1795 
     1796        if (!an->ps_key) 
     1797            return; 
     1798 
     1799        ath_key_delete(common, &ps_key); 
     1800} 
     1801 
    17841802static int ath9k_sta_remove(struct ieee80211_hw *hw, 
    17851803                            struct ieee80211_vif *vif, 
    17861804                            struct ieee80211_sta *sta) 
    17871805{ 
    17881806        struct ath_softc *sc = hw->priv; 
    17891807 
     1808        ath9k_del_ps_key(sc, vif, sta); 
    17901809        ath_node_detach(sc, sta); 
    17911810 
    17921811        return 0; 
    static int ath9k_set_key(struct ieee8021 
    18891908 
    18901909        switch (cmd) { 
    18911910        case SET_KEY: 
     1911                if (sta) 
     1912                        ath9k_del_ps_key(sc, vif, sta); 
     1913 
    18921914                ret = ath_key_config(common, vif, sta, key); 
    18931915                if (ret >= 0) { 
    18941916                        key->hw_key_idx = ret; 
  • drivers/net/wireless/ath/key.c

    a b int ath_key_config(struct ath_common *co 
    483483        memset(&hk, 0, sizeof(hk)); 
    484484 
    485485        switch (key->cipher) { 
     486        case 0: 
     487                hk.kv_type = ATH_CIPHER_CLR; 
     488                break; 
    486489        case WLAN_CIPHER_SUITE_WEP40: 
    487490        case WLAN_CIPHER_SUITE_WEP104: 
    488491                hk.kv_type = ATH_CIPHER_WEP; 
    int ath_key_config(struct ath_common *co 
    498501        } 
    499502 
    500503        hk.kv_len = key->keylen; 
    501         memcpy(hk.kv_val, key->key, key->keylen); 
     504        if (key->keylen) 
     505                memcpy(hk.kv_val, key->key, key->keylen); 
    502506 
    503507        if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { 
    504508                switch (vif->type) { 
  • drivers/net/wireless/ath/ath9k/xmit.c

    a b static void setup_frame_info(struct ieee 
    15261526        struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; 
    15271527        struct ieee80211_hdr *hdr; 
    15281528        struct ath_frame_info *fi = get_frame_info(skb); 
    1529         struct ath_node *an; 
     1529        struct ath_node *an = NULL; 
    15301530        struct ath_atx_tid *tid; 
    15311531        enum ath9k_key_type keytype; 
    15321532        u16 seqno = 0; 
    static void setup_frame_info(struct ieee 
    15341534 
    15351535        keytype = ath9k_cmn_get_hw_crypto_keytype(skb); 
    15361536 
     1537        if (sta) 
     1538                an = (struct ath_node *) sta->drv_priv; 
     1539 
    15371540        hdr = (struct ieee80211_hdr *)skb->data; 
    1538         if (sta && ieee80211_is_data_qos(hdr->frame_control) && 
     1541        if (an && ieee80211_is_data_qos(hdr->frame_control) && 
    15391542                conf_is_ht(&hw->conf) && (sc->sc_flags & SC_OP_TXAGGR)) { 
    15401543 
    1541                 an = (struct ath_node *) sta->drv_priv; 
    15421544                tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
    15431545 
    15441546                /* 
    static void setup_frame_info(struct ieee 
    15541556        memset(fi, 0, sizeof(*fi)); 
    15551557        if (hw_key) 
    15561558                fi->keyix = hw_key->hw_key_idx; 
     1559        else if (an && ieee80211_is_data(hdr->frame_control) && an->ps_key > 0) 
     1560                fi->keyix = an->ps_key; 
    15571561        else 
    15581562                fi->keyix = ATH9K_TXKEYIX_INVALID; 
    15591563        fi->keytype = keytype; 
Note: See TracBrowser for help on using the repository browser.