staging: wfx: simplify handling of encrypted frames
authorJérôme Pouiller <jerome.pouiller@silabs.com>
Wed, 1 Jul 2020 15:07:04 +0000 (17:07 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Jul 2020 08:33:07 +0000 (10:33 +0200)
We don't want mac80211 try to check MMIC and other security mechanisms.
So, the driver remove all the data related to the encryption (IV, ICV,
MMIC).

However, enabling RX_FLAG_PN_VALIDATED is sufficient for that.

So, drop the useless function wfx_drop_encrypt_data() and enable
RX_FLAG_PN_VALIDATED.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200701150707.222985-11-Jerome.Pouiller@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/data_rx.c

index 316c2f1..60e2e5c 100644 (file)
 #include "bh.h"
 #include "sta.h"
 
-static int wfx_drop_encrypt_data(struct wfx_dev *wdev,
-                                const struct hif_ind_rx *arg,
-                                struct sk_buff *skb)
-{
-       struct ieee80211_hdr *frame = (struct ieee80211_hdr *)skb->data;
-       size_t hdrlen = ieee80211_hdrlen(frame->frame_control);
-       size_t iv_len, icv_len;
-
-       /* Oops... There is no fast way to ask mac80211 about
-        * IV/ICV lengths. Even defineas are not exposed.
-        */
-       switch (arg->rx_flags.encryp) {
-       case HIF_RI_FLAGS_WEP_ENCRYPTED:
-               iv_len = 4 /* WEP_IV_LEN */;
-               icv_len = 4 /* WEP_ICV_LEN */;
-               break;
-       case HIF_RI_FLAGS_TKIP_ENCRYPTED:
-               iv_len = 8 /* TKIP_IV_LEN */;
-               icv_len = 4 /* TKIP_ICV_LEN */
-                       + 8 /*MICHAEL_MIC_LEN*/;
-               break;
-       case HIF_RI_FLAGS_AES_ENCRYPTED:
-               iv_len = 8 /* CCMP_HDR_LEN */;
-               icv_len = 8 /* CCMP_MIC_LEN */;
-               break;
-       case HIF_RI_FLAGS_WAPI_ENCRYPTED:
-               iv_len = 18 /* WAPI_HDR_LEN */;
-               icv_len = 16 /* WAPI_MIC_LEN */;
-               break;
-       default:
-               dev_err(wdev->dev, "unknown encryption type %d\n",
-                       arg->rx_flags.encryp);
-               return -EIO;
-       }
-
-       /* Firmware strips ICV in case of MIC failure. */
-       if (arg->status == HIF_STATUS_RX_FAIL_MIC)
-               icv_len = 0;
-
-       if (skb->len < hdrlen + iv_len + icv_len) {
-               dev_warn(wdev->dev, "malformed SDU received\n");
-               return -EIO;
-       }
-
-       /* Remove IV, ICV and MIC */
-       skb_trim(skb, skb->len - icv_len);
-       memmove(skb->data + iv_len, skb->data, hdrlen);
-       skb_pull(skb, iv_len);
-       return 0;
-}
-
 void wfx_rx_cb(struct wfx_vif *wvif,
               const struct hif_ind_rx *arg, struct sk_buff *skb)
 {
@@ -103,13 +52,8 @@ void wfx_rx_cb(struct wfx_vif *wvif,
        hdr->signal = arg->rcpi_rssi / 2 - 110;
        hdr->antenna = 0;
 
-       if (arg->rx_flags.encryp) {
-               if (wfx_drop_encrypt_data(wvif->wdev, arg, skb))
-                       goto drop;
-               hdr->flag |= RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED;
-               if (arg->rx_flags.encryp == HIF_RI_FLAGS_TKIP_ENCRYPTED)
-                       hdr->flag |= RX_FLAG_MMIC_STRIPPED;
-       }
+       if (arg->rx_flags.encryp)
+               hdr->flag |= RX_FLAG_DECRYPTED | RX_FLAG_PN_VALIDATED;
 
        /* Filter block ACK negotiation: fully controlled by firmware */
        if (ieee80211_is_action(frame->frame_control) &&