}
 
 static ieee80211_txrx_result
-ieee80211_rx_h_wep_decrypt(struct ieee80211_txrx_data *rx)
+ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
 {
-       if ((rx->key && rx->key->conf.alg != ALG_WEP) ||
-           !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
-           ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
-            ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
-             (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH)))
+       if (!(rx->fc & IEEE80211_FCTL_PROTECTED))
                return TXRX_CONTINUE;
 
        if (!rx->key) {
                if (net_ratelimit())
-                       printk(KERN_DEBUG "%s: RX WEP frame, but no key set\n",
-                              rx->dev->name);
+                       printk(KERN_DEBUG "%s: RX protected frame,"
+                              " but have no key\n", rx->dev->name);
                return TXRX_DROP;
        }
 
-       if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) {
-               if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) {
-                       if (net_ratelimit())
-                               printk(KERN_DEBUG "%s: RX WEP frame, decrypt "
-                                      "failed\n", rx->dev->name);
-                       return TXRX_DROP;
-               }
-       } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) {
-               ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
-               /* remove ICV */
-               skb_trim(rx->skb, rx->skb->len - 4);
+       switch (rx->key->conf.alg) {
+       case ALG_WEP:
+               return ieee80211_crypto_wep_decrypt(rx);
+       case ALG_TKIP:
+               return ieee80211_crypto_tkip_decrypt(rx);
+       case ALG_CCMP:
+               return ieee80211_crypto_ccmp_decrypt(rx);
+       case ALG_NONE:
+               return TXRX_CONTINUE;
        }
 
-       return TXRX_CONTINUE;
+       /* not reached */
+       WARN_ON(1);
+       return TXRX_DROP;
 }
 
 static inline struct ieee80211_fragment_entry *
        ieee80211_rx_h_check,
        ieee80211_rx_h_load_key,
        ieee80211_rx_h_sta_process,
-       ieee80211_rx_h_ccmp_decrypt,
-       ieee80211_rx_h_tkip_decrypt,
        ieee80211_rx_h_wep_weak_iv_detection,
-       ieee80211_rx_h_wep_decrypt,
+       ieee80211_rx_h_decrypt,
        ieee80211_rx_h_defragment,
        ieee80211_rx_h_ps_poll,
        ieee80211_rx_h_michael_mic_verify,
 
 }
 
 
-void ieee80211_wep_get_iv(struct ieee80211_local *local,
-                         struct ieee80211_key *key, u8 *iv)
+static void ieee80211_wep_get_iv(struct ieee80211_local *local,
+                                struct ieee80211_key *key, u8 *iv)
 {
        local->wep_iv++;
        if (ieee80211_wep_weak_iv(local->wep_iv, key->conf.keylen))
 }
 
 
-void ieee80211_wep_remove_iv(struct ieee80211_local *local,
-                            struct sk_buff *skb,
-                            struct ieee80211_key *key)
+static void ieee80211_wep_remove_iv(struct ieee80211_local *local,
+                                   struct sk_buff *skb,
+                                   struct ieee80211_key *key)
 {
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        u16 fc;
 
        return NULL;
 }
+
+ieee80211_txrx_result
+ieee80211_crypto_wep_decrypt(struct ieee80211_txrx_data *rx)
+{
+       if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
+           ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
+            (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))
+               return TXRX_CONTINUE;
+
+       if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) {
+               if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) {
+                       if (net_ratelimit())
+                               printk(KERN_DEBUG "%s: RX WEP frame, decrypt "
+                                      "failed\n", rx->dev->name);
+                       return TXRX_DROP;
+               }
+       } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) {
+               ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
+               /* remove ICV */
+               skb_trim(rx->skb, rx->skb->len - 4);
+       }
+
+       return TXRX_CONTINUE;
+}
 
 
 int ieee80211_wep_init(struct ieee80211_local *local);
 void ieee80211_wep_free(struct ieee80211_local *local);
-void ieee80211_wep_get_iv(struct ieee80211_local *local,
-                         struct ieee80211_key *key, u8 *iv);
 u8 * ieee80211_wep_add_iv(struct ieee80211_local *local,
                          struct sk_buff *skb,
                          struct ieee80211_key *key);
-void ieee80211_wep_remove_iv(struct ieee80211_local *local,
-                            struct sk_buff *skb,
-                            struct ieee80211_key *key);
 void ieee80211_wep_encrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
                                size_t klen, u8 *data, size_t data_len);
 int ieee80211_wep_decrypt_data(struct crypto_blkcipher *tfm, u8 *rc4key,
 int ieee80211_wep_get_keyidx(struct sk_buff *skb);
 u8 * ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key);
 
+ieee80211_txrx_result
+ieee80211_crypto_wep_decrypt(struct ieee80211_txrx_data *rx);
+
 #endif /* WEP_H */
 
 
 
 ieee80211_txrx_result
-ieee80211_rx_h_tkip_decrypt(struct ieee80211_txrx_data *rx)
+ieee80211_crypto_tkip_decrypt(struct ieee80211_txrx_data *rx)
 {
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
        u16 fc;
        fc = le16_to_cpu(hdr->frame_control);
        hdrlen = ieee80211_get_hdrlen(fc);
 
-       if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
-           !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
-           (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
+       if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
                return TXRX_CONTINUE;
 
        if (!rx->sta || skb->len - hdrlen < 12)
 
 
 ieee80211_txrx_result
-ieee80211_rx_h_ccmp_decrypt(struct ieee80211_txrx_data *rx)
+ieee80211_crypto_ccmp_decrypt(struct ieee80211_txrx_data *rx)
 {
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
        u16 fc;
        fc = le16_to_cpu(hdr->frame_control);
        hdrlen = ieee80211_get_hdrlen(fc);
 
-       if (!key || key->conf.alg != ALG_CCMP ||
-           !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
-           (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
+       if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
                return TXRX_CONTINUE;
 
        data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN;
 
 ieee80211_txrx_result
 ieee80211_tx_h_tkip_encrypt(struct ieee80211_txrx_data *tx);
 ieee80211_txrx_result
-ieee80211_rx_h_tkip_decrypt(struct ieee80211_txrx_data *rx);
+ieee80211_crypto_tkip_decrypt(struct ieee80211_txrx_data *rx);
 
 ieee80211_txrx_result
 ieee80211_tx_h_ccmp_encrypt(struct ieee80211_txrx_data *tx);
 ieee80211_txrx_result
-ieee80211_rx_h_ccmp_decrypt(struct ieee80211_txrx_data *rx);
+ieee80211_crypto_ccmp_decrypt(struct ieee80211_txrx_data *rx);
 
 #endif /* WPA_H */