Received: by 10.223.185.111 with SMTP id b44csp523315wrg; Fri, 9 Mar 2018 08:49:56 -0800 (PST) X-Google-Smtp-Source: AG47ELvMWgYiqn6gJKJBV5A8NbmYlqAhhgB2X71jaQmA/2hyFKGQvTOGFfXdwSvAfGHeyY7MsWG0 X-Received: by 2002:a17:902:aa89:: with SMTP id d9-v6mr28586413plr.337.1520614195945; Fri, 09 Mar 2018 08:49:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520614195; cv=none; d=google.com; s=arc-20160816; b=Ubj1oESsRVy4feO4PDFD1azLk+Lp3gJh/g8ANFHwbkH8U9T1RWXBrcf2JStXhNJxM/ NdQYTxjoCVnn5QzL4o0TQI7zLx3yukA4PTs1EVIfcR5RvinNbNfsQymittsdRja2xge3 bJy1r6YRCsTgtt7nbndq/6JsN39Wr1YQOJ+N76JVOy1rfT7U/AsOHrT6rYzR3r68BNDi l03Fb4cPRLRHMEx1jRFm30oRxU0BijTkj5JD80ZarS+DLCi8llXW5V+VPO7tHvP4iyVc QS6eEuoxvScK9a//TqrP08rt1/wJs116sGjZKg162nV6H97O15aIahUkAkhvPvXTYZfc CYtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=EAEKkJZEwjbJM2Srf3VwfwlAq3xBE/C+w3aKjFAeep4=; b=m7tJtPUFr1nSy3AEwTaECrawB2SbEqL/sdyDTF9FrYEUBMffMWFlEKdyIhkKYyCQke 89nH94UjmHVoTY3yQID7Ay1R9yFgcNfVT2HKgJDa7uc0iMao7URLXro2d6PwmLTH61d5 a3WajvZ6/VJ9S51QFxJmSku3ErB6FOUo9PTcGEG7ep7uZDJWQDHlejGjXgCy6GeUT/TC 8sjmpaAow47nZuyXGbDOsTbRKZfrA2YthUzWBpqel6nSeFvFHdldSyq7ZNqa7xCYZ1zm pG7aVP42Qu2pxuy8TalKZOvv1b7VsarnPrQt3fpGeaRbgJkqJH5RmYkVfUfggXZAZNlE lBJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=jat954iu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y8-v6si1130583plt.378.2018.03.09.08.49.41; Fri, 09 Mar 2018 08:49:55 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=jat954iu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932131AbeCIQst (ORCPT + 99 others); Fri, 9 Mar 2018 11:48:49 -0500 Received: from mail-lf0-f65.google.com ([209.85.215.65]:33657 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751159AbeCIQsr (ORCPT ); Fri, 9 Mar 2018 11:48:47 -0500 Received: by mail-lf0-f65.google.com with SMTP id o145-v6so14092516lff.0 for ; Fri, 09 Mar 2018 08:48:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=EAEKkJZEwjbJM2Srf3VwfwlAq3xBE/C+w3aKjFAeep4=; b=jat954iusSqie+ssxFqR2mFVIloWo4P/sSTvFlXaG8AcEdLy/1c5+5mc4oVB2dI8EM V65xdmGtzPJyINP50gtnVt9IM086gZY58RjFWnijpYjuCpl83/03g8AXi5fbeS95FvNc UxKzAUfRln2495VLUC8NUYcBYFc9Dv2er2DKCw4XxbDDIllqFbH1PucUb26xuGfpyyhP dywL2ibk7mj3wbLBA3uUrtk4AbLrDiDWhyBgxEtau9aKJdQGgNulGnMIHsX5KYlkxq5z b2kFv1al7Igxbz32BLxWtxU5dCOMlNLBIkwedkNgjt4rtS+U5am5RfhMSRVQFodfDGiY VrKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=EAEKkJZEwjbJM2Srf3VwfwlAq3xBE/C+w3aKjFAeep4=; b=piZ9fgzUhYUhrh3zQQ4f5x6N7J9k82wnvG6kHs47QE1IGONOE74l1pXePEYRJw0v0H q9vUzLyqoahGPzb6O9JJSTjgU4PEQqtOnHFw5GfDHdFU7u4ySUu+8gmOesM0hmjnHf6Z ICGzd1BE4ZDQYjJ3BA8N2IVHXKI3T2cz3cBq/afmtMP9CeGRMEBkWJLchC5m+/nbZ631 nT9+GAUSS1itlIQBFEVAYZlBJDUBHYhELZ3PvwJCJEDGjtw9Mxr6dFuS9E7khlpl1SxS tbyzDsP7Rz7XSnbAnQ2LKHPj8/5FeSIAd0WQJm36AmHas+wMpI/7I2/0qQYtKOvy96/9 FYHQ== X-Gm-Message-State: AElRT7GCuOLzQs9T2wGcdISLn3/9YoKg4Ees6LdnVzqqa+y9mZjINbdq rW2j6tnwUsNBCkhDWDqZQjM= X-Received: by 10.25.81.141 with SMTP id g13mr20880864lfl.19.1520614125637; Fri, 09 Mar 2018 08:48:45 -0800 (PST) Received: from alpha (ppp89-110-25-51.pppoe.avangarddsl.ru. [89.110.25.51]) by smtp.gmail.com with ESMTPSA id n69sm367757lja.35.2018.03.09.08.48.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 09 Mar 2018 08:48:44 -0800 (PST) Received: (nullmailer pid 13974 invoked by uid 1000); Fri, 09 Mar 2018 16:49:27 -0000 From: Ivan Safonov To: Greg Kroah-Hartman Cc: Hans de Goede , Santha Meena Ramamoorthy , devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, Ivan Safonov Subject: [PATCH] staging:r8188eu: Use lib80211 to support TKIP Date: Fri, 9 Mar 2018 19:49:23 +0300 Message-Id: <20180309164923.13929-1-insafonov@gmail.com> X-Mailer: git-send-email 2.16.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Custom TKIP decryption replaced with lib80211 implementation. MIC check use lib80211 too. Signed-off-by: Ivan Safonov --- drivers/staging/rtl8188eu/Kconfig | 1 + drivers/staging/rtl8188eu/core/rtw_recv.c | 161 ++++++++------------------ drivers/staging/rtl8188eu/core/rtw_security.c | 92 +++++++-------- 3 files changed, 94 insertions(+), 160 deletions(-) diff --git a/drivers/staging/rtl8188eu/Kconfig b/drivers/staging/rtl8188eu/Kconfig index ff7832798a77..673fdce25530 100644 --- a/drivers/staging/rtl8188eu/Kconfig +++ b/drivers/staging/rtl8188eu/Kconfig @@ -7,6 +7,7 @@ config R8188EU select LIB80211 select LIB80211_CRYPT_WEP select LIB80211_CRYPT_CCMP + select LIB80211_CRYPT_TKIP ---help--- This option adds the Realtek RTL8188EU USB device such as TP-Link TL-WN725N. If built as a module, it will be called r8188eu. diff --git a/drivers/staging/rtl8188eu/core/rtw_recv.c b/drivers/staging/rtl8188eu/core/rtw_recv.c index c6857a5be12a..05936a45eb93 100644 --- a/drivers/staging/rtl8188eu/core/rtw_recv.c +++ b/drivers/staging/rtl8188eu/core/rtw_recv.c @@ -23,6 +23,7 @@ #include #include #include +#include #define ETHERNET_HEADER_SIZE 14 /* Ethernet Header Length */ #define LLC_HEADER_SIZE 6 /* LLC Header Length */ @@ -220,31 +221,20 @@ u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter) static int recvframe_chkmic(struct adapter *adapter, struct recv_frame *precvframe) { - int i, res = _SUCCESS; - u32 datalen; - u8 miccode[8]; - u8 bmic_err = false, brpt_micerror = true; - u8 *pframe, *payload, *pframemic; - u8 *mickey; - struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib = &precvframe->attrib; - struct security_priv *psecuritypriv = &adapter->securitypriv; - - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - stainfo = rtw_get_stainfo(&adapter->stapriv, &prxattrib->ta[0]); + int res = _SUCCESS; + struct rx_pkt_attrib *prxattrib = &precvframe->attrib; + struct sta_info *stainfo = rtw_get_stainfo(&adapter->stapriv, prxattrib->ta); if (prxattrib->encrypt == _TKIP_) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, - ("\n %s: prxattrib->encrypt==_TKIP_\n", __func__)); - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, - ("\n %s: da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - __func__, prxattrib->ra[0], prxattrib->ra[1], prxattrib->ra[2], - prxattrib->ra[3], prxattrib->ra[4], prxattrib->ra[5])); - - /* calculate mic code */ if (stainfo) { + int key_idx; + const int iv_len = 8, icv_len = 4, key_length = 32; + struct sk_buff *skb = precvframe->pkt; + u8 key[32], iv[8], icv[4], *pframe = skb->data; + void *crypto_private = NULL; + struct lib80211_crypto_ops *crypto_ops = try_then_request_module(lib80211_get_crypto_ops("TKIP"), "lib80211_crypt_tkip"); + struct security_priv *psecuritypriv = &adapter->securitypriv; + if (IS_MCAST(prxattrib->ra)) { if (!psecuritypriv) { res = _FAIL; @@ -253,115 +243,58 @@ static int recvframe_chkmic(struct adapter *adapter, DBG_88E("\n %s: didn't install group key!!!!!!!!!!\n", __func__); goto exit; } - mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0]; - - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, - ("\n %s: bcmc key\n", __func__)); + key_idx = prxattrib->key_index; + memcpy(key, psecuritypriv->dot118021XGrpKey[key_idx].skey, 16); + memcpy(key + 16, psecuritypriv->dot118021XGrprxmickey[key_idx].skey, 16); } else { - mickey = &stainfo->dot11tkiprxmickey.skey[0]; - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("\n %s: unicast key\n", __func__)); + key_idx = 0; + memcpy(key, stainfo->dot118021x_UncstKey.skey, 16); + memcpy(key + 16, stainfo->dot11tkiprxmickey.skey, 16); } - /* icv_len included the mic code */ - datalen = precvframe->pkt->len-prxattrib->hdrlen - - prxattrib->iv_len-prxattrib->icv_len-8; - pframe = precvframe->pkt->data; - payload = pframe+prxattrib->hdrlen+prxattrib->iv_len; - - RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n", prxattrib->iv_len, prxattrib->icv_len)); - rtw_seccalctkipmic(mickey, pframe, payload, datalen, &miccode[0], - (unsigned char)prxattrib->priority); /* care the length of the data */ + if (!crypto_ops) { + res = _FAIL; + goto exit_lib80211_tkip; + } - pframemic = payload+datalen; + memcpy(iv, pframe + prxattrib->hdrlen, iv_len); + memcpy(icv, pframe + skb->len - icv_len, icv_len); + memmove(pframe + iv_len, pframe, prxattrib->hdrlen); - bmic_err = false; + skb_pull(skb, iv_len); + skb_trim(skb, skb->len - icv_len); - for (i = 0; i < 8; i++) { - if (miccode[i] != *(pframemic+i)) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("%s: miccode[%d](%02x)!=*(pframemic+%d)(%02x) ", - __func__, i, miccode[i], i, *(pframemic + i))); - bmic_err = true; - } + crypto_private = crypto_ops->init(key_idx); + if (!crypto_private) { + res = _FAIL; + goto exit_lib80211_tkip; + } + if (crypto_ops->set_key(key, key_length, NULL, crypto_private) < 0) { + res = _FAIL; + goto exit_lib80211_tkip; + } + if (crypto_ops->decrypt_msdu(skb, key_idx, prxattrib->hdrlen, crypto_private)) { + res = _FAIL; + goto exit_lib80211_tkip; } - if (bmic_err) { - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-8), *(pframemic-7), *(pframemic-6), - *(pframemic-5), *(pframemic-4), *(pframemic-3), - *(pframemic-2), *(pframemic-1))); - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", - *(pframemic-16), *(pframemic-15), *(pframemic-14), - *(pframemic-13), *(pframemic-12), *(pframemic-11), - *(pframemic-10), *(pframemic-9))); - { - uint i; + memmove(pframe, pframe + iv_len, prxattrib->hdrlen); + skb_push(skb, iv_len); + skb_put(skb, icv_len); - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("\n ======demp packet (len=%d)======\n", - precvframe->pkt->len)); - for (i = 0; i < precvframe->pkt->len; i += 8) { - RT_TRACE(_module_rtl871x_recv_c_, - _drv_err_, - ("0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x", - *(precvframe->pkt->data+i), - *(precvframe->pkt->data+i+1), - *(precvframe->pkt->data+i+2), - *(precvframe->pkt->data+i+3), - *(precvframe->pkt->data+i+4), - *(precvframe->pkt->data+i+5), - *(precvframe->pkt->data+i+6), - *(precvframe->pkt->data+i+7))); - } - RT_TRACE(_module_rtl871x_recv_c_, - _drv_err_, - ("\n ====== demp packet end [len=%d]======\n", - precvframe->pkt->len)); - RT_TRACE(_module_rtl871x_recv_c_, - _drv_err_, - ("\n hrdlen=%d,\n", - prxattrib->hdrlen)); - } + memcpy(pframe + prxattrib->hdrlen, iv, iv_len); + memcpy(pframe + skb->len - icv_len, icv, icv_len); - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, - ("ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d ", - prxattrib->ra[0], prxattrib->ra[1], prxattrib->ra[2], - prxattrib->ra[3], prxattrib->ra[4], prxattrib->ra[5], psecuritypriv->binstallGrpkey)); - - /* double check key_index for some timing issue , */ - /* cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue */ - if ((IS_MCAST(prxattrib->ra) == true) && (prxattrib->key_index != pmlmeinfo->key_index)) - brpt_micerror = false; - - if ((prxattrib->bdecrypted) && (brpt_micerror)) { - rtw_handle_tkip_mic_err(adapter, (u8)IS_MCAST(prxattrib->ra)); - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, (" mic error :prxattrib->bdecrypted=%d ", prxattrib->bdecrypted)); - DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); - } else { - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, (" mic error :prxattrib->bdecrypted=%d ", prxattrib->bdecrypted)); - DBG_88E(" mic error :prxattrib->bdecrypted=%d\n", prxattrib->bdecrypted); - } - res = _FAIL; - } else { - /* mic checked ok */ - if ((!psecuritypriv->bcheck_grpkey) && (IS_MCAST(prxattrib->ra))) { - psecuritypriv->bcheck_grpkey = true; - RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("psecuritypriv->bcheck_grpkey = true")); - } - } +exit_lib80211_tkip: + if (crypto_ops && crypto_private) + crypto_ops->deinit(crypto_private); } else { RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("%s: rtw_get_stainfo==NULL!!!\n", __func__)); } - - skb_trim(precvframe->pkt, precvframe->pkt->len - 8); } exit: - return res; } diff --git a/drivers/staging/rtl8188eu/core/rtw_security.c b/drivers/staging/rtl8188eu/core/rtw_security.c index 67a2490f055e..bfe0b217e679 100644 --- a/drivers/staging/rtl8188eu/core/rtw_security.c +++ b/drivers/staging/rtl8188eu/core/rtw_security.c @@ -650,71 +650,71 @@ u32 rtw_tkip_encrypt(struct adapter *padapter, u8 *pxmitframe) return res; } -/* The hlen isn't include the IV */ u32 rtw_tkip_decrypt(struct adapter *padapter, u8 *precvframe) -{ /* exclude ICV */ - u16 pnl; - u32 pnh; - u8 rc4key[16]; - u8 ttkey[16]; - u8 crc[4]; - struct arc4context mycontext; - int length; - - u8 *pframe, *payload, *iv, *prwskey; - union pn48 dot11txpn; - struct sta_info *stainfo; - struct rx_pkt_attrib *prxattrib = &((struct recv_frame *)precvframe)->attrib; - struct security_priv *psecuritypriv = &padapter->securitypriv; - u32 res = _SUCCESS; - - - pframe = (unsigned char *)((struct recv_frame *)precvframe)->pkt->data; +{ + struct rx_pkt_attrib *prxattrib = &((struct recv_frame *)precvframe)->attrib; + u32 res = _SUCCESS; /* 4 start to decrypt recvframe */ if (prxattrib->encrypt == _TKIP_) { - stainfo = rtw_get_stainfo(&padapter->stapriv, &prxattrib->ta[0]); + struct sta_info *stainfo = rtw_get_stainfo(&padapter->stapriv, prxattrib->ta); + if (stainfo) { + int key_idx; + const int iv_len = 8, icv_len = 4, key_length = 32; + void *crypto_private = NULL; + struct sk_buff *skb = ((struct recv_frame *)precvframe)->pkt; + u8 key[32], iv[8], icv[4], *pframe = skb->data; + struct lib80211_crypto_ops *crypto_ops = try_then_request_module(lib80211_get_crypto_ops("TKIP"), "lib80211_crypt_tkip"); + struct security_priv *psecuritypriv = &padapter->securitypriv; + if (IS_MCAST(prxattrib->ra)) { if (!psecuritypriv->binstallGrpkey) { res = _FAIL; DBG_88E("%s:rx bc/mc packets, but didn't install group key!!!!!!!!!!\n", __func__); goto exit; } - prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey; + key_idx = prxattrib->key_index; + memcpy(key, psecuritypriv->dot118021XGrpKey[key_idx].skey, 16); + memcpy(key + 16, psecuritypriv->dot118021XGrprxmickey[key_idx].skey, 16); } else { - RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("%s: stainfo!= NULL!!!\n", __func__)); - prwskey = &stainfo->dot118021x_UncstKey.skey[0]; + key_idx = 0; + memcpy(key, stainfo->dot118021x_UncstKey.skey, 16); + memcpy(key + 16, stainfo->dot11tkiprxmickey.skey, 16); } - iv = pframe+prxattrib->hdrlen; - payload = pframe+prxattrib->iv_len+prxattrib->hdrlen; - length = ((struct recv_frame *)precvframe)->pkt->len-prxattrib->hdrlen-prxattrib->iv_len; - - GET_TKIP_PN(iv, dot11txpn); - - pnl = (u16)(dot11txpn.val); - pnh = (u32)(dot11txpn.val>>16); + if (!crypto_ops) { + res = _FAIL; + goto exit_lib80211_tkip; + } - phase1((u16 *)&ttkey[0], prwskey, &prxattrib->ta[0], pnh); - phase2(&rc4key[0], prwskey, (unsigned short *)&ttkey[0], pnl); + memcpy(iv, pframe + prxattrib->hdrlen, iv_len); + memcpy(icv, pframe + skb->len - icv_len, icv_len); - /* 4 decrypt payload include icv */ + crypto_private = crypto_ops->init(key_idx); + if (!crypto_private) { + res = _FAIL; + goto exit_lib80211_tkip; + } + if (crypto_ops->set_key(key, key_length, NULL, crypto_private) < 0) { + res = _FAIL; + goto exit_lib80211_tkip; + } + if (crypto_ops->decrypt_mpdu(skb, prxattrib->hdrlen, crypto_private)) { + res = _FAIL; + goto exit_lib80211_tkip; + } - arcfour_init(&mycontext, rc4key, 16); - arcfour_encrypt(&mycontext, payload, payload, length); + memmove(pframe, pframe + iv_len, prxattrib->hdrlen); + skb_push(skb, iv_len); + skb_put(skb, icv_len); - *((__le32 *)crc) = getcrc32(payload, length-4); + memcpy(pframe + prxattrib->hdrlen, iv, iv_len); + memcpy(pframe + skb->len - icv_len, icv, icv_len); - if (crc[3] != payload[length-1] || - crc[2] != payload[length-2] || - crc[1] != payload[length-3] || - crc[0] != payload[length-4]) { - RT_TRACE(_module_rtl871x_security_c_, _drv_err_, - ("rtw_wep_decrypt:icv error crc (%4ph)!=payload (%4ph)\n", - &crc, &payload[length-4])); - res = _FAIL; - } +exit_lib80211_tkip: + if (crypto_ops && crypto_private) + crypto_ops->deinit(crypto_private); } else { RT_TRACE(_module_rtl871x_security_c_, _drv_err_, ("rtw_tkip_decrypt: stainfo==NULL!!!\n")); res = _FAIL; -- 2.16.1