OSDN Git Service

Add rtl8821ce driver version 5.5.2
[android-x86/external-kernel-drivers.git] / rtl8821ce / core / rtw_ioctl_query.c
diff --git a/rtl8821ce/core/rtw_ioctl_query.c b/rtl8821ce/core/rtw_ioctl_query.c
new file mode 100644 (file)
index 0000000..6f7613e
--- /dev/null
@@ -0,0 +1,166 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2017 Realtek Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ *****************************************************************************/
+#define _RTW_IOCTL_QUERY_C_
+
+#include <drv_types.h>
+
+
+#ifdef PLATFORM_WINDOWS
+/*
+ * Added for WPA2-PSK, by Annie, 2005-09-20.
+ *   */
+u8
+query_802_11_capability(
+       _adapter                *Adapter,
+       u8                      *pucBuf,
+       u32             *pulOutLen
+)
+{
+       static NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = {
+               {Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled},
+               {Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled},
+               {Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled},
+               {Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled},
+               {Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled},
+               {Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled},
+               {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled},
+               {Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled},
+               {Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled},
+               {Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled},
+               {Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled},
+               {Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled},
+               {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled},
+               {Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled}
+       };
+       static ULONG    ulNumOfPairSupported = sizeof(szAuthEnc) / sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
+       NDIS_802_11_CAPABILITY *pCap = (NDIS_802_11_CAPABILITY *)pucBuf;
+       u8      *pucAuthEncryptionSupported = (u8 *) pCap->AuthenticationEncryptionSupported;
+
+
+       pCap->Length = sizeof(NDIS_802_11_CAPABILITY);
+       if (ulNumOfPairSupported > 1)
+               pCap->Length += (ulNumOfPairSupported - 1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);
+
+       pCap->Version = 2;
+       pCap->NoOfPMKIDs = NUM_PMKID_CACHE;
+       pCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported;
+
+       if (sizeof(szAuthEnc) <= 240)           /* 240 = 256 - 4*4       */ { /* SecurityInfo.szCapability: only 256 bytes in size. */
+               _rtw_memcpy(pucAuthEncryptionSupported, (u8 *)szAuthEnc,  sizeof(szAuthEnc));
+               *pulOutLen = pCap->Length;
+               return _TRUE;
+       } else {
+               *pulOutLen = 0;
+               return _FALSE;
+       }
+}
+
+u8 query_802_11_association_information(_adapter *padapter, PNDIS_802_11_ASSOCIATION_INFORMATION       pAssocInfo)
+{
+       struct wlan_network *tgt_network;
+       struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);
+       struct  security_priv  *psecuritypriv = &(padapter->securitypriv);
+       WLAN_BSSID_EX   *psecnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
+       u8      *pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
+       unsigned char i, *auth_ie, *supp_ie;
+
+       /* NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); */
+       _rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
+       /* pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); */
+
+       /* ------------------------------------------------------ */
+       /* Association Request related information */
+       /* ------------------------------------------------------ */
+       /* Req_1. AvailableRequestFixedIEs */
+       if (psecnetwork != NULL) {
+
+               pAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_CURRENTAPADDRESS;
+               pAssocInfo->RequestFixedIEs.Capabilities = (unsigned short) *&psecnetwork->IEs[10];
+               _rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress,
+                           &psecnetwork->MacAddress, 6);
+
+               pAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
+
+               if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING | _FW_LINKED) == _TRUE) {
+
+                       if (psecuritypriv->ndisauthtype >= Ndis802_11AuthModeWPA2)
+                               pDest[0] = 48;          /* RSN Information Element */
+                       else
+                               pDest[0] = 221; /* WPA(SSN) Information Element */
+
+                       supp_ie = &psecuritypriv->supplicant_ie[0];
+
+                       i = 13; /* 0~11 is fixed information element             */
+                       while ((i < supp_ie[0]) && (i < 256)) {
+                               if ((unsigned char)supp_ie[i] == pDest[0]) {
+                                       _rtw_memcpy((u8 *)(pDest),
+                                                   &supp_ie[i],
+                                                   supp_ie[1 + i] + 2);
+
+                                       break;
+                               }
+
+                               i = i + supp_ie[i + 1] + 2;
+                               if (supp_ie[1 + i] == 0)
+                                       i = i + 1;
+
+                       }
+
+
+                       pAssocInfo->RequestIELength += (2 + supp_ie[1 + i]); /* (2 + psecnetwork->IEs[1+i]+4); */
+
+               }
+
+
+
+       }
+
+
+       /* ------------------------------------------------------ */
+       /* Association Response related information */
+       /* ------------------------------------------------------ */
+
+       if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
+               tgt_network = &(pmlmepriv->cur_network);
+               if (tgt_network != NULL) {
+                       pAssocInfo->AvailableResponseFixedIEs =
+                               NDIS_802_11_AI_RESFI_CAPABILITIES
+                               | NDIS_802_11_AI_RESFI_ASSOCIATIONID
+                               ;
+
+                       pAssocInfo->ResponseFixedIEs.Capabilities = (unsigned short) *&tgt_network->network.IEs[10];
+                       pAssocInfo->ResponseFixedIEs.StatusCode = 0;
+                       pAssocInfo->ResponseFixedIEs.AssociationId = (unsigned short) tgt_network->aid;
+
+                       pDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength;
+                       auth_ie = &psecuritypriv->authenticator_ie[0];
+
+
+                       i = auth_ie[0] - 12;
+                       if (i > 0) {
+                               _rtw_memcpy((u8 *)&pDest[0], &auth_ie[1], i);
+                               pAssocInfo->ResponseIELength = i;
+                       }
+
+
+                       pAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength;
+
+
+               }
+       }
+
+       return _TRUE;
+}
+#endif