17696 lines
532 KiB
C
17696 lines
532 KiB
C
/****************************************************************************
|
|
* Ralink Tech Inc.
|
|
* 4F, No. 2 Technology 5th Rd.
|
|
* Science-based Industrial Park
|
|
* Hsin-chu, Taiwan, R.O.C.
|
|
* (c) Copyright 2002, Ralink Technology, Inc.
|
|
*
|
|
* All rights reserved. Ralink's source code is an unpublished work and the
|
|
* use of a copyright notice does not imply otherwise. This source code
|
|
* contains confidential trade secret material of Ralink Tech. Any attemp
|
|
* or participation in deciphering, decoding, reverse engineering or in any
|
|
* way altering the source code is stricitly prohibited, unless the prior
|
|
* written consent of Ralink Technology, Inc. is obtained.
|
|
****************************************************************************
|
|
|
|
Module Name:
|
|
ap_cfg.c
|
|
|
|
Abstract:
|
|
IOCTL related subroutines
|
|
|
|
Revision History:
|
|
Who When What
|
|
--------- ---------- ----------------------------------------------
|
|
*/
|
|
|
|
|
|
#include "rt_config.h"
|
|
|
|
|
|
#define A_BAND_REGION_0 0
|
|
#define A_BAND_REGION_1 1
|
|
#define A_BAND_REGION_2 2
|
|
#define A_BAND_REGION_3 3
|
|
#define A_BAND_REGION_4 4
|
|
#define A_BAND_REGION_5 5
|
|
#define A_BAND_REGION_6 6
|
|
#define A_BAND_REGION_7 7
|
|
#define A_BAND_REGION_8 8
|
|
#define A_BAND_REGION_9 9
|
|
#define A_BAND_REGION_10 10
|
|
|
|
#define G_BAND_REGION_0 0
|
|
#define G_BAND_REGION_1 1
|
|
#define G_BAND_REGION_2 2
|
|
#define G_BAND_REGION_3 3
|
|
#define G_BAND_REGION_4 4
|
|
#define G_BAND_REGION_5 5
|
|
#define G_BAND_REGION_6 6
|
|
|
|
COUNTRY_CODE_TO_COUNTRY_REGION allCountry[] = {
|
|
/* {Country Number, ISO Name, Country Name, Support 11A, 11A Country Region, Support 11G, 11G Country Region} */
|
|
{0, "DB", "Debug", TRUE, A_BAND_REGION_7, TRUE, G_BAND_REGION_5},
|
|
{8, "AL", "ALBANIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{12, "DZ", "ALGERIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{32, "AR", "ARGENTINA", TRUE, A_BAND_REGION_3, TRUE, G_BAND_REGION_1},
|
|
{51, "AM", "ARMENIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{36, "AU", "AUSTRALIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{40, "AT", "AUSTRIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{31, "AZ", "AZERBAIJAN", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{48, "BH", "BAHRAIN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{112, "BY", "BELARUS", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{56, "BE", "BELGIUM", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{84, "BZ", "BELIZE", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{68, "BO", "BOLIVIA", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{76, "BR", "BRAZIL", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{96, "BN", "BRUNEI DARUSSALAM", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{100, "BG", "BULGARIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{124, "CA", "CANADA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{152, "CL", "CHILE", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{156, "CN", "CHINA", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{170, "CO", "COLOMBIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{188, "CR", "COSTA RICA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{191, "HR", "CROATIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{196, "CY", "CYPRUS", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{203, "CZ", "CZECH REPUBLIC", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{208, "DK", "DENMARK", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{214, "DO", "DOMINICAN REPUBLIC", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{218, "EC", "ECUADOR", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{818, "EG", "EGYPT", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{222, "SV", "EL SALVADOR", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{233, "EE", "ESTONIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{246, "FI", "FINLAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{250, "FR", "FRANCE", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{268, "GE", "GEORGIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{276, "DE", "GERMANY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{300, "GR", "GREECE", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{320, "GT", "GUATEMALA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{340, "HN", "HONDURAS", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{344, "HK", "HONG KONG", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{348, "HU", "HUNGARY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{352, "IS", "ICELAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{356, "IN", "INDIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{360, "ID", "INDONESIA", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{364, "IR", "IRAN", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{372, "IE", "IRELAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{376, "IL", "ISRAEL", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{380, "IT", "ITALY", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{392, "JP", "JAPAN", TRUE, A_BAND_REGION_9, TRUE, G_BAND_REGION_1},
|
|
{400, "JO", "JORDAN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{398, "KZ", "KAZAKHSTAN", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{408, "KP", "KOREA DEMOCRATIC PEOPLE'S REPUBLIC OF",TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1},
|
|
{410, "KR", "KOREA REPUBLIC OF", TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1},
|
|
{414, "KW", "KUWAIT", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{428, "LV", "LATVIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{422, "LB", "LEBANON", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{438, "LI", "LIECHTENSTEIN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{440, "LT", "LITHUANIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{442, "LU", "LUXEMBOURG", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{446, "MO", "MACAU", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{807, "MK", "MACEDONIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{458, "MY", "MALAYSIA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{484, "MX", "MEXICO", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{492, "MC", "MONACO", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{504, "MA", "MOROCCO", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{528, "NL", "NETHERLANDS", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{554, "NZ", "NEW ZEALAND", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{578, "NO", "NORWAY", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{512, "OM", "OMAN", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{586, "PK", "PAKISTAN", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{591, "PA", "PANAMA", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{604, "PE", "PERU", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{608, "PH", "PHILIPPINES", TRUE, A_BAND_REGION_4, TRUE, G_BAND_REGION_1},
|
|
{616, "PL", "POLAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{620, "PT", "PORTUGAL", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{630, "PR", "PUERTO RICO", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{634, "QA", "QATAR", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{642, "RO", "ROMANIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{643, "RU", "RUSSIA FEDERATION", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{682, "SA", "SAUDI ARABIA", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{702, "SG", "SINGAPORE", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{703, "SK", "SLOVAKIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{705, "SI", "SLOVENIA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{710, "ZA", "SOUTH AFRICA", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{724, "ES", "SPAIN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{752, "SE", "SWEDEN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{756, "CH", "SWITZERLAND", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{760, "SY", "SYRIAN ARAB REPUBLIC", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{158, "TW", "TAIWAN", TRUE, A_BAND_REGION_3, TRUE, G_BAND_REGION_0},
|
|
{764, "TH", "THAILAND", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{780, "TT", "TRINIDAD AND TOBAGO", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{788, "TN", "TUNISIA", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{792, "TR", "TURKEY", TRUE, A_BAND_REGION_2, TRUE, G_BAND_REGION_1},
|
|
{804, "UA", "UKRAINE", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{784, "AE", "UNITED ARAB EMIRATES", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{826, "GB", "UNITED KINGDOM", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_1},
|
|
{840, "US", "UNITED STATES", TRUE, A_BAND_REGION_0, TRUE, G_BAND_REGION_0},
|
|
{858, "UY", "URUGUAY", TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1},
|
|
{860, "UZ", "UZBEKISTAN", TRUE, A_BAND_REGION_1, TRUE, G_BAND_REGION_0},
|
|
{862, "VE", "VENEZUELA", TRUE, A_BAND_REGION_5, TRUE, G_BAND_REGION_1},
|
|
{704, "VN", "VIET NAM", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{887, "YE", "YEMEN", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{716, "ZW", "ZIMBABWE", FALSE, A_BAND_REGION_0, TRUE, G_BAND_REGION_1},
|
|
{999, "", "", 0, 0, 0, 0}
|
|
};
|
|
|
|
#define NUM_OF_COUNTRIES (sizeof(allCountry)/sizeof(COUNTRY_CODE_TO_COUNTRY_REGION))
|
|
|
|
|
|
INT Set_CountryString_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_CountryCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
|
INT Set_ChGeography_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* EXT_BUILD_CHANNEL_LIST */
|
|
|
|
#ifdef SPECIFIC_TX_POWER_SUPPORT
|
|
INT Set_AP_PKT_PWR(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* SPECIFIC_TX_POWER_SUPPORT */
|
|
|
|
INT Set_AP_SSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_TxRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef RT305x
|
|
INT Set_RfRead_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_RfWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* RT305x */
|
|
|
|
INT Set_OLBCDetection_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_MaxStaNum_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_IdleTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#ifdef IAPP_SUPPORT
|
|
INT Set_IappPID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* IAPP_SUPPORT */
|
|
|
|
INT Set_AP_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_EncrypType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WpaMixPairCipher_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_RekeyInterval_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_RekeyMethod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_PMKCachePeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_ASSOC_REQ_RSSI_THRESHOLD(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_KickStaRssiLow_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_DefaultKeyID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_Key1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_Key2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_Key3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_Key4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_WPAPSK_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_BasicRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_BeaconPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_DtimPeriod_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_NoForwarding_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_NoForwardingBTNSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WmmCapable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_HideSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_VLANID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_VLANPriority_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_VLAN_TAG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AccessPolicy_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#ifdef RELEASE_EXCLUDE
|
|
INT Set_AccessControlList_Proc(RTMP_ADAPTER *pAd, PUCHAR arg);
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
INT Set_ACLAddEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_ACLDelEntry_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_ACLShowAll_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_ACLClearAll_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_RadioOn_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_SiteSurvey_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AutoChannelSel_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#ifdef AP_SCAN_SUPPORT
|
|
INT Set_AutoChannelSelCheckTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* AP_SCAN_SUPPORT */
|
|
|
|
INT Set_BADecline_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Show_StaCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_StaSecurityInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_DriverInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_Sat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_RAInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef RTMP_MAC_PCI
|
|
#ifdef DBG_DIAGNOSE
|
|
INT Set_DiagOpt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_BDInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_diag_cond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_Diag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* DBG_DAIGNOSE */
|
|
#endif /* RTMP_MAC_PCI */
|
|
|
|
INT Show_Sat_Reset_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_MATTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#ifdef DOT1X_SUPPORT
|
|
VOID RTMPIoctlQueryRadiusConf(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
INT Set_IEEE8021X_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_PreAuth_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_RADIUS_Server_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_RADIUS_Port_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_RADIUS_Key_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
INT Set_DisConnectSta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_DisConnectAllSta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef NINTENDO_AP
|
|
int Set_NintendiCapable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
int Set_NintendoGet_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
int Set_NintendoSet_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* NINTENDO_AP */
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
INT Set_ApCli_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Bssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_DefaultKeyID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_WPAPSK_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Key1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Key2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Key3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_Key4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_TxMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_TxMcs_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
|
INT Set_ApCli_AutoConnect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
|
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
INT Set_ApCli_Wpa_Support(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_ApCli_IEEE8021X_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
|
|
#ifdef MAC_REPEATER_SUPPORT
|
|
INT Set_ReptMode_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* MAC_REPEATER_SUPPORT */
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_AP_WscSsid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef UAPSD_SUPPORT
|
|
INT Set_UAPSD_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* UAPSD_SUPPORT */
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_WscStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef BB_SOC
|
|
INT Set_WscOOB_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif
|
|
|
|
INT Set_WscStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
VOID RTMPIoctlWscProfile(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
VOID RTMPIoctlWscPINCode(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
VOID RTMPIoctlWscStatus(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
VOID RTMPIoctlGetWscDynInfo(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
VOID RTMPIoctlGetWscRegsDynInfo(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq);
|
|
|
|
BOOLEAN WscCheckEnrolleeNonceFromUpnp(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING *pData,
|
|
IN USHORT Length,
|
|
IN PWSC_CTRL pWscControl);
|
|
|
|
UCHAR WscRxMsgTypeFromUpnp(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING *pData,
|
|
IN USHORT Length);
|
|
|
|
INT WscGetConfForUpnp(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN PWSC_CTRL pWscControl);
|
|
|
|
INT Set_AP_WscConfMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WscConfStatus_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WscMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WscGetConf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP_WscPinCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WscSecurityMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_AP_WscMultiByteCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
|
|
INT Set_WscVersion_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef WSC_V2_SUPPORT
|
|
INT Set_WscV2Support_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscVersion2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscExtraTlvTag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscExtraTlvType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscExtraTlvData_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscSetupLock_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscFragment_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscFragmentSize_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscMaxPinAttack_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_WscSetupLockTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* WSC_V2_SUPPORT */
|
|
INT Set_WscAutoTriggerDisable_Proc(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_STRING *arg);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#ifdef EASY_CONFIG_SETUP
|
|
INT Set_AP_AutoProvisionEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_RssiThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef WAC_SUPPORT
|
|
INT Set_AP_WACEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* WAC_SUPPORT */
|
|
#endif /* EASY_CONFIG_SETUP */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef MCAST_RATE_SPECIFIC
|
|
INT Set_McastPhyMode(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_McastMcs(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Show_McastRate(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* MCAST_RATE_SPECIFIC */
|
|
|
|
#ifdef DOT11N_DRAFT3
|
|
INT Set_OBSSScanParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT Set_AP2040ReScan_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* DOT11N_DRAFT3 */
|
|
|
|
INT Set_EntryLifeCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
#ifdef LED_CONTROL_SUPPORT
|
|
INT Set_WlanLed_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* LED_CONTROL_SUPPORT */
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
|
|
#ifdef AP_QLOAD_SUPPORT
|
|
INT Set_QloadClr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
/* QLOAD ALARM */
|
|
INT Set_QloadAlarmTimeThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_QloadAlarmNumThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* AP_QLOAD_SUPPORT */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef RT3883
|
|
INT Set_CwCTest_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* RT3883 */
|
|
|
|
INT Set_MemDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
INT Set_PowerSaveLifeTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef P2P_SUPPORT
|
|
INT Set_P2p_OpMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Enable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Bssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_EncrypType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_DefaultKeyID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_WPAPSK_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Key1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Key2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Key3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_Key4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_TxMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT Set_P2pCli_TxMcs_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_P2pCli_WscSsid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
#ifdef DYNAMIC_VGA_SUPPORT
|
|
INT Set_DyncVgaEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT set_false_cca_hi_th(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
INT set_false_cca_low_th(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
#endif /* DYNAMIC_VGA_SUPPORT */
|
|
|
|
#ifdef MT_MAC
|
|
INT Set_AP_TimEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
INT setApTmrEnableProc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
|
|
#ifdef DBG
|
|
INT Set_AP_DumpTime_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg);
|
|
|
|
INT Set_BcnStateCtrl_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg);
|
|
#endif
|
|
|
|
#endif /* MT_MAC */
|
|
|
|
static struct {
|
|
RTMP_STRING *name;
|
|
INT (*set_proc)(PRTMP_ADAPTER pAdapter, RTMP_STRING *arg);
|
|
} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = {
|
|
{"RateAlg", Set_RateAlg_Proc},
|
|
#ifdef NEW_RATE_ADAPT_SUPPORT
|
|
{"PerThrdAdj", Set_PerThrdAdj_Proc},
|
|
{"LowTrafficThrd", Set_LowTrafficThrd_Proc},
|
|
{"TrainUpRule", Set_TrainUpRule_Proc},
|
|
{"TrainUpRuleRSSI", Set_TrainUpRuleRSSI_Proc},
|
|
{"TrainUpLowThrd", Set_TrainUpLowThrd_Proc},
|
|
{"TrainUpHighThrd", Set_TrainUpHighThrd_Proc},
|
|
{"RateTable", Set_RateTable_Proc},
|
|
#endif /* NEW_RATE_ADAPT_SUPPORT */
|
|
{"DriverVersion", Set_DriverVersion_Proc},
|
|
{"CountryRegion", Set_CountryRegion_Proc},
|
|
{"CountryRegionABand", Set_CountryRegionABand_Proc},
|
|
{"CountryString", Set_CountryString_Proc},
|
|
{"CountryCode", Set_CountryCode_Proc},
|
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
|
{"ChGeography", Set_ChGeography_Proc},
|
|
#endif /* EXT_BUILD_CHANNEL_LIST */
|
|
{"SSID", Set_AP_SSID_Proc},
|
|
{"WirelessMode", Set_WirelessMode_Proc},
|
|
{"BasicRate", Set_BasicRate_Proc},
|
|
{"ShortSlot", Set_ShortSlot_Proc},
|
|
{"Channel", Set_Channel_Proc},
|
|
#if defined(RT5370) || defined(RT5372) || defined(RT5390) || defined(RT5392)
|
|
{"BbpResetFlagCountVale", Set_BbpResetFlagCountVale},
|
|
#endif /* defined(RT5370) || defined(RT5372) || defined(RT5390) || defined(RT5392) */
|
|
{"BeaconPeriod", Set_BeaconPeriod_Proc},
|
|
{"DtimPeriod", Set_DtimPeriod_Proc},
|
|
{"TxPower", Set_TxPower_Proc},
|
|
{"BGProtection", Set_BGProtection_Proc},
|
|
{"DisableOLBC", Set_OLBCDetection_Proc},
|
|
{"TxPreamble", Set_TxPreamble_Proc},
|
|
{"RTSThreshold", Set_RTSThreshold_Proc},
|
|
{"FragThreshold", Set_FragThreshold_Proc},
|
|
{"TxBurst", Set_TxBurst_Proc},
|
|
{"MaxStaNum", Set_AP_MaxStaNum_Proc},
|
|
#ifdef RTMP_MAC_PCI
|
|
{"ShowRF", Set_ShowRF_Proc},
|
|
#endif /* RTMP_MAC_PCI */
|
|
{"IdleTimeout", Set_AP_IdleTimeout_Proc},
|
|
#ifdef DOT11_N_SUPPORT
|
|
{"BASetup", Set_BASetup_Proc},
|
|
{"BADecline", Set_BADecline_Proc},
|
|
{"SendMIMOPS", Set_SendSMPSAction_Proc},
|
|
{"BAOriTearDown", Set_BAOriTearDown_Proc},
|
|
{"BARecTearDown", Set_BARecTearDown_Proc},
|
|
{"HtBw", Set_HtBw_Proc},
|
|
{"HtMcs", Set_HtMcs_Proc},
|
|
{"HtGi", Set_HtGi_Proc},
|
|
{"HtOpMode", Set_HtOpMode_Proc},
|
|
{"HtStbc", Set_HtStbc_Proc},
|
|
{"HtExtcha", Set_HtExtcha_Proc},
|
|
{"HtMpduDensity", Set_HtMpduDensity_Proc},
|
|
{"HtBaWinSize", Set_HtBaWinSize_Proc},
|
|
{"HtMIMOPS", Set_HtMIMOPSmode_Proc},
|
|
{"HtRdg", Set_HtRdg_Proc},
|
|
{"HtLinkAdapt", Set_HtLinkAdapt_Proc},
|
|
{"HtAmsdu", Set_HtAmsdu_Proc},
|
|
{"HtAutoBa", Set_HtAutoBa_Proc},
|
|
{"HtProtect", Set_HtProtect_Proc},
|
|
{"HtMimoPs", Set_HtMimoPs_Proc},
|
|
{"HtTxStream", Set_HtTxStream_Proc},
|
|
{"HtRxStream", Set_HtRxStream_Proc},
|
|
{"ForceShortGI", Set_ForceShortGI_Proc},
|
|
{"ForceGF", Set_ForceGF_Proc},
|
|
{"HtTxBASize", Set_HtTxBASize_Proc},
|
|
{"BurstMode", Set_BurstMode_Proc},
|
|
#ifdef GREENAP_SUPPORT
|
|
{"GreenAP", Set_GreenAP_Proc},
|
|
#endif /* GREENAP_SUPPORT */
|
|
{"HtDisallowTKIP", Set_HtDisallowTKIP_Proc},
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
#ifdef DOT11_VHT_AC
|
|
{"VhtBw", Set_VhtBw_Proc},
|
|
{"VhtStbc", Set_VhtStbc_Proc},
|
|
{"VhtBwSignal", set_VhtBwSignal_Proc},
|
|
{"VhtDisallowNonVHT", Set_VhtDisallowNonVHT_Proc},
|
|
#endif /* DOT11_VHT_AC */
|
|
|
|
#ifdef IAPP_SUPPORT
|
|
{"IappPID", Set_IappPID_Proc},
|
|
#endif /* IAPP_SUPPORT */
|
|
|
|
#ifdef AGGREGATION_SUPPORT
|
|
{"PktAggregate", Set_PktAggregate_Proc},
|
|
#endif /* AGGREGATION_SUPPORT */
|
|
|
|
#ifdef INF_PPA_SUPPORT
|
|
{"INF_AMAZON_SE_PPA", Set_INF_AMAZON_SE_PPA_Proc},
|
|
#endif /* INF_PPA_SUPPORT */
|
|
|
|
{"WmmCapable", Set_AP_WmmCapable_Proc},
|
|
|
|
{"NoForwarding", Set_NoForwarding_Proc},
|
|
{"NoForwardingBTNBSSID", Set_NoForwardingBTNSSID_Proc},
|
|
{"HideSSID", Set_HideSSID_Proc},
|
|
{"IEEE80211H", Set_IEEE80211H_Proc},
|
|
{"VLANID", Set_VLANID_Proc},
|
|
{"VLANPriority", Set_VLANPriority_Proc},
|
|
{"VLANTag", Set_VLAN_TAG_Proc},
|
|
{"AuthMode", Set_AP_AuthMode_Proc},
|
|
{"EncrypType", Set_AP_EncrypType_Proc},
|
|
{"WpaMixPairCipher", Set_AP_WpaMixPairCipher_Proc},
|
|
{"RekeyInterval", Set_AP_RekeyInterval_Proc},
|
|
{"RekeyMethod", Set_AP_RekeyMethod_Proc},
|
|
{"DefaultKeyID", Set_AP_DefaultKeyID_Proc},
|
|
{"Key1", Set_AP_Key1_Proc},
|
|
{"Key2", Set_AP_Key2_Proc},
|
|
{"Key3", Set_AP_Key3_Proc},
|
|
{"Key4", Set_AP_Key4_Proc},
|
|
{"AccessPolicy", Set_AccessPolicy_Proc},
|
|
{"ACLAddEntry", Set_ACLAddEntry_Proc},
|
|
{"ACLDelEntry", Set_ACLDelEntry_Proc},
|
|
{"ACLShowAll", Set_ACLShowAll_Proc},
|
|
{"ACLClearAll", Set_ACLClearAll_Proc},
|
|
{"WPAPSK", Set_AP_WPAPSK_Proc},
|
|
{"RadioOn", Set_RadioOn_Proc},
|
|
#ifdef SPECIFIC_TX_POWER_SUPPORT
|
|
{"PktPwr", Set_AP_PKT_PWR},
|
|
#endif /* SPECIFIC_TX_POWER_SUPPORT */
|
|
{"AssocReqRssiThres", Set_AP_ASSOC_REQ_RSSI_THRESHOLD},
|
|
{"KickStaRssiLow", Set_AP_KickStaRssiLow_Proc},
|
|
#ifdef AP_SCAN_SUPPORT
|
|
{"SiteSurvey", Set_SiteSurvey_Proc},
|
|
{"AutoChannelSel", Set_AutoChannelSel_Proc},
|
|
{"ACSCheckTime", Set_AutoChannelSelCheckTime_Proc},
|
|
#endif /* AP_SCAN_SUPPORT */
|
|
{"ResetCounter", Set_ResetStatCounter_Proc},
|
|
{"DisConnectSta", Set_DisConnectSta_Proc},
|
|
{"DisConnectAllSta", Set_DisConnectAllSta_Proc},
|
|
#ifdef DOT1X_SUPPORT
|
|
{"IEEE8021X", Set_IEEE8021X_Proc},
|
|
{"PreAuth", Set_PreAuth_Proc},
|
|
{"PMKCachePeriod", Set_AP_PMKCachePeriod_Proc},
|
|
{"own_ip_addr", Set_OwnIPAddr_Proc},
|
|
{"EAPifname", Set_EAPIfName_Proc},
|
|
{"PreAuthifname", Set_PreAuthIfName_Proc},
|
|
{"RADIUS_Server", Set_RADIUS_Server_Proc},
|
|
{"RADIUS_Port", Set_RADIUS_Port_Proc},
|
|
{"RADIUS_Key", Set_RADIUS_Key_Proc},
|
|
#endif /* DOT1X_SUPPORT */
|
|
#ifdef DBG
|
|
{"Debug", Set_Debug_Proc},
|
|
{"DebugFunc", Set_DebugFunc_Proc},
|
|
#endif /* DBG */
|
|
|
|
#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)
|
|
{"RadarShow", Set_RadarShow_Proc},
|
|
#ifdef DFS_SUPPORT
|
|
{"RadarDebug", Set_RadarDebug_Proc},
|
|
/*{"RadarHit", Set_RadarHit_Proc},*/
|
|
{"CSPeriod", Set_CSPeriod_Proc},
|
|
{"ResetRadarHwDetect", Set_ResetRadarHwDetect_Proc},
|
|
{"DfsSwDisable", Set_DfsSwDisable_Proc},
|
|
{"DfsEvDropAdjTime", Set_DfsEnvtDropAdjTime_Proc},
|
|
{"RadarStart", Set_RadarStart_Proc},
|
|
{"RadarStop", Set_RadarStop_Proc},
|
|
{"RadarT1", Set_RadarSetTbl1_Proc},
|
|
{"RadarT2", Set_RadarSetTbl2_Proc},
|
|
{"PollTime", Set_PollTime_Proc},
|
|
{"PrintBusyIdle", Set_PrintBusyIdle_Proc},
|
|
{"BusyIdleRatio", Set_BusyIdleRatio_Proc},
|
|
{"DfsRssiHigh", Set_DfsRssiHigh_Proc},
|
|
{"DfsRssiLow", Set_DfsRssiLow_Proc},
|
|
{"ChMovTime", Set_ChMovingTime_Proc},
|
|
{"BlockChReset", Set_BlockChReset_Proc},
|
|
#endif /* DFS_SUPPORT */
|
|
#ifdef CARRIER_DETECTION_SUPPORT
|
|
{"CarrierDetect", Set_CarrierDetect_Proc},
|
|
{"CarrierCriteria", Set_CarrierCriteria_Proc},
|
|
{"CarrierReCheck", Set_CarrierReCheck_Proc},
|
|
{"CarrierGoneThreshold", Set_CarrierGoneThreshold_Proc},
|
|
{"CarrierDebug", Set_CarrierDebug_Proc},
|
|
{"Delta", Set_CarrierDelta_Proc},
|
|
{"DivFlag", Set_CarrierDivFlag_Proc},
|
|
{"CarrThrd", Set_CarrierThrd_Proc},
|
|
/* v2 functions */
|
|
{"SymRund", Set_CarrierSymRund_Proc},
|
|
{"CarrMask", Set_CarrierMask_Proc},
|
|
#endif /* CARRIER_DETECTION_SUPPORT */
|
|
#endif /* defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */
|
|
|
|
#ifdef RT305x
|
|
{"RfRead", Set_RfRead_Proc},
|
|
{"RfWrite", Set_RfWrite_Proc},
|
|
{"HiPower", Set_HiPower_Proc},
|
|
#if defined(RT3352) || defined(RT5350)
|
|
#ifdef RTMP_INTERNAL_TX_ALC
|
|
{"TSSIMaxRange", Set_TSSIMaxRange_Proc},
|
|
#endif /* RTMP_INTERNAL_TX_ALC */
|
|
#endif /* defined(RT3352) || defined(RT5350) */
|
|
#endif /* RT305x */
|
|
|
|
#ifdef RT6352
|
|
{"RfBankSel", Set_RfBankSel_Proc},
|
|
#ifdef RTMP_TEMPERATURE_CALIBRATION
|
|
{"TemperatureInit", Set_TemperatureCAL_Proc},
|
|
#endif /* RTMP_TEMPERATURE_CALIBRATION */
|
|
#endif /* RT6352 */
|
|
|
|
#ifdef CONFIG_ATE
|
|
{"ATE", SetATE},
|
|
{"ATEDA", SetATEDa},
|
|
{"ATESA", SetATESa},
|
|
{"ADCDump", SetADCDump},
|
|
{"ATEBSSID", SetATEBssid},
|
|
{"ATECHANNEL", SetATEChannel},
|
|
{"ATEINITCHAN", SetATEInitChan},
|
|
#ifdef RTMP_TEMPERATURE_CALIBRATION
|
|
{"ATETEMPCAL", SetATETempCal},
|
|
{"ATESHOWTSSI", SetATEShowTssi},
|
|
#endif /* RTMP_TEMPERATURE_CALIBRATION */
|
|
#ifdef RTMP_INTERNAL_TX_ALC
|
|
{"ATETSSICBA", SetATETssiCalibration},
|
|
#if defined(RT3350) || defined(RT3352)
|
|
{"ATETSSICALBRENABLE", RT335x_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc},
|
|
#endif /* defined(RT3350) || defined(RT3352) */
|
|
#endif /* RTMP_INTERNAL_TX_ALC */
|
|
#ifdef IQ_CAL_SUPPORT
|
|
{"ATEIQCOMP", SetATEIqCompensation},
|
|
#endif /* IQ_CAL_SUPPORT */
|
|
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
|
{"ATETSSICBAEX", SetATETssiCalibrationEx},
|
|
#ifdef RT5592
|
|
{"ATETSSICALBRENABLE", RT5592_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc},
|
|
#endif /* RT5592 */
|
|
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
|
|
{"ATETXPOW0", SetATETxPower0},
|
|
{"ATETXPOW1", SetATETxPower1},
|
|
#ifdef DOT11N_SS3_SUPPORT
|
|
{"ATETXPOW2", SetATETxPower2},
|
|
#endif /* DOT11N_SS3_SUPPORT */
|
|
{"ATETXPOWEVAL", SetATETxPowerEvaluation},
|
|
{"ATETXANT", SetATETxAntenna},
|
|
{"ATERXANT", SetATERxAntenna},
|
|
#ifdef RT3350
|
|
{"ATEPABIAS", SetATEPABias},
|
|
#endif /* RT3350 */
|
|
{"ATETXFREQOFFSET", SetATETxFreqOffset},
|
|
{"ATETXBW", SetATETxBw},
|
|
{"ATETXLEN", SetATETxLength},
|
|
{"ATETXCNT", SetATETxCount},
|
|
{"ATETXMCS", SetATETxMcs},
|
|
{"ATETXSTBC", SetATETxStbc},
|
|
{"ATETXMODE", SetATETxMode},
|
|
{"ATETXGI", SetATETxGi},
|
|
{"ATERXFER", SetATERxFer},
|
|
{"ATERRF", SetATEReadRF},
|
|
#if (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF))
|
|
{"ATEWRF1", SetATEWriteRF1},
|
|
{"ATEWRF2", SetATEWriteRF2},
|
|
{"ATEWRF3", SetATEWriteRF3},
|
|
{"ATEWRF4", SetATEWriteRF4},
|
|
#endif /* (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF)) */
|
|
{"ATELDE2P", SetATELoadE2p},
|
|
{"ATERE2P", SetATEReadE2p},
|
|
#ifdef LED_CONTROL_SUPPORT
|
|
#ifdef RT35xx
|
|
{"ATELED", SetATELed},
|
|
{"ATEHWLED", SetATEHwLed},
|
|
#endif /* RT35xx */
|
|
#endif /* LED_CONTROL_SUPPORT */
|
|
{"ATEAUTOALC", SetATEAutoAlc},
|
|
{"ATETEMPSENSOR", SetATETempSensor},
|
|
#ifdef VCORECAL_SUPPORT
|
|
{"ATEVCOCAL", SetATEVcoCal},
|
|
#endif /* VCORECAL_SUPPORT */
|
|
{"ATEIPG", SetATEIpg},
|
|
{"ATEPAYLOAD", SetATEPayload},
|
|
{"ATEFIXEDPAYLOAD", SetATEFixedPayload},
|
|
#ifdef HUAWEI_ATE
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
{"ATEFILTER", SetATEMacFilter},
|
|
{"ATEFILTERENABLE", SetATEMacFilterEnable},
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
#endif /* HUAWEI_ATE */
|
|
#ifdef TXBF_SUPPORT
|
|
{"ATETXBF", SetATETxBf},
|
|
{"ATETXSOUNDING", SetATETxSounding},
|
|
{"ATETXBFDIVCAL", SetATETxBfDivcal},
|
|
{"ATETXBFLNACAL", SetATETxBfLnacal},
|
|
{"ATETxBfInit", SetATETxBfInit},
|
|
{"ATETxBfCal", SetATETxBfCal},
|
|
#ifdef MT76x2
|
|
{"ATETxBfNewCal", SetATETxBfNewCal},
|
|
{"ATETxBfNewVerify", SetATENewPhaseVerify},
|
|
#endif
|
|
{"ATETxBfGolden", SetATETxBfGolden},
|
|
{"ATETxBfVerify", SetATETXBfVerify},
|
|
{"ATETxBfVerifyN", SetATETxBfVerifyNoComp},
|
|
{"ATEForceBBP", SetATEForceBBP},
|
|
#endif /* TXBF_SUPPORT */
|
|
{"ATETTR", SetATETtr},
|
|
{"ATESHOW", SetATEShow},
|
|
{"ATEHELP", SetATEHelp},
|
|
#ifdef RT33xx
|
|
{"ATETXEVMSHOW", SetATETxEvmCalibrationShow},
|
|
{"ATETXEVMCAL", SetATETxEvmCalibration},
|
|
{"ATETXEVMFILL", SetATETxEvmCalibrationFill},
|
|
#endif /* RT33xx */
|
|
#ifdef CONFIG_QA
|
|
{"TxStop", SetTxStop},
|
|
{"RxStop", SetRxStop},
|
|
#ifdef DBG
|
|
{"EERead", SetEERead},
|
|
{"EEWrite", SetEEWrite},
|
|
{"BBPRead", SetBBPRead},
|
|
{"BBPWrite", SetBBPWrite},
|
|
#endif /* DBG */
|
|
#endif /* CONFIG_QA */
|
|
#endif /* CONFIG_ATE */
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
{"ApCliEnable", Set_ApCli_Enable_Proc},
|
|
{"ApCliSsid", Set_ApCli_Ssid_Proc},
|
|
{"ApCliBssid", Set_ApCli_Bssid_Proc},
|
|
{"ApCliAuthMode", Set_ApCli_AuthMode_Proc},
|
|
{"ApCliEncrypType", Set_ApCli_EncrypType_Proc},
|
|
{"ApCliDefaultKeyID", Set_ApCli_DefaultKeyID_Proc},
|
|
{"ApCliWPAPSK", Set_ApCli_WPAPSK_Proc},
|
|
{"ApCliKey1", Set_ApCli_Key1_Proc},
|
|
{"ApCliKey2", Set_ApCli_Key2_Proc},
|
|
{"ApCliKey3", Set_ApCli_Key3_Proc},
|
|
{"ApCliKey4", Set_ApCli_Key4_Proc},
|
|
{"ApCliTxMode", Set_ApCli_TxMode_Proc},
|
|
{"ApCliTxMcs", Set_ApCli_TxMcs_Proc},
|
|
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
|
{"ApCliAutoConnect", Set_ApCli_AutoConnect_Proc},
|
|
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
{"ApCliWpaSupport", Set_ApCli_Wpa_Support},
|
|
{"ApCliIEEE1X", Set_ApCli_IEEE8021X_Proc},
|
|
#endif /* WPA_SUPPLICANT_SUPPORT */
|
|
|
|
#ifdef MAC_REPEATER_SUPPORT
|
|
{"MACRepeaterEn", Set_ReptMode_Enable_Proc},
|
|
#if 0
|
|
{"ReptCliAddr", Set_ReptCli_Addr_Proc},
|
|
#endif
|
|
#endif /* MAC_REPEATER_SUPPORT */
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
{"ApCliWscSsid", Set_AP_WscSsid_Proc},
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef WSC_AP_SUPPORT
|
|
{"WscConfMode", Set_AP_WscConfMode_Proc},
|
|
{"WscConfStatus", Set_AP_WscConfStatus_Proc},
|
|
{"WscMode", Set_AP_WscMode_Proc},
|
|
{"WscStatus", Set_WscStatus_Proc},
|
|
{"WscGetConf", Set_AP_WscGetConf_Proc},
|
|
{"WscPinCode", Set_AP_WscPinCode_Proc},
|
|
{"WscStop", Set_WscStop_Proc},
|
|
{"WscGenPinCode", Set_WscGenPinCode_Proc},
|
|
{"WscVendorPinCode", Set_WscVendorPinCode_Proc},
|
|
{"WscSecurityMode", Set_AP_WscSecurityMode_Proc},
|
|
{"WscMultiByteCheck", Set_AP_WscMultiByteCheck_Proc},
|
|
{"WscVersion", Set_WscVersion_Proc},
|
|
#ifdef WSC_V2_SUPPORT
|
|
{"WscV2Support", Set_WscV2Support_Proc},
|
|
{"WscVersion2", Set_WscVersion2_Proc},
|
|
{"WscExtraTlvTag", Set_WscExtraTlvTag_Proc},
|
|
{"WscExtraTlvType", Set_WscExtraTlvType_Proc},
|
|
{"WscExtraTlvData", Set_WscExtraTlvData_Proc},
|
|
{"WscSetupLock", Set_WscSetupLock_Proc},
|
|
{"WscFragment", Set_WscFragment_Proc},
|
|
{"WscFragmentSize", Set_WscFragmentSize_Proc},
|
|
{"WscMaxPinAttack", Set_WscMaxPinAttack_Proc},
|
|
{"WscSetupLockTime", Set_WscSetupLockTime_Proc},
|
|
#endif /* WSC_V2_SUPPORT */
|
|
#ifdef WSC_NFC_SUPPORT
|
|
{"NfcStatus", Set_NfcStatus_Proc},
|
|
{"NfcPasswdToken", Set_NfcPasswdToken_Proc},
|
|
{"NfcConfigToken", Set_NfcConfigurationToken_Proc},
|
|
{"DoWpsByNFC", Set_DoWpsByNFC_Proc},
|
|
{"NfcRegenPK", Set_NfcRegenPK_Proc}, /* For NFC negative test */
|
|
#endif /* WSC_NFC_SUPPORT */
|
|
{"WscAutoTriggerDisable", Set_WscAutoTriggerDisable_Proc},
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#ifdef EASY_CONFIG_SETUP
|
|
{"AutoProvisionEn", Set_AP_AutoProvisionEnable_Proc},
|
|
{"RssiThreshold", Set_RssiThreshold_Proc},
|
|
#ifdef WAC_SUPPORT
|
|
{"WACEnable", Set_AP_WACEnable_Proc},
|
|
#endif /* WAC_SUPPORT */
|
|
#endif /* EASY_CONFIG_SETUP */
|
|
#ifdef NINTENDO_AP
|
|
{"NintendoCapable", Set_NintendiCapable_Proc},
|
|
{"NintendoLogin", Set_NintendoSet_Proc},
|
|
/* {"Nintendoget", Set_NintendoGet_Proc}, */
|
|
#endif /* NINTENDO_AP */
|
|
#ifdef UAPSD_SUPPORT
|
|
{"UAPSDCapable", Set_UAPSD_Proc},
|
|
#endif /* UAPSD_SUPPORT */
|
|
#ifdef IGMP_SNOOP_SUPPORT
|
|
{"IgmpSnEnable", Set_IgmpSn_Enable_Proc},
|
|
{"IgmpAdd", Set_IgmpSn_AddEntry_Proc},
|
|
{"IgmpDel", Set_IgmpSn_DelEntry_Proc},
|
|
#endif /* IGMP_SNOOP_SUPPORT */
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef MCAST_RATE_SPECIFIC
|
|
{"McastPhyMode", Set_McastPhyMode},
|
|
{"McastMcs", Set_McastMcs},
|
|
#endif /* MCAST_RATE_SPECIFIC */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
{"FixedTxMode", Set_FixedTxMode_Proc},
|
|
#ifdef CONFIG_APSTA_MIXED_SUPPORT
|
|
{"OpMode", Set_OpMode_Proc},
|
|
#endif /* CONFIG_APSTA_MIXED_SUPPORT */
|
|
#ifdef MESH_SUPPORT
|
|
{"MeshId", Set_MeshId_Proc},
|
|
{"MeshHostName", Set_MeshHostName_Proc},
|
|
{"MeshAutoLink", Set_MeshAutoLink_Proc},
|
|
{"MeshForward", Set_MeshForward_Proc},
|
|
{"MeshAddLink", Set_MeshAddLink_Proc},
|
|
{"MeshDelLink", Set_MeshDelLink_Proc},
|
|
{"MeshMultiCastAgeOut", Set_MeshMultiCastAgeOut_Proc},
|
|
{"MeshAuthMode", Set_MeshAuthMode_Proc},
|
|
{"MeshEncrypType", Set_MeshEncrypType_Proc},
|
|
{"MeshDefaultkey", Set_MeshDefaultkey_Proc},
|
|
{"MeshWEPKEY", Set_MeshWEPKEY_Proc},
|
|
{"MeshWPAKEY", Set_MeshWPAKEY_Proc},
|
|
#endif /* MESH_SUPPORT */
|
|
|
|
#ifdef TXBF_SUPPORT
|
|
#ifndef MT76x2
|
|
{"TxBfTag", Set_TxBfTag_Proc},
|
|
{"ReadITxBf", Set_ReadITxBf_Proc},
|
|
{"WriteITxBf", Set_WriteITxBf_Proc},
|
|
{"StatITxBf", Set_StatITxBf_Proc},
|
|
{"ReadETxBf", Set_ReadETxBf_Proc},
|
|
{"WriteETxBf", Set_WriteETxBf_Proc},
|
|
{"StatETxBf", Set_StatETxBf_Proc},
|
|
{"ITxBfTimeout", Set_ITxBfTimeout_Proc},
|
|
{"ETxBfTimeout", Set_ETxBfTimeout_Proc},
|
|
{"InvTxBfTag", Set_InvTxBfTag_Proc},
|
|
{"ITxBfCal", Set_ITxBfCal_Proc},
|
|
{"ITxBfDivCal", Set_ITxBfDivCal_Proc},
|
|
{"ITxBfLnaCal", Set_ITxBfLnaCal_Proc},
|
|
#endif
|
|
{"InvTxBfTag", Set_InvTxBfTag_Proc},
|
|
{"ITxBfDivCal", Set_ITxBfDivCal_Proc},
|
|
|
|
{"ITxBfEn", Set_ITxBfEn_Proc},
|
|
{"ETxBfEnCond", Set_ETxBfEnCond_Proc},
|
|
{"ETxBfCodebook", Set_ETxBfCodebook_Proc},
|
|
{"ETxBfCoefficient", Set_ETxBfCoefficient_Proc},
|
|
{"ETxBfGrouping", Set_ETxBfGrouping_Proc},
|
|
{"ETxBfNoncompress", Set_ETxBfNoncompress_Proc},
|
|
{"ETxBfIncapable", Set_ETxBfIncapable_Proc},
|
|
{"NoSndgCntThrd", Set_NoSndgCntThrd_Proc},
|
|
{"NdpSndgStreams", Set_NdpSndgStreams_Proc},
|
|
{"TriggerSounding", Set_Trigger_Sounding_Proc},
|
|
|
|
#ifdef MT76x2
|
|
{"TxBfProfileTagHelp", Set_TxBfProfileTag_Help},
|
|
{"TxBfProfileTagValid", Set_TxBfProfileTagValid},
|
|
{"TxBfProfileTagTimeOut", Set_TxBfProfileTag_TimeOut},
|
|
{"TxBfProfileTagMatrix", Set_TxBfProfileTag_Matrix},
|
|
{"TxBfProfileTagSNR", Set_TxBfProfileTag_SNR},
|
|
{"TxBfProfileTagTxScale", Set_TxBfProfileTag_TxScale},
|
|
{"TxBfProfileTagMac", Set_TxBfProfileTag_MAC},
|
|
{"TxBfProfileTagFlg", Set_TxBfProfileTag_Flg},
|
|
{"TxBfProfileTagRead", Set_TxBfProfileTagRead},
|
|
{"TxBfProfileTagWrite", Set_TxBfProfileTagWrite},
|
|
{"TxBfProfileDataRead", Set_TxBfProfileDataRead},
|
|
{"TxBfProfileDataWrite", Set_TxBfProfileDataWrite},
|
|
{"TxBfProfileDataReadAll", Set_TxBfProfileDataReadAll},
|
|
{"TxBfProfileDataWriteAll",Set_TxBfProfileDataWriteAll},
|
|
#endif
|
|
|
|
#endif /* TXBF_SUPPORT */
|
|
#ifdef VHT_TXBF_SUPPORT
|
|
{"VhtNDPA", Set_VhtNDPA_Sounding_Proc},
|
|
#endif /* VHT_TXBF_SUPPORT */
|
|
|
|
#if defined(RT2883) || defined(RT3883)
|
|
{"PhyRateLimit", Set_PhyRateLimit_Proc},
|
|
#ifdef DBG
|
|
{"FixedRate", Set_FixedRate_Proc},
|
|
#endif /* DBG */
|
|
#endif /* defined (RT2883) || defined (RT3883) */
|
|
|
|
#ifdef PRE_ANT_SWITCH
|
|
{"PreAntSwitch", Set_PreAntSwitch_Proc},
|
|
{"PreAntSwitchRSSI", Set_PreAntSwitchRSSI_Proc},
|
|
{"PreAntSwitchTimeout", Set_PreAntSwitchTimeout_Proc},
|
|
#endif /* PRE_ANT_SWITCH */
|
|
|
|
#ifdef CFO_TRACK
|
|
{"CFOTrack", Set_CFOTrack_Proc},
|
|
#endif /* CFO_TRACK */
|
|
|
|
#ifdef STREAM_MODE_SUPPORT
|
|
{"StreamMode", Set_StreamMode_Proc},
|
|
{"StreamModeMac", Set_StreamModeMac_Proc},
|
|
{"StreamModeMCS", Set_StreamModeMCS_Proc},
|
|
#endif /* STREAM_MODE_SUPPORT */
|
|
|
|
#ifdef DBG_CTRL_SUPPORT
|
|
{"DebugFlags", Set_DebugFlags_Proc},
|
|
#ifdef INCLUDE_DEBUG_QUEUE
|
|
{"DebugQueue", Set_DebugQueue_Proc},
|
|
#endif /* INCLUDE_DEBUG_QUEUE */
|
|
#endif /* DBG_CTRL_SUPPORT */
|
|
|
|
{"LongRetry", Set_LongRetryLimit_Proc},
|
|
{"ShortRetry", Set_ShortRetryLimit_Proc},
|
|
{"AutoFallBack", Set_AutoFallBack_Proc},
|
|
#ifdef RTMP_MAC_PCI
|
|
#ifdef DBG_DIAGNOSE
|
|
{"DiagOpt", Set_DiagOpt_Proc},
|
|
{"BDInfo", Set_BDInfo_Proc},
|
|
{"diag_cond", Set_diag_cond_Proc},
|
|
#endif /* DBG_DIAGNOSE */
|
|
#endif /* RTMP_MAC_PCI */
|
|
|
|
{"MeasureReq", Set_MeasureReq_Proc},
|
|
{"TpcReq", Set_TpcReq_Proc},
|
|
{"PwrConstraint", Set_PwrConstraint},
|
|
#ifdef DOT11K_RRM_SUPPORT
|
|
{"BcnReq", Set_BeaconReq_Proc},
|
|
{"LinkReq", Set_LinkMeasureReq_Proc},
|
|
{"RrmEnable", Set_Dot11kRRM_Enable_Proc},
|
|
{"TxReq", Set_TxStreamMeasureReq_Proc},
|
|
|
|
/* only for voice enterprise power constraint testing. */
|
|
{"vopwrc", Set_VoPwrConsTest},
|
|
|
|
/* only for selftesting and debugging. */
|
|
{"rrm", Set_RRM_Selftest_Proc},
|
|
#endif /* DOT11K_RRM_SUPPORT */
|
|
#ifdef DOT11V_WNM_SUPPORT
|
|
/* {"WnmMaxIdlePeriod", Set_WnmMaxIdlePeriod_Proc}, */
|
|
{"WNMTransMantREQ", Set_WNMTransMantREQ_Proc},
|
|
{"APWNMDMSShow", Set_APWNMDMSShow_Proc},
|
|
#endif /* DOT11V_WNM_SUPPORT */
|
|
#ifdef DOT11N_DRAFT3
|
|
{"OBSSScanParam", Set_OBSSScanParam_Proc},
|
|
{"AP2040Rescan", Set_AP2040ReScan_Proc},
|
|
{"HtBssCoex", Set_HT_BssCoex_Proc},
|
|
{"HtBssCoexApCntThr", Set_HT_BssCoexApCntThr_Proc},
|
|
#endif /* DOT11N_DRAFT3 */
|
|
{"EntryLifeCheck", Set_EntryLifeCheck_Proc},
|
|
#ifdef WMM_ACM_SUPPORT
|
|
{"acm", ACM_Ioctl},
|
|
#endif /* WMM_ACM_SUPPORT */
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
{"ft", FT_Ioctl},
|
|
{"ftenable", Set_FT_Enable},
|
|
{"ftmdid", Set_FT_Mdid},
|
|
{"ftr0khid", Set_FT_R0khid},
|
|
{"ftric", Set_FT_RIC},
|
|
{"ftotd", Set_FT_OTD},
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
|
|
#ifdef RTMP_EFUSE_SUPPORT
|
|
{"efuseLoadFromBin", set_eFuseLoadFromBin_Proc}, /* For backward compatible, the usage is the same as bufferLoadFromBin + bufferWriteBack */
|
|
{"efuseFreeNumber", set_eFuseGetFreeBlockCount_Proc},
|
|
{"efuseDump", set_eFusedump_Proc},
|
|
#ifdef CONFIG_ATE
|
|
{"bufferLoadFromEfuse", Set_LoadEepromBufferFromEfuse_Proc},
|
|
#ifdef BB_SOC
|
|
{"efuseBufferModeWriteBack", set_BinModeWriteBack_Proc},
|
|
#else
|
|
{"efuseBufferModeWriteBack", set_eFuseBufferModeWriteBack_Proc}, /* For backward compatible, the usage is the same as bufferWriteBack */
|
|
#endif
|
|
#endif /* CONFIG_ATE */
|
|
#endif /* RTMP_EFUSE_SUPPORT */
|
|
{"bufferLoadFromBin", Set_LoadEepromBufferFromBin_Proc},
|
|
{"bufferWriteBack", Set_EepromBufferWriteBack_Proc},
|
|
|
|
#ifdef RT30xx
|
|
{"ant", Set_Antenna_Proc},
|
|
#endif /* RT30xx */
|
|
|
|
#ifdef RT5350
|
|
{"HwAntDiv", Set_Hw_Antenna_Div_Proc},
|
|
#endif /* RT5350 */
|
|
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
#ifdef LED_CONTROL_SUPPORT
|
|
{"WlanLed", Set_WlanLed_Proc},
|
|
#endif /* LED_CONTROL_SUPPORT */
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
|
|
#ifdef AP_QLOAD_SUPPORT
|
|
{"qloadclr", Set_QloadClr_Proc},
|
|
{"qloadalarmtimethres", Set_QloadAlarmTimeThreshold_Proc}, /* QLOAD ALARM */
|
|
{"qloadalarmnumthres", Set_QloadAlarmNumThreshold_Proc}, /* QLOAD ALARM */
|
|
#endif /* AP_QLOAD_SUPPORT */
|
|
|
|
{"ra_interval", Set_RateAdaptInterval},
|
|
|
|
#ifdef THERMAL_PROTECT_SUPPORT
|
|
{"tpc", set_thermal_protection_criteria_proc},
|
|
#endif /* THERMAL_PROTECT_SUPPORT */
|
|
|
|
#ifdef SMART_ANTENNA
|
|
{"sa", Set_SmartAnt_Proc},
|
|
{"sa_msc", Set_McsStableCnt_Proc},
|
|
{"sa_mcs", Set_SA_McsBound_Proc},
|
|
{"sa_sta", Set_SA_Station_Proc},
|
|
{"sa_starule", Set_SA_StationCandRule_Proc},
|
|
{"sa_mode", Set_SA_Mode_Proc},
|
|
{"sa_txNss", set_SA_txNss_Proc},
|
|
{"sa_ant", Set_SA_StaticAntPair_Proc},
|
|
{"sa_agsp", Set_SA_AGSP_Proc},
|
|
{"sa_tseq", Set_SA_TrainSeq_Proc},
|
|
{"sa_tdelay", Set_SA_TrainDelay_Proc},
|
|
{"sa_tcond", Set_SA_TrainCond_Proc},
|
|
{"sa_rssivar", Set_SA_RssiVariance_Proc},
|
|
{"sa_rssith", Set_SA_RssiThreshold_Proc},
|
|
{"sa_skipconf", Set_SA_SkipConfirmStage_Proc},
|
|
{"sa_tcand", Set_SA_AntCand_Proc},
|
|
{"sa_tp", Set_TestPeriod_Proc},
|
|
{"sa_tc", Set_MaxAntennaTry_Proc},
|
|
{"sa_dbg", Set_DbgLogOn_Proc},
|
|
#endif // SMART_ANTENNA //
|
|
|
|
{"memdebug", Set_MemDebug_Proc},
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
{"pslifetime", Set_PowerSaveLifeTime_Proc},
|
|
|
|
#ifdef MBSS_SUPPORT
|
|
{"MBSSWirelessMode", Set_MBSS_WirelessMode_Proc},
|
|
#endif /* MBSS_SUPPORT */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef P2P_SUPPORT
|
|
{"P2pCliEnable", Set_P2pCli_Enable_Proc},
|
|
{"P2pCliSsid", Set_P2pCli_Ssid_Proc},
|
|
{"P2pCliBssid", Set_P2pCli_Bssid_Proc},
|
|
{"P2pCliAuthMode", Set_P2pCli_AuthMode_Proc},
|
|
{"P2pCliEncrypType", Set_P2pCli_EncrypType_Proc},
|
|
{"P2pCliDefaultKeyID", Set_P2pCli_DefaultKeyID_Proc},
|
|
{"P2pCliWPAPSK", Set_P2pCli_WPAPSK_Proc},
|
|
{"P2pCliKey1", Set_P2pCli_Key1_Proc},
|
|
{"P2pCliKey2", Set_P2pCli_Key2_Proc},
|
|
{"P2pCliKey3", Set_P2pCli_Key3_Proc},
|
|
{"P2pCliKey4", Set_P2pCli_Key4_Proc},
|
|
{"P2pCliTxMode", Set_P2pCli_TxMode_Proc},
|
|
{"P2pCliTxMcs", Set_P2pCli_TxMcs_Proc},
|
|
#ifdef WSC_AP_SUPPORT
|
|
{"P2pCliWscSsid", Set_P2pCli_WscSsid_Proc},
|
|
#endif /* WSC_AP_SUPPORT */
|
|
{"P2pOpMode", Set_P2p_OpMode_Proc},
|
|
{"p2pEnable", Set_P2P_Enable},
|
|
{"p2pLisCh", Set_P2P_Listen_Channel},
|
|
{"p2pOpCh", Set_P2P_Operation_Channel},
|
|
{"p2pGoInt", Set_P2P_GO_Intent},
|
|
{"p2pDevName", Set_P2P_Device_Name},
|
|
{"p2pWscMode", Set_P2P_WSC_Mode},
|
|
{"p2pWscConf", Set_P2P_WSC_ConfMethod},
|
|
{"p2pNoACnt", Set_P2P_NoA_Count},
|
|
{"p2pNoADuration", Set_P2P_NoA_Duration},
|
|
{"p2pNoAInv", Set_P2P_NoA_Interval},
|
|
{"p2pExtLst", Set_P2P_Extend_Listen},
|
|
{"p2pExtLstPrd", Set_P2P_Extend_Listen_Periodic},
|
|
{"p2pExtLstInv", Set_P2P_Extend_Listen_Interval},
|
|
{"p2pIntraBss", Set_P2P_Intra_Bss},
|
|
{"p2pScan", Set_P2P_Scan},
|
|
{"p2pProv", Set_P2P_Provision_Proc},
|
|
{"p2pInv", Set_P2P_Invite_Proc},
|
|
{"p2pDevDisc", Set_P2P_Device_Discoverability_Proc},
|
|
{"p2pLink", Set_P2P_Connect_GoIndex_Proc},
|
|
{"p2pCfg", Set_P2P_Print_Cfg},
|
|
{"p2pTab", Set_P2P_Print_GroupTable_Proc},
|
|
{"p2pPerTab", Set_P2P_Print_PersistentTable_Proc},
|
|
{"p2pStat", Set_P2P_State_Proc},
|
|
{"p2pReset", Set_P2P_Reset_Proc},
|
|
{"p2pDefConfMthd", Set_P2P_Default_Config_Method_Proc},
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
{"VcoPeriod", Set_VcoPeriod_Proc},
|
|
#ifdef CONFIG_SNIFFER_SUPPORT
|
|
{"MonitorMode", Set_MonitorMode_Proc},
|
|
#endif /* CONFIG_SNIFFER_SUPPORT */
|
|
#ifdef SINGLE_SKU
|
|
{"ModuleTxpower", Set_ModuleTxpower_Proc},
|
|
#endif /* SINGLE_SKU */
|
|
|
|
#ifdef RT6352
|
|
{"TestDPDCalibration", Set_TestDPDCalibration_Proc},
|
|
{"TestDPDCalibrationTX0", Set_TestDPDCalibrationTX0_Proc},
|
|
{"TestDPDCalibrationTX1", Set_TestDPDCalibrationTX1_Proc},
|
|
#endif /* RT6352 */
|
|
|
|
#ifdef DOT11W_PMF_SUPPORT
|
|
{"PMFMFPC", Set_PMFMFPC_Proc},
|
|
{"PMFMFPR", Set_PMFMFPR_Proc},
|
|
{"PMFSHA256", Set_PMFSHA256_Proc},
|
|
#endif /* DOT11W_PMF_SUPPORT */
|
|
|
|
#ifdef MICROWAVE_OVEN_SUPPORT
|
|
{"MO_FalseCCATh", Set_MO_FalseCCATh_Proc},
|
|
#endif /* MICROWAVE_OVEN_SUPPORT */
|
|
|
|
#ifdef CONFIG_FPGA_MODE
|
|
{"fpga_on", set_fpga_mode}, /* 1 = manual mode, 2 = fix phy/mode/rate/mcs */
|
|
{"dataphy", set_data_phy_mode}, /* 0 = CCK, 1 = OFDM, 2 = MODE_HTMIX, 3 = HT-GF, 4 = VHT */
|
|
{"databw", set_data_bw}, /* 0 = 20M, 1 = 40M, 2 = 80M */
|
|
{"datamcs", set_data_mcs}, /* 0~ 15 */
|
|
{"databasize", set_data_basize},
|
|
{"datagi", set_data_gi},
|
|
{"dataldpc", set_data_ldpc},
|
|
{"txcnt", set_tx_kickcnt},
|
|
{"stop_tr", set_tr_stop},
|
|
{"vco_cal", set_vco_cal},
|
|
|
|
#ifdef MT_MAC
|
|
{"txs_type", set_txs_report_type},
|
|
{"no_bcn", set_no_bcn},
|
|
#endif /* MT_MAC */
|
|
|
|
#ifdef CAPTURE_MODE
|
|
{"cap_start", set_cap_start},
|
|
{"cap_trigger", set_cap_trigger},
|
|
{"cap_dump", set_cap_dump},
|
|
#endif /* CAPTURE_MODE */
|
|
#endif /* CONFIG_FPGA_MODE */
|
|
|
|
#if defined(WFA_VHT_PF) || defined(MT7603_FPGA) || defined(MT7628_FPGA)
|
|
{"force_amsdu", set_force_amsdu},
|
|
#endif /* defined(WFA_VHT_PF) || defined(MT7603_FPGA) */
|
|
|
|
#ifdef WFA_VHT_PF
|
|
{"nss_mcs_opt", set_vht_nss_mcs_opt}, // SIGMA
|
|
{"opt_md_notif_ie", set_vht_opmode_notify_ie}, // SIGMA
|
|
{"force_op", set_force_operating_mode},
|
|
{"force_noack", set_force_noack},
|
|
{"force_vht_sgi", set_force_vht_sgi},
|
|
{"force_vht_stbc", set_force_vht_tx_stbc},
|
|
{"ext_cca", set_force_ext_cca},
|
|
#endif /* WFA_VHT_PF */
|
|
{"rf", SetRF},
|
|
#ifdef MT76x0
|
|
{"AntennaSelect", Set_AntennaSelect_Proc},
|
|
#endif /* MT76x0 */
|
|
{"tssi_enable", set_tssi_enable},
|
|
#ifdef RLT_MAC
|
|
#ifdef CONFIG_WIFI_TEST
|
|
{"pbf_loopback", set_pbf_loopback},
|
|
{"pbf_rx_drop", set_pbf_rx_drop},
|
|
#endif
|
|
#endif
|
|
#ifdef DYNAMIC_VGA_SUPPORT
|
|
{"DyncVgaEnable", Set_DyncVgaEnable_Proc},
|
|
{"fc_hth", set_false_cca_hi_th},
|
|
{"fc_lth", set_false_cca_low_th},
|
|
#endif /* DYNAMIC_VGA_SUPPORT */
|
|
#ifdef MT_MAC
|
|
{"TimEnable", Set_AP_TimEnable_Proc},//only for development purpose!! iwpriv ra0 set
|
|
{"TmrEnable", setApTmrEnableProc},//0: disalbe, 1: initialiter, 2: responser.
|
|
{"get_fid", set_get_fid},
|
|
{"fwlog", set_fw_log},
|
|
{"manual_txop", SetManualTxOP},
|
|
{"manual_txop_thld", SetManualTxOPThreshold},
|
|
{"manual_txop_upbound", SetManualTxOPUpBound},
|
|
{"manual_txop_lowbound", SetManualTxOPLowBound},
|
|
#ifdef DBG
|
|
{"DumpTime", Set_AP_DumpTime_Proc},//only for development purpose!! iwpriv ra0 set
|
|
{"BcnStateCtrl", Set_BcnStateCtrl_Proc},//only for development purpose!! iwpriv ra0 set
|
|
#endif
|
|
#ifdef LED_CONTROL_SUPPORT
|
|
{"MT7603LED", Set_MT7603LED_Proc},
|
|
{"MT7603LEDEnhance", Set_MT7603LED_Enhance_Proc},
|
|
{"MT7603LEDBehavior", Set_MT7603LED_Behavor_Proc},
|
|
#endif /* LED_CONTROL_SUPPORT */
|
|
#ifdef RTMP_MAC_PCI
|
|
{"pdma_dbg", Set_PDMAWatchDog_Proc},
|
|
{"pse_dbg", SetPSEWatchDog_Proc},
|
|
#endif
|
|
{"get_thermal_sensor", Set_themal_sensor},
|
|
{"rx_pspoll_filter", Set_rx_pspoll_filter_proc},
|
|
#endif
|
|
#ifdef RT_CFG80211_SUPPORT
|
|
{"DisableCfg2040Scan", Set_DisableCfg2040Scan_Proc},
|
|
#endif
|
|
#ifdef SINGLE_SKU_V2
|
|
{"SKUEnable", SetSKUEnable_Proc},
|
|
#endif /* SINGLE_SKU_V2 */
|
|
{"ed_chk", Set_ed_chk_proc},
|
|
#ifdef SMART_CARRIER_SENSE_SUPPORT
|
|
{"SCSEnable", SetSCSEnable_Proc},
|
|
{"SCSCfg", SetSCSCfg_Proc},
|
|
#endif /* SMART_CARRIER_SENSE_SUPPORT */
|
|
{NULL,}
|
|
};
|
|
|
|
|
|
static struct {
|
|
RTMP_STRING *name;
|
|
INT (*set_proc)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
|
} *PRTMP_PRIVATE_SHOW_PROC, RTMP_PRIVATE_SHOW_SUPPORT_PROC[] = {
|
|
{"stainfo", Show_MacTable_Proc},
|
|
#ifdef MT_MAC
|
|
{"psinfo", Show_PSTable_Proc},
|
|
{"wtbl", show_wtbl_proc},
|
|
{"mibinfo", show_mib_proc},
|
|
{"tmacinfo", ShowTmacInfo},
|
|
{"agginfo", ShowAggInfo},
|
|
{"manual_txop", ShowManualTxOP},
|
|
{"pseinfo", ShowPseInfo},
|
|
{"psedata", ShowPseData},
|
|
#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_USB_SUPPORT)
|
|
{"dschinfo", ShowDMASchInfo},
|
|
#endif
|
|
#endif /* MT_MAC */
|
|
{"sta_tr", Show_sta_tr_proc},
|
|
{"peerinfo", show_stainfo_proc},
|
|
{"stacountinfo", Show_StaCount_Proc},
|
|
{"stasecinfo", Show_StaSecurityInfo_Proc},
|
|
{"descinfo", Show_DescInfo_Proc},
|
|
{"driverinfo", Show_DriverInfo_Proc},
|
|
{"devinfo", show_devinfo_proc},
|
|
{"sysinfo", show_sysinfo_proc},
|
|
{"trinfo", show_trinfo_proc},
|
|
{"pwrinfo", show_pwr_info},
|
|
{"txqinfo", show_txqinfo_proc},
|
|
#ifdef WDS_SUPPORT
|
|
{"wdsinfo", Show_WdsTable_Proc},
|
|
#endif /* WDS_SUPPORT */
|
|
#ifdef DOT11_N_SUPPORT
|
|
{"bainfo", Show_BaTable_Proc},
|
|
#endif /* DOT11_N_SUPPORT */
|
|
{"stat", Show_Sat_Proc},
|
|
#ifdef RTMP_MAC_PCI
|
|
#ifdef DBG_DIAGNOSE
|
|
{"diag", Show_Diag_Proc},
|
|
#endif /* DBG_DIAGNOSE */
|
|
#endif /* RTMP_MAC_PCI */
|
|
{"stat_reset", Show_Sat_Reset_Proc},
|
|
#ifdef IGMP_SNOOP_SUPPORT
|
|
{"igmpinfo", Set_IgmpSn_TabDisplay_Proc},
|
|
#endif /* IGMP_SNOOP_SUPPORT */
|
|
#ifdef MCAST_RATE_SPECIFIC
|
|
{"mcastrate", Show_McastRate},
|
|
#endif /* MCAST_RATE_SPECIFIC */
|
|
#ifdef MAT_SUPPORT
|
|
{"matinfo", Show_MATTable_Proc},
|
|
#endif /* MAT_SUPPORT */
|
|
#ifdef RELEASE_EXCLUDE
|
|
#ifdef RTMP_MAC_USB
|
|
{"rxbulk", Show_RxBulk_Proc},
|
|
{"txbulk", Show_TxBulk_Proc},
|
|
#endif /* RTMP_MAC_USB */
|
|
#endif /* RELEASE_EXCLUDE */
|
|
#ifdef MESH_SUPPORT
|
|
{"meshinfo", Set_MeshInfo_Display_Proc},
|
|
{"neighinfo", Set_NeighborInfo_Display_Proc},
|
|
{"meshrouteinfo", Set_MeshRouteInfo_Display_Proc},
|
|
{"meshproxyinfo", Set_MeshProxyInfo_Display_Proc},
|
|
{"meshentryinfo", Set_MeshEntryInfo_Display_Proc},
|
|
{"multipathinfo", Set_MultipathInfo_Display_Proc},
|
|
{"multicastageoutinfo", Set_MultiCastAgeOut_Display_Proc},
|
|
{"pktsiginfo", Set_PktSig_Display_Proc},
|
|
#endif /* MESH_SUPPORT */
|
|
#ifdef DFS_SUPPORT
|
|
{"blockch", Show_BlockCh_Proc},
|
|
#endif /* DFS_SUPPORT */
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
{"ftinfo", Show_FTConfig_Proc},
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
#ifdef DOT11K_RRM_SUPPORT
|
|
{"rrminfo", RRM_InfoDisplay_Proc},
|
|
#endif /* DOT11K_RRM_SUPPORT */
|
|
#ifdef AP_QLOAD_SUPPORT
|
|
{"qload", Show_QoSLoad_Proc},
|
|
#endif /* AP_QLOAD_SUPPORT */
|
|
#ifdef APCLI_SUPPORT
|
|
{"connStatus", RTMPIoctlConnStatus},
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef MAC_REPEATER_SUPPORT
|
|
{"reptinfo", Show_Repeater_Cli_Proc},
|
|
#endif /* MAC_REPEATER_SUPPORT */
|
|
#ifdef SMART_ANTENNA
|
|
{"sainfo", Show_SA_CfgInfo_Proc},
|
|
{"sadbginfo", Show_SA_DbgInfo_Proc},
|
|
#endif // SMART_ANTENNA //
|
|
|
|
{"rainfo", Show_RAInfo_Proc},
|
|
|
|
#ifdef MBSS_SUPPORT
|
|
{"mbss", Show_MbssInfo_Display_Proc},
|
|
#endif /* MBSS_SUPPORT */
|
|
#ifdef WSC_AP_SUPPORT
|
|
{"WscPeerList", WscApShowPeerList},
|
|
#ifdef WSC_NFC_SUPPORT
|
|
{"NfcStatus", Get_NfcStatus_Proc},
|
|
#endif /* WSC_NFC_SUPPORT */
|
|
#endif /* WSC_AP_SUPPORT */
|
|
{"rfinfo", ShowRFInfo},
|
|
{"bbpinfo", ShowBBPInfo},
|
|
#ifdef SMART_CARRIER_SENSE_SUPPORT
|
|
{"SCSInfo", ShowSCSInfo},
|
|
#endif /* SMART_CARRIER_SENSE_SUPPORT */
|
|
{NULL,}
|
|
};
|
|
|
|
|
|
INT RTMPAPPrivIoctlSet(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)
|
|
{
|
|
RTMP_STRING *this_char, *value;
|
|
INT Status = NDIS_STATUS_SUCCESS;
|
|
|
|
while ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, ",")) != NULL)
|
|
{
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
if ((value = strchr(this_char, '=')) != NULL)
|
|
*value++ = 0;
|
|
|
|
if (!value
|
|
#ifdef WSC_AP_SUPPORT
|
|
&& (
|
|
(strcmp(this_char, "WscStop") != 0) &&
|
|
#ifdef BB_SOC
|
|
(strcmp(this_char, "WscResetPinCode") != 0) &&
|
|
#endif
|
|
(strcmp(this_char, "WscGenPinCode")!= 0)
|
|
)
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#ifdef SMART_ANTENNA
|
|
&& (strcmp(this_char, "sa") != 0)
|
|
#endif /* SMART_ANTENNA */
|
|
)
|
|
continue;
|
|
|
|
for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++)
|
|
{
|
|
if (!strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name))
|
|
{
|
|
if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAd, value))
|
|
{ /*FALSE:Set private failed then return Invalid argument */
|
|
Status = -EINVAL;
|
|
}
|
|
break; /*Exit for loop. */
|
|
}
|
|
}
|
|
|
|
if(PRTMP_PRIVATE_SET_PROC->name == NULL)
|
|
{ /*Not found argument */
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::(iwpriv) Command not Support [%s=%s]\n", this_char, value));
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
|
|
INT RTMPAPPrivIoctlShow(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)
|
|
{
|
|
RTMP_STRING *this_char, *value = NULL;
|
|
INT Status = NDIS_STATUS_SUCCESS;
|
|
|
|
while ((this_char = strsep((char **)&pIoctlCmdStr->u.data.pointer, ",")) != NULL)
|
|
{
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
value = strchr(this_char, '=');
|
|
if (value) {
|
|
if (strlen(value) > 1) {
|
|
*value=0;
|
|
value++;
|
|
} else
|
|
value = NULL;
|
|
}
|
|
|
|
for (PRTMP_PRIVATE_SHOW_PROC = RTMP_PRIVATE_SHOW_SUPPORT_PROC; PRTMP_PRIVATE_SHOW_PROC->name; PRTMP_PRIVATE_SHOW_PROC++)
|
|
{
|
|
if (!strcmp(this_char, PRTMP_PRIVATE_SHOW_PROC->name))
|
|
{
|
|
if(!PRTMP_PRIVATE_SHOW_PROC->set_proc(pAd, value))
|
|
{ /*FALSE:Set private failed then return Invalid argument */
|
|
Status = -EINVAL;
|
|
}
|
|
break; /*Exit for loop. */
|
|
}
|
|
}
|
|
|
|
if(PRTMP_PRIVATE_SHOW_PROC->name == NULL)
|
|
{ /*Not found argument */
|
|
Status = -EINVAL;
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
if (pAd->infType == RTMP_DEV_INF_RBUS)
|
|
{
|
|
for (PRTMP_PRIVATE_SHOW_PROC = RTMP_PRIVATE_SHOW_SUPPORT_PROC; PRTMP_PRIVATE_SHOW_PROC->name; PRTMP_PRIVATE_SHOW_PROC++)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", PRTMP_PRIVATE_SHOW_PROC->name));
|
|
}
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::(iwpriv) Command not Support [%s=%s]\n", this_char, value));
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
#if defined(INF_AR9) || defined(BB_SOC)
|
|
#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC)
|
|
INT RTMPAPPrivIoctlAR9Show(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *pIoctlCmdStr)
|
|
{
|
|
INT Status = NDIS_STATUS_SUCCESS;
|
|
|
|
if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_mac_table"))
|
|
{
|
|
RTMPAR9IoctlGetMacTable(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_stat2"))
|
|
{
|
|
RTMPIoctlGetSTAT2(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_radio_dyn_info"))
|
|
{
|
|
RTMPIoctlGetRadioDynInfo(pAd,pIoctlCmdStr);
|
|
}
|
|
#ifdef WSC_AP_SUPPORT
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_profile"))
|
|
{
|
|
RTMPAR9IoctlWscProfile(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_pincode"))
|
|
{
|
|
RTMPIoctlWscPINCode(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_wsc_status"))
|
|
{
|
|
RTMPIoctlWscStatus(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_wps_dyn_info"))
|
|
{
|
|
RTMPIoctlGetWscDynInfo(pAd,pIoctlCmdStr);
|
|
}
|
|
else if(!strcmp(pIoctlCmdStr->u.data.pointer, "get_wps_regs_dyn_info"))
|
|
{
|
|
RTMPIoctlGetWscRegsDynInfo(pAd,pIoctlCmdStr);
|
|
}
|
|
#endif
|
|
return Status;
|
|
}
|
|
#endif /*AR9_MAPI_SUPPORT*/
|
|
#endif/*AR9_INF*/
|
|
|
|
INT RTMPAPSetInformation(
|
|
IN PRTMP_ADAPTER pAd,
|
|
INOUT RTMP_IOCTL_INPUT_STRUCT *rq,
|
|
IN INT cmd)
|
|
{
|
|
RTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;
|
|
UCHAR Addr[MAC_ADDR_LEN];
|
|
INT Status = NDIS_STATUS_SUCCESS;
|
|
|
|
#ifdef SNMP_SUPPORT
|
|
/*snmp */
|
|
UINT KeyIdx = 0;
|
|
PNDIS_AP_802_11_KEY pKey = NULL;
|
|
TX_RTY_CFG_STRUC tx_rty_cfg;
|
|
ULONG ShortRetryLimit, LongRetryLimit;
|
|
UCHAR ctmp;
|
|
#endif /* SNMP_SUPPORT */
|
|
|
|
#ifdef MESH_SUPPORT
|
|
BOOLEAN RestartMeshIsRequired = FALSE;
|
|
#endif /* MESH_SUPPORT */
|
|
|
|
NDIS_802_11_WEP_STATUS WepStatus;
|
|
NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax;
|
|
NDIS_802_11_SSID Ssid;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
STA_TR_ENTRY *tr_entry;
|
|
struct ieee80211req_mlme mlme;
|
|
|
|
struct ieee80211req_key Key;
|
|
struct ieee80211req_del_key delkey;
|
|
UINT8 Wcid;
|
|
BSS_STRUCT *pMbss ;
|
|
WSC_LV_INFO WscIEBeacon;
|
|
WSC_LV_INFO WscIEProbeResp;
|
|
int i;
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
INT ifIndex;
|
|
BOOLEAN apcliEn=FALSE;
|
|
PNDIS_APCLI_802_11_PMKID pPmkId = NULL;
|
|
BOOLEAN IEEE8021xState = FALSE;
|
|
BOOLEAN IEEE8021x_required_keys = FALSE;
|
|
UCHAR wpa_supplicant_enable = 0;
|
|
PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL;
|
|
INT BssIdx, i;
|
|
PNDIS_802_11_WEP pWepKey =NULL;
|
|
PAPCLI_STRUCT pApCliEntry=NULL;
|
|
MAC_TABLE_ENTRY *pMacEntry=(MAC_TABLE_ENTRY *)NULL;
|
|
PNDIS_APCLI_802_11_KEY pApCliKey = NULL;
|
|
MLME_DISASSOC_REQ_STRUCT DisassocReq;
|
|
MLME_DEAUTH_REQ_STRUCT DeAuthFrame;
|
|
PULONG pCurrState;
|
|
STA_TR_ENTRY *tr_entry = NULL;
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
|
|
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
switch(cmd & 0x7FFF)
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
case OID_802_11_SET_IEEE8021X:
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
|
|
if(apcliEn == TRUE )
|
|
{
|
|
Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.IEEE8021X = IEEE8021xState;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Apcli(%d)::OID_802_11_SET_IEEE8021X (=%d)\n",ifIndex, IEEE8021xState));
|
|
}
|
|
else
|
|
Status = -EINVAL;
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_SET_IEEE8021X_REQUIRE_KEY:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
if(apcliEn == TRUE )
|
|
{
|
|
Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.IEEE8021x_required_keys = IEEE8021x_required_keys;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Apcli(%d)::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\n",ifIndex, IEEE8021x_required_keys));
|
|
}
|
|
else
|
|
Status = -EINVAL;
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_PMKID:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&pPmkId, wrq->u.data.length);
|
|
|
|
if(pPmkId == NULL) {
|
|
Status = -ENOMEM;
|
|
break;
|
|
}
|
|
Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
/* check the PMKID information */
|
|
if (pPmkId->BSSIDInfoCount == 0)
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);
|
|
else
|
|
{
|
|
PBSSID_INFO pBssIdInfo;
|
|
UINT BssIdx;
|
|
UINT CachedIdx;
|
|
UINT tail;
|
|
|
|
tail = Offsetof(NDIS_APCLI_802_11_PMKID, BSSIDInfo);
|
|
for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++)
|
|
{
|
|
tail += sizeof(BSSID_INFO);
|
|
if (tail > wrq->u.data.length) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("buf not enough, stop at BssIdx %u\n",
|
|
BssIdx));
|
|
break;
|
|
}
|
|
/* point to the indexed BSSID_INFO structure */
|
|
pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO));
|
|
/* Find the entry in the saved data base. */
|
|
for (CachedIdx = 0; CachedIdx < pAd->ApCfg.ApCliTab[ifIndex].SavedPMKNum; CachedIdx++)
|
|
{
|
|
/* compare the BSSID */
|
|
if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS)))
|
|
break;
|
|
}
|
|
|
|
/* Found, replace it */
|
|
if (CachedIdx < PMKID_NO)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
|
|
NdisMoveMemory(&pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
|
|
pAd->ApCfg.ApCliTab[ifIndex].SavedPMKNum++;
|
|
}
|
|
/* Not found, replace the last one */
|
|
else
|
|
{
|
|
/* Randomly replace one */
|
|
CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO);
|
|
DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
|
|
NdisMoveMemory(&pAd->ApCfg.ApCliTab[ifIndex].SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
|
|
}
|
|
}
|
|
}
|
|
if(pPmkId)
|
|
os_free_mem(NULL, pPmkId);
|
|
break;
|
|
|
|
case RT_OID_WPA_SUPPLICANT_SUPPORT:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
Status = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (wpa_supplicant_enable & WPA_SUPPLICANT_ENABLE_WPS)
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP |= WPA_SUPPLICANT_ENABLE_WPS;
|
|
else
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP = wpa_supplicant_enable;
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP &= 0x7F;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("APCLI Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=0x%02X)\n",
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_REMOVE_KEY:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&pRemoveKey, wrq->u.data.length);
|
|
if(pRemoveKey == NULL)
|
|
{
|
|
Status = -ENOMEM;
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (pRemoveKey->Length != wrq->u.data.length)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!\n"));
|
|
}
|
|
else
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
{
|
|
RTMPWPARemoveKeyProc(pAd, pRemoveKey);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\n"));
|
|
}
|
|
else
|
|
{
|
|
UINT KeyIdx;
|
|
BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;
|
|
KeyIdx = pRemoveKey->KeyIndex;
|
|
|
|
if (KeyIdx & 0x80000000)
|
|
{
|
|
/* Should never set default bit when remove key */
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\n"));
|
|
}
|
|
else
|
|
{
|
|
KeyIdx = KeyIdx & 0x0fffffff;
|
|
if (KeyIdx > 3)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\n", KeyIdx));
|
|
}
|
|
else
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].KeyLen = 0;
|
|
pAd->ApCfg.ApCliTab[ifIndex].SharedKey[KeyIdx].CipherAlg = CIPHER_NONE;
|
|
AsicRemoveSharedKeyEntry(pAd
|
|
, (UCHAR)BssIdx
|
|
, (UCHAR)KeyIdx);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (pRemoveKey)
|
|
os_free_mem(NULL, pRemoveKey);
|
|
break;
|
|
|
|
case OID_802_11_ADD_WEP:
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&pWepKey, wrq->u.data.length);
|
|
if(pWepKey == NULL)
|
|
{
|
|
Status = -ENOMEM;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Apcli::OID_802_11_ADD_WEP, Failed!!\n"));
|
|
break;
|
|
}
|
|
BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID];
|
|
Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\n"));
|
|
} else if ((pWepKey->KeyLength != 5) &&
|
|
(pWepKey->KeyLength != 13)) {
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("invalid pWepKey->KeyLength %u\n",
|
|
pWepKey->KeyLength));
|
|
}
|
|
else
|
|
{
|
|
UINT KeyIdx;
|
|
KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
|
|
/* KeyIdx must be 0 ~ 3 */
|
|
if (KeyIdx > 3) {
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set ApCli::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\n"));
|
|
}
|
|
else
|
|
{
|
|
UCHAR CipherAlg = 0;
|
|
PUCHAR Key;
|
|
|
|
/* Zero the specific shared key */
|
|
NdisZeroMemory(&pApCliEntry->SharedKey[KeyIdx], sizeof(CIPHER_KEY));
|
|
|
|
/* set key material and key length */
|
|
pApCliEntry->SharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
|
|
NdisMoveMemory(pApCliEntry->SharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
|
|
|
|
switch(pWepKey->KeyLength)
|
|
{
|
|
case 5:
|
|
CipherAlg = CIPHER_WEP64;
|
|
break;
|
|
case 13:
|
|
CipherAlg = CIPHER_WEP128;
|
|
break;
|
|
default:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
pApCliEntry->SharedKey[KeyIdx].CipherAlg = CipherAlg;
|
|
|
|
/* Default key for tx (shared key) */
|
|
if (pWepKey->KeyIndex & 0x80000000)
|
|
{
|
|
NdisZeroMemory(&pApCliEntry->wpa_supplicant_info.DesireSharedKey[KeyIdx], sizeof(CIPHER_KEY));
|
|
|
|
/* set key material and key length */
|
|
pApCliEntry->wpa_supplicant_info.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
|
|
NdisMoveMemory(pApCliEntry->wpa_supplicant_info.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
|
|
pApCliEntry->wpa_supplicant_info.DesireSharedKeyId =
|
|
(UCHAR)KeyIdx;
|
|
pApCliEntry->wpa_supplicant_info.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg;
|
|
|
|
pApCliEntry->wdev.DefaultKeyId = (UCHAR) KeyIdx;
|
|
}
|
|
|
|
if ((pApCliEntry->wpa_supplicant_info.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&
|
|
(pApCliEntry->wdev.AuthMode >= Ndis802_11AuthModeWPA))
|
|
{
|
|
Key = pWepKey->KeyMaterial;
|
|
|
|
/* Set Group key material to Asic */
|
|
AsicAddSharedKeyEntry(pAd
|
|
, (UCHAR)BssIdx
|
|
, (UCHAR)KeyIdx
|
|
, &pApCliEntry->SharedKey[KeyIdx]);
|
|
|
|
if (pWepKey->KeyIndex & 0x80000000) {
|
|
RTMPSetWcidSecurityInfo(pAd, (UCHAR)BssIdx
|
|
, (UINT8)KeyIdx, CipherAlg
|
|
, pApCliEntry->MacTabWCID, SHAREDKEYTABLE);
|
|
}
|
|
NdisAcquireSpinLock(&pAd->MacTabLock);
|
|
// TODO: shiang-usw, need to replace upper setting with tr_entry
|
|
pAd->MacTab.tr_entry[pMacEntry->wcid].PortSecured = WPA_802_1X_PORT_SECURED;
|
|
NdisReleaseSpinLock(&pAd->MacTabLock);
|
|
}
|
|
else if ((pApCliEntry->Valid == TRUE)
|
|
&& (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED))
|
|
{
|
|
Key = pApCliEntry->SharedKey[KeyIdx].Key;
|
|
|
|
/* Set key material and cipherAlg to Asic */
|
|
AsicAddSharedKeyEntry(pAd, (UCHAR)BssIdx
|
|
, (UCHAR)KeyIdx, &pApCliEntry->SharedKey[KeyIdx]);
|
|
|
|
if (pWepKey->KeyIndex & 0x80000000)
|
|
{
|
|
/* Assign pairwise key info */
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
(UCHAR)BssIdx,
|
|
(UINT8)KeyIdx,
|
|
CipherAlg,
|
|
pApCliEntry->MacTabWCID,
|
|
SHAREDKEYTABLE);
|
|
}
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set ApCli::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\n",
|
|
pWepKey->KeyIndex, pWepKey->KeyLength,
|
|
(tr_entry->PortSecured == WPA_802_1X_PORT_SECURED ? "Port Secured":"Port NOT Secured")));
|
|
}
|
|
}
|
|
|
|
if (pWepKey)
|
|
os_free_mem(NULL, pWepKey);
|
|
break;
|
|
|
|
case OID_802_11_ADD_KEY:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&pApCliKey, wrq->u.data.length);
|
|
if(pApCliKey == NULL)
|
|
{
|
|
Status = -ENOMEM;
|
|
break;
|
|
}
|
|
Status = copy_from_user(pApCliKey, wrq->u.data.pointer, wrq->u.data.length);
|
|
if ((pApCliKey->Length != wrq->u.data.length) ||
|
|
((pApCliKey->KeyIndex & 0xFF) >= SHARE_KEY_NUM)) {
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY, Failed!!\n"));
|
|
}
|
|
else
|
|
{
|
|
RTMPApCliAddKey(pAd, ifIndex, pApCliKey);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", pApCliKey->KeyIndex, pApCliKey->KeyLength));
|
|
}
|
|
if (pApCliKey)
|
|
os_free_mem(NULL, pApCliKey);
|
|
break;
|
|
|
|
case OID_802_11_DISASSOCIATE:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
|
|
|
|
|
|
if (!apcliEn || ifIndex >= MAX_APCLI_NUM)
|
|
return FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DISASSOCIATE \n"));
|
|
|
|
DisassocParmFill(pAd, &DisassocReq, pAd->MlmeAux.Bssid, REASON_DISASSOC_STA_LEAVING);
|
|
|
|
MlmeEnqueue(pAd, APCLI_ASSOC_STATE_MACHINE, APCLI_MT2_MLME_DISASSOC_REQ,
|
|
sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, ifIndex);
|
|
|
|
if (pApCliEntry->Valid)
|
|
ApCliLinkDown(pAd, (UCHAR)ifIndex);
|
|
|
|
/* set the apcli interface be invalid. */
|
|
pApCliEntry->Valid = FALSE;
|
|
|
|
/* clear MlmeAux.Ssid and Bssid. */
|
|
NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
|
|
pAd->MlmeAux.SsidLen = 0;
|
|
NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
|
|
pAd->MlmeAux.Rssi = 0;
|
|
|
|
*pCurrState = APCLI_CTRL_DEASSOC;
|
|
break;
|
|
|
|
case OID_802_11_DROP_UNENCRYPTED:
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID];
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
if (wrq->u.data.length != sizeof(int))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
int enabled = 0;
|
|
Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
NdisAcquireSpinLock(&pAd->MacTabLock);
|
|
if (enabled == 1)
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
else
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
|
|
NdisReleaseSpinLock(&pAd->MacTabLock);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set ApCLi::OID_802_11_DROP_UNENCRYPTED (=%d)\n", enabled));
|
|
}
|
|
break;
|
|
|
|
case OID_SET_COUNTERMEASURES:
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
if (wrq->u.data.length != sizeof(int))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
int enabled = 0;
|
|
Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (enabled == 1)
|
|
pApCliEntry->bBlockAssoc = TRUE;
|
|
else
|
|
/* WPA MIC error should block association attempt for 60 seconds */
|
|
pApCliEntry->bBlockAssoc = FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set ApCli::OID_SET_COUNTERMEASURES bBlockAssoc=%s\n", pApCliEntry->bBlockAssoc ? "TRUE":"FALSE"));
|
|
}
|
|
break;
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
|
|
#ifdef P2P_SUPPORT
|
|
|
|
case OID_802_11_P2P_MODE:
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_P2P_MODE \n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("wrq->u.data.length =%d sizeof(UCHAR)=%d\n"
|
|
, wrq->u.data.length, sizeof(UCHAR)));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR OpMode=1;
|
|
Status = copy_from_user(&OpMode, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (OpMode == OPMODE_AP)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
P2P_CliStop(pAd);
|
|
|
|
if ((!P2P_GO_ON(pAd)) || (P2P_GO_ON(pAd)))
|
|
{
|
|
P2PCfgInit(pAd);
|
|
P2P_GoStartUp(pAd, MAIN_MBSSID);
|
|
}
|
|
}
|
|
else if (OpMode == OPMODE_APSTA)
|
|
{
|
|
if (P2P_GO_ON(pAd))
|
|
P2P_GoStop(pAd);
|
|
|
|
if ((!P2P_CLI_ON(pAd)) || (P2P_CLI_ON(pAd)))
|
|
{
|
|
P2PCfgInit(pAd);
|
|
P2P_CliStartUp(pAd);
|
|
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
P2P_CliStop(pAd);
|
|
else if (P2P_GO_ON(pAd))
|
|
{
|
|
P2P_GoStop(pAd);
|
|
if (INFRA_ON(pAd))
|
|
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
|
}
|
|
P2PCfgInit(pAd);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2p_OpMode_Proc::(OpMode = %d)\n", pObj->ioctl_if, OpMode));
|
|
|
|
|
|
}
|
|
break;
|
|
/*
|
|
case OID_802_11_P2P_CLEAN_TABLE:
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_P2P_CLEAN_TABLE \n"));
|
|
{
|
|
P2pGroupTabInit(pAd);
|
|
}
|
|
break;
|
|
*/
|
|
case OID_802_11_P2P_DEVICE_NAME:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_DEVICE_NAME \n"));
|
|
if (wrq->u.data.length > 32)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR DeviceName[MAX_LEN_OF_SSID] = {0};
|
|
|
|
NdisZeroMemory(DeviceName, sizeof(DeviceName));
|
|
Status = copy_from_user(&DeviceName, wrq->u.data.pointer, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_DEVICE_NAME DeviceName=%s\n",DeviceName));
|
|
{
|
|
|
|
pAd->P2pCfg.DeviceNameLen = wrq->u.data.length;
|
|
NdisZeroMemory(pAd->P2pCfg.DeviceName, 32);
|
|
NdisMoveMemory(pAd->P2pCfg.DeviceName, DeviceName, pAd->P2pCfg.DeviceNameLen);
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: Device Name = %s.\n", __FUNCTION__, pAd->P2pCfg.DeviceName));
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_LISTEN_CHANNEL:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_P2P_LISTEN_CHANNEL \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
/*UCHAR __buf[4]; */
|
|
UCHAR listen_ch;
|
|
Status = copy_from_user(&listen_ch, wrq->u.data.pointer, wrq->u.data.length);
|
|
/*sprintf(__buf, "%d", listen_ch);*/
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: listen_ch = %d.\n", __FUNCTION__, listen_ch));
|
|
|
|
{
|
|
/*
|
|
POS_COOKIE pObj;
|
|
UINT32 channel;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return 0;
|
|
|
|
channel = (UCHAR) simple_strtol(arg, 0, 10);
|
|
*/
|
|
/* check if this channel is valid */
|
|
if (ChannelSanity(pAd, listen_ch) == TRUE)
|
|
{
|
|
pAd->P2pCfg.ListenChannel = listen_ch;
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Listen Channel out of range, using default.\n"));
|
|
pAd->P2pCfg.ListenChannel = 1;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: Listen Channel = %d.\n", __FUNCTION__, pAd->P2pCfg.ListenChannel));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_OPERATION_CHANNEL:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_P2P_OPERATION_CHANNEL \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR op_ch;
|
|
Status = copy_from_user(&op_ch, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
/* check if this channel is valid */
|
|
if (ChannelSanity(pAd, op_ch) == TRUE)
|
|
{
|
|
pAd->P2pCfg.GroupChannel = op_ch;
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Opertation Channel out of range, using default.\n"));
|
|
pAd->P2pCfg.GroupChannel = 1;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: Op Channel = %d.\n", __FUNCTION__, pAd->P2pCfg.GroupChannel));
|
|
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_GO_INT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_P2P_GO_INT \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR intent;
|
|
Status = copy_from_user(&intent, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
/* check if this channel is valid */
|
|
|
|
if (intent <= 15)
|
|
pAd->P2pCfg.GoIntentIdx = intent;
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("GO Intent out of range 0 ~ 15, using default.\n"));
|
|
pAd->P2pCfg.GoIntentIdx = 0;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: GO Intent = %d.\n", __FUNCTION__, pAd->P2pCfg.GoIntentIdx));
|
|
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_SCAN:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_SCAN \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
|
|
UCHAR bScan;
|
|
Status = copy_from_user(&bScan, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
|
|
if (bScan)
|
|
{
|
|
pAd->StaCfg.bAutoReconnect = FALSE;
|
|
P2pScan(pAd);
|
|
}
|
|
else
|
|
{
|
|
pAd->StaCfg.bAutoReconnect = TRUE;
|
|
P2pStopScan(pAd);
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case OID_P2P_WSC_PIN_CODE:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_P2P_WSC_PIN_CODE wrq->u.data.length=%d\n",wrq->u.data.length));
|
|
if (wrq->u.data.length != 8) /* PIN Code Length is 8 */
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
CHAR PinCode[9] = {0};
|
|
Status = copy_from_user(&PinCode[0], wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status == 0)
|
|
{
|
|
if (Set_AP_WscPinCode_Proc(pAd, (RTMP_STRING *) &PinCode[0]) == FALSE)
|
|
Status = -EINVAL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_WscMode:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_WscMode \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR p2pWscMode;
|
|
Status = copy_from_user(&p2pWscMode, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
/* check if this channel is valid */
|
|
|
|
if (p2pWscMode <= 2 && p2pWscMode >= 1)
|
|
pAd->P2pCfg.WscMode= p2pWscMode;
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("WscMode is invalid, using default.\n"));
|
|
pAd->P2pCfg.WscMode = WSC_PIN_MODE; /* PIN */
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: WscMode = %s.\n", __FUNCTION__, (p2pWscMode == 1) ? "PIN" : "PBC"));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_WscConf:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_WscConf \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR method;
|
|
Status = copy_from_user(&method, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
if (pAd->P2pCfg.WscMode == WSC_PIN_MODE)
|
|
{
|
|
if (method == 1)
|
|
{
|
|
/* Display PIN */
|
|
pAd->P2pCfg.Dpid = DEV_PASS_ID_REG;
|
|
pAd->P2pCfg.ConfigMethod = WSC_CONFMET_DISPLAY;
|
|
DBGPRINT(RT_DEBUG_ERROR, (" *************************************************\n"));
|
|
DBGPRINT(RT_DEBUG_ERROR, (" * PIN Code = %08u *\n", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode));
|
|
DBGPRINT(RT_DEBUG_ERROR, (" *************************************************\n"));
|
|
|
|
}
|
|
else if (method == 2)
|
|
{
|
|
/* Enter PIN */
|
|
pAd->P2pCfg.Dpid = DEV_PASS_ID_USER;
|
|
pAd->P2pCfg.ConfigMethod = WSC_CONFMET_KEYPAD;
|
|
}
|
|
}
|
|
else if (pAd->P2pCfg.WscMode == WSC_PBC_MODE)
|
|
{
|
|
if (method == 3)
|
|
{
|
|
pAd->P2pCfg.Dpid = DEV_PASS_ID_PBC;
|
|
pAd->P2pCfg.ConfigMethod = WSC_CONFMET_PBC;
|
|
}
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: Config Method = %s.\n", __FUNCTION__, decodeConfigMethod(pAd->P2pCfg.ConfigMethod)));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_P2P_Link:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_P2P_Link \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
|
|
UCHAR p2pindex;
|
|
PUCHAR pAddr;
|
|
Status = copy_from_user(&p2pindex, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s:: TabIdx[%d]\n", __FUNCTION__, p2pindex));
|
|
if (p2pindex < pAd->P2pTable.ClientNumber)
|
|
{
|
|
/*P2PPrintP2PEntry(pAd, P2pTabIdx); */
|
|
/*pAd->P2pCfg.ConnectingIndex = 0; */
|
|
/*if (pAd->P2pTable.Client[P2pTabIdx].P2pClientState == P2PSTATE_DISCOVERY) */
|
|
/* pAd->P2pTable.Client[P2pTabIdx].P2pClientState = P2PSTATE_CONNECT_COMMAND; */
|
|
/*COPY_MAC_ADDR(pAd->P2pCfg.ConnectingMAC, pAd->P2pTable.Client[P2pTabIdx].addr); */
|
|
/*pAd->P2pTable.Client[P2pTabIdx].StateCount = 10; */
|
|
/*pAd->P2pTable.Client[P2pTabIdx].bValid = TRUE; */
|
|
/*P2pConnect(pAd); */
|
|
pAddr = &pAd->P2pTable.Client[p2pindex].addr[0];
|
|
P2pConnectPrepare(pAd, pAddr, P2PSTATE_CONNECT_COMMAND);
|
|
}
|
|
else
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Table Idx out of range!\n"));
|
|
}
|
|
break;
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
case OID_802_11_DEAUTHENTICATION:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION\n"));
|
|
if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
MLME_DEAUTH_REQ_STRUCT *pInfo = NULL;
|
|
MLME_QUEUE_ELEM *Elem;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));
|
|
|
|
if(Elem == NULL)
|
|
{
|
|
Status = -ENOMEM;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION, Failed!!\n"));
|
|
break;
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
|
|
if (ifIndex >= MAX_APCLI_NUM)
|
|
{
|
|
os_free_mem(NULL, Elem);
|
|
return FALSE;
|
|
}
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pInfo, sizeof(MLME_DEAUTH_REQ_STRUCT));
|
|
if(!pInfo)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::OID_802_11_DEAUTHENTICATION, alloc pInfo buffer Failed!\n"));
|
|
os_free_mem(NULL, Elem);
|
|
return FALSE;
|
|
}
|
|
Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);
|
|
/* Fill in the related information */
|
|
DeAuthFrame.Reason = (USHORT)pInfo->Reason;
|
|
COPY_MAC_ADDR(DeAuthFrame.Addr, pInfo->Addr);
|
|
|
|
MlmeEnqueue(pAd,
|
|
APCLI_AUTH_STATE_MACHINE,
|
|
APCLI_MT2_MLME_DEAUTH_REQ,
|
|
sizeof(MLME_DEAUTH_REQ_STRUCT),
|
|
&DeAuthFrame,
|
|
ifIndex);
|
|
|
|
if (pApCliEntry->Valid)
|
|
ApCliLinkDown(pAd, (UCHAR)ifIndex);
|
|
|
|
/* set the apcli interface be invalid.*/
|
|
pApCliEntry->Valid = FALSE;
|
|
|
|
/* clear MlmeAux.Ssid and Bssid.*/
|
|
NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
|
|
pAd->MlmeAux.SsidLen = 0;
|
|
NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
|
|
pAd->MlmeAux.Rssi = 0;
|
|
|
|
*pCurrState = APCLI_CTRL_DISCONNECTED;
|
|
#ifdef WPA3_SUPPORT
|
|
pApCliEntry->fgIsConnInitialized = FALSE;
|
|
pApCliEntry->MlmeAux.fgPeerAuthCommitReceived = FALSE;
|
|
pApCliEntry->MlmeAux.fgPeerAuthConfirmReceived = FALSE;
|
|
pApCliEntry->MlmeAux.fgOwnAuthCommitSend = FALSE;
|
|
pApCliEntry->MlmeAux.fgOwnAuthConfirmSend = FALSE;
|
|
#endif
|
|
if(pInfo)
|
|
os_free_mem(NULL, pInfo);
|
|
|
|
os_free_mem(NULL, Elem);
|
|
}
|
|
else
|
|
#endif /* WPA_SUPPLICANT_SUPPORT */
|
|
#endif/*APCLI_SUPPORT*/
|
|
{
|
|
if (Elem)
|
|
{
|
|
pInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;
|
|
Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
if ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)
|
|
{
|
|
Elem->Wcid = pEntry->wcid;
|
|
MlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ,
|
|
sizeof(MLME_DEAUTH_REQ_STRUCT), Elem, 0);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", pInfo->Reason));
|
|
}
|
|
os_free_mem(NULL, Elem);
|
|
}
|
|
else
|
|
Status = -EFAULT;
|
|
}
|
|
}
|
|
|
|
break;
|
|
#ifdef IAPP_SUPPORT
|
|
case RT_SET_IAPP_PID:
|
|
{
|
|
unsigned long IappPid;
|
|
if (copy_from_user(&IappPid, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
RTMP_GET_OS_PID(pObj->IappPid, IappPid);
|
|
pObj->IappPid_nr = IappPid;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_APD_PID::(IappPid=%lu(0x%lx))\n", IappPid, (ULONG)pObj->IappPid));
|
|
}
|
|
}
|
|
break;
|
|
#endif /* IAPP_SUPPORT */
|
|
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
case RT_SET_FT_STATION_NOTIFY:
|
|
case RT_SET_FT_KEY_REQ:
|
|
case RT_SET_FT_KEY_RSP:
|
|
case RT_FT_KEY_SET:
|
|
case RT_FT_NEIGHBOR_REPORT:
|
|
case RT_FT_NEIGHBOR_REQUEST:
|
|
case RT_FT_NEIGHBOR_RESPONSE:
|
|
case RT_FT_ACTION_FORWARD:
|
|
{
|
|
UCHAR *pBuffer;
|
|
|
|
FT_MEM_ALLOC(pAd, &pBuffer, wrq->u.data.length+1);
|
|
if (pBuffer == NULL)
|
|
break;
|
|
|
|
if (copy_from_user(pBuffer, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
FT_MEM_FREE(pAd, pBuffer);
|
|
break;
|
|
}
|
|
|
|
switch(cmd & 0x7FFF)
|
|
{
|
|
case RT_SET_FT_STATION_NOTIFY:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_FT_STATION_NOTIFY\n"));
|
|
FT_KDP_StationInform(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_SET_FT_KEY_REQ:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_FT_KEY_REQ\n"));
|
|
FT_KDP_IOCTL_KEY_REQ(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_SET_FT_KEY_RSP:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_FT_KEY_RSP\n"));
|
|
FT_KDP_KeyResponseToUs(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_FT_KEY_SET:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_FT_KEY_SET\n"));
|
|
/* Note: the key must be ended by 0x00 */
|
|
pBuffer[wrq->u.data.length] = 0x00;
|
|
FT_KDP_CryptKeySet(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_FT_NEIGHBOR_REPORT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_FT_NEIGHBOR_REPORT\n"));
|
|
#ifdef FT_KDP_FUNC_INFO_BROADCAST
|
|
FT_KDP_NeighborReportHandle(pAd, pBuffer, wrq->u.data.length);
|
|
#endif /* FT_KDP_FUNC_INFO_BROADCAST */
|
|
break;
|
|
case RT_FT_NEIGHBOR_REQUEST:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_FT_NEIGHBOR_REPORT\n"));
|
|
FT_KDP_NeighborRequestHandle(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_FT_NEIGHBOR_RESPONSE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_FT_NEIGHBOR_RESPONSE\n"));
|
|
FT_KDP_NeighborResponseHandle(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
case RT_FT_ACTION_FORWARD:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_FT_ACTION_FORWARD\n"));
|
|
FT_RRB_ActionHandle(pAd, pBuffer, wrq->u.data.length);
|
|
break;
|
|
}
|
|
|
|
FT_MEM_FREE(pAd, pBuffer);
|
|
}
|
|
break;
|
|
|
|
case OID_802_11R_SUPPORT:
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
ULONG value;
|
|
Status = copy_from_user(&value, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.Dot11rFtEnable = (value == 0 ? FALSE : TRUE);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Set::OID_802_11R_SUPPORT(=%d) \n",
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.Dot11rFtEnable));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11R_MDID:
|
|
if (wrq->u.data.length != FT_MDID_LEN)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
Status = copy_from_user(pAd->ApCfg.MBSSID[apidx].FtCfg.FtMdId, wrq->u.data.pointer, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Set::OID_802_11R_MDID(=%c%c) \n",
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtMdId[0],
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtMdId[0]));
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case OID_802_11R_R0KHID:
|
|
if (wrq->u.data.length <= FT_ROKH_ID_LEN)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
Status = copy_from_user(pAd->ApCfg.MBSSID[apidx].FtCfg.FtR0khId, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtR0khIdLen = wrq->u.data.length;
|
|
DBGPRINT(RT_DEBUG_TRACE,("Set::OID_802_11R_OID_802_11R_R0KHID(=%s) Len=%d\n",
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtR0khId,
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtR0khIdLen));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11R_RIC:
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
ULONG value;
|
|
Status = copy_from_user(&value, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.RsrReqCap = (value == 0 ? FALSE : TRUE);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Set::OID_802_11R_RIC(=%d) \n",
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.Dot11rFtEnable));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11R_OTD:
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
ULONG value;
|
|
Status = copy_from_user(&value, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.FtOverDs = (value == 0 ? FALSE : TRUE);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Set::OID_802_11R_OTD(=%d) \n",
|
|
pAd->ApCfg.MBSSID[apidx].FtCfg.FtCapFlag.Dot11rFtEnable));
|
|
}
|
|
break;
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
case RT_SET_APD_PID:
|
|
{
|
|
unsigned long apd_pid;
|
|
if (copy_from_user(&apd_pid, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
RTMP_GET_OS_PID(pObj->apd_pid, apd_pid);
|
|
pObj->apd_pid_nr = apd_pid;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_APD_PID::(ApdPid=%lu(0x%lx))\n", apd_pid, (ULONG)pObj->apd_pid));
|
|
}
|
|
}
|
|
break;
|
|
case RT_SET_DEL_MAC_ENTRY:
|
|
if (copy_from_user(Addr, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_SET_DEL_MAC_ENTRY::(%02x:%02x:%02x:%02x:%02x:%02x)\n", Addr[0],Addr[1],Addr[2],Addr[3],Addr[4],Addr[5]));
|
|
|
|
pEntry = MacTableLookup(pAd, Addr);
|
|
if (pEntry)
|
|
{
|
|
MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);
|
|
/* MacTableDeleteEntry(pAd, pEntry->wcid, Addr); */
|
|
}
|
|
}
|
|
break;
|
|
#ifdef WSC_AP_SUPPORT
|
|
case RT_OID_WSC_SET_SELECTED_REGISTRAR:
|
|
{
|
|
PUCHAR upnpInfo;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WSC::RT_OID_WSC_SET_SELECTED_REGISTRAR, wrq->u.data.length=%d!\n", wrq->u.data.length));
|
|
os_alloc_mem(pAd, (UCHAR **)&upnpInfo, wrq->u.data.length);
|
|
if(upnpInfo)
|
|
{
|
|
int len, Status;
|
|
|
|
Status = copy_from_user(upnpInfo, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
len = wrq->u.data.length;
|
|
|
|
if((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode & WSC_PROXY))
|
|
{
|
|
WscSelectedRegistrar(pAd, upnpInfo, len, apidx);
|
|
if (pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimerRunning == TRUE)
|
|
{
|
|
BOOLEAN Cancelled;
|
|
RTMPCancelTimer(&pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimer, &Cancelled);
|
|
}
|
|
/* 2mins time-out timer */
|
|
RTMPSetTimer(&pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.Wsc2MinsTimerRunning = TRUE;
|
|
}
|
|
}
|
|
os_free_mem(NULL, upnpInfo);
|
|
}
|
|
else
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
#ifdef HOSTAPD_SUPPORT
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
}
|
|
break;
|
|
case RT_OID_WSC_EAPMSG:
|
|
{
|
|
RTMP_WSC_U2KMSG_HDR *msgHdr = NULL;
|
|
PUCHAR pUPnPMsg = NULL;
|
|
UINT msgLen = 0, Machine = 0, msgType = 0;
|
|
int retVal, senderID = 0;
|
|
#ifdef HOSTAPD_SUPPORT
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WSC::RT_OID_WSC_EAPMSG, wrq->u.data.length=%d, ioctl_if=%d\n", wrq->u.data.length, pObj->ioctl_if));
|
|
|
|
msgLen = wrq->u.data.length;
|
|
os_alloc_mem(pAd, (UCHAR **)&pUPnPMsg, msgLen);
|
|
if (pUPnPMsg == NULL)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
int HeaderLen;
|
|
RTMP_STRING *pWpsMsg;
|
|
UINT WpsMsgLen;
|
|
PWSC_CTRL pWscControl;
|
|
//BOOLEAN bGetDeviceInfo = FALSE;
|
|
|
|
NdisZeroMemory(pUPnPMsg, msgLen);
|
|
retVal = copy_from_user(pUPnPMsg, wrq->u.data.pointer, msgLen);
|
|
|
|
msgHdr = (RTMP_WSC_U2KMSG_HDR *)pUPnPMsg;
|
|
senderID = get_unaligned((INT32 *)(&msgHdr->Addr2[0]));
|
|
/*senderID = *((int *)&msgHdr->Addr2); */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_EAPMSG++++++++\n\n"));
|
|
hex_dump("MAC::", &msgHdr->Addr3[0], MAC_ADDR_LEN);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_EAPMSG++++++++\n\n"));
|
|
|
|
HeaderLen = LENGTH_802_11 + LENGTH_802_1_H + sizeof(IEEE8021X_FRAME) + sizeof(EAP_FRAME);
|
|
pWpsMsg = (RTMP_STRING *)&pUPnPMsg[HeaderLen];
|
|
WpsMsgLen = msgLen - HeaderLen;
|
|
|
|
/*assign the STATE_MACHINE type */
|
|
Machine = WSC_STATE_MACHINE;
|
|
msgType = WSC_EAPOL_UPNP_MSG;
|
|
|
|
pWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;
|
|
/* If AP is unconfigured, WPS state machine will be triggered after received M2. */
|
|
if ((pWscControl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)
|
|
#ifdef WSC_V2_SUPPORT
|
|
&& (pWscControl->WscV2Info.bWpsEnable || (pWscControl->WscV2Info.bEnableWpsV2 == FALSE))
|
|
#endif /* WSC_V2_SUPPORT */
|
|
)
|
|
{
|
|
if (strstr(pWpsMsg, "SimpleConfig") &&
|
|
!pWscControl->EapMsgRunning &&
|
|
!pWscControl->WscUPnPNodeInfo.bUPnPInProgress)
|
|
{
|
|
/* GetDeviceInfo */
|
|
WscInit(pAd, FALSE, pObj->ioctl_if);
|
|
/* trigger wsc re-generate public key */
|
|
pWscControl->RegData.ReComputePke = 1;
|
|
//bGetDeviceInfo = TRUE;
|
|
}
|
|
else if (WscRxMsgTypeFromUpnp(pAd, pWpsMsg, WpsMsgLen) == WSC_MSG_M2 &&
|
|
!pWscControl->EapMsgRunning &&
|
|
!pWscControl->WscUPnPNodeInfo.bUPnPInProgress)
|
|
{
|
|
/* Check Enrollee Nonce of M2 */
|
|
if (WscCheckEnrolleeNonceFromUpnp(pAd, pWpsMsg, WpsMsgLen, pWscControl))
|
|
{
|
|
WscGetConfWithoutTrigger(pAd, pWscControl, TRUE);
|
|
pWscControl->WscState = WSC_STATE_SENT_M1;
|
|
}
|
|
}
|
|
}
|
|
|
|
retVal = MlmeEnqueueForWsc(pAd, msgHdr->envID, senderID, Machine, msgType, msgLen, pUPnPMsg);
|
|
if((retVal == FALSE) && (msgHdr->envID != 0))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("MlmeEnqueuForWsc return False and envID=0x%x!\n", msgHdr->envID));
|
|
Status = -EINVAL;
|
|
}
|
|
|
|
os_free_mem(NULL, pUPnPMsg);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_EAPMSG finished!\n"));
|
|
#ifdef HOSTAPD_SUPPORT
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
}
|
|
break;
|
|
#ifdef WSC_UFD
|
|
case RT_OID_WSC_READ_UFD_FILE:
|
|
if (wrq->u.data.length > 0)
|
|
{
|
|
RTMP_STRING *pWscUfdFileName = NULL;
|
|
UCHAR apIdx = pObj->ioctl_if;
|
|
WSC_CTRL *pWscCtrl = &pAd->ApCfg.MBSSID[apIdx].WscControl;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, wrq->u.data.length+1);
|
|
if (pWscUfdFileName)
|
|
{
|
|
RTMPZeroMemory(pWscUfdFileName, wrq->u.data.length+1);
|
|
if (copy_from_user(pWscUfdFileName, wrq->u.data.pointer, wrq->u.data.length))
|
|
Status = -EFAULT;
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_READ_UFD_FILE (WscUfdFileName=%s)\n", pWscUfdFileName));
|
|
if (pWscCtrl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)
|
|
{
|
|
if (WscReadProfileFromUfdFile(pAd, apIdx, pWscUfdFileName))
|
|
{
|
|
pWscCtrl->WscConfStatus = WSC_SCSTATE_CONFIGURED;
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_READ_UFD_FILE: AP is configured.\n"));
|
|
Status = -EINVAL;
|
|
}
|
|
}
|
|
os_free_mem(NULL, pWscUfdFileName);
|
|
}
|
|
else
|
|
Status = -ENOMEM;
|
|
}
|
|
else
|
|
Status = -EINVAL;
|
|
break;
|
|
|
|
case RT_OID_WSC_WRITE_UFD_FILE:
|
|
if (wrq->u.data.length > 0)
|
|
{
|
|
RTMP_STRING*pWscUfdFileName = NULL;
|
|
UCHAR apIdx = pObj->ioctl_if;
|
|
WSC_CTRL *pWscCtrl = &pAd->ApCfg.MBSSID[apIdx].WscControl;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pWscUfdFileName, wrq->u.data.length+1);
|
|
if (pWscUfdFileName)
|
|
{
|
|
RTMPZeroMemory(pWscUfdFileName, wrq->u.data.length+1);
|
|
if (copy_from_user(pWscUfdFileName, wrq->u.data.pointer, wrq->u.data.length))
|
|
Status = -EFAULT;
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_WRITE_UFD_FILE (WscUfdFileName=%s)\n", pWscUfdFileName));
|
|
if (pWscCtrl->WscConfStatus == WSC_SCSTATE_CONFIGURED)
|
|
{
|
|
WscWriteProfileToUfdFile(pAd, apIdx, pWscUfdFileName);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_WSC_WRITE_UFD_FILE: AP is un-configured.\n"));
|
|
Status = -EINVAL;
|
|
}
|
|
}
|
|
os_free_mem(NULL, pWscUfdFileName);
|
|
}
|
|
else
|
|
Status = -ENOMEM;
|
|
}
|
|
else
|
|
Status = -EINVAL;
|
|
break;
|
|
#endif /* WSC_UFD */
|
|
case RT_OID_WSC_UUID:
|
|
if (wrq->u.data.length == (UUID_LEN_STR-1))
|
|
{
|
|
UCHAR apIdx = pObj->ioctl_if;
|
|
pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str[0] = '\0';
|
|
Status = copy_from_user(&pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str[0],
|
|
wrq->u.data.pointer,
|
|
wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("UUID ASCII string: %s\n",
|
|
pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_Str));
|
|
}
|
|
else if (wrq->u.data.length == UUID_LEN_HEX)
|
|
{
|
|
UCHAR apIdx = pObj->ioctl_if, ii;
|
|
Status = copy_from_user(&pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_E[0],
|
|
wrq->u.data.pointer,
|
|
wrq->u.data.length);
|
|
|
|
for (ii=0; ii< 16; ii++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%02x", (pAd->ApCfg.MBSSID[apIdx].WscControl.Wsc_Uuid_E[ii] & 0xff)));
|
|
}
|
|
}
|
|
else
|
|
Status = -EINVAL;
|
|
break;
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#ifdef NINTENDO_AP
|
|
case RT_OID_802_11_NINTENDO_SET_TABLE:
|
|
RTMPIoctlNintendoSetTable(pAd, wrq);
|
|
break;
|
|
case RT_OID_802_11_NINTENDO_CAPABLE:
|
|
RTMPIoctlNintendoCapable(pAd, wrq);
|
|
break;
|
|
#endif /* NINTENDO_AP */
|
|
|
|
#ifdef SNMP_SUPPORT
|
|
case OID_802_11_SHORTRETRYLIMIT:
|
|
if (wrq->u.data.length != sizeof(ULONG))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
Status = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
|
|
AsicSetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_SHORT, ShortRetryLimit);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SHORTRETRYLIMIT (ShortRetryLimit=%ld)\n", ShortRetryLimit));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_LONGRETRYLIMIT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT \n"));
|
|
if (wrq->u.data.length != sizeof(ULONG))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
Status = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
|
|
AsicSetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_LONG, LongRetryLimit);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT (,LongRetryLimit=%ld)\n", LongRetryLimit));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_WEPDEFAULTKEYVALUE:
|
|
{
|
|
UINT KeyIdx;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE\n"));
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pKey, wrq->u.data.length);
|
|
if (pKey == NULL)
|
|
{
|
|
Status= -EINVAL;
|
|
break;
|
|
}
|
|
Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
|
|
/*pKey = &WepKey; */
|
|
|
|
if ( pKey->Length != wrq->u.data.length)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n"));
|
|
}
|
|
KeyIdx = pKey->KeyIndex & 0x0fffffff;
|
|
DBGPRINT(RT_DEBUG_TRACE,("pKey->KeyIndex =%d, pKey->KeyLength=%d\n", pKey->KeyIndex, pKey->KeyLength));
|
|
|
|
/* it is a shared key */
|
|
if (KeyIdx > 4)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength;
|
|
NdisMoveMemory(&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength);
|
|
if (pKey->KeyIndex & 0x80000000)
|
|
{
|
|
/* Default key for tx (shared key) */
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId = (UCHAR) KeyIdx;
|
|
}
|
|
/*RestartAPIsRequired = TRUE; */
|
|
}
|
|
os_free_mem(NULL, pKey);
|
|
break;
|
|
|
|
}
|
|
case OID_802_11_WEPDEFAULTKEYID:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYID \n"));
|
|
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
Status = copy_from_user(&pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
break;
|
|
|
|
|
|
case OID_802_11_CURRENTCHANNEL:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CURRENTCHANNEL \n"));
|
|
if (wrq->u.data.length != sizeof(UCHAR))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
RTMP_STRING ChStr[5] = {0};
|
|
Status = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);
|
|
snprintf(ChStr, sizeof(ChStr), "%d", ctmp);
|
|
Set_Channel_Proc(pAd, ChStr);
|
|
}
|
|
break;
|
|
#endif /* SNMP_SUPPORT */
|
|
|
|
#ifdef MESH_SUPPORT
|
|
case OID_802_11_MESH_SECURITY_INFO:
|
|
Status = RTMPIoctlSetMeshSecurityInfo(pAd, wrq);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
RestartMeshIsRequired = TRUE;
|
|
break;
|
|
|
|
case OID_802_11_MESH_ID:
|
|
if (wrq->u.data.length >= MAX_MESH_ID_LEN)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR MeshID[MAX_MESH_ID_LEN];
|
|
|
|
NdisZeroMemory(pAd->MeshTab.MeshId, MAX_MESH_ID_LEN);
|
|
|
|
Status = copy_from_user(&MeshID,wrq->u.data.pointer, wrq->u.data.length);
|
|
NdisMoveMemory(&pAd->MeshTab.MeshId, MeshID, wrq->u.data.length);
|
|
pAd->MeshTab.MeshIdLen = (UCHAR)wrq->u.data.length;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_MESH_ID (=%s)\n", pAd->MeshTab.MeshId));
|
|
RestartMeshIsRequired = TRUE;
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_AUTO_LINK:
|
|
if (wrq->u.data.length != 1)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR Enable = TRUE;
|
|
|
|
Status = copy_from_user(&Enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->MeshTab.MeshAutoLink = (Enable > 0) ? TRUE : FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_MESH_AUTO_LINK (=%s)\n",
|
|
pAd->MeshTab.MeshAutoLink == TRUE ? "Enable" : "Disable"));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_ADD_LINK:
|
|
if (wrq->u.data.length != MAC_ADDR_LEN)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR MacAddr[MAC_ADDR_LEN];
|
|
UINT LinkIdx;
|
|
|
|
Status = copy_from_user(&MacAddr, wrq->u.data.pointer, MAC_ADDR_LEN);
|
|
LinkIdx = GetMeshLinkId(pAd, (PCHAR)MacAddr);
|
|
if (LinkIdx == BSS_NOT_FOUND)
|
|
{
|
|
LinkIdx = MeshLinkAlloc(pAd, MacAddr, MESH_LINK_STATIC);
|
|
if (LinkIdx == BSS_NOT_FOUND)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s() All Mesh-Links been occupied.\n", __FUNCTION__));
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if (!VALID_MESH_LINK_ID(LinkIdx))
|
|
break;
|
|
|
|
MlmeEnqueue(pAd, MESH_LINK_MNG_STATE_MACHINE, MESH_LINK_MNG_ACTOPN, 0, NULL, LinkIdx);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(LinkIdx = %d)\n", __FUNCTION__, LinkIdx));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_DEL_LINK:
|
|
if (wrq->u.data.length != MAC_ADDR_LEN)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR MacAddr[MAC_ADDR_LEN];
|
|
UINT LinkIdx;
|
|
|
|
Status = copy_from_user(&MacAddr, wrq->u.data.pointer, MAC_ADDR_LEN);
|
|
LinkIdx = GetMeshLinkId(pAd, (PCHAR)MacAddr);
|
|
if (!VALID_MESH_LINK_ID(LinkIdx))
|
|
break;
|
|
|
|
pAd->MeshTab.MeshLink[LinkIdx].Entry.LinkType = MESH_LINK_DYNAMIC;
|
|
MlmeEnqueue(pAd, MESH_LINK_MNG_STATE_MACHINE, MESH_LINK_MNG_CNCL, 0, NULL, LinkIdx);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s::(LinkIdx = %d)\n", __FUNCTION__, LinkIdx));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_MAX_TX_RATE:
|
|
if (wrq->u.data.length != 1)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR TxRate;
|
|
|
|
Status = copy_from_user(&TxRate, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (TxRate <= 12)
|
|
pAd->MeshTab.MeshMaxTxRate = TxRate;
|
|
else
|
|
pAd->MeshTab.MeshMaxTxRate = 0;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_MESH_MAX_TX_RATE (=%ld)\n",
|
|
pAd->MeshTab.MeshMaxTxRate));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_CHANNEL:
|
|
if (wrq->u.data.length != 1)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
{
|
|
UCHAR Channel;
|
|
|
|
if (INFRA_ON(pAd) || ADHOC_ON(pAd))
|
|
break;
|
|
|
|
Status = copy_from_user(&Channel, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (pAd->MeshTab.UCGEnable == TRUE)
|
|
{
|
|
pAd->MeshTab.MeshChannel = Channel;
|
|
MlmeEnqueue(pAd, MESH_CTRL_STATE_MACHINE, MESH_CTRL_UCG_EVT, 0, NULL, 0);
|
|
}
|
|
else
|
|
{
|
|
UCHAR rf_channel;
|
|
|
|
pAd->MeshTab.MeshChannel = pAd->CommonCfg.Channel = Channel;
|
|
#ifdef DOT11_N_SUPPORT
|
|
N_ChannelCheck(pAd);
|
|
if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)
|
|
&& pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
|
|
rf_channel = N_SetCenCh(pAd, pAd->CommonCfg.Channel);
|
|
else
|
|
#endif /* DOT11_N_SUPPORT */
|
|
rf_channel = pAd->CommonCfg.Channel;
|
|
|
|
AsicSwitchChannel(pAd, rf_channel, FALSE);
|
|
AsicLockChannel(pAd, rf_channel);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("BW_%d, control_channel(%d), CentralChannel(%d) \n",
|
|
pAd->CommonCfg.RegTransmitSetting.field.BW,
|
|
pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_MESH_CHANNEL (=%d)\n", (int)Channel));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_HOSTNAME:
|
|
if (wrq->u.data.length >= MAX_HOST_NAME_LEN)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
NdisZeroMemory(pAd->MeshTab.HostName, MAX_HOST_NAME_LEN);
|
|
Status = copy_from_user(pAd->MeshTab.HostName, wrq->u.data.pointer, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_HOSTNAME_ID (=%s)\n", pAd->MeshTab.HostName));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_ONLY_MODE:
|
|
if (wrq->u.data.length != 1)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
{
|
|
UCHAR Enable;
|
|
|
|
Status = copy_from_user(&Enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
pAd->MeshTab.MeshOnly = (Enable == 1 ? TRUE : FALSE);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_MESH_ONLY_MODE (=%s)\n", pAd->MeshTab.MeshOnly == TRUE ? "Enable" : "Disable"));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_FORWARD:
|
|
if (wrq->u.data.length != 1)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
{
|
|
UCHAR Enable = TRUE;
|
|
|
|
Status = copy_from_user(&Enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
pAd->MeshTab.MeshCapability.field.Forwarding = (Enable > 0) ? (1) : (0);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_MESH_FORWARD (=%s)\n",
|
|
pAd->MeshTab.MeshCapability.field.Forwarding == 1 ? "Enable" : "Disable"));
|
|
}
|
|
break;
|
|
#endif /* MESH_SUPPORT */
|
|
|
|
#ifdef WAPI_SUPPORT
|
|
case OID_802_11_WAPI_PID:
|
|
{
|
|
unsigned long wapi_pid;
|
|
if (copy_from_user(&wapi_pid, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
RTMP_GET_OS_PID(pObj->wapi_pid, wapi_pid);
|
|
pObj->wapi_pid_nr = wapi_pid;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OID_802_11_WAPI_PID::(WapiPid=%lu(0x%x))\n", wapi_pid, (UINT32)pObj->wapi_pid));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_PORT_SECURE_STATE:
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Set::OID_802_11_PORT_SECURE_STATE\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (wrq->u.data.length != sizeof(WAPI_PORT_SECURE_STRUCT))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
WAPI_PORT_SECURE_STRUCT wapi_port;
|
|
STA_TR_ENTRY *tr_entry;
|
|
|
|
Status = copy_from_user(&wapi_port, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
if ((pEntry = MacTableLookup(pAd, wapi_port.Addr)) != NULL)
|
|
{
|
|
tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid];
|
|
switch (wapi_port.state)
|
|
{
|
|
case WAPI_PORT_SECURED:
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
|
|
pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
|
|
break;
|
|
|
|
default:
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
|
|
break;
|
|
}
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_PORT_SECURE_STATE (state=%d)\n", wapi_port.state));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_UCAST_KEY_INFO:
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Set::OID_802_11_UCAST_KEY_INFO\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (wrq->u.data.length != sizeof(WAPI_UCAST_KEY_STRUCT))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
WAPI_UCAST_KEY_STRUCT wapi_ukey;
|
|
|
|
Status = copy_from_user(&wapi_ukey, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
if ((pEntry = MacTableLookup(pAd, wapi_ukey.Addr)) != NULL)
|
|
{
|
|
pEntry->usk_id = wapi_ukey.key_id;
|
|
NdisMoveMemory(pEntry->PTK, wapi_ukey.PTK, 64);
|
|
|
|
/* Install pairwise key */
|
|
WAPIInstallPairwiseKey(pAd, pEntry, TRUE);
|
|
|
|
/* Start or re-start USK rekey mechanism, if necessary. */
|
|
RTMPCancelWapiRekeyTimerAction(pAd, pEntry);
|
|
RTMPStartWapiRekeyTimerAction(pAd, pEntry);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_UCAST_KEY_INFO complete\n"));
|
|
#if 1
|
|
hex_dump("WAPI UCAST KEY", pEntry->PTK, 64);
|
|
#endif
|
|
}
|
|
}
|
|
break;
|
|
|
|
#if 0
|
|
case OID_802_11_MCAST_KEY_INFO:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_MCAST_KEY_INFO\n"));
|
|
if (wrq->u.data.length != sizeof(WAPI_MCAST_KEY_STRUCT))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
WAPI_MCAST_KEY_STRUCT wapi_mkey;
|
|
|
|
Status = copy_from_user(&wapi_mkey, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[pObj->ioctl_if].GTK, wapi_mkey.GTK, 32);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_MCAST_KEY_INFO complete\n"));
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
#endif /* WAPI_SUPPORT */
|
|
|
|
#ifdef DOT1X_SUPPORT
|
|
case OID_802_DOT1X_PMKID_CACHE:
|
|
RTMPIoctlAddPMKIDCache(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_DOT1X_RADIUS_DATA:
|
|
RTMPIoctlRadiusData(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_DOT1X_WPA_KEY:
|
|
RTMPIoctlAddWPAKey(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_DOT1X_STATIC_WEP_COPY:
|
|
RTMPIoctlStaticWepCopy(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_DOT1X_IDLE_TIMEOUT:
|
|
RTMPIoctlSetIdleTimeout(pAd, wrq);
|
|
break;
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
case OID_802_11_AUTHENTICATION_MODE:
|
|
if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);
|
|
if (AuthMode > Ndis802_11AuthModeMax)
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
if(apcliEn)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode != AuthMode)
|
|
{
|
|
/* Config has changed */
|
|
pAd->ApCfg.ApCliTab[ifIndex].bConfigChanged = TRUE;
|
|
}
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode = AuthMode;
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))
|
|
{
|
|
pAd->MacTab.tr_entry[i].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
}
|
|
}
|
|
|
|
RTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode,
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.WepStatus
|
|
, (UCHAR)(ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.DefaultKeyId = 0;
|
|
|
|
if(pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.DefaultKeyId = 1;
|
|
}
|
|
}
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
else
|
|
{
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode != AuthMode)
|
|
{
|
|
/* Config has changed */
|
|
pAd->bConfigChanged = TRUE;
|
|
}
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode = AuthMode;
|
|
}
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n", pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode));
|
|
}
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
break;
|
|
|
|
case OID_802_11_WEP_STATUS:
|
|
if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState;
|
|
if (ifIndex >= MAX_APCLI_NUM)
|
|
return FALSE;
|
|
|
|
if(apcliEn)
|
|
{
|
|
if (WepStatus <= Ndis802_11GroupWEP104Enabled)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[ifIndex].wdev.WepStatus != WepStatus)
|
|
{
|
|
/* Config has changed */
|
|
pAd->ApCfg.ApCliTab[ifIndex].bConfigChanged = TRUE;
|
|
}
|
|
pAd->ApCfg.ApCliTab[ifIndex].wdev.WepStatus = WepStatus;
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))
|
|
{
|
|
INT idx = pAd->MacTab.Content[i].wcid;
|
|
pAd->MacTab.tr_entry[idx].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
}
|
|
}
|
|
|
|
pApCliEntry->PairCipher = pApCliEntry->wdev.WepStatus;
|
|
pApCliEntry->GroupCipher = pApCliEntry->wdev.WepStatus;
|
|
pApCliEntry->bMixCipher = FALSE;
|
|
|
|
if (pApCliEntry->wdev.WepStatus >= Ndis802_11TKIPEnable)
|
|
pApCliEntry->wdev.DefaultKeyId = 1;
|
|
|
|
RTMPMakeRSNIE(pAd
|
|
, pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode
|
|
, pAd->ApCfg.ApCliTab[ifIndex].wdev.WepStatus
|
|
, (UCHAR)(ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
{
|
|
/* Since TKIP, AES, WEP are all supported. It should not have any invalid setting */
|
|
if (WepStatus <= Ndis802_11GroupWEP104Enabled)
|
|
{
|
|
struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
if (wdev->WepStatus != WepStatus)
|
|
{
|
|
/* Config has changed */
|
|
pAd->bConfigChanged = TRUE;
|
|
}
|
|
wdev->WepStatus = WepStatus;
|
|
|
|
if (wdev->WepStatus == Ndis802_11TKIPAESMix)
|
|
wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable;
|
|
else
|
|
wdev->GroupKeyWepStatus = WepStatus;
|
|
}
|
|
else
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus));
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case OID_802_11_SSID:
|
|
if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
RTMP_STRING *pSsidString = NULL;
|
|
Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
if (Ssid.SsidLength > MAX_LEN_OF_SSID)
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
if (Ssid.SsidLength == 0)
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
os_alloc_mem(NULL, (UCHAR **)&pSsidString, MAX_LEN_OF_SSID+1);
|
|
if (pSsidString)
|
|
{
|
|
NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);
|
|
NdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
ifIndex = pObj->ioctl_if;
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
if(apcliEn)
|
|
{
|
|
Set_ApCli_Ssid_Proc(pAd,pSsidString);
|
|
}
|
|
}
|
|
else
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
{
|
|
NdisZeroMemory((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,MAX_LEN_OF_SSID);
|
|
strcpy((PCHAR)pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid,pSsidString);
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen =
|
|
(UCHAR)strlen(pSsidString);
|
|
}
|
|
os_free_mem(NULL, pSsidString);
|
|
}
|
|
else
|
|
Status = -ENOMEM;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
case HOSTAPD_OID_SET_802_1X:/*pure 1x is enabled. */
|
|
Set_IEEE8021X_Proc(pAd,"1");
|
|
break;
|
|
|
|
case HOSTAPD_OID_SET_KEY:
|
|
{
|
|
UINT KeyIdx;
|
|
Status = -EINVAL;
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UINT apidx = pObj->ioctl_if;
|
|
if(wrq->u.data.length != sizeof(struct ieee80211req_key) || !wrq->u.data.pointer)
|
|
break;
|
|
Status = copy_from_user(&Key, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, Key.ik_macaddr);
|
|
|
|
|
|
if((Key.ik_type == CIPHER_WEP64) ||(Key.ik_type == CIPHER_WEP128))/*dynamic wep with 1x */
|
|
{
|
|
if (pEntry)/*pairwise key */
|
|
{
|
|
pEntry->PairwiseKey.KeyLen = Key.ik_keylen;
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, Key.ik_keydata, Key.ik_keylen);
|
|
pEntry->PairwiseKey.CipherAlg = Key.ik_type;
|
|
KeyIdx=pAd->ApCfg.MBSSID[pEntry->func_tb_idx].DefaultKeyId;
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
RTMPAddWcidAttributeEntry(
|
|
pAd,
|
|
pEntry->func_tb_idx,
|
|
KeyIdx, /* The value may be not zero */
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry);
|
|
}
|
|
else/*group key */
|
|
{
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
DBGPRINT(RT_DEBUG_OFF, ("Key.ik_keyix=%x\n", Key.ik_keyix));
|
|
KeyIdx = Key.ik_keyix& 0x0fff;
|
|
DBGPRINT(RT_DEBUG_OFF, ("ra%d KeyIdx=%d\n", apidx, KeyIdx));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Key.ik_keyix=%x\n", Key.ik_keyix));
|
|
/* it is a shared key */
|
|
if (KeyIdx < 4)
|
|
{
|
|
pAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) Key.ik_keylen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &Key.ik_keydata, Key.ik_keylen);
|
|
if (Key.ik_keyix & 0x8000)
|
|
{
|
|
/* Default key for tx (shared key) */
|
|
DBGPRINT(RT_DEBUG_OFF, ("ra%d DefaultKeyId=%d\n"
|
|
, apidx, KeyIdx));
|
|
pMbss->DefaultKeyId = (UCHAR) KeyIdx;
|
|
}
|
|
/*pMbss->DefaultKeyId=1; */
|
|
|
|
pAd->SharedKey[apidx][KeyIdx].CipherAlg = Key.ik_type;
|
|
AsicAddSharedKeyEntry(
|
|
pAd,
|
|
(UCHAR)apidx,
|
|
(UCHAR)KeyIdx,
|
|
&pAd->SharedKey[apidx][KeyIdx]
|
|
);
|
|
|
|
RTMPAddWcidAttributeEntry(
|
|
pAd,
|
|
apidx,
|
|
KeyIdx,
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,
|
|
NULL);
|
|
}
|
|
}
|
|
}
|
|
else if (pEntry)
|
|
{
|
|
KeyIdx = Key.ik_keyix& 0x0fff;
|
|
if (pEntry->WepStatus == Ndis802_11TKIPEnable)
|
|
{
|
|
pEntry->PairwiseKey.KeyLen = LEN_TK;
|
|
NdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, Key.ik_keylen);
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);
|
|
}
|
|
|
|
if(pEntry->WepStatus == Ndis802_11AESEnable)
|
|
{
|
|
pEntry->PairwiseKey.KeyLen = LEN_TK;
|
|
NdisMoveMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keydata, OFFSET_OF_PTK_TK);
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], Key.ik_keylen);
|
|
}
|
|
|
|
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
|
|
if (pEntry->WepStatus == Ndis802_11TKIPEnable)
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;
|
|
else if (pEntry->WepStatus == Ndis802_11AESEnable)
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_AES;
|
|
|
|
pEntry->PairwiseKey.CipherAlg = Key.ik_type;
|
|
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
pEntry->func_tb_idx,
|
|
(UINT8)KeyIdx,
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry->wcid,
|
|
PAIRWISEKEYTABLE);
|
|
}
|
|
else
|
|
{
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
KeyIdx = Key.ik_keyix& 0x0fff;
|
|
|
|
/*if (Key.ik_keyix & 0x8000) */
|
|
{
|
|
pMbss->DefaultKeyId = (UCHAR) KeyIdx;
|
|
}
|
|
|
|
if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11TKIPEnable)
|
|
{
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);
|
|
}
|
|
|
|
if(pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11AESEnable)
|
|
{
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].KeyLen= LEN_TK;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].Key, Key.ik_keydata, 16);
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].RxMic, (Key.ik_keydata+16+8), 8);
|
|
NdisMoveMemory(pAd->SharedKey[apidx][pMbss->DefaultKeyId].TxMic, (Key.ik_keydata+16), 8);
|
|
}
|
|
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_NONE;
|
|
if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11TKIPEnable)
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_TKIP;
|
|
else if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11AESEnable)
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg = CIPHER_AES;
|
|
|
|
hex_dump("Key.ik_keydata,", (unsigned char*) Key.ik_keydata, 32);
|
|
|
|
AsicAddSharedKeyEntry(
|
|
pAd,
|
|
(UCHAR)apidx,
|
|
(UCHAR)pMbss->DefaultKeyId,
|
|
&pAd->SharedKey[apidx][pMbss->DefaultKeyId]
|
|
);
|
|
GET_GroupKey_WCID(pAd, Wcid, apidx);
|
|
|
|
RTMPSetWcidSecurityInfo(pAd, (UINT8)apidx, (UINT8)KeyIdx,
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg, Wcid, SHAREDKEYTABLE);
|
|
|
|
/*RTMPAddWcidAttributeEntry(
|
|
pAd,
|
|
apidx,
|
|
pMbss->DefaultKeyId,
|
|
pAd->SharedKey[apidx][pMbss->DefaultKeyId].CipherAlg,
|
|
NULL);*/
|
|
}
|
|
break;
|
|
}
|
|
case HOSTAPD_OID_DEL_KEY:
|
|
|
|
Status = -EINVAL;
|
|
if(wrq->u.data.length != sizeof(struct ieee80211req_del_key) || !wrq->u.data.pointer)
|
|
break;
|
|
Status = copy_from_user(&delkey, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, delkey.idk_macaddr);
|
|
if (pEntry){
|
|
/* clear the previous Pairwise key table */
|
|
if(pEntry->wcid != 0)
|
|
{
|
|
NdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY));
|
|
AsicRemovePairwiseKeyEntry(pAd,(UCHAR)pEntry->wcid);
|
|
}
|
|
}
|
|
else if((delkey.idk_macaddr == NULL) && (delkey.idk_keyix < 4))
|
|
/* remove group key */
|
|
AsicRemoveSharedKeyEntry(pAd, pEntry->func_tb_idx, delkey.idk_keyix);
|
|
break;
|
|
|
|
case HOSTAPD_OID_SET_STA_AUTHORIZED:/*for portsecured flag. */
|
|
|
|
if (wrq->u.data.length != sizeof(struct ieee80211req_mlme))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
Status = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, mlme.im_macaddr);
|
|
if (!pEntry){
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
tr_entry = &pAd->MacTab.tr_entry[pEntry->wcid];
|
|
switch (mlme.im_op)
|
|
{
|
|
case IEEE80211_MLME_AUTHORIZE:
|
|
pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
|
|
pEntry->WpaState = AS_PTKINITDONE;/*wpa state machine is not in use. */
|
|
/*pAd->StaCfg.PortSecured= WPA_802_1X_PORT_SECURED; */
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
|
|
break;
|
|
case IEEE80211_MLME_UNAUTHORIZE:
|
|
pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
break;
|
|
default:
|
|
Status = -EINVAL;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case HOSTAPD_OID_STATIC_WEP_COPY:
|
|
{
|
|
UINT KeyIdx;
|
|
INT apidx;
|
|
if (wrq->u.data.length != sizeof(struct ieee80211req_mlme))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
Status = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, mlme.im_macaddr);
|
|
if (!pEntry){
|
|
Status = -EINVAL;
|
|
}
|
|
else{
|
|
/*Status = -EINVAL; */
|
|
DBGPRINT(RT_DEBUG_OFF, ("HOSTAPD_OID_STATIC_WEP_COPY IEEE8021X=%d WepStatus=%d\n"
|
|
, pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.IEEE8021X, pEntry->WepStatus));
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.IEEE8021X != TRUE)
|
|
break;
|
|
if (pEntry->WepStatus != Ndis802_11WEPEnabled)
|
|
break;
|
|
|
|
apidx = pObj->ioctl_if;
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
|
|
KeyIdx=pMbss->DefaultKeyId;
|
|
DBGPRINT(RT_DEBUG_OFF, ("HOSTAPD_OID_STATIC_WEP_COPY=%d\n", KeyIdx));
|
|
pEntry->AuthMode=pAd->ApCfg.MBSSID[apidx].AuthMode;
|
|
pEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pAd->SharedKey[apidx][KeyIdx].KeyLen);
|
|
pEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;
|
|
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
RTMPAddWcidAttributeEntry(
|
|
pAd,
|
|
pEntry->func_tb_idx,
|
|
KeyIdx, /* The value may be not zero */
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry);
|
|
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case HOSTAPD_OID_SET_STA_DEAUTH:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::HOSTAPD_OID_SET_STA_DEAUTH\n"));
|
|
MLME_DEAUTH_REQ_STRUCT *pInfo;
|
|
MLME_QUEUE_ELEM *Elem;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&Elem, sizeof(MLME_QUEUE_ELEM));
|
|
if(Elem)
|
|
{
|
|
pInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;
|
|
|
|
if (wrq->u.data.length != sizeof(struct ieee80211req_mlme))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
Status = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);
|
|
NdisMoveMemory(pInfo->Addr, mlme.im_macaddr, MAC_ADDR_LEN);
|
|
if ((pEntry = MacTableLookup(pAd, pInfo->Addr)) != NULL)
|
|
{
|
|
pInfo->Reason = mlme.im_reason;
|
|
Elem->Wcid = pEntry->wcid;
|
|
MlmeEnqueue(pAd, AP_AUTH_STATE_MACHINE, APMT2_MLME_DEAUTH_REQ, sizeof(MLME_DEAUTH_REQ_STRUCT), Elem,0);
|
|
}
|
|
}
|
|
os_free_mem(NULL, Elem);
|
|
}
|
|
break;
|
|
|
|
case HOSTAPD_OID_SET_STA_DISASSOC:/*hostapd request to disassoc the station. */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::HOSTAPD_OID_SET_STA_DISASSOC\n"));
|
|
MLME_DISASSOC_REQ_STRUCT DisassocReq;
|
|
if (wrq->u.data.length != sizeof(struct ieee80211req_mlme))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
Status = copy_from_user(&mlme, wrq->u.data.pointer, wrq->u.data.length);
|
|
NdisMoveMemory(DisassocReq.Addr, mlme.im_macaddr, MAC_ADDR_LEN);
|
|
DisassocReq.Reason = mlme.im_reason;
|
|
MlmeEnqueue(pAd, AP_ASSOC_STATE_MACHINE, APMT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq,0);
|
|
}
|
|
break;
|
|
|
|
case OID_HOSTAPD_SUPPORT:/*notify the driver to support hostapd. */
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
BOOLEAN hostapd_enable;
|
|
int v, apidx;
|
|
apidx = pObj->ioctl_if;
|
|
Status = copy_from_user(&hostapd_enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_OFF, ("OID_HOSTAPD_SUPPORT apidx=%d\n", apidx));
|
|
pAd->ApCfg.MBSSID[apidx].Hostapd = hostapd_enable;
|
|
BSS_STRUCT *pMBSSStruct;
|
|
|
|
for(v=0;v<MAX_MBSSID_NUM(pAd);v++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("ApCfg->MBSSID[%d].Hostapd == %s\n"
|
|
, v, (pAd->ApCfg.MBSSID[v].Hostapd == Hostapd_EXT ? "TRUE" : "FALSE")));
|
|
pMBSSStruct = &pAd->ApCfg.MBSSID[v];
|
|
pMBSSStruct->WPAREKEY.ReKeyInterval = 0;
|
|
pMBSSStruct->WPAREKEY.ReKeyMethod = DISABLE_REKEY;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case HOSTAPD_OID_COUNTERMEASURES:/*report txtsc to hostapd. */
|
|
|
|
if (wrq->u.data.length != sizeof(BOOLEAN))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
BOOLEAN countermeasures_enable;
|
|
Status = copy_from_user(&countermeasures_enable, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
if(countermeasures_enable)
|
|
{
|
|
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Receive CM Attack Twice within 60 seconds ====>>> \n"));
|
|
|
|
/* send wireless event - for counter measures */
|
|
pAd->ApCfg.CMTimerRunning = FALSE;
|
|
|
|
for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];
|
|
/* happened twice within 60 sec, AP SENDS disaccociate all associated STAs. All STA's transition to State 2 */
|
|
if (IS_ENTRY_CLIENT(pEntry))
|
|
{
|
|
MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_MIC_FAILURE,FALSE);
|
|
}
|
|
}
|
|
|
|
/* Further, ban all Class 3 DATA transportation for a period of 60 sec */
|
|
/* disallow new association , too */
|
|
pAd->ApCfg.BANClass3Data = TRUE;
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
pAd->ApCfg.BANClass3Data = FALSE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case HOSTAPD_OID_SET_WPS_BEACON_IE:/*pure 1x is enabled. */
|
|
DBGPRINT(RT_DEBUG_TRACE,("HOSTAPD_OID_SET_WPS_BEACON_IE\n"));
|
|
if (wrq->u.data.length != sizeof(WSC_LV_INFO))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
INT apidx;
|
|
apidx = pObj->ioctl_if;
|
|
pAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;
|
|
BSS_STRUCT *pMBSSStruct;
|
|
NdisZeroMemory(&WscIEBeacon,sizeof(WSC_LV_INFO));
|
|
Status = copy_from_user(&WscIEBeacon, wrq->u.data.pointer, wrq->u.data.length);
|
|
pMBSSStruct = &pAd->ApCfg.MBSSID[apidx];
|
|
NdisMoveMemory(pMBSSStruct->WscIEBeacon.Value,WscIEBeacon.Value, WscIEBeacon.ValueLen);
|
|
pMBSSStruct->WscIEBeacon.ValueLen=WscIEBeacon.ValueLen;
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
}
|
|
|
|
break;
|
|
|
|
case HOSTAPD_OID_SET_WPS_PROBE_RESP_IE:/*pure 1x is enabled. */
|
|
apidx = pObj->ioctl_if;
|
|
DBGPRINT(RT_DEBUG_TRACE,("HOSTAPD_OID_SET_WPS_PROBE_RESP_IE\n"));
|
|
if (wrq->u.data.length != sizeof(WSC_LV_INFO))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE,("HOSTAPD_OID_SET_WPS_PROBE_RESP_IE failed\n"));
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
INT apidx;
|
|
apidx = pObj->ioctl_if;
|
|
pAd->ApCfg.MBSSID[apidx].HostapdWPS = TRUE;
|
|
BSS_STRUCT *pMBSSStruct;
|
|
NdisZeroMemory(&WscIEProbeResp,sizeof(WSC_LV_INFO));
|
|
Status = copy_from_user(&WscIEProbeResp, wrq->u.data.pointer, wrq->u.data.length);
|
|
pMBSSStruct = &pAd->ApCfg.MBSSID[apidx];
|
|
NdisMoveMemory(pMBSSStruct->WscIEProbeResp.Value,WscIEProbeResp.Value, WscIEProbeResp.ValueLen);
|
|
pMBSSStruct->WscIEProbeResp.ValueLen=WscIEProbeResp.ValueLen;
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
|
|
}
|
|
break;
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef CONFIG_HOTSPOT
|
|
case OID_802_11_HS_TEST:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("hotspot test\n"));
|
|
break;
|
|
case OID_802_11_HS_IE:
|
|
{
|
|
UCHAR *IE;
|
|
os_alloc_mem(NULL, (UCHAR **)&IE, wrq->u.data.length);
|
|
copy_from_user(IE, wrq->u.data.pointer, wrq->u.data.length);
|
|
Set_AP_IE(pAd, IE, wrq->u.data.length);
|
|
os_free_mem(NULL, IE);
|
|
}
|
|
break;
|
|
case OID_802_11_HS_ANQP_RSP:
|
|
{
|
|
UCHAR *Buf;
|
|
struct anqp_rsp_data *rsp_data;
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
rsp_data = (struct anqp_rsp_data *)Buf;
|
|
Send_ANQP_Rsp(pAd,
|
|
rsp_data->peer_mac_addr,
|
|
rsp_data->anqp_rsp,
|
|
rsp_data->anqp_rsp_len);
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_HS_ONOFF:
|
|
{
|
|
UCHAR *Buf;
|
|
struct hs_onoff *onoff;
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
onoff = (struct hs_onoff *)Buf;
|
|
Set_HotSpot_OnOff(pAd, onoff->hs_onoff, onoff->event_trigger, onoff->event_type);
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_HS_PARAM_SETTING:
|
|
{
|
|
UCHAR *Buf;
|
|
struct hs_param_setting *param_setting;
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
param_setting = (struct hs_param_setting *)Buf;
|
|
Set_HotSpot_Param(pAd, param_setting->param, param_setting->value);
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_HS_RESET_RESOURCE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("hotspot reset some resource\n"));
|
|
Clear_Hotspot_All_IE(pAd);
|
|
//Clear_All_PROXY_TABLE(pAd);
|
|
break;
|
|
#ifdef CONFIG_HOTSPOT_R2
|
|
case OID_802_11_HS_SASN_ENABLE:
|
|
{
|
|
UCHAR *Buf;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl;
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
pHSCtrl->bASANEnable = Buf[0];
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_BSS_LOAD:
|
|
{
|
|
UCHAR *Buf;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl;
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
pHSCtrl->QLoadTestEnable = Buf[0];
|
|
pHSCtrl->QLoadCU = Buf[1];
|
|
memcpy(&pHSCtrl->QLoadStaCnt, &Buf[2], 2);
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
#ifdef CONFIG_HOTSPOT_R2
|
|
case OID_802_11_WNM_BTM_REQ:
|
|
{
|
|
UCHAR *Buf;
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
struct btm_req_data *req_data;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl;
|
|
|
|
os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
req_data = (struct btm_req_data *)Buf;
|
|
|
|
if ((pEntry = MacTableLookup(pAd, req_data->peer_mac_addr)) == NULL)
|
|
{
|
|
}
|
|
else if (((pHSCtrl->HotSpotEnable) && (pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode == Ndis802_11AuthModeOpen)) ||
|
|
((pEntry->WpaState == AS_PTKINITDONE) && (pEntry->GTKState = REKEY_ESTABLISHED)))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("btm1\n"));
|
|
Send_BTM_Req(pAd,
|
|
req_data->peer_mac_addr,
|
|
req_data->btm_req,
|
|
req_data->btm_req_len);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("btm2\n"));
|
|
pEntry->IsBTMReqValid = TRUE;
|
|
os_alloc_mem(pEntry->ReqbtmData, (UCHAR **)&pEntry->ReqbtmData, sizeof(struct btm_req_data)+req_data->btm_req_len);
|
|
memcpy(pEntry->ReqbtmData, Buf, sizeof(struct btm_req_data)+req_data->btm_req_len);
|
|
}
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_WNM_NOTIFY_REQ:
|
|
{
|
|
UCHAR *Buf;
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
struct wnm_req_data *req_data;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].HotSpotCtrl;
|
|
|
|
os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
req_data = (struct wnm_req_data *)Buf;
|
|
//printk("addr=%02x:%02x:%02x:%02x:%02x:%02x\n", req_data->peer_mac_addr[0],req_data->peer_mac_addr[1],req_data->peer_mac_addr[2],req_data->peer_mac_addr[3],req_data->peer_mac_addr[4],req_data->peer_mac_addr[5]);
|
|
//for(k=0;k<req_data->wnm_req_len;k++)
|
|
// printk("%02x:", *(req_data->wnm_req+k));
|
|
|
|
//printk("req len=%d\n",req_data->wnm_req_len);
|
|
if ((pEntry = MacTableLookup(pAd, req_data->peer_mac_addr)) == NULL)
|
|
{
|
|
}
|
|
else if (((pHSCtrl->HotSpotEnable) && (pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode == Ndis802_11AuthModeOpen)) ||
|
|
((pEntry->WpaState == AS_PTKINITDONE) && (pEntry->GTKState = REKEY_ESTABLISHED)))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("wnm1\n"));
|
|
Send_WNM_Notify_Req(pAd,
|
|
req_data->peer_mac_addr,
|
|
req_data->wnm_req,
|
|
req_data->wnm_req_len,
|
|
req_data->type);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("wnm2\n"));
|
|
pEntry->IsWNMReqValid = TRUE;
|
|
os_alloc_mem(pEntry->ReqData, (UCHAR **)&pEntry->ReqData, sizeof(struct wnm_req_data)+req_data->wnm_req_len);
|
|
memcpy(pEntry->ReqData, Buf, sizeof(struct wnm_req_data)+req_data->wnm_req_len);
|
|
}
|
|
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
case OID_802_11_QOSMAP_CONFIGURE:
|
|
{
|
|
UCHAR *Buf;
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
struct qosmap_data *req_data;
|
|
unsigned int i;
|
|
|
|
os_alloc_mem(Buf, (UCHAR **)&Buf, wrq->u.data.length);
|
|
copy_from_user(Buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
|
|
req_data = (struct qosmap_data *)Buf;
|
|
|
|
if ((pEntry = MacTableLookup(pAd, req_data->peer_mac_addr)) != NULL)
|
|
{
|
|
//clear previous data
|
|
pEntry->DscpExceptionCount = 0;
|
|
memset(pEntry->DscpRange, 0xff, 16);
|
|
memset(pEntry->DscpException, 0xff, 42);
|
|
|
|
pEntry->DscpExceptionCount = req_data->qosmap_len-16;
|
|
memcpy((UCHAR *)pEntry->DscpRange, &req_data->qosmap[pEntry->DscpExceptionCount], 16);
|
|
if (pEntry->DscpExceptionCount != 0)
|
|
memcpy((UCHAR *)pEntry->DscpException, req_data->qosmap, pEntry->DscpExceptionCount);
|
|
|
|
Send_QOSMAP_Configure(pAd,
|
|
req_data->peer_mac_addr,
|
|
req_data->qosmap,
|
|
req_data->qosmap_len,
|
|
pEntry->apidx);
|
|
}
|
|
else if ((req_data->peer_mac_addr[0] == 0)
|
|
&& (req_data->peer_mac_addr[1] == 0)
|
|
&& (req_data->peer_mac_addr[2] == 0)
|
|
&& (req_data->peer_mac_addr[3] == 0)
|
|
&& (req_data->peer_mac_addr[4] == 0)
|
|
&& (req_data->peer_mac_addr[5] == 0) ) {
|
|
/* Special MAC 00:00:00:00:00:00 for HS2 QoS Map Change using. */
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) {
|
|
pEntry = &pAd->MacTab.Content[i];
|
|
|
|
if ((IS_ENTRY_CLIENT(pEntry))
|
|
&& (pEntry->Sst == SST_ASSOC)) {
|
|
if (pEntry->QosMapSupport) {
|
|
pEntry->DscpExceptionCount = 0;
|
|
memset(pEntry->DscpRange, 0xff, 16);
|
|
memset(pEntry->DscpException, 0xff, 42);
|
|
|
|
pEntry->DscpExceptionCount = req_data->qosmap_len-16;
|
|
memcpy((UCHAR *)pEntry->DscpRange,
|
|
&req_data->qosmap[pEntry->DscpExceptionCount], 16);
|
|
if (pEntry->DscpExceptionCount != 0) {
|
|
memcpy((UCHAR *)pEntry->DscpException,
|
|
req_data->qosmap, pEntry->DscpExceptionCount);
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("send QoS map frame: apidx=%d\n", pEntry->apidx));
|
|
Send_QOSMAP_Configure(pAd,
|
|
pEntry->Addr,
|
|
req_data->qosmap,
|
|
req_data->qosmap_len,
|
|
pEntry->apidx);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
os_free_mem(NULL, Buf);
|
|
}
|
|
break;
|
|
#endif
|
|
#endif
|
|
default:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd));
|
|
Status = -EOPNOTSUPP;
|
|
break;
|
|
}
|
|
|
|
#ifdef MESH_SUPPORT
|
|
/* important parameter is changed, restart mesh */
|
|
if (RestartMeshIsRequired)
|
|
{
|
|
MeshDown(pAd, TRUE);
|
|
MeshUp(pAd);
|
|
}
|
|
#endif /* MESH_SUPPORT */
|
|
|
|
return Status;
|
|
}
|
|
|
|
|
|
INT RTMPAPQueryInformation(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN OUT RTMP_IOCTL_INPUT_STRUCT *rq,
|
|
IN INT cmd)
|
|
{
|
|
RTMP_IOCTL_INPUT_STRUCT *wrq = (RTMP_IOCTL_INPUT_STRUCT *) rq;
|
|
ULONG Status = NDIS_STATUS_SUCCESS;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
RTMP_STRING driverVersion[16];
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
#ifdef WSC_AP_SUPPORT
|
|
UINT WscPinCode = 0;
|
|
PWSC_PROFILE pProfile;
|
|
PWSC_CTRL pWscControl;
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#ifdef SNMP_SUPPORT
|
|
ULONG ulInfo;
|
|
DefaultKeyIdxValue *pKeyIdxValue;
|
|
INT valueLen;
|
|
TX_RTY_CFG_STRUC tx_rty_cfg;
|
|
ULONG ShortRetryLimit, LongRetryLimit;
|
|
UCHAR snmp_tmp[64];
|
|
#endif /* SNMP_SUPPORT */
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
struct default_group_key group_key;
|
|
struct ieee80211req_key ik;
|
|
unsigned char *p;
|
|
MAC_TABLE_ENTRY *pEntry=(MAC_TABLE_ENTRY *)NULL;
|
|
struct ieee80211req_wpaie wpaie;
|
|
BSS_STRUCT *pMbss;
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
INT ifIndex;
|
|
ULONG BssBufSize;
|
|
BOOLEAN apcliEn=FALSE;
|
|
INT i,Padding = 0;
|
|
PUCHAR pBuf = NULL, pPtr=NULL;
|
|
NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL;
|
|
USHORT BssLen = 0;
|
|
PNDIS_WLAN_BSSID_EX pBss;
|
|
MAC_TABLE_ENTRY *pMacEntry=(MAC_TABLE_ENTRY *)NULL;
|
|
STA_TR_ENTRY *tr_entry;
|
|
PAPCLI_STRUCT pApCliEntry=NULL;
|
|
NDIS_802_11_SSID Ssid;
|
|
UINT we_version_compiled;
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
|
|
|
|
NDIS_802_11_STATISTICS *pStatistics;
|
|
|
|
#ifdef EASY_CONFIG_SETUP
|
|
PUCHAR pStaMacAddr = NULL;
|
|
#endif /* EASY_CONFIG_SETUP */
|
|
|
|
#ifdef P2P_SUPPORT
|
|
/*RT_P2P_UI_TABLE UI_table;*/
|
|
PRT_P2P_UI_TABLE pUI_table;
|
|
PRT_P2P_TABLE pP2pTable;
|
|
PRT_P2P_CLIENT_ENTRY pPAdCli, pUICli;
|
|
PRT_P2P_CONFIG pP2PCtrl; /* = &pAd->P2pCfg; */
|
|
UCHAR tmp[24];
|
|
UCHAR i;
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
#ifdef DOT1X_SUPPORT
|
|
INT IEEE8021X = 0;
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
INT mBss_staCount = 0;
|
|
NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax;
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
struct wifi_dev *wdev = NULL;
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
/* For all ioctl to this function, we assume that's query for AP/APCLI/GO device */
|
|
if ((pObj->ioctl_if_type == INT_MBSSID) || (pObj->ioctl_if_type == INT_MAIN))
|
|
{
|
|
if (apidx >= pAd->ApCfg.BssidNum)
|
|
return EFAULT;
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
}
|
|
|
|
switch(cmd)
|
|
{
|
|
case OID_802_11_MBSS_GET_STA_COUNT:
|
|
wrq->u.data.length = sizeof(INT);
|
|
mBss_staCount = pAd->ApCfg.MBSSID[apidx].StaCount;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MBSS_GET_STA_COUNT ==> %d \n", mBss_staCount));
|
|
Status = copy_to_user(wrq->u.data.pointer, &mBss_staCount, wrq->u.data.length);
|
|
break;
|
|
#ifdef DOT1X_SUPPORT
|
|
case OID_802_11_SET_IEEE8021X:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SET_IEEE8021X \n"));
|
|
wrq->u.data.length = sizeof(INT);
|
|
if(pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.IEEE8021X == TRUE)
|
|
IEEE8021X=1;
|
|
else
|
|
IEEE8021X=0;
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, &IEEE8021X, wrq->u.data.length);
|
|
break;
|
|
#endif /* DOT1X_SUPPORT */
|
|
case OID_802_11_AUTHENTICATION_MODE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE \n"));
|
|
wrq->u.data.length = sizeof(NDIS_802_11_AUTHENTICATION_MODE);
|
|
AuthMode=pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.AuthMode;
|
|
Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);
|
|
break;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
case RT_OID_NEW_DRIVER:
|
|
{
|
|
UCHAR enabled = 1;
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query apcli::RT_OID_NEW_DRIVER (=%d)\n", enabled));
|
|
break;
|
|
}
|
|
|
|
case RT_OID_WE_VERSION_COMPILED:
|
|
wrq->u.data.length = sizeof(UINT);
|
|
we_version_compiled = RtmpOsWirelessExtVerGet();
|
|
Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_WE_VERSION_COMPILED (=%d)\n", we_version_compiled));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
break;
|
|
|
|
case OID_802_11_BSSID_LIST:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ifIndex].MacTabWCID];
|
|
//tr_entry = &pAd->MacTab.Content[pMacEntry->wcid];
|
|
tr_entry = &pAd->MacTab.tr_entry[pMacEntry->wcid];
|
|
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
|
|
{
|
|
/*
|
|
* Still scanning, indicate the caller should try again.
|
|
*/
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n"));
|
|
return -EAGAIN;
|
|
}
|
|
if ((pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE)
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].wpa_supplicant_info.WpaSupplicantScanCount = 0;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAd->ScanTab.BssNr));
|
|
BssBufSize = sizeof(ULONG);
|
|
|
|
for (i = 0; i < pAd->ScanTab.BssNr; i++)
|
|
{
|
|
BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);
|
|
}
|
|
|
|
BssBufSize += 256;
|
|
os_alloc_mem(pAd, (UCHAR **)&pBuf, BssBufSize);
|
|
if(pBuf == NULL)
|
|
{
|
|
Status = -ENOMEM;
|
|
break;
|
|
}
|
|
NdisZeroMemory(pBuf, BssBufSize);
|
|
pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;
|
|
pBssidList->NumberOfItems = pAd->ScanTab.BssNr;
|
|
|
|
BssLen = 4; /* Consist of NumberOfItems */
|
|
pPtr = (PUCHAR) &pBssidList->Bssid[0];
|
|
for (i = 0; i < pAd->ScanTab.BssNr; i++)
|
|
{
|
|
pBss = (PNDIS_WLAN_BSSID_EX) pPtr;
|
|
NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);
|
|
if ((pAd->ScanTab.BssEntry[i].Hidden == 1))
|
|
{
|
|
/*
|
|
We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation
|
|
and then failed to send EAPOl farame.
|
|
*/
|
|
if ((pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode >= Ndis802_11AuthModeWPA) && (tr_entry->PortSecured != WPA_802_1X_PORT_SECURED))
|
|
{
|
|
pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;
|
|
NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);
|
|
}
|
|
else
|
|
pBss->Ssid.SsidLength = 0;
|
|
}
|
|
else
|
|
{
|
|
pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;
|
|
NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);
|
|
}
|
|
pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy;
|
|
pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta;
|
|
pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]);
|
|
pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
|
|
pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod;
|
|
pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin;
|
|
|
|
MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);
|
|
|
|
if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA)
|
|
pBss->InfrastructureMode = Ndis802_11Infrastructure;
|
|
else
|
|
pBss->InfrastructureMode = Ndis802_11IBSS;
|
|
|
|
NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen);
|
|
NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen,
|
|
pAd->ScanTab.BssEntry[i].ExtRate,
|
|
pAd->ScanTab.BssEntry[i].ExtRateLen);
|
|
|
|
if (pAd->ScanTab.BssEntry[i].VarIELen == 0)
|
|
{
|
|
pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
|
|
NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
|
|
pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
|
|
}
|
|
else
|
|
{
|
|
pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen);
|
|
pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
|
|
NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
|
|
NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen);
|
|
pPtr += pAd->ScanTab.BssEntry[i].VarIELen;
|
|
}
|
|
pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);
|
|
|
|
#if WIRELESS_EXT < 17
|
|
if ((BssLen + pBss->Length) < wrq->u.data.length)
|
|
BssLen += pBss->Length;
|
|
else
|
|
{
|
|
pBssidList->NumberOfItems = i;
|
|
break;
|
|
}
|
|
#else
|
|
BssLen += pBss->Length;
|
|
#endif
|
|
}
|
|
|
|
#if WIRELESS_EXT < 17
|
|
wrq->u.data.length = BssLen;
|
|
#else
|
|
if (BssLen > wrq->u.data.length)
|
|
{
|
|
os_free_mem(NULL, pBssidList);
|
|
return -E2BIG;
|
|
}
|
|
else
|
|
wrq->u.data.length = BssLen;
|
|
#endif
|
|
Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);
|
|
os_free_mem(NULL, pBssidList);
|
|
break;
|
|
case OID_802_3_CURRENT_ADDRESS:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
pMacEntry = &pAd->MacTab.Content[pAd->ApCfg.ApCliTab[ifIndex].MacTabWCID];
|
|
|
|
wrq->u.data.length = MAC_ADDR_LEN;
|
|
Status = copy_to_user(wrq->u.data.pointer, pApCliEntry->wdev.if_addr, wrq->u.data.length);
|
|
break;
|
|
|
|
case OID_802_11_BSSID:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
if (INFRA_ON(pAd) || ADHOC_ON(pAd))
|
|
{
|
|
Status = copy_to_user(wrq->u.data.pointer, pApCliEntry->CfgApCliBssid, sizeof(NDIS_802_11_MAC_ADDRESS));
|
|
|
|
|
|
DBGPRINT(RT_DEBUG_INFO, ("IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n",
|
|
pApCliEntry->CfgApCliBssid[0],pApCliEntry->CfgApCliBssid[1],pApCliEntry->CfgApCliBssid[2],
|
|
pApCliEntry->CfgApCliBssid[3],pApCliEntry->CfgApCliBssid[4],pApCliEntry->CfgApCliBssid[5]));
|
|
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n"));
|
|
Status = -ENOTCONN;
|
|
}
|
|
break;
|
|
case OID_802_11_SSID:
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry=&pAd->ApCfg.ApCliTab[ifIndex];
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
if (!apcliEn)
|
|
return FALSE;
|
|
|
|
NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
|
|
NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);
|
|
Ssid.SsidLength = pApCliEntry->CfgSsidLen;
|
|
NdisMoveMemory(Ssid.Ssid, pApCliEntry->CfgSsid,Ssid.SsidLength);
|
|
wrq->u.data.length = sizeof(NDIS_802_11_SSID);
|
|
Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query Apcli::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid));
|
|
break;
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
|
|
#ifdef P2P_SUPPORT
|
|
case OID_802_11_P2P_Connected_MAC:
|
|
wrq->u.data.length = MAC_ADDR_LEN;
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.ConnectingMAC, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_Connected_MAC\n"));
|
|
break;
|
|
|
|
case OID_802_11_P2P_MODE:
|
|
wrq->u.data.length = sizeof(char);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.Rule, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_MODE (Len=%d, Rule=%s)\n", sizeof(char),pAd->P2pCfg.Rule));
|
|
break;
|
|
|
|
case OID_802_11_P2P_DEVICE_NAME:
|
|
wrq->u.data.length = pAd->P2pCfg.DeviceNameLen;
|
|
Status = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.DeviceName, pAd->P2pCfg.DeviceNameLen);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_DEVICE_NAME (Len=%d, DeviceName=%s)\n", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));
|
|
break;
|
|
|
|
case OID_802_11_P2P_LISTEN_CHANNEL:
|
|
wrq->u.data.length = sizeof(char);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.ListenChannel, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_LISTEN_CHANNEL (Len=%d, Listen_Ch=%d)\n", sizeof(char),pAd->P2pCfg.ListenChannel));
|
|
break;
|
|
|
|
case OID_802_11_P2P_OPERATION_CHANNEL:
|
|
wrq->u.data.length = sizeof(char);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->P2pCfg.GroupChannel, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_OPERATION_CHANNEL (Len=%d, Op_Ch=%d)\n", sizeof(char),pAd->P2pCfg.GroupOpChannel));
|
|
break;
|
|
|
|
|
|
case OID_802_11_P2P_MAC_ADDR:
|
|
wrq->u.data.length = 6;
|
|
Status = copy_to_user(wrq->u.data.pointer, pAd->P2pCfg.Bssid, wrq->u.data.length);
|
|
/*DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_MAC_ADDR (Len=%d, Rule=%s)\n", sizeof(char),pAd->P2pCfg.GroupOpChannel)); */
|
|
break;
|
|
|
|
case OID_802_11_P2P_CTRL_STATUS:
|
|
wrq->u.data.length = 24;
|
|
pP2PCtrl = &pAd->P2pCfg;
|
|
NdisZeroMemory(tmp, 24);
|
|
sprintf(tmp,"%s",decodeCtrlState(pP2PCtrl->CtrlCurrentState));
|
|
Status = copy_to_user(wrq->u.data.pointer, tmp, 24);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\n", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));
|
|
break;
|
|
|
|
case OID_802_11_P2P_DISC_STATUS:
|
|
wrq->u.data.length = 24;
|
|
pP2PCtrl = &pAd->P2pCfg;
|
|
NdisZeroMemory(tmp, 24);
|
|
sprintf(tmp,"%s",decodeDiscoveryState(pP2PCtrl->DiscCurrentState));
|
|
Status = copy_to_user(wrq->u.data.pointer, tmp, 24);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\n", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));
|
|
break;
|
|
|
|
case OID_802_11_P2P_GOFORM_STATUS:
|
|
wrq->u.data.length = 24;
|
|
pP2PCtrl = &pAd->P2pCfg;
|
|
NdisZeroMemory(tmp, 24);
|
|
sprintf(tmp,"%s",decodeGroupFormationState(pP2PCtrl->GoFormCurrentState));
|
|
Status = copy_to_user(wrq->u.data.pointer, tmp, 24);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_MODE (Len=%d, DeviceName=%s)\n", pAd->P2pCfg.DeviceNameLen,pAd->P2pCfg.DeviceName));
|
|
break;
|
|
|
|
case OID_802_11_P2P_SCAN_LIST:
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&pUI_table, sizeof(RT_P2P_UI_TABLE));
|
|
pP2pTable = &pAd->P2pTable;
|
|
/*NdisZeroMemory(&UI_table, sizeof(UI_table));*/
|
|
/*pUI_table = &UI_table;*/
|
|
NdisZeroMemory(pUI_table, sizeof(RT_P2P_UI_TABLE));
|
|
pUI_table->ClientNumber = pAd->P2pTable.ClientNumber;
|
|
for (i=0; i < pAd->P2pTable.ClientNumber; i++)
|
|
{
|
|
pPAdCli = &pP2pTable->Client[i];
|
|
pUICli = &pUI_table->Client[i];
|
|
NdisMoveMemory(pUICli, pPAdCli, sizeof(RT_P2P_CLIENT_ENTRY));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("Query::OID_802_11_P2P_SCAN_LIST\n"));
|
|
Status = copy_to_user(wrq->u.data.pointer, pUI_table, sizeof(RT_P2P_UI_TABLE));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_P2P_SCAN_LIST (Len=%d, Rule=%s)\n", sizeof(char),pAd->P2pCfg.GroupOpChannel));
|
|
os_free_mem(NULL, pUI_table);
|
|
break;
|
|
|
|
case OID_P2P_WSC_PIN_CODE:
|
|
wrq->u.data.length = sizeof(UINT);
|
|
WscPinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;
|
|
|
|
if (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_PIN_CODE (=%d)\n", WscPinCode));
|
|
break;
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
case RT_OID_VERSION_INFO:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n"));
|
|
wrq->u.data.length = (UINT16)strlen(AP_DRIVER_VERSION);
|
|
snprintf(&driverVersion[0], sizeof(driverVersion), "%s", AP_DRIVER_VERSION);
|
|
driverVersion[wrq->u.data.length] = '\0';
|
|
if (copy_to_user(wrq->u.data.pointer, &driverVersion, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_NETWORK_TYPES_SUPPORTED:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED \n"));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->RfIcType, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
#ifdef IAPP_SUPPORT
|
|
case RT_QUERY_SIGNAL_CONTEXT:
|
|
{
|
|
BOOLEAN FlgIs11rSup = FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_QUERY_SIGNAL_CONTEXT \n"));
|
|
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
FlgIs11rSup = TRUE;
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
|
|
if (FlgIs11rSup == FALSE)
|
|
{
|
|
#if 0
|
|
wrq->u.data.length = sizeof(RT_SIGNAL_STRUC);
|
|
if (copy_to_user(wrq->u.data.pointer, &pObj->RTSignal, wrq->u.data.length))
|
|
#endif
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
}
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
else
|
|
{
|
|
FT_KDP_SIGNAL *pFtKdp;
|
|
FT_KDP_EVT_HEADER *pEvtHdr;
|
|
|
|
|
|
/* query signal content for 11r */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_QUERY_FT_KDP_CONTEXT \n"));
|
|
|
|
FT_KDP_EventGet(pAd, &pFtKdp);
|
|
if (pFtKdp != NULL)
|
|
pEvtHdr = (FT_KDP_EVT_HEADER *)pFtKdp->Content;
|
|
/* End of if */
|
|
|
|
if ((pFtKdp != NULL) &&
|
|
((RT_SIGNAL_STRUC_HDR_SIZE + pEvtHdr->EventLen) <=
|
|
wrq->u.data.length))
|
|
{
|
|
/* copy the event */
|
|
if (copy_to_user(
|
|
wrq->u.data.pointer,
|
|
pFtKdp,
|
|
RT_SIGNAL_STRUC_HDR_SIZE + pEvtHdr->EventLen))
|
|
{
|
|
wrq->u.data.length = 0;
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
wrq->u.data.length = RT_SIGNAL_STRUC_HDR_SIZE;
|
|
wrq->u.data.length += pEvtHdr->EventLen;
|
|
}
|
|
|
|
FT_MEM_FREE(pAd, pFtKdp);
|
|
}
|
|
else
|
|
{
|
|
/* no event is queued */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("ft_kdp> no event is queued!\n"));
|
|
wrq->u.data.length = 0;
|
|
}
|
|
}
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
}
|
|
break;
|
|
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
case RT_FT_DATA_ENCRYPT:
|
|
case RT_FT_DATA_DECRYPT:
|
|
{
|
|
UCHAR *pBuffer;
|
|
UINT32 DataLen;
|
|
|
|
DataLen = wrq->u.data.length;
|
|
|
|
/*
|
|
Make sure the data length is multiple of 8
|
|
due to AES_KEY_WRAP() limitation.
|
|
*/
|
|
if (DataLen & 0x07)
|
|
DataLen += 8 - (DataLen & 0x07);
|
|
/* End of if */
|
|
|
|
FT_MEM_ALLOC(pAd, &pBuffer, DataLen+FT_KDP_KEY_ENCRYPTION_EXTEND);
|
|
if (pBuffer == NULL)
|
|
break;
|
|
NdisZeroMemory(pBuffer, DataLen+FT_KDP_KEY_ENCRYPTION_EXTEND);
|
|
|
|
if (copy_from_user(pBuffer, wrq->u.data.pointer, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
FT_MEM_FREE(pAd, pBuffer);
|
|
break;
|
|
}
|
|
|
|
switch(cmd)
|
|
{
|
|
case RT_FT_DATA_ENCRYPT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_FT_DATA_ENCRYPT \n"));
|
|
FT_KDP_DataEncrypt(pAd, (UCHAR *)pBuffer, &DataLen);
|
|
break;
|
|
|
|
case RT_FT_DATA_DECRYPT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_FT_DATA_DECRYPT \n"));
|
|
FT_KDP_DataDecrypt(pAd, (UCHAR *)pBuffer, &DataLen);
|
|
break;
|
|
}
|
|
|
|
wrq->u.data.length = DataLen;
|
|
if (copy_to_user(wrq->u.data.pointer, pBuffer, wrq->u.data.length))
|
|
Status = -EFAULT;
|
|
FT_MEM_FREE(pAd, pBuffer);
|
|
}
|
|
break;
|
|
|
|
case RT_OID_802_11R_INFO:
|
|
{
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PFT_CONFIG_INFO pFtConfig;
|
|
PFT_CFG pFtCfg;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pFtConfig, sizeof(FT_CONFIG_INFO));
|
|
if (pFtConfig == NULL)
|
|
break;
|
|
|
|
pFtCfg = &pAd->ApCfg.MBSSID[apidx].FtCfg;
|
|
NdisZeroMemory(pFtConfig, sizeof(FT_CONFIG_INFO));
|
|
|
|
pFtConfig->FtSupport = pFtCfg->FtCapFlag.Dot11rFtEnable;
|
|
pFtConfig->FtRicSupport = pFtCfg->FtCapFlag.RsrReqCap;
|
|
pFtConfig->FtOtdSupport = pFtCfg->FtCapFlag.FtOverDs;
|
|
NdisMoveMemory(pFtConfig->MdId, pFtCfg->FtMdId, FT_MDID_LEN);
|
|
pFtConfig->R0KHIdLen = pFtCfg->FtR0khIdLen;
|
|
NdisMoveMemory(pFtConfig->R0KHId, pFtCfg->FtR0khId, pFtCfg->FtR0khIdLen);
|
|
|
|
wrq->u.data.length = sizeof(FT_CONFIG_INFO);
|
|
Status = copy_to_user(wrq->u.data.pointer, pFtConfig, wrq->u.data.length);
|
|
os_free_mem(NULL, pFtConfig);
|
|
}
|
|
break;
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
|
|
#endif /* IAPP_SUPPORT */
|
|
|
|
#ifdef WMM_ACM_SUPPORT
|
|
case RT_OID_WMM_ACM_TSPEC:
|
|
{
|
|
UINT32 NumStream;
|
|
CHAR *pMac;
|
|
UINT32 *pNumOfTspec;
|
|
BOOLEAN FlgIsOk;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WMM_ACM_TSPEC \n"));
|
|
|
|
FlgIsOk = FALSE;
|
|
pMac = wrq->u.data.pointer; /* from user */
|
|
pNumOfTspec = (UINT32 *)wrq->u.data.pointer; /* to user */
|
|
NumStream = ACMP_StreamNumGet(pAd, ACM_SM_CATEGORY_PEER, 1, (PUCHAR)pMac);
|
|
|
|
if (NumStream > 0)
|
|
{
|
|
/* at least one TSPEC */
|
|
if (wrq->u.data.length >= \
|
|
(sizeof(UINT32)+sizeof(ACM_STREAM_INFO)*NumStream))
|
|
{
|
|
/* user buffer is enough to fill all TSPECs */
|
|
if (ACMP_StreamsGet(
|
|
pAd, ACM_SM_CATEGORY_PEER, 1,
|
|
&NumStream, (PUCHAR)pMac,
|
|
(ACM_STREAM_INFO *)(wrq->u.data.pointer+sizeof(UINT32))) == ACM_RTN_OK)
|
|
{
|
|
/* fill the actual number of TSPEC */
|
|
*pNumOfTspec = NumStream;
|
|
FlgIsOk = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (FlgIsOk == FALSE)
|
|
*pNumOfTspec = 0; /* get fail */
|
|
}
|
|
break;
|
|
#endif /* WMM_ACM_SUPPORT */
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
case RT_OID_WSC_QUERY_STATUS:
|
|
{
|
|
INT WscStatus;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_QUERY_STATUS \n"));
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
INT ApCliIdx = pObj->ioctl_if;
|
|
APCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);
|
|
WscStatus = pAd->ApCfg.ApCliTab[ApCliIdx].WscControl.WscStatus;
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
INT ApCliIdx = pObj->ioctl_if;
|
|
APCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);
|
|
WscStatus = pAd->ApCfg.ApCliTab[ApCliIdx].WscControl.WscStatus;
|
|
}
|
|
else
|
|
{
|
|
WscStatus = pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
WscStatus = pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus;
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(INT);
|
|
if (copy_to_user(wrq->u.data.pointer, &WscStatus, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
}
|
|
case RT_OID_WSC_PIN_CODE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_PIN_CODE \n"));
|
|
wrq->u.data.length = sizeof(UINT);
|
|
/*WscPinCode = GenerateWpsPinCode(pAd, FALSE, apidx); */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
|
|
WscPinCode = pWscControl->WscEnrolleePinCode;
|
|
if (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
#ifdef APCLI_SUPPORT
|
|
case RT_OID_APCLI_WSC_PIN_CODE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_APCLI_WSC_PIN_CODE \n"));
|
|
wrq->u.data.length = sizeof(UINT);
|
|
/*WscPinCode = GenerateWpsPinCode(pAd, TRUE, apidx); */
|
|
WscPinCode = pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode;
|
|
|
|
if (copy_to_user(wrq->u.data.pointer, &WscPinCode, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
#endif /* APCLI_SUPPORT */
|
|
case RT_OID_WSC_UUID:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_QUERY_UUID \n"));
|
|
wrq->u.data.length = UUID_LEN_STR;
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
if (copy_to_user(wrq->u.data.pointer, &pWscControl->Wsc_Uuid_Str[0], UUID_LEN_STR))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
case RT_OID_WSC_MAC_ADDRESS:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_MAC_ADDRESS \n"));
|
|
wrq->u.data.length = MAC_ADDR_LEN;
|
|
if (copy_to_user(wrq->u.data.pointer, pAd->ApCfg.MBSSID[apidx].wdev.bssid, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
case RT_OID_WSC_CONFIG_STATUS:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_CONFIG_STATUS \n"));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
case RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_QUERY_PEER_INFO_ON_RUNNING \n"));
|
|
|
|
if (pAd->ApCfg.MBSSID[apidx].WscControl.WscState > WSC_STATE_WAIT_M2)
|
|
{
|
|
wrq->u.data.length = sizeof(WSC_PEER_DEV_INFO);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscPeerInfo, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
case RT_OID_802_11_WSC_QUERY_PROFILE:
|
|
wrq->u.data.length = sizeof(WSC_PROFILE);
|
|
os_alloc_mem(pAd, (UCHAR **)&pProfile, sizeof(WSC_PROFILE));
|
|
if (pProfile == NULL)
|
|
{
|
|
Status = -EFAULT;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_802_11_WSC_QUERY_PROFILE fail!\n"));
|
|
break;
|
|
}
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
|
|
RTMPZeroMemory(pProfile, sizeof(WSC_PROFILE));
|
|
NdisMoveMemory(pProfile, &pWscControl->WscProfile, sizeof(WSC_PROFILE));
|
|
if ((pProfile->Profile[0].AuthType == WSC_AUTHTYPE_OPEN) && (pProfile->Profile[0].EncrType == WSC_ENCRTYPE_NONE))
|
|
{
|
|
pProfile->Profile[0].KeyLength = 0;
|
|
NdisZeroMemory(pProfile->Profile[0].Key, 64);
|
|
}
|
|
if (copy_to_user(wrq->u.data.pointer, pProfile, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
|
|
os_free_mem(NULL, pProfile);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WSC_QUERY_PROFILE \n"));
|
|
break;
|
|
#ifdef WSC_V2_SUPPORT
|
|
case RT_OID_WSC_V2_SUPPORT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_V2_SUPPORT (=%d)\n", pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2));
|
|
wrq->u.data.length = sizeof(BOOLEAN);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
case RT_OID_WSC_FRAGMENT_SIZE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WSC_FRAGMENT_SIZE (=%d)\n", pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize));
|
|
wrq->u.data.length = sizeof(USHORT);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.WscFragSize, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
#endif /* WSC_V2_SUPPORT */
|
|
|
|
#ifdef WSC_NFC_SUPPORT
|
|
case RT_OID_NFC_STATUS:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NFC_STATUS (=%d)\n", pAd->ApCfg.MBSSID[apidx].WscControl.NfcStatus));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
if (copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].WscControl.NfcStatus, wrq->u.data.length))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
#endif /* WSC_NFC_SUPPORT */
|
|
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#ifdef LLTD_SUPPORT
|
|
case RT_OID_GET_LLTD_ASSO_TABLE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::Get LLTD association table\n"));
|
|
if ((wrq->u.data.pointer == NULL) || (apidx != MAIN_MBSSID))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
INT i;
|
|
RT_LLTD_ASSOICATION_TABLE AssocTab;
|
|
|
|
AssocTab.Num = 0;
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))
|
|
{
|
|
COPY_MAC_ADDR(AssocTab.Entry[AssocTab.Num].Addr, &pAd->MacTab.Content[i].Addr);
|
|
AssocTab.Entry[AssocTab.Num].phyMode = pAd->CommonCfg.PhyMode;
|
|
AssocTab.Entry[AssocTab.Num].MOR = RateIdToMbps[pAd->ApCfg.MBSSID[apidx].MaxTxRate] * 2;
|
|
AssocTab.Num += 1;
|
|
}
|
|
}
|
|
wrq->u.data.length = sizeof(RT_LLTD_ASSOICATION_TABLE);
|
|
if (copy_to_user(wrq->u.data.pointer, &AssocTab, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
Status = -EFAULT;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("AssocTab.Num = %d \n", AssocTab.Num));
|
|
}
|
|
break;
|
|
#ifdef APCLI_SUPPORT
|
|
case RT_OID_GET_REPEATER_AP_LINEAGE:
|
|
#if 0
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::Get repeater AP lineage.\n"));
|
|
if (wrq->u.data.pointer == NULL)
|
|
{
|
|
Status = -EFAULT;
|
|
break;
|
|
}
|
|
|
|
if (pAd->ApCfg.ApCliTab[apidx].Valid)
|
|
{
|
|
wrq->u.data.length = 6;
|
|
if (copy_to_user(wrq->u.data.pointer,
|
|
APCLI_GET_ROOT_BSSID(pAd, pAd->ApCfg.ApCliTab[apidx].MacTabWCID), wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
Status = -EFAULT;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: Root AP BSSID: \n", __FUNCTION__));
|
|
}
|
|
else
|
|
wrq->u.data.length = 0;
|
|
#else
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Not Support : Get repeater AP lineage.\n"));
|
|
#endif
|
|
break;
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
#endif /* LLTD_SUPPORT */
|
|
#ifdef NINTENDO_AP
|
|
case RT_OID_802_11_NINTENDO_GET_TABLE:
|
|
RTMPIoctlNintendoGetTable(pAd, wrq);
|
|
break;
|
|
#endif /* NINTENDO_AP */
|
|
#ifdef DOT1X_SUPPORT
|
|
case OID_802_DOT1X_CONFIGURATION:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::Get Radius setting(%d)\n", sizeof(DOT1X_CMM_CONF)));
|
|
RTMPIoctlQueryRadiusConf(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_DOT1X_QUERY_STA_AID:
|
|
RTMPIoctlQueryStaAid(pAd, wrq);
|
|
break;
|
|
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
case RT_OID_802_11_MAC_ADDRESS:
|
|
wrq->u.data.length = MAC_ADDR_LEN;
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[apidx].wdev.bssid, wrq->u.data.length);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_802_11_MAC_ADDRESS \n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
break;
|
|
|
|
#ifdef SNMP_SUPPORT
|
|
case RT_OID_802_11_MANUFACTUREROUI:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREROUI \n"));
|
|
wrq->u.data.length = ManufacturerOUI_LEN;
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
|
|
break;
|
|
|
|
case RT_OID_802_11_MANUFACTURERNAME:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTURERNAME \n"));
|
|
wrq->u.data.length = strlen(ManufacturerNAME);
|
|
Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
|
|
break;
|
|
|
|
case RT_OID_802_11_RESOURCETYPEIDNAME:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_RESOURCETYPEIDNAME \n"));
|
|
wrq->u.data.length = strlen(ResourceTypeIdName);
|
|
Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);
|
|
break;
|
|
|
|
case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:
|
|
{
|
|
ULONG ulInfo;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n"));
|
|
ulInfo = 1; /* 1 is support wep else 2 is not support. */
|
|
wrq->u.data.length = sizeof(ulInfo);
|
|
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
|
|
break;
|
|
}
|
|
case RT_OID_802_11_POWERMANAGEMENTMODE:
|
|
{
|
|
ULONG ulInfo;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_POWERMANAGEMENTMODE \n"));
|
|
ulInfo = 1; /* 1 is power active else 2 is power save. */
|
|
wrq->u.data.length = sizeof(ulInfo);
|
|
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
|
|
break;
|
|
}
|
|
case OID_802_11_WEPDEFAULTKEYVALUE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEPDEFAULTKEYVALUE \n"));
|
|
pKeyIdxValue = wrq->u.data.pointer;
|
|
DBGPRINT(RT_DEBUG_TRACE,("KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx));
|
|
|
|
valueLen = pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen;
|
|
NdisMoveMemory(pKeyIdxValue->Value,
|
|
&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].Key,
|
|
valueLen);
|
|
pKeyIdxValue->Value[valueLen]='\0';
|
|
|
|
wrq->u.data.length = sizeof(DefaultKeyIdxValue);
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE,("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \n", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length, pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,
|
|
pAd->SharedKey[pObj->ioctl_if][0].Key[0],
|
|
pAd->SharedKey[pObj->ioctl_if][1].Key[0],
|
|
pAd->SharedKey[pObj->ioctl_if][2].Key[0],
|
|
pAd->SharedKey[pObj->ioctl_if][3].Key[0]));
|
|
break;
|
|
|
|
case OID_802_11_WEPDEFAULTKEYID:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPDEFAULTKEYID \n"));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyId =%d \n", pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId));
|
|
break;
|
|
|
|
case RT_OID_802_11_WEPKEYMAPPINGLENGTH:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n"));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer,
|
|
&pAd->SharedKey[pObj->ioctl_if][pAd->ApCfg.MBSSID[pObj->ioctl_if].DefaultKeyId].KeyLen,
|
|
wrq->u.data.length);
|
|
break;
|
|
|
|
case OID_802_11_SHORTRETRYLIMIT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SHORTRETRYLIMIT \n"));
|
|
wrq->u.data.length = sizeof(ULONG);
|
|
ShortRetryLimit = AsicGetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_SHORT);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("ShortRetryLimit =%ld\n", ShortRetryLimit));
|
|
Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);
|
|
break;
|
|
|
|
case OID_802_11_LONGRETRYLIMIT:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_LONGRETRYLIMIT \n"));
|
|
wrq->u.data.length = sizeof(ULONG);
|
|
LongRetryLimit = AsicGetRetryLimit(pAd, TX_RTY_CFG_RTY_LIMIT_LONG);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("LongRetryLimit =%ld\n", LongRetryLimit));
|
|
Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);
|
|
break;
|
|
|
|
case RT_OID_802_11_PRODUCTID:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRODUCTID \n"));
|
|
|
|
#ifdef RTMP_MAC_PCI
|
|
{
|
|
|
|
USHORT device_id;
|
|
if (((POS_COOKIE)pAd->OS_Cookie)->pci_dev != NULL)
|
|
pci_read_config_word(((POS_COOKIE)pAd->OS_Cookie)->pci_dev, PCI_DEVICE_ID, &device_id);
|
|
else
|
|
DBGPRINT(RT_DEBUG_TRACE, (" pci_dev = NULL\n"));
|
|
snprintf((RTMP_STRING *)snmp_tmp, sizeof(snmp_tmp), "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id);
|
|
}
|
|
#endif /* RTMP_MAC_PCI */
|
|
#ifdef RTMP_MAC_USB
|
|
snprintf((RTMP_STRING *)snmp_tmp, sizeof(snmp_tmp), "%04x %04x\n",
|
|
RtmpOsGetUsbDevVendorID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev),
|
|
RtmpOsGetUsbDevProductID(((POS_COOKIE)pAd->OS_Cookie)->pUsb_Dev));
|
|
#endif /* RTMP_MAC_USB */
|
|
wrq->u.data.length = strlen((RTMP_STRING *) snmp_tmp);
|
|
Status = copy_to_user(wrq->u.data.pointer, snmp_tmp, wrq->u.data.length);
|
|
break;
|
|
|
|
case RT_OID_802_11_MANUFACTUREID:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREID \n"));
|
|
wrq->u.data.length = strlen(ManufacturerNAME);
|
|
Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
|
|
break;
|
|
|
|
case OID_802_11_CURRENTCHANNEL:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CURRENTCHANNEL \n"));
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAd->CommonCfg.Channel));
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
|
|
break;
|
|
#endif /* SNMP_SUPPORT */
|
|
|
|
case OID_802_11_STATISTICS:
|
|
os_alloc_mem(pAd, (UCHAR **)&pStatistics, sizeof(NDIS_802_11_STATISTICS));
|
|
if (pStatistics)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n"));
|
|
/* add the most up-to-date h/w raw counters into software counters */
|
|
/*NICUpdateRawCounters(pAd);*/
|
|
|
|
pStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;
|
|
pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;
|
|
pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart;
|
|
pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;
|
|
pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart;
|
|
pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart;
|
|
pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart;
|
|
pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart;
|
|
pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart;
|
|
pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
|
|
pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;
|
|
#ifdef DBG
|
|
pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;
|
|
#else
|
|
pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart;
|
|
pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100;
|
|
#endif
|
|
pStatistics->TransmittedFrameCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;
|
|
pStatistics->WEPUndecryptableCount.QuadPart = pAd->WlanCounters.WEPUndecryptableCount.QuadPart;
|
|
wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);
|
|
Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);
|
|
os_free_mem(NULL, pStatistics);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(mem alloc failed)\n"));
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
case RT_OID_802_11_PER_BSS_STATISTICS:
|
|
{
|
|
PMBSS_STATISTICS pMbssStat;
|
|
INT apidx = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
|
|
os_alloc_mem(pAd, (UCHAR * *) &pMbssStat, sizeof(MBSS_STATISTICS));
|
|
NdisZeroMemory(pMbssStat, sizeof(MBSS_STATISTICS));
|
|
|
|
pMbssStat->TransmittedByteCount = pMbss->TransmittedByteCount;
|
|
pMbssStat->ReceivedByteCount = pMbss->ReceivedByteCount;
|
|
pMbssStat->TxCount = pMbss->TxCount;
|
|
pMbssStat->RxCount = pMbss->RxCount;
|
|
pMbssStat->RxErrorCount = pMbss->RxErrorCount;
|
|
pMbssStat->RxDropCount = pMbss->RxDropCount;
|
|
pMbssStat->TxErrorCount = pMbss->TxErrorCount;
|
|
pMbssStat->TxDropCount = pMbss->TxDropCount;
|
|
pMbssStat->ucPktsTx = pMbss->ucPktsTx;
|
|
pMbssStat->ucPktsRx = pMbss->ucPktsRx;
|
|
pMbssStat->mcPktsTx = pMbss->mcPktsTx;
|
|
pMbssStat->mcPktsRx = pMbss->mcPktsRx;
|
|
pMbssStat->bcPktsTx= pMbss->bcPktsTx;
|
|
pMbssStat->bcPktsRx= pMbss->bcPktsRx;
|
|
wrq->u.data.length = sizeof(MBSS_STATISTICS);
|
|
Status = copy_to_user(wrq->u.data.pointer, pMbssStat, wrq->u.data.length);
|
|
os_free_mem(pAd, pMbssStat);
|
|
}
|
|
break;
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
#ifdef TXBF_SUPPORT
|
|
case RT_OID_802_11_QUERY_TXBF_TABLE:
|
|
if (!pAd->chipCap.FlgHwTxBfCap)
|
|
Status = -EFAULT;
|
|
else
|
|
{
|
|
INT i;
|
|
RT_802_11_TXBF_TABLE MacTab;
|
|
|
|
MacTab.Num = 0;
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC))
|
|
{
|
|
memcpy(&MacTab.Entry[MacTab.Num], &pAd->MacTab.Content[i].TxBFCounters, sizeof(RT_COUNTER_TXBF));
|
|
MacTab.Num++;
|
|
}
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(RT_802_11_TXBF_TABLE);
|
|
Status = copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length);
|
|
}
|
|
break;
|
|
#endif /* TXBF_SUPPORT */
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
#ifdef MESH_SUPPORT
|
|
case OID_802_11_MESH_DEVICENAME:
|
|
if (pAd->MeshTab.wdev.if_dev)
|
|
{
|
|
wrq->u.data.length = strlen(RtmpOsGetNetDevName(pAd->MeshTab.wdev.if_dev)) + 1;
|
|
Status = copy_to_user(wrq->u.data.pointer, RtmpOsGetNetDevName(pAd->MeshTab.wdev.if_dev), strlen(RtmpOsGetNetDevName(pAd->MeshTab.wdev.if_dev)));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_DEVICENAME (Len=%d, Name=%s)\n", wrq->u.data.length, RtmpOsGetNetDevName(pAd->MeshTab.wdev.if_dev)));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_SECURITY_INFO:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_SECURITY_INFO \n"));
|
|
if (wrq->u.data.length != sizeof(MESH_SECURITY_INFO))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Len Diff %d/%d \n", wrq->u.data.length, sizeof(MESH_SECURITY_INFO)));
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
RTMPIoctlQueryMeshSecurityInfo(pAd, wrq);
|
|
break;
|
|
|
|
case OID_802_11_MESH_ID:
|
|
wrq->u.data.length = pAd->MeshTab.MeshIdLen;
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.MeshId, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_ID (Len=%d, MeshID=%s)\n", pAd->MeshTab.MeshIdLen,
|
|
pAd->MeshTab.MeshId));
|
|
break;
|
|
|
|
case OID_802_11_MESH_AUTO_LINK:
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.MeshAutoLink, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_AUTO_LINK (=%d)\n", pAd->MeshTab.MeshAutoLink));
|
|
break;
|
|
|
|
case OID_802_11_MESH_LINK_STATUS:
|
|
{
|
|
MESH_LINK_INFO MeshLinkInfo;
|
|
UCHAR i;
|
|
|
|
NdisZeroMemory(&MeshLinkInfo, sizeof(MESH_LINK_INFO));
|
|
|
|
for (i=0; i<MAX_MESH_LINKS; i++)
|
|
{
|
|
PMESH_LINK_ENTRY pMeshEntry = &pAd->MeshTab.MeshLink[i].Entry;
|
|
MAC_TABLE_ENTRY *mac_entry = &pAd->MacTab.Content[pEntry->MacTabMatchWCID];
|
|
COPY_MAC_ADDR(MeshLinkInfo.Entry[i].PeerMacAddr, pMeshEntry->PeerMacAddr);
|
|
MeshLinkInfo.Entry[i].LinkType = pMeshEntry->LinkType;
|
|
MeshLinkInfo.Entry[i].Status = PeerLinkValidCheck(pAd, i);
|
|
MeshLinkInfo.Entry[i].Rssi =
|
|
RTMPMaxRssi(pAd, mac_entry->RssiSample.AvgRssi[0],
|
|
mac_entry->RssiSample.AvgRssi[1],
|
|
mac_entry->RssiSample.AvgRssi[2]);
|
|
MeshLinkInfo.Entry[i].CurTxRate = mac_entry->HTPhyMode;
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(MESH_LINK_INFO);
|
|
Status = copy_to_user(wrq->u.data.pointer, &MeshLinkInfo, wrq->u.data.length);
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_LIST:
|
|
{
|
|
PMESH_NEIGHBOR_INFO pMeshNeighborInfo;
|
|
UCHAR i, idx = 0;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pMeshNeighborInfo, sizeof(MESH_NEIGHBOR_INFO));
|
|
if (pMeshNeighborInfo == NULL)
|
|
break;
|
|
|
|
NdisZeroMemory(pMeshNeighborInfo, sizeof(MESH_NEIGHBOR_INFO));
|
|
for (i=0; i<MAX_NEIGHBOR_MP; i++)
|
|
{
|
|
PMESH_NEIGHBOR_ENTRY pEntry = &pAd->MeshTab.pMeshNeighborTab->NeighborMP[i];
|
|
|
|
if (pEntry->Valid)
|
|
{
|
|
strcpy((RTMP_STRING *)pMeshNeighborInfo->Entry[idx].HostName, (RTMP_STRING *)pEntry->HostName);
|
|
COPY_MAC_ADDR(pMeshNeighborInfo->Entry[idx].MacAddr, pEntry->PeerMac);
|
|
strcpy((RTMP_STRING *)pMeshNeighborInfo->Entry[idx].MeshId, (RTMP_STRING *)pEntry->MeshId);
|
|
pMeshNeighborInfo->Entry[idx].Channel = pEntry->Channel;
|
|
pMeshNeighborInfo->Entry[idx].Rssi = pEntry->RealRssi;
|
|
pMeshNeighborInfo->Entry[idx].Status = pEntry->State != LINK_AVAILABLE ? 0 : 1;
|
|
pMeshNeighborInfo->Entry[idx].MeshEncrypType =
|
|
MeshCheckPeerMpCipher(pEntry->CapabilityInfo, pEntry->RSNIE, pEntry->RSNIE_Len);;
|
|
idx++;
|
|
}
|
|
}
|
|
pMeshNeighborInfo->num = idx;
|
|
wrq->u.data.length = sizeof(MESH_NEIGHBOR_INFO);
|
|
Status = copy_to_user(wrq->u.data.pointer, pMeshNeighborInfo, wrq->u.data.length);
|
|
|
|
if (pMeshNeighborInfo)
|
|
os_free_mem(NULL, pMeshNeighborInfo);
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_ROUTE_LIST:
|
|
{
|
|
PRT_MESH_ROUTE_TABLE rt_table;
|
|
UCHAR i;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&rt_table, sizeof(RT_MESH_ROUTE_TABLE));
|
|
if (rt_table == NULL)
|
|
break;
|
|
|
|
NdisZeroMemory(rt_table, sizeof(RT_MESH_ROUTE_TABLE));
|
|
|
|
for (i=0; i<MESH_MAX_LEN_OF_FORWARD_TABLE; i++)
|
|
{
|
|
PMESH_ROUTING_ENTRY pEntry = &pAd->MeshTab.pMeshRouteTab->Content[i];
|
|
|
|
if (pEntry->Valid)
|
|
{
|
|
COPY_MAC_ADDR(rt_table->Entry[rt_table->Num].MeshDA, pEntry->MeshDA);
|
|
rt_table->Entry[rt_table->Num].Dsn = pEntry->Dsn;
|
|
COPY_MAC_ADDR(rt_table->Entry[rt_table->Num].NextHop, pEntry->NextHop);
|
|
rt_table->Entry[rt_table->Num].Metric = pEntry->PathMetric;
|
|
rt_table->Num++;
|
|
}
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(RT_MESH_ROUTE_TABLE);
|
|
Status = copy_to_user(wrq->u.data.pointer, rt_table, wrq->u.data.length);
|
|
|
|
if (rt_table)
|
|
os_free_mem(NULL, rt_table);
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Query::OID_802_11_MESH_ROUTE_LIST \n"));
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MESH_MAX_TX_RATE:
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.MeshMaxTxRate, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_CHANNEL (=%d)\n", pAd->MeshTab.MeshChannel));
|
|
break;
|
|
|
|
case OID_802_11_MESH_CHANNEL:
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.MeshChannel, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_CHANNEL (=%d)\n", pAd->MeshTab.MeshChannel));
|
|
break;
|
|
|
|
case OID_802_11_MESH_HOSTNAME:
|
|
wrq->u.data.length = strlen((RTMP_STRING *)pAd->MeshTab.HostName) + 1;
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.HostName, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_HOSTNAME (MeshHostName=%s)\n", pAd->MeshTab.HostName));
|
|
break;
|
|
case OID_802_11_MESH_ONLY_MODE:
|
|
wrq->u.data.length = sizeof(UCHAR);
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->MeshTab.MeshOnly, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MESH_ONLY_MODE (=%s)\n", pAd->MeshTab.MeshOnly == TRUE ? "Enable" : "Disable"));
|
|
break;
|
|
#endif /* MESH_SUPPORT */
|
|
|
|
#ifdef WAPI_SUPPORT
|
|
case OID_802_11_MCAST_TXIV:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MCAST_TXIV \n"));
|
|
#if 0
|
|
wrq->u.data.length = LEN_WAPI_TSC;
|
|
Status = copy_to_user(wrq->u.data.pointer, 0/*pAd->ApCfg.MBSSID[pObj->ioctl_if].tx_iv*/, wrq->u.data.length);
|
|
#endif
|
|
Status = -EINVAL;
|
|
break;
|
|
case OID_802_11_WAPI_CONFIGURATION:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::Get WAPI Configuration(%d)\n", sizeof(WAPI_CONF)));
|
|
RTMPIoctlQueryWapiConf(pAd, wrq);
|
|
break;
|
|
case OID_802_11_WAPI_IE:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WAPI_IE\n"));
|
|
if (wrq->u.data.length != sizeof(WAPI_WIE_STRUCT))
|
|
Status = -EINVAL;
|
|
else
|
|
{
|
|
WAPI_WIE_STRUCT wapi_ie;
|
|
MAC_TABLE_ENTRY *pWapiEntry;
|
|
|
|
NdisZeroMemory(&wapi_ie, sizeof(WAPI_WIE_STRUCT));
|
|
NdisMoveMemory(wapi_ie.addr, wrq->u.data.pointer, MAC_ADDR_LEN);
|
|
|
|
pWapiEntry = MacTableLookup(pAd, wapi_ie.addr);
|
|
|
|
if (pWapiEntry && IS_ENTRY_CLIENT(pWapiEntry) && (pWapiEntry->RSNIE_Len > 0))
|
|
{
|
|
wapi_ie.wie_len = pWapiEntry->RSNIE_Len;
|
|
NdisMoveMemory(wapi_ie.wie, pWapiEntry->RSN_IE, pWapiEntry->RSNIE_Len);
|
|
}
|
|
|
|
if (copy_to_user(wrq->u.data.pointer, &wapi_ie, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
}
|
|
break;
|
|
|
|
case OID_802_11_MCAST_KEY_INFO:
|
|
{
|
|
BSS_STRUCT *pMbss;
|
|
WAPI_MCAST_KEY_STRUCT wapi_mkey;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_MCAST_KEY_INFO\n"));
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
NdisZeroMemory(&wapi_mkey, sizeof(WAPI_MCAST_KEY_STRUCT));
|
|
|
|
if (pMbss->sw_wpi_encrypt)
|
|
{
|
|
NdisMoveMemory(wapi_mkey.m_tx_iv,
|
|
pAd->SharedKey[pObj->ioctl_if][pMbss->wdev.DefaultKeyId].TxTsc,
|
|
LEN_WAPI_TSC);
|
|
}
|
|
else
|
|
{
|
|
INT m_wcid;
|
|
|
|
GET_GroupKey_WCID(pAd, m_wcid, apidx);
|
|
RTMPGetWapiTxTscFromAsic(pAd, m_wcid, wapi_mkey.m_tx_iv);
|
|
}
|
|
wapi_mkey.key_id = pMbss->wdev.DefaultKeyId;
|
|
NdisMoveMemory(wapi_mkey.key_announce, pMbss->key_announce_flag, LEN_WAPI_TSC);
|
|
NdisMoveMemory(wapi_mkey.NMK, pMbss->NMK, 16);
|
|
|
|
wrq->u.data.length = sizeof(WAPI_MCAST_KEY_STRUCT);
|
|
Status = copy_to_user(wrq->u.data.pointer, &wapi_mkey, wrq->u.data.length);
|
|
}
|
|
break;
|
|
|
|
#endif /* WAPI_SUPPORT */
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
|
|
case HOSTAPD_OID_GETWPAIE:/*report wpa ie of the new station to hostapd. */
|
|
|
|
if (wrq->u.data.length != sizeof(wpaie))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else if (copy_from_user(&wpaie, wrq->u.data.pointer, IEEE80211_ADDR_LEN))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
pEntry = MacTableLookup(pAd, wpaie.wpa_macaddr);
|
|
if (!pEntry){
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
NdisZeroMemory(wpaie.rsn_ie,sizeof(wpaie.rsn_ie));
|
|
/* For WPA1, RSN_IE=221 */
|
|
if ((pEntry->AuthMode == Ndis802_11AuthModeWPA) || (pEntry->AuthMode == Ndis802_11AuthModeWPAPSK)
|
|
||(pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)
|
|
|| (pEntry->AuthMode == Ndis802_11AuthModeWPA1WPA2) ||(pEntry->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)
|
|
#ifdef WPA3_SUPPORT
|
|
|| (pEntry->AuthMode == Ndis802_11AuthModeWPA3SAE) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSKWPA3SAE)
|
|
#endif
|
|
)
|
|
{
|
|
int ielen = pEntry->RSNIE_Len;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("pEntry->RSNIE_Len=%d\n",pEntry->RSNIE_Len));
|
|
if (ielen > sizeof(wpaie.rsn_ie))
|
|
ielen = sizeof(wpaie.rsn_ie)-1;
|
|
p = wpaie.rsn_ie;
|
|
hex_dump("HOSTAPD_OID_GETWPAIE woody==>pEntry->RSN_IE", (unsigned char*)pEntry->RSN_IE,ielen);
|
|
NdisMoveMemory(p, pEntry->RSN_IE, ielen);
|
|
}
|
|
}
|
|
if(copy_to_user(wrq->u.data.pointer, &wpaie, sizeof(wpaie)))
|
|
Status = -EFAULT;
|
|
break;
|
|
|
|
|
|
case HOSTAPD_OID_GET_SEQ:/*report txtsc to hostapd. */
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
if (wrq->u.data.length != sizeof(ik))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else if (copy_from_user(&ik, wrq->u.data.pointer, IEEE80211_ADDR_LEN))
|
|
{
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
{
|
|
NdisZeroMemory(&ik.ik_keytsc, sizeof(ik.ik_keytsc));
|
|
p = (unsigned char *)&ik.ik_keytsc;
|
|
NdisMoveMemory(p+2, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].TxTsc, 6);
|
|
if(copy_to_user(wrq->u.data.pointer, &ik, sizeof(ik)))
|
|
Status = -EFAULT;
|
|
}
|
|
break;
|
|
|
|
|
|
case HOSTAPD_OID_GET_1X_GROUP_KEY:/*report default group key to hostapd. */
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
if (wrq->u.data.length != sizeof(group_key))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
if(pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen!=0 && pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key!=NULL)
|
|
{
|
|
group_key.ik_keyix = pMbss->DefaultKeyId;
|
|
group_key.ik_keylen = pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen;
|
|
NdisMoveMemory(group_key.ik_keydata, pAd->SharedKey[apidx][ pMbss->DefaultKeyId].Key,pAd->SharedKey[apidx][ pMbss->DefaultKeyId].KeyLen);
|
|
if(copy_to_user(wrq->u.data.pointer, &group_key, sizeof(group_key)))
|
|
Status = -EFAULT;
|
|
}
|
|
}
|
|
break;
|
|
|
|
#endif/*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
case OID_GEN_MEDIA_CONNECT_STATUS:
|
|
{
|
|
ULONG ApCliIdx = pObj->ioctl_if;
|
|
|
|
NDIS_MEDIA_STATE MediaState;
|
|
PMAC_TABLE_ENTRY pEntry;
|
|
STA_TR_ENTRY *tr_entry;
|
|
PAPCLI_STRUCT pApCliEntry;
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
{
|
|
Status = -EOPNOTSUPP;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
APCLI_MR_APIDX_SANITY_CHECK(ApCliIdx);
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ApCliIdx];
|
|
pEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID];
|
|
if (!IS_ENTRY_APCLI(pEntry))
|
|
{
|
|
Status = -EOPNOTSUPP;
|
|
break;
|
|
}
|
|
|
|
if ((pAd->ApCfg.ApCliTab[ApCliIdx].Valid == TRUE)
|
|
&& (tr_entry->PortSecured == WPA_802_1X_PORT_SECURED))
|
|
MediaState = NdisMediaStateConnected;
|
|
else
|
|
MediaState = NdisMediaStateDisconnected;
|
|
|
|
wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);
|
|
Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);
|
|
}
|
|
}
|
|
break;
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
case RT_OID_802_11_SNR_0:
|
|
if (wdev && wdev->LastSNR0 > 0) {
|
|
ULONG ulInfo;
|
|
ulInfo = ConvertToSnr(pAd, wdev->LastSNR0);
|
|
wrq->u.data.length = sizeof(ulInfo);
|
|
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo));
|
|
}
|
|
else
|
|
Status = -EFAULT;
|
|
break;
|
|
case RT_OID_802_11_SNR_1:
|
|
if (wdev && (pAd->Antenna.field.RxPath > 1) && (wdev->LastSNR1 > 0))
|
|
{
|
|
ULONG ulInfo;
|
|
ulInfo = ConvertToSnr(pAd, wdev->LastSNR1);
|
|
wrq->u.data.length = sizeof(ulInfo);
|
|
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(%lx, LastSNR1=%d)\n",ulInfo, wdev->LastSNR1));
|
|
}
|
|
else
|
|
Status = -EFAULT;
|
|
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1, Status=%d\n",Status));
|
|
break;
|
|
#ifdef DOT11N_SS3_SUPPORT
|
|
case RT_OID_802_11_SNR_2:
|
|
if (wdev && (pAd->Antenna.field.RxPath > 2) && (wdev->LastSNR2 > 0))
|
|
{
|
|
ULONG ulInfo;
|
|
ulInfo = ConvertToSnr(pAd, wdev->LastSNR2);
|
|
wrq->u.data.length = sizeof(ulInfo);
|
|
Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
|
|
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(%lx, LastSNR2=%d)\n",ulInfo, wdev->LastSNR2));
|
|
}
|
|
else
|
|
Status = -EFAULT;
|
|
DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1, Status=%d\n",Status));
|
|
break;
|
|
#endif /* DOT11N_SS3_SUPPORT */
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
|
|
#ifdef EASY_CONFIG_SETUP
|
|
case OID_PIN_OF_ENROLLEE:
|
|
os_alloc_mem(NULL, &pStaMacAddr, MAC_ADDR_LEN);
|
|
if (pStaMacAddr)
|
|
{
|
|
Status = copy_from_user(pStaMacAddr, wrq->u.data.pointer, MAC_ADDR_LEN);
|
|
if (Status == NDIS_STATUS_SUCCESS)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = NULL;
|
|
PEASY_CONFIG_INFO pEasyConf = &pAd->ApCfg.MBSSID[pObj->ioctl_if].EasyConfigInfo;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE,("Query::OID_PIN_OF_ENROLLEE(STA - %02X:%02X:%02X:%02X:%02X:%02X)\n",
|
|
pStaMacAddr[0],
|
|
pStaMacAddr[1],
|
|
pStaMacAddr[2],
|
|
pStaMacAddr[3],
|
|
pStaMacAddr[4],
|
|
pStaMacAddr[5]));
|
|
pEntry = MacTableLookup(pAd, pStaMacAddr);
|
|
if (pEntry && pEntry->bRaAutoWpsCapable)
|
|
{
|
|
wrq->u.data.length = 8;
|
|
Status = copy_to_user(wrq->u.data.pointer, pEasyConf->WpsPinCode, wrq->u.data.length);
|
|
}
|
|
else
|
|
wrq->u.data.length = 0;
|
|
}
|
|
os_free_mem(NULL, pStaMacAddr);
|
|
}
|
|
break;
|
|
#endif /* EASY_CONFIG_SETUP */
|
|
|
|
#ifdef WAC_SUPPORT
|
|
case RT_OID_WAC_REQ:
|
|
if (wrq->u.data.length < sizeof(WAC_REQUEST))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
WAC_IoctlReq(pAd, pObj->ioctl_if, wrq);
|
|
}
|
|
break;
|
|
#endif /* WAC_SUPPORT */
|
|
|
|
case OID_802_11_ACL_LIST:
|
|
if (wrq->u.data.length < sizeof(RT_802_11_ACL))
|
|
{
|
|
Status = -EINVAL;
|
|
}
|
|
else
|
|
{
|
|
Status = copy_to_user(wrq->u.data.pointer, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
}
|
|
break;
|
|
#ifdef CONFIG_HOTSPOT
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
case OID_802_11_WNM_IPV4_PROXY_ARP_LIST:
|
|
{
|
|
BSS_STRUCT *pMbss;
|
|
PUCHAR pProxyARPTable;
|
|
UINT32 ARPTableLen;
|
|
pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
ARPTableLen = IPv4ProxyARPTableLen(pAd, pMbss);
|
|
os_alloc_mem(NULL, &pProxyARPTable, ARPTableLen);
|
|
GetIPv4ProxyARPTable(pAd, pMbss, &pProxyARPTable);
|
|
wrq->u.data.length = ARPTableLen;
|
|
Status = copy_to_user(wrq->u.data.pointer, pProxyARPTable, ARPTableLen);
|
|
os_free_mem(NULL, pProxyARPTable);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WNM_PROXY_ARP_LIST\n"));
|
|
break;
|
|
case OID_802_11_WNM_IPV6_PROXY_ARP_LIST:
|
|
{
|
|
BSS_STRUCT *pMbss;
|
|
PUCHAR pProxyARPTable;
|
|
UINT32 ARPTableLen;
|
|
pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
ARPTableLen = IPv6ProxyARPTableLen(pAd, pMbss);
|
|
os_alloc_mem(NULL, &pProxyARPTable, ARPTableLen);
|
|
GetIPv6ProxyARPTable(pAd, pMbss, &pProxyARPTable);
|
|
wrq->u.data.length = ARPTableLen;
|
|
Status = copy_to_user(wrq->u.data.pointer, pProxyARPTable, ARPTableLen);
|
|
os_free_mem(NULL, pProxyARPTable);
|
|
}
|
|
break;
|
|
#endif
|
|
case OID_802_11_SECURITY_TYPE:
|
|
{
|
|
BSS_STRUCT *pMbss;
|
|
PUCHAR pType;
|
|
struct security_type *SecurityType;
|
|
//DBGPRINT(RT_DEBUG_TRACE, ("Query:OID_802_11_SECURITY_TYPE\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Query:OID_802_11_SECURITY_TYPE\n"));
|
|
os_alloc_mem(NULL, &pType, sizeof(*SecurityType));
|
|
SecurityType = (struct security_type *)pType;
|
|
pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
SecurityType->ifindex = pObj->ioctl_if;
|
|
SecurityType->auth_mode = pMbss->wdev.AuthMode; //pMbss->AuthMode;
|
|
SecurityType->encryp_type = pMbss->wdev.WepStatus; //pMbss->WepStatus;
|
|
wrq->u.data.length = sizeof(*SecurityType);
|
|
Status = copy_to_user(wrq->u.data.pointer, pType, sizeof(*SecurityType));
|
|
os_free_mem(NULL, pType);
|
|
}
|
|
break;
|
|
case OID_802_11_HS_BSSID:
|
|
{
|
|
BSS_STRUCT *pMbss;
|
|
pMbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
wrq->u.data.length = 6;
|
|
Status = copy_to_user(wrq->u.data.pointer, pMbss->wdev.bssid, 6);
|
|
}
|
|
break;
|
|
#ifdef CONFIG_HOTSPOT_R2
|
|
case OID_802_11_HS_OSU_SSID:
|
|
{
|
|
wrq->u.data.length = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; //+2;
|
|
Status = copy_to_user(wrq->u.data.pointer, pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen);
|
|
}
|
|
break;
|
|
//JERRY for hs test
|
|
#endif /* CONFIG_HOTSPOT_R2 */
|
|
#endif
|
|
#ifdef RLT_MAC
|
|
#ifdef CONFIG_WIFI_TEST
|
|
case OID_WIFI_TEST_BBP:
|
|
|
|
break;
|
|
case OID_WIFI_TEST_BBP32:
|
|
{
|
|
UINT32 Index;
|
|
UINT32 j = 0;
|
|
struct bbp32_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct bbp32_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->bbp_start = %x\n", Info->bbp_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->bbp_end = %x\n", Info->bbp_end));
|
|
|
|
|
|
for (Index = Info->bbp_start; Index <= Info->bbp_end; Index += 4)
|
|
{
|
|
UINT32 Value;
|
|
RTMP_BBP_IO_READ32(pAd, Index + pAd->chipCap.BBPMemMapOffset, &Value);
|
|
DBGPRINT(RT_DEBUG_OFF, ("Offset = %x\n", Index + pAd->chipCap.BBPMemMapOffset));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Value = %x\n", Value));
|
|
NdisMoveMemory(Info->bbp_value + j, &Value, 4);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
|
|
|
|
break;
|
|
case OID_WIFI_TEST_RF:
|
|
|
|
break;
|
|
#ifdef RLT_RF
|
|
case OID_WIFI_TEST_RF_BANK:
|
|
{
|
|
UINT16 Index;
|
|
UINT16 j = 0;
|
|
struct rf_bank_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct rf_bank_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_bank = %x\n", Info->rf_bank));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_start = %x\n", Info->rf_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_end = %x\n", Info->rf_end));
|
|
|
|
|
|
for (Index = Info->rf_start; Index <= Info->rf_end; Index ++)
|
|
{
|
|
UINT8 Value;
|
|
rlt_rf_read(pAd, Info->rf_bank, Index, &Value);
|
|
DBGPRINT(RT_DEBUG_OFF, ("Offset = %x\n", Index));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Value = %x\n", Value));
|
|
NdisMoveMemory(Info->rf_value + j, &Value, 1);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
#endif /* RLT_RF */
|
|
#ifdef MT_RF
|
|
case OID_WIFI_TEST_RF_INDEX:
|
|
{
|
|
UINT16 Index;
|
|
UINT16 j = 0;
|
|
struct rf_index_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct rf_bank_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_index = %x\n", Info->rf_index));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_start = %x\n", Info->rf_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_end = %x\n", Info->rf_end));
|
|
|
|
for (Index = Info->rf_start; Index <= Info->rf_end; Index += 4)
|
|
{
|
|
UINT32 Value;
|
|
mt76x2_rf_read(pAd, Info->rf_index, Index, &Value);
|
|
DBGPRINT(RT_DEBUG_OFF, ("Offset = %x\n", Index));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Value = %x\n", Value));
|
|
NdisMoveMemory(Info->rf_value + j, &Value, 4);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
#endif /* MT_RF */
|
|
case OID_WIFI_TEST_MEM_MAP_INFO:
|
|
{
|
|
UINT16 Index;
|
|
UINT16 j = 0;
|
|
struct mem_map_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct mem_map_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->base = %x\n", Info->base));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->mem_map_start = %x\n"
|
|
, Info->mem_map_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->mem_map_end = %x\n"
|
|
, Info->mem_map_end));
|
|
|
|
|
|
for (Index = Info->mem_map_start; Index <= Info->mem_map_end; Index += 4)
|
|
{
|
|
UINT32 Value;
|
|
read_reg(pAd, Info->base, Index, &Value);
|
|
NdisMoveMemory(Info->mem_map_value + j, &Value, 4);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_E2P:
|
|
{
|
|
UINT16 Index;
|
|
UINT16 j = 0;
|
|
struct e2p_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct e2p_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->e2p_start = %x\n", Info->e2p_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->e2p_end = %x\n", Info->e2p_end));
|
|
|
|
|
|
for (Index = Info->e2p_start; Index <= Info->e2p_end; Index += 2)
|
|
{
|
|
UINT16 Value;
|
|
RT28xx_EEPROM_READ16(pAd, Index, Value);
|
|
NdisMoveMemory(Info->e2p_value + j, &Value, 2);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_MAC:
|
|
{
|
|
UINT32 Index;
|
|
UINT32 j = 0;
|
|
struct mac_info *Info;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, wrq->u.data.length);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Status = copy_from_user(buf, wrq->u.data.pointer, wrq->u.data.length);
|
|
Info = (struct mac_info *)buf;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->mac_start = %x\n", Info->mac_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->mac_end = %x\n", Info->mac_end));
|
|
|
|
|
|
for (Index = Info->mac_start; Index <= Info->mac_end; Index += 4)
|
|
{
|
|
UINT32 Value;
|
|
RTMP_IO_READ32(pAd, Index + pAd->chipCap.MacMemMapOffset, &Value);
|
|
DBGPRINT(RT_DEBUG_OFF, ("Offset = %x\n",
|
|
Index + pAd->chipCap.MacMemMapOffset));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Value = %x\n", Value));
|
|
NdisMoveMemory(Info->mac_value + j, &Value, 4);
|
|
j++;
|
|
}
|
|
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_BBP_NUM:
|
|
{
|
|
struct bbp32_info Info;
|
|
Info.bbp_start = pAd->chipCap.BBPStart;
|
|
Info.bbp_end = pAd->chipCap.BBPEnd;
|
|
wrq->u.data.length = sizeof(Info);
|
|
Status = copy_to_user(wrq->u.data.pointer, &Info, wrq->u.data.length);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_RF_NUM:
|
|
|
|
break;
|
|
|
|
#ifdef RLT_RF
|
|
case OID_WIFI_TEST_RF_BANK_OFFSET:
|
|
{
|
|
struct rf_bank_info *Info;
|
|
struct RF_BANK_OFFSET *Offset;
|
|
UINT8 Index;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, sizeof(*Info) * pAd->chipCap.RFBankNum);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Info = (struct rf_bank_info *)buf;
|
|
Offset = pAd->chipCap.RFBankOffset;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("pAd->chipCap.RFBankNum = %d\n", pAd->chipCap.RFBankNum));
|
|
|
|
for (Index = 0; Index < pAd->chipCap.RFBankNum; Index++)
|
|
{
|
|
Info->rf_bank = Offset->RFBankIndex;
|
|
Info->rf_start = Offset->RFStart;
|
|
Info->rf_end =Offset->RFEnd;
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_bank = %d\n", Info->rf_bank));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_start = %x\n", Info->rf_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_end = %x\n", Info->rf_end));
|
|
Info++;
|
|
Offset++;
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(*Info) * pAd->chipCap.RFBankNum;
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
#endif /* RLT_RF */
|
|
|
|
#ifdef MT_RF
|
|
case OID_WIFI_TEST_RF_INDEX_OFFSET:
|
|
{
|
|
struct rf_index_info *Info;
|
|
struct RF_INDEX_OFFSET *Offset;
|
|
UINT8 Index;
|
|
char *buf;
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&buf, sizeof(*Info) * pAd->chipCap.RFIndexNum);
|
|
|
|
if (!buf)
|
|
{
|
|
Status = -EINVAL;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Memory is not available\n"));
|
|
break;
|
|
}
|
|
|
|
Info = (struct rf_index_info *)buf;
|
|
Offset = pAd->chipCap.RFIndexOffset;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("pAd->chipCap.RFIndexNum = %d\n", pAd->chipCap.RFIndexNum));
|
|
|
|
for (Index = 0; Index < pAd->chipCap.RFIndexNum; Index++)
|
|
{
|
|
Info->rf_index = Offset->RFIndex;
|
|
Info->rf_start = Offset->RFStart;
|
|
Info->rf_end =Offset->RFEnd;
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_index = %d\n", Info->rf_index));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_start = %x\n", Info->rf_start));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Info->rf_end = %x\n", Info->rf_end));
|
|
Info++;
|
|
Offset++;
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(*Info) * pAd->chipCap.RFIndexNum;
|
|
Status = copy_to_user(wrq->u.data.pointer, buf, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, buf);
|
|
}
|
|
break;
|
|
#endif
|
|
case OID_WIFI_TEST_MAC_NUM:
|
|
{
|
|
struct mac_info Info;
|
|
Info.mac_start = pAd->chipCap.MacStart;
|
|
Info.mac_end = pAd->chipCap.MacEnd;
|
|
wrq->u.data.length = sizeof(Info);
|
|
Status = copy_to_user(wrq->u.data.pointer, &Info, wrq->u.data.length);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_E2P_NUM:
|
|
{
|
|
struct e2p_info Info;
|
|
Info.e2p_start = pAd->chipCap.E2PStart;
|
|
Info.e2p_end = pAd->chipCap.E2PEnd;
|
|
wrq->u.data.length = sizeof(Info);
|
|
Status = copy_to_user(wrq->u.data.pointer, &Info, wrq->u.data.length);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_MEM_MAP_NUM:
|
|
{
|
|
struct mem_map_info Info;
|
|
Info.mem_map_start = pAd->chipCap.MemMapStart;
|
|
Info.mem_map_end = pAd->chipCap.MemMapEnd;
|
|
wrq->u.data.length = sizeof(Info);
|
|
Status = copy_to_user(wrq->u.data.pointer, &Info, wrq->u.data.length);
|
|
}
|
|
break;
|
|
case OID_WIFI_TEST_PHY_MODE:
|
|
{
|
|
struct phy_mode_info info;
|
|
info.data_phy = pAd->fpga_ctl.rx_data_phy;
|
|
info.data_bw = pAd->fpga_ctl.rx_data_bw;
|
|
info.data_ldpc = pAd->fpga_ctl.rx_data_ldpc;
|
|
info.data_mcs = pAd->fpga_ctl.rx_data_mcs;
|
|
info.data_gi = pAd->fpga_ctl.rx_data_gi;
|
|
info.data_stbc = pAd->fpga_ctl.rx_data_stbc;
|
|
wrq->u.data.length = sizeof(info);
|
|
Status = copy_to_user(wrq->u.data.pointer, &info, wrq->u.data.length);
|
|
}
|
|
break;
|
|
#endif
|
|
#endif
|
|
default:
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x, apidx=%d\n", cmd, apidx));
|
|
Status = -EOPNOTSUPP;
|
|
break;
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Country Code.
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_CountryCode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
|
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
|
/* reset temp table status */
|
|
pAd->CommonCfg.pChDesp = NULL;
|
|
pAd->CommonCfg.DfsType = MAX_RD_REGION;
|
|
#endif /* EXT_BUILD_CHANNEL_LIST */
|
|
|
|
if(strlen(arg) == 2)
|
|
{
|
|
NdisMoveMemory(pAd->CommonCfg.CountryCode, arg, 2);
|
|
pAd->CommonCfg.bCountryFlag = TRUE;
|
|
}
|
|
else
|
|
{
|
|
NdisZeroMemory(pAd->CommonCfg.CountryCode,
|
|
sizeof(pAd->CommonCfg.CountryCode));
|
|
pAd->CommonCfg.bCountryFlag = FALSE;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryCode_Proc::(bCountryFlag=%d, CountryCode=%s)\n", pAd->CommonCfg.bCountryFlag, pAd->CommonCfg.CountryCode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
|
INT Set_ChGeography_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG Geography;
|
|
|
|
Geography = simple_strtol(arg, 0, 10);
|
|
if (Geography <= BOTH)
|
|
pAd->CommonCfg.Geography = Geography;
|
|
else
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_ChannelGeography_Proc::(wrong setting. 0: Out-door, 1: in-door, 2: both)\n"));
|
|
|
|
pAd->CommonCfg.CountryCode[2] =
|
|
(pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O');
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_ChannelGeography_Proc:: Geography = %s\n", pAd->CommonCfg.Geography == ODOR ? "out-door" : (pAd->CommonCfg.Geography == IDOR ? "in-door" : "both")));
|
|
|
|
/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */
|
|
/* it's no longer necessary since APStartUp will rebuild channel again. */
|
|
/*BuildChannelListEx(pAd); */
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* EXT_BUILD_CHANNEL_LIST */
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Country String.
|
|
This command will not work, if the field of CountryRegion in eeprom is programmed.
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_CountryString_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT index = 0;
|
|
INT success = TRUE;
|
|
RTMP_STRING name_buffer[40] = {0};
|
|
|
|
#ifdef EXT_BUILD_CHANNEL_LIST
|
|
return -EOPNOTSUPP;
|
|
#endif /* EXT_BUILD_CHANNEL_LIST */
|
|
|
|
if(strlen(arg) <= 38)
|
|
{
|
|
if (strlen(arg) < 4)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryString_Proc::Parameter of CountryString are too short !\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
for (index = 0; index < strlen(arg); index++)
|
|
{
|
|
if ((arg[index] >= 'a') && (arg[index] <= 'z'))
|
|
arg[index] = toupper(arg[index]);
|
|
}
|
|
|
|
for (index = 0; index < NUM_OF_COUNTRIES; index++)
|
|
{
|
|
NdisZeroMemory(name_buffer, 40);
|
|
snprintf(name_buffer, sizeof(name_buffer), "\"%s\"", (RTMP_STRING *) allCountry[index].pCountryName);
|
|
|
|
if (strncmp((RTMP_STRING *) allCountry[index].pCountryName, arg, strlen(arg)) == 0)
|
|
break;
|
|
else if (strncmp(name_buffer, arg, strlen(arg)) == 0)
|
|
break;
|
|
}
|
|
|
|
if (index == NUM_OF_COUNTRIES)
|
|
success = FALSE;
|
|
}
|
|
else
|
|
{
|
|
success = FALSE;
|
|
}
|
|
|
|
if (success == TRUE)
|
|
{
|
|
if (pAd->CommonCfg.CountryRegion & 0x80)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryString_Proc::parameter of CountryRegion in eeprom is programmed \n"));
|
|
success = FALSE;
|
|
}
|
|
else
|
|
{
|
|
success = FALSE;
|
|
if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
|
|
{
|
|
if (allCountry[index].SupportGBand == TRUE)
|
|
{
|
|
pAd->CommonCfg.CountryRegion = (UCHAR) allCountry[index].RegDomainNum11G;
|
|
success = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("The Country are not Support G Band Channel\n"));
|
|
}
|
|
}
|
|
|
|
if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
|
|
{
|
|
if (allCountry[index].SupportABand == TRUE)
|
|
{
|
|
pAd->CommonCfg.CountryRegionForABand = (UCHAR) allCountry[index].RegDomainNum11A;
|
|
success = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("The Country are not Support A Band Channel\n"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (success == TRUE)
|
|
{
|
|
NdisZeroMemory(pAd->CommonCfg.CountryCode, sizeof(pAd->CommonCfg.CountryCode));
|
|
NdisMoveMemory(pAd->CommonCfg.CountryCode, allCountry[index].IsoName, 2);
|
|
pAd->CommonCfg.CountryCode[2] = ' ';
|
|
/* After Set ChGeography need invoke SSID change procedural again for Beacon update. */
|
|
/* it's no longer necessary since APStartUp will rebuild channel again. */
|
|
/*BuildChannelList(pAd); */
|
|
|
|
pAd->CommonCfg.bCountryFlag = TRUE;
|
|
|
|
/* if set country string, driver needs to be reset */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryString_Proc::(CountryString=%s CountryRegin=%d CountryCode=%s)\n",
|
|
allCountry[index].pCountryName, pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryCode));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryString_Proc::Parameters out of range\n"));
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set SSID
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_SSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT success = FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
BSS_STRUCT *mbss;
|
|
|
|
if(((pObj->ioctl_if < HW_BEACON_MAX_NUM)) && (strlen(arg) <= MAX_LEN_OF_SSID))
|
|
{
|
|
mbss = &pAd->ApCfg.MBSSID[pObj->ioctl_if];
|
|
|
|
NdisZeroMemory(mbss->Ssid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(mbss->Ssid, arg, strlen(arg));
|
|
mbss->SsidLen = (UCHAR)strlen(arg);
|
|
success = TRUE;
|
|
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_GO_ON(pAd))
|
|
{
|
|
P2P_GoStop(pAd);
|
|
P2P_GoStartUp(pAd, MAIN_MBSSID);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\n", pObj->ioctl_if,
|
|
mbss->SsidLen, mbss->Ssid));
|
|
}
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
/* If in detection mode, need to stop detect first. */
|
|
if (pAd->CommonCfg.bIEEE80211H == FALSE)
|
|
{
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
}
|
|
else
|
|
{
|
|
/* each mode has different restart method */
|
|
if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)
|
|
{
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
}
|
|
else if (pAd->Dot11_H.RDMode == RD_SWITCHING_MODE)
|
|
{
|
|
}
|
|
else if (pAd->Dot11_H.RDMode == RD_NORMAL_MODE)
|
|
{
|
|
APStop(pAd);
|
|
APStartUp(pAd);
|
|
}
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_SSID_Proc::(Len=%d,Ssid=%s)\n", pObj->ioctl_if,
|
|
mbss->SsidLen, mbss->Ssid));
|
|
}
|
|
}
|
|
else
|
|
success = FALSE;
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set TxRate
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_TxRate_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
NdisZeroMemory(pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRates, MAX_LEN_OF_SUPPORTED_RATES);
|
|
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex = (UCHAR)simple_strtol(arg, 0, 10);
|
|
/* todo RTMPBuildDesireRate(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].DesiredRatesIndex); */
|
|
|
|
/*todo MlmeUpdateTxRates(pAd); */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set BasicRate
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_BasicRate_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
ULONG BasicRateBitmap;
|
|
|
|
BasicRateBitmap = (ULONG) simple_strtol(arg, 0, 10);
|
|
|
|
if (BasicRateBitmap > 4095) /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */
|
|
return FALSE;
|
|
|
|
pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap;
|
|
pAd->CommonCfg.BasicRateBitmapOld = BasicRateBitmap;
|
|
|
|
MlmeUpdateTxRates(pAd, FALSE, (UCHAR)pObj->ioctl_if);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_BasicRate_Proc::(BasicRateBitmap=0x%08lx)\n", pAd->CommonCfg.BasicRateBitmap));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Beacon Period
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_BeaconPeriod_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
USHORT BeaconPeriod;
|
|
INT success = FALSE;
|
|
|
|
BeaconPeriod = (USHORT) simple_strtol(arg, 0, 10);
|
|
if((BeaconPeriod >= 20) && (BeaconPeriod < 1024))
|
|
{
|
|
pAd->CommonCfg.BeaconPeriod = BeaconPeriod;
|
|
success = TRUE;
|
|
|
|
#ifdef AP_QLOAD_SUPPORT
|
|
/* re-calculate QloadBusyTimeThreshold */
|
|
QBSS_LoadAlarmReset(pAd);
|
|
#endif /* AP_QLOAD_SUPPORT */
|
|
}
|
|
else
|
|
success = FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_BeaconPeriod_Proc::(BeaconPeriod=%d)\n", pAd->CommonCfg.BeaconPeriod));
|
|
|
|
return success;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Dtim Period
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_DtimPeriod_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR DtimPeriod;
|
|
INT success = FALSE;
|
|
|
|
DtimPeriod = (UCHAR) simple_strtol(arg, 0, 10);
|
|
if((DtimPeriod >= 1) && (DtimPeriod <= 255))
|
|
{
|
|
pAd->ApCfg.DtimPeriod = DtimPeriod;
|
|
success = TRUE;
|
|
}
|
|
else
|
|
success = FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_DtimPeriod_Proc::(DtimPeriod=%d)\n", pAd->ApCfg.DtimPeriod));
|
|
|
|
return success;
|
|
}
|
|
|
|
#ifdef RT305x
|
|
INT Set_RfRead_Proc(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
int i;
|
|
UCHAR Value;
|
|
|
|
for (i = 0; i < 32; i++)
|
|
{
|
|
RT30xxReadRFRegister(pAdapter, i, &Value);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02x ", Value));
|
|
if (((i + 1) % 4) == 0)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_RfWrite_Proc(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG offset = 0;
|
|
ULONG value = 0;
|
|
PUCHAR p2 = (PUCHAR)arg;
|
|
|
|
while((*p2 != ':') && (*p2 != '\0'))
|
|
{
|
|
p2++;
|
|
}
|
|
|
|
if (*p2 == ':')
|
|
{
|
|
A2Hex(offset, arg);
|
|
A2Hex(value, p2+ 1);
|
|
}
|
|
else
|
|
{
|
|
A2Hex(value, arg);
|
|
}
|
|
|
|
if (offset >= 32)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
RT30xxWriteRFRegister(pAdapter, offset, value);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* RT305x */
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Disable/enable OLBC detection manually
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_OLBCDetection_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
switch (simple_strtol(arg, 0, 10))
|
|
{
|
|
case 0: /*enable OLBC detect */
|
|
pAd->CommonCfg.DisableOLBCDetect = 0;
|
|
break;
|
|
case 1: /*disable OLBC detect */
|
|
pAd->CommonCfg.DisableOLBCDetect = 1;
|
|
break;
|
|
default: /*Invalid argument */
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WmmCapable Enable or Disable
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_WmmCapable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bWmmCapable;
|
|
POS_COOKIE pObj= (POS_COOKIE)pAd->OS_Cookie;
|
|
|
|
bWmmCapable = (BOOLEAN)simple_strtol(arg, 0, 10);
|
|
|
|
if (bWmmCapable == 1)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bWmmCapable = TRUE;
|
|
else if (bWmmCapable == 0)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bWmmCapable = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].bWmmCapableOrg = \
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bWmmCapable;
|
|
|
|
#ifdef RTL865X_FAST_PATH
|
|
if (!isFastPathCapable(pAd)) {
|
|
rtlairgo_fast_tx_unregister();
|
|
rtl865x_extDev_unregisterUcastTxDev(pAd->net_dev);
|
|
}
|
|
#endif
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
/*Sync with the HT relate info. In N mode, we should re-enable it */
|
|
SetCommonHT(pAd);
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WmmCapable_Proc::(bWmmCapable=%d)\n",
|
|
pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bWmmCapable));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_AP_MaxStaNum_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
INT apidx = pObj->ioctl_if;
|
|
|
|
return ApCfg_Set_MaxStaNum_Proc(pAd, apidx, arg);
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set session idle timeout
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_IdleTimeout_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
return ApCfg_Set_IdleTimeout_Proc(pAd, arg);
|
|
}
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set No Forwarding Enable or Disable
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_NoForwarding_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG NoForwarding;
|
|
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
NoForwarding = simple_strtol(arg, 0, 10);
|
|
|
|
if (NoForwarding == 1)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = TRUE;
|
|
else if (NoForwarding == 0)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_NoForwarding_Proc::(NoForwarding=%ld)\n",
|
|
pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].IsolateInterStaTraffic));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set No Forwarding between each SSID
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_NoForwardingBTNSSID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG NoForwarding;
|
|
|
|
NoForwarding = simple_strtol(arg, 0, 10);
|
|
|
|
if (NoForwarding == 1)
|
|
pAd->ApCfg.IsolateInterStaTrafficBTNBSSID = TRUE;
|
|
else if (NoForwarding == 0)
|
|
pAd->ApCfg.IsolateInterStaTrafficBTNBSSID = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_NoForwardingBTNSSID_Proc::(NoForwarding=%ld)\n", pAd->ApCfg.IsolateInterStaTrafficBTNBSSID));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Hide SSID Enable or Disable
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_HideSSID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bHideSsid;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
bHideSsid = (BOOLEAN)simple_strtol(arg, 0, 10);
|
|
|
|
if (bHideSsid == 1)
|
|
bHideSsid = TRUE;
|
|
else if (bHideSsid == 0)
|
|
bHideSsid = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid != bHideSsid)
|
|
{
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid = bHideSsid;
|
|
}
|
|
|
|
#ifdef WSC_V2_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.bEnableWpsV2)
|
|
WscOnOff(pAd, pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid);
|
|
#endif /* WSC_V2_SUPPORT */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_HideSSID_Proc::(HideSSID=%d)\n", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set VLAN's ID field
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_VLANID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
wdev->VLAN_VID = (USHORT)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_VLANID_Proc::(VLAN_VID=%d)\n",
|
|
pObj->ioctl_if, wdev->VLAN_VID));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set VLAN's priority field
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_VLANPriority_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
|
|
wdev->VLAN_Priority = (USHORT)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_VLANPriority_Proc::(VLAN_Priority=%d)\n", pObj->ioctl_if, wdev->VLAN_Priority));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set enable or disable carry VLAN in the air
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_VLAN_TAG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bVLAN_Tag;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
bVLAN_Tag = (BOOLEAN)simple_strtol(arg, 0, 10);
|
|
|
|
if (bVLAN_Tag == 1)
|
|
bVLAN_Tag = TRUE;
|
|
else if (bVLAN_Tag == 0)
|
|
bVLAN_Tag = FALSE;
|
|
else
|
|
return FALSE; //Invalid argument
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
wdev->bVLAN_Tag = bVLAN_Tag;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_VLAN_TAG_Proc::(VLAN_Tag=%d)\n",
|
|
pObj->ioctl_if, wdev->bVLAN_Tag));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Authentication mode
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_AuthMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG i;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
if (apidx >= pAd->ApCfg.BssidNum)
|
|
return FALSE;
|
|
|
|
/* Set Authentication mode */
|
|
ApCfg_Set_AuthMode_Proc(pAd, apidx, arg);
|
|
|
|
/* reset the portSecure for all entries */
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]))
|
|
{
|
|
pAd->MacTab.tr_entry[i].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
}
|
|
}
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
/* reset the PortSecure this BSS */
|
|
wdev->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
|
|
/* Default key index is always 2 in WPA mode */
|
|
if(wdev->AuthMode >= Ndis802_11AuthModeWPA)
|
|
wdev->DefaultKeyId = 1;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Encryption Type
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_EncrypType_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
struct wifi_dev *wdev;
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
if ((strcmp(arg, "NONE") == 0) || (strcmp(arg, "none") == 0))
|
|
wdev->WepStatus = Ndis802_11WEPDisabled;
|
|
else if ((strcmp(arg, "WEP") == 0) || (strcmp(arg, "wep") == 0))
|
|
wdev->WepStatus = Ndis802_11WEPEnabled;
|
|
else if ((strcmp(arg, "TKIP") == 0) || (strcmp(arg, "tkip") == 0))
|
|
wdev->WepStatus = Ndis802_11TKIPEnable;
|
|
else if ((strcmp(arg, "AES") == 0) || (strcmp(arg, "aes") == 0))
|
|
wdev->WepStatus = Ndis802_11AESEnable;
|
|
else if ((strcmp(arg, "TKIPAES") == 0) || (strcmp(arg, "tkipaes") == 0))
|
|
wdev->WepStatus = Ndis802_11TKIPAESMix;
|
|
#ifdef WAPI_SUPPORT
|
|
else if ((strcmp(arg, "SMS4") == 0) || (strcmp(arg, "sms4") == 0))
|
|
wdev->WepStatus = Ndis802_11EncryptionSMS4Enabled;
|
|
#endif /* WAPI_SUPPORT */
|
|
else
|
|
return FALSE;
|
|
|
|
if (wdev->WepStatus >= Ndis802_11TKIPEnable)
|
|
wdev->DefaultKeyId = 1;
|
|
|
|
/* decide the group key encryption type */
|
|
if (wdev->WepStatus == Ndis802_11TKIPAESMix)
|
|
wdev->GroupKeyWepStatus = Ndis802_11TKIPEnable;
|
|
else
|
|
wdev->GroupKeyWepStatus = wdev->WepStatus;
|
|
|
|
/* move to ap.c::APStartUp to process */
|
|
/*RTMPMakeRSNIE(pAd, pAd->ApCfg.MBSSID[apidx].AuthMode, pAd->ApCfg.MBSSID[apidx].WepStatus, apidx); */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_EncrypType_Proc::(EncrypType=%d)\n", apidx, wdev->WepStatus));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA pairwise mix-cipher combination
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_WpaMixPairCipher_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
struct wifi_dev *wdev;
|
|
|
|
/*
|
|
In WPA-WPA2 mix mode, it provides a more flexible cipher combination.
|
|
- WPA-AES and WPA2-TKIP
|
|
- WPA-AES and WPA2-TKIPAES
|
|
- WPA-TKIP and WPA2-AES
|
|
- WPA-TKIP and WPA2-TKIPAES
|
|
- WPA-TKIPAES and WPA2-AES
|
|
- WPA-TKIPAES and WPA2-TKIP
|
|
- WPA-TKIPAES and WPA2-TKIPAES (default)
|
|
*/
|
|
wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
if ((strncmp(arg, "WPA_AES_WPA2_TKIPAES", 20) == 0) || (strncmp(arg, "wpa_aes_wpa2_tkipaes", 20) == 0))
|
|
wdev->WpaMixPairCipher = WPA_AES_WPA2_TKIPAES;
|
|
else if ((strncmp(arg, "WPA_AES_WPA2_TKIP", 17) == 0) || (strncmp(arg, "wpa_aes_wpa2_tkip", 17) == 0))
|
|
wdev->WpaMixPairCipher = WPA_AES_WPA2_TKIP;
|
|
else if ((strncmp(arg, "WPA_TKIP_WPA2_AES", 17) == 0) || (strncmp(arg, "wpa_tkip_wpa2_aes", 17) == 0))
|
|
wdev->WpaMixPairCipher = WPA_TKIP_WPA2_AES;
|
|
else if ((strncmp(arg, "WPA_TKIP_WPA2_TKIPAES", 21) == 0) || (strncmp(arg, "wpa_tkip_wpa2_tkipaes", 21) == 0))
|
|
wdev->WpaMixPairCipher = WPA_TKIP_WPA2_TKIPAES;
|
|
else if ((strncmp(arg, "WPA_TKIPAES_WPA2_AES", 20) == 0) || (strncmp(arg, "wpa_tkipaes_wpa2_aes", 20) == 0))
|
|
wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_AES;
|
|
else if ((strncmp(arg, "WPA_TKIPAES_WPA2_TKIPAES", 24) == 0) || (strncmp(arg, "wpa_tkipaes_wpa2_tkipaes", 24) == 0))
|
|
wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIPAES;
|
|
else if ((strncmp(arg, "WPA_TKIPAES_WPA2_TKIP", 21) == 0) || (strncmp(arg, "wpa_tkipaes_wpa2_tkip", 21) == 0))
|
|
wdev->WpaMixPairCipher = WPA_TKIPAES_WPA2_TKIP;
|
|
else
|
|
return FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_AP_WpaMixPairCipher_Proc=0x%02x\n", apidx, wdev->WpaMixPairCipher));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA rekey interval value
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_RekeyInterval_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
INT32 val;
|
|
|
|
val = simple_strtol(arg, 0, 10);
|
|
|
|
if((val >= 10) && (val < MAX_REKEY_INTER))
|
|
pAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = val;
|
|
else /* Default */
|
|
pAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval = 3600;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_AP_RekeyInterval_Proc=%ld\n",
|
|
apidx, pAd->ApCfg.MBSSID[apidx].WPAREKEY.ReKeyInterval));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef SPECIFIC_TX_POWER_SUPPORT
|
|
INT Set_AP_PKT_PWR(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
INT input;
|
|
input = simple_strtol(arg, 0, 10);
|
|
|
|
/*
|
|
Tx_PWR_ADJ[3:0] From 0 to 7 is Positive & add with Tx Power (dB),
|
|
From 8 to 15 is minus with Tx Power mapping to -16 to -2 (step by 2),
|
|
Default value: 0.
|
|
|
|
[0x13BC]TX_ALC_MONITOR, 13:8
|
|
TX_ALC_REQ_ADJ TX ALC Req Saturated[5:0], unit (0.5dB)
|
|
*/
|
|
|
|
if ((input >= 0) && (input <= 15))
|
|
pAd->ApCfg.MBSSID[apidx].TxPwrAdj = input;
|
|
else
|
|
DBGPRINT(RT_DEBUG_ERROR, ("AP[%d]->PktPwr: Out of Range\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("AP[%d]->PktPwr: %d\n", apidx, pAd->ApCfg.MBSSID[apidx].TxPwrAdj));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* SPECIFIC_TX_POWER_SUPPORT */
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA rekey method
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_RekeyMethod_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PRT_WPA_REKEY pInfo = &pAd->ApCfg.MBSSID[apidx].WPAREKEY;
|
|
|
|
if ((strcmp(arg, "TIME") == 0) || (strcmp(arg, "time") == 0))
|
|
pInfo->ReKeyMethod = TIME_REKEY;
|
|
else if ((strcmp(arg, "PKT") == 0) || (strcmp(arg, "pkt") == 0))
|
|
pInfo->ReKeyMethod = PKT_REKEY;
|
|
else if ((strcmp(arg, "DISABLE") == 0) || (strcmp(arg, "disable") == 0))
|
|
pInfo->ReKeyMethod = DISABLE_REKEY;
|
|
else
|
|
pInfo->ReKeyMethod = DISABLE_REKEY;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_AP_RekeyMethod_Proc=%ld\n",
|
|
apidx, pInfo->ReKeyMethod));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set PMK-cache period
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_PMKCachePeriod_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
UINT32 val = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->ApCfg.MBSSID[apidx].PMKCachePeriod = val * 60 * OS_HZ;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_AP_PMKCachePeriod_Proc=%ld\n",
|
|
apidx, pAd->ApCfg.MBSSID[apidx].PMKCachePeriod));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set AssocReq RSSI Threshold to reject STA with weak signal.
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_ASSOC_REQ_RSSI_THRESHOLD(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
UINT j;
|
|
CHAR rssi;
|
|
rssi = (CHAR)simple_strtol(arg, 0, 10);
|
|
|
|
if (rssi == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Disable AP_ASSOC_REQ_RSSI_THRESHOLD\n"));
|
|
}
|
|
else if (rssi > 0 || rssi < -100)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_AP_ASSOC_REQ_RSSI_THRESHOLD Value Error.\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
pAd->ApCfg.MBSSID[apidx].AssocReqRssiThreshold = rssi;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Set_AP_ASSOC_REQ_RSSI_THRESHOLD=%d\n", apidx,
|
|
pAd->ApCfg.MBSSID[apidx].AssocReqRssiThreshold ));
|
|
|
|
for(j = BSS0; j < pAd->ApCfg.BssidNum; j++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%d. ==> %d\n", j, pAd->ApCfg.MBSSID[j].AssocReqRssiThreshold ));
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set lower limit for AP kicking out a STA.
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_KickStaRssiLow_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
UINT j;
|
|
CHAR rssi;
|
|
rssi = (CHAR)simple_strtol(arg, 0, 10);
|
|
|
|
if (rssi == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Disable RssiLowForStaKickOut Function\n"));
|
|
}
|
|
else if (rssi > 0 || rssi < -100)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RssiLowForStaKickOut Value Error.\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
pAd->ApCfg.MBSSID[apidx].RssiLowForStaKickOut = rssi;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) RssiLowForStaKickOut=%d\n", apidx,
|
|
pAd->ApCfg.MBSSID[apidx].RssiLowForStaKickOut ));
|
|
|
|
for(j = BSS0; j < pAd->ApCfg.BssidNum; j++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%d. ==> %d\n", j, pAd->ApCfg.MBSSID[j].RssiLowForStaKickOut ));
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Default Key ID
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_DefaultKeyID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG KeyIdx;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
|
|
KeyIdx = simple_strtol(arg, 0, 10);
|
|
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
|
|
pAd->ApCfg.MBSSID[apidx].wdev.DefaultKeyId = (UCHAR) (KeyIdx - 1 );
|
|
else
|
|
return FALSE; /* Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\n", apidx, pAd->ApCfg.MBSSID[apidx].wdev.DefaultKeyId));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#if 0
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY1
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key1_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT KeyLen;
|
|
INT i;
|
|
UCHAR CipherAlg = CIPHER_WEP64;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
|
|
KeyLen = strlen(arg);
|
|
|
|
switch (KeyLen)
|
|
{
|
|
case 5: /*wep 40 Ascii type */
|
|
pAd->SharedKey[apidx][0].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][0].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::(Key1=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 10: /*wep 40 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][0].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][0].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::(Key1=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
case 13: /*wep 104 Ascii type */
|
|
pAd->SharedKey[apidx][0].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][0].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::(Key1=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 26: /*wep 104 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][0].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][0].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::(Key1=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
default: /*Invalid argument */
|
|
pAd->SharedKey[apidx][0].KeyLen = 0;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::Invalid argument (=%s)\n", apidx, arg));
|
|
return FALSE;
|
|
}
|
|
|
|
pAd->SharedKey[apidx][0].CipherAlg = CipherAlg;
|
|
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd,
|
|
apidx,
|
|
0,
|
|
pAd->SharedKey[apidx][0].CipherAlg,
|
|
pAd->SharedKey[apidx][0].Key,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY2
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key2_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT KeyLen;
|
|
INT i;
|
|
UCHAR CipherAlg = CIPHER_WEP64;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
|
|
KeyLen = strlen(arg);
|
|
|
|
switch (KeyLen)
|
|
{
|
|
case 5: /*wep 40 Ascii type */
|
|
pAd->SharedKey[apidx][1].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][1].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::(Key2=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 10: /*wep 40 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][1].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][1].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::(Key2=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
case 13: /*wep 104 Ascii type */
|
|
pAd->SharedKey[apidx][1].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][1].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::(Key2=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 26: /*wep 104 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][1].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][1].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::(Key2=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
default: /*Invalid argument */
|
|
pAd->SharedKey[apidx][1].KeyLen = 0;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::Invalid argument (=%s)\n", apidx, arg));
|
|
return FALSE;
|
|
}
|
|
|
|
pAd->SharedKey[apidx][1].CipherAlg = CipherAlg;
|
|
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd,
|
|
apidx,
|
|
1,
|
|
pAd->SharedKey[apidx][1].CipherAlg,
|
|
pAd->SharedKey[apidx][1].Key,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY3
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key3_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT KeyLen;
|
|
INT i;
|
|
UCHAR CipherAlg = CIPHER_WEP64;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
|
|
KeyLen = strlen(arg);
|
|
|
|
switch (KeyLen)
|
|
{
|
|
case 5: /*wep 40 Ascii type */
|
|
pAd->SharedKey[apidx][2].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][2].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key3_Proc::(Key3=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 10: /*wep 40 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][2].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][2].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key3_Proc::(Key3=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
case 13: /*wep 104 Ascii type */
|
|
pAd->SharedKey[apidx][2].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][2].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key3_Proc::(Key3=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 26: /*wep 104 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][2].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][2].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key3_Proc::(Key3=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
default: /*Invalid argument */
|
|
pAd->SharedKey[apidx][2].KeyLen = 0;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("IF(ra%d) Set_Key3_Proc::Invalid argument (=%s)\n", apidx, arg));
|
|
return FALSE;
|
|
}
|
|
|
|
pAd->SharedKey[apidx][2].CipherAlg = CipherAlg;
|
|
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd,
|
|
apidx,
|
|
2,
|
|
pAd->SharedKey[apidx][2].CipherAlg,
|
|
pAd->SharedKey[apidx][2].Key,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY4
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key4_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT KeyLen;
|
|
INT i;
|
|
UCHAR CipherAlg = CIPHER_WEP64;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
KeyLen = strlen(arg);
|
|
|
|
switch (KeyLen)
|
|
{
|
|
case 5: /*wep 40 Ascii type */
|
|
pAd->SharedKey[apidx][3].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][3].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key4_Proc::(Key4=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 10: /*wep 40 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][3].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][3].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP64;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key4_Proc::(Key4=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
case 13: /*wep 104 Ascii type */
|
|
pAd->SharedKey[apidx][3].KeyLen = KeyLen;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][3].Key, arg, KeyLen);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key4_Proc::(Key4=%s and type=%s)\n", apidx, arg, "Ascii"));
|
|
break;
|
|
case 26: /*wep 104 Hex type */
|
|
for(i=0; i < KeyLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
pAd->SharedKey[apidx][3].KeyLen = KeyLen/2 ;
|
|
AtoH(arg, pAd->SharedKey[apidx][3].Key, KeyLen/2);
|
|
CipherAlg = CIPHER_WEP128;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key4_Proc::(Key4=%s and type=%s)\n", apidx, arg, "Hex"));
|
|
break;
|
|
default: /*Invalid argument */
|
|
pAd->SharedKey[apidx][3].KeyLen = 0;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("IF(ra%d) Set_Key4_Proc::Invalid argument (=%s)\n", apidx, arg));
|
|
return FALSE;
|
|
}
|
|
|
|
pAd->SharedKey[apidx][3].CipherAlg = CipherAlg;
|
|
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd,
|
|
apidx,
|
|
3,
|
|
pAd->SharedKey[apidx][3].CipherAlg,
|
|
pAd->SharedKey[apidx][3].Key,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#else
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY1
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key1_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR apidx, keyidx = 0;
|
|
CIPHER_KEY *pSharedKey;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
apidx = (UCHAR)pObj->ioctl_if;
|
|
pSharedKey = &pAd->SharedKey[apidx][keyidx];
|
|
retVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, keyidx);
|
|
if (retVal == TRUE)
|
|
{
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd, apidx, keyidx, pSharedKey);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key1_Proc::(Key1=%s) success!\n", apidx, arg));
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY2
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key2_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR apidx, keyidx = 1;
|
|
CIPHER_KEY *pSharedKey;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
apidx = (UCHAR)pObj->ioctl_if;
|
|
pSharedKey = &pAd->SharedKey[apidx][keyidx];
|
|
retVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, keyidx);
|
|
if (retVal == TRUE)
|
|
{
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd, apidx, keyidx, pSharedKey);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key2_Proc::(Key2=%s) success!\n", apidx, arg));
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY3
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key3_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR apidx, keyidx = 2;
|
|
CIPHER_KEY *pSharedKey;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
apidx = (UCHAR)pObj->ioctl_if;
|
|
pSharedKey = &pAd->SharedKey[apidx][keyidx];
|
|
retVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, keyidx);
|
|
if (retVal == TRUE)
|
|
{
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd, apidx, keyidx, pSharedKey);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key3_Proc::(Key3=%s) success!\n", apidx, arg));
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY4
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_Key4_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
|
|
POS_COOKIE pObj;
|
|
UCHAR apidx, keyidx = 3;
|
|
CIPHER_KEY *pSharedKey;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
apidx = (UCHAR)pObj->ioctl_if;
|
|
pSharedKey = &pAd->SharedKey[apidx][keyidx];
|
|
retVal = RT_CfgSetWepKey(pAd, arg, pSharedKey, keyidx);
|
|
if (retVal == TRUE)
|
|
{
|
|
/* Set keys (into ASIC) */
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
; /* not support */
|
|
else /* Old WEP stuff */
|
|
{
|
|
AsicAddSharedKeyEntry(pAd, apidx, keyidx, pSharedKey);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_Key4_Proc::(Key4=%s) success!\n", apidx, arg));
|
|
}
|
|
|
|
return retVal;
|
|
}
|
|
|
|
#endif
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Access ctrol policy
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AccessPolicy_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
switch (simple_strtol(arg, 0, 10))
|
|
{
|
|
case 0: /*Disable */
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 0;
|
|
break;
|
|
case 1: /* Allow All, and ACL is positive. */
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 1;
|
|
break;
|
|
case 2: /* Reject All, and ACL is negative. */
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = 2;
|
|
break;
|
|
default: /*Invalid argument */
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_AccessPolicy_Proc::Invalid argument (=%s)\n", arg));
|
|
return FALSE;
|
|
}
|
|
|
|
/* check if the change in ACL affects any existent association */
|
|
ApUpdateAccessControlList(pAd, (UCHAR)pObj->ioctl_if);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_AccessPolicy_Proc::(AccessPolicy=%ld)\n", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* Replaced by Set_ACLAddEntry_Proc() and Set_ACLClearAll_Proc() */
|
|
#ifdef RELEASE_EXCLUDE
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Access control mac table list
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AccessControlList_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN PUCHAR arg)
|
|
{
|
|
UCHAR macAddr[MAC_ADDR_LEN];
|
|
RT_802_11_ACL acl;
|
|
CHAR *this_char;
|
|
CHAR *value;
|
|
INT i, j;
|
|
BOOLEAN isDuplicate=FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
NdisZeroMemory(&acl, sizeof(RT_802_11_ACL));
|
|
|
|
this_char = (CHAR *)strsep((char **)&arg, ";");
|
|
if (this_char == NULL)
|
|
return FALSE;
|
|
|
|
if (*this_char == '\0')
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The AccessControlList%d entered is NULL ===> Make the list empty!\n", pObj->ioctl_if));
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
if (strlen((char *)this_char) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
{
|
|
return FALSE;
|
|
}
|
|
for (i=0, value = (CHAR *)rstrtok((char *)this_char,":"); value; value = (CHAR *)rstrtok((char *)NULL,":"))
|
|
{
|
|
if((strlen((char *)value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
{
|
|
return FALSE; /*Invalid */
|
|
}
|
|
AtoH((char *)value, &macAddr[i++], 1);
|
|
}
|
|
|
|
if (i != 6)
|
|
{
|
|
return FALSE; /*Invalid */
|
|
}
|
|
|
|
/*Check if this entry is duplicate. */
|
|
isDuplicate = FALSE;
|
|
for (j=0; j<acl.Num; j++)
|
|
{
|
|
if (memcmp(acl.Entry[j].Addr, &macAddr, 6) == 0)
|
|
{
|
|
isDuplicate = TRUE;
|
|
}
|
|
}
|
|
|
|
if (!isDuplicate)
|
|
{
|
|
NdisMoveMemory(acl.Entry[acl.Num++].Addr, &macAddr, 6);
|
|
}
|
|
|
|
if (acl.Num == MAX_NUM_OF_ACL_LIST)
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The AccessControlList is full, and no more entry can join the list!\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));
|
|
break;
|
|
}
|
|
}while ((this_char = (CHAR *)strsep((char **)&arg, ";")) != NULL);
|
|
}
|
|
ASSERT(acl.Num <= MAX_NUM_OF_ACL_LIST);
|
|
acl.Policy = pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy;
|
|
NdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, &acl, sizeof(RT_802_11_ACL));
|
|
|
|
#if 0
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num > MAX_NUM_OF_ACL_LIST)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = MAX_NUM_OF_ACL_LIST;
|
|
else
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = acl.Num;
|
|
#endif
|
|
|
|
/* Check if the change in ACL affects any existent association. */
|
|
ApUpdateAccessControlList(pAd, (UCHAR)pObj->ioctl_if);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::Set_AccessControlList_Proc(Policy=%ld, Entry#=%ld)\n",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));
|
|
|
|
#ifdef DBG
|
|
DBGPRINT(RT_DEBUG_TRACE, ("=============== Entry ===============\n"));
|
|
for (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Entry #%02d: ", i+1));
|
|
for (j=0; j<6; j++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X ",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Add one entry or several entries(if allowed to)
|
|
into Access control mac table list
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ACLAddEntry_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR macAddr[MAC_ADDR_LEN];
|
|
/* RT_802_11_ACL acl; */
|
|
RT_802_11_ACL *pacl = NULL;
|
|
RTMP_STRING *this_char;
|
|
RTMP_STRING *value;
|
|
INT i, j;
|
|
BOOLEAN isDuplicate=FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
if (pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num >= (MAX_NUM_OF_ACL_LIST - 1))
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The AccessControlList is full, and no more entry can join the list!\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
/* allocate memory */
|
|
os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));
|
|
if (pacl == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
|
|
return FALSE;
|
|
}
|
|
|
|
NdisZeroMemory(pacl, sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
|
|
while ((this_char = strsep((char **)&arg, ";")) != NULL)
|
|
{
|
|
if (*this_char == '\0')
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("An unnecessary delimiter entered!\n"));
|
|
continue;
|
|
}
|
|
if (strlen(this_char) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("illegal MAC address length!\n"));
|
|
continue;
|
|
}
|
|
for (i=0, value = rstrtok(this_char,":"); value; value = rstrtok(NULL,":"))
|
|
{
|
|
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("illegal MAC address format or octet!\n"));
|
|
/* Do not use "continue" to replace "break" */
|
|
break;
|
|
}
|
|
AtoH(value, &macAddr[i++], 1);
|
|
}
|
|
|
|
if (i != MAC_ADDR_LEN)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
/* Check if this entry is duplicate. */
|
|
isDuplicate = FALSE;
|
|
for (j=0; j<pacl->Num; j++)
|
|
{
|
|
if (memcmp(pacl->Entry[j].Addr, &macAddr, 6) == 0)
|
|
{
|
|
isDuplicate = TRUE;
|
|
DBGPRINT(RT_DEBUG_WARN, ("You have added an entry before :\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("The duplicate entry is %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));
|
|
}
|
|
}
|
|
|
|
if (!isDuplicate)
|
|
{
|
|
NdisMoveMemory(pacl->Entry[pacl->Num++].Addr, &macAddr, MAC_ADDR_LEN);
|
|
}
|
|
|
|
if (pacl->Num == MAX_NUM_OF_ACL_LIST)
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The AccessControlList is full, and no more entry can join the list!\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("The last entry of ACL is %02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));
|
|
break;
|
|
}
|
|
}
|
|
|
|
ASSERT(pacl->Num < MAX_NUM_OF_ACL_LIST);
|
|
|
|
NdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, pacl, sizeof(RT_802_11_ACL));
|
|
|
|
/* check if the change in ACL affects any existent association */
|
|
ApUpdateAccessControlList(pAd, (UCHAR)pObj->ioctl_if);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::%s(Policy=%ld, Entry#=%ld)\n",
|
|
__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));
|
|
|
|
#ifdef DBG
|
|
DBGPRINT(RT_DEBUG_TRACE, ("=============== Entry ===============\n"));
|
|
for (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Entry #%02d: ", i+1));
|
|
for (j=0; j<MAC_ADDR_LEN; j++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X ",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif
|
|
|
|
if (pacl != NULL)
|
|
os_free_mem(NULL, pacl);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Delete one entry or several entries(if allowed to)
|
|
from Access control mac table list
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ACLDelEntry_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR macAddr[MAC_ADDR_LEN];
|
|
UCHAR nullAddr[MAC_ADDR_LEN];
|
|
RT_802_11_ACL acl;
|
|
RTMP_STRING *this_char;
|
|
RTMP_STRING *value;
|
|
INT i, j;
|
|
BOOLEAN isFound=FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
NdisZeroMemory(&acl, sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
NdisZeroMemory(nullAddr, MAC_ADDR_LEN);
|
|
|
|
while ((this_char = strsep((char **)&arg, ";")) != NULL)
|
|
{
|
|
if (*this_char == '\0')
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("An unnecessary delimiter entered!\n"));
|
|
continue;
|
|
}
|
|
if (strlen(this_char) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("illegal MAC address length!\n"));
|
|
continue;
|
|
}
|
|
|
|
for (i=0, value = rstrtok(this_char,":"); value; value = rstrtok(NULL,":"))
|
|
{
|
|
if ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("illegal MAC address format or octet!\n"));
|
|
/* Do not use "continue" to replace "break" */
|
|
break;
|
|
}
|
|
AtoH(value, &macAddr[i++], 1);
|
|
}
|
|
|
|
if (i != MAC_ADDR_LEN)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
/* Check if this entry existed. */
|
|
isFound = FALSE;
|
|
for (j=0; j<acl.Num; j++)
|
|
{
|
|
if (memcmp(acl.Entry[j].Addr, &macAddr, MAC_ADDR_LEN) == 0)
|
|
{
|
|
isFound = TRUE;
|
|
NdisZeroMemory(acl.Entry[j].Addr, MAC_ADDR_LEN);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("The entry %02x:%02x:%02x:%02x:%02x:%02x founded will be deleted!\n",
|
|
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));
|
|
}
|
|
}
|
|
|
|
if (!isFound)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("The entry %02x:%02x:%02x:%02x:%02x:%02x is not in the list!\n",
|
|
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]));
|
|
}
|
|
}
|
|
|
|
NdisZeroMemory(&pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy = acl.Policy;
|
|
ASSERT(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num == 0);
|
|
i = 0;
|
|
|
|
for (j=0; j<acl.Num; j++)
|
|
{
|
|
if (memcmp(acl.Entry[j].Addr, &nullAddr, MAC_ADDR_LEN) == 0)
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
NdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i++]), acl.Entry[j].Addr, MAC_ADDR_LEN);
|
|
}
|
|
}
|
|
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num = i;
|
|
ASSERT(acl.Num >= pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num);
|
|
|
|
/* check if the change in ACL affects any existent association */
|
|
ApUpdateAccessControlList(pAd, (UCHAR)pObj->ioctl_if);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::%s(Policy=%ld, Entry#=%ld)\n",
|
|
__FUNCTION__ , pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));
|
|
|
|
#ifdef DBG
|
|
DBGPRINT(RT_DEBUG_TRACE, ("=============== Entry ===============\n"));
|
|
for (i=0; i<pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num; i++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Entry #%02d: ", i+1));
|
|
for (j=0; j<MAC_ADDR_LEN; j++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X ",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Entry[i].Addr[j]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* for ACL policy message */
|
|
#define ACL_POLICY_TYPE_NUM 3
|
|
char const *pACL_PolicyMessage[ACL_POLICY_TYPE_NUM] = {
|
|
"the Access Control feature is disabled", /* 0 : Disable */
|
|
"only the following entries are allowed to join this BSS", /* 1 : Allow */
|
|
"all the following entries are rejected to join this BSS", /* 2 : Reject */
|
|
};
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Dump all the entries in the Access control
|
|
mac table list of a specified BSS
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ACLShowAll_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
RT_802_11_ACL acl;
|
|
BOOLEAN bDumpAll = FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
INT i, j;
|
|
|
|
bDumpAll = (BOOLEAN)simple_strtol(arg, 0, 10);
|
|
|
|
if (bDumpAll == 1)
|
|
{
|
|
bDumpAll = TRUE;
|
|
}
|
|
else if (bDumpAll == 0)
|
|
{
|
|
bDumpAll = FALSE;
|
|
DBGPRINT(RT_DEBUG_WARN, ("Your input is 0!\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("The Access Control List will not be dumped!\n"));
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE; /* Invalid argument */
|
|
}
|
|
|
|
NdisZeroMemory(&acl, sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(&acl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
|
|
/* Check if the list is already empty. */
|
|
if (acl.Num == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The Access Control List is empty!\n"));
|
|
return TRUE;
|
|
}
|
|
|
|
ASSERT(((bDumpAll == 1) && (acl.Num > 0)));
|
|
|
|
/* Show the corresponding policy first. */
|
|
DBGPRINT(RT_DEBUG_OFF, ("=============== Access Control Policy ===============\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Policy is %ld : ", acl.Policy));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", pACL_PolicyMessage[acl.Policy]));
|
|
|
|
/* Dump the entry in the list one by one */
|
|
DBGPRINT(RT_DEBUG_OFF, ("=============== Access Control List ===============\n"));
|
|
for (i=0; i<acl.Num; i++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Entry #%02d: ", i+1));
|
|
for (j=0; j<MAC_ADDR_LEN; j++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X ", acl.Entry[i].Addr[j]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Clear all the entries in the Access control
|
|
mac table list of a specified BSS
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ACLClearAll_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
/* RT_802_11_ACL acl; */
|
|
RT_802_11_ACL *pacl = NULL;
|
|
BOOLEAN bClearAll = FALSE;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
bClearAll = (BOOLEAN)simple_strtol(arg, 0, 10);
|
|
|
|
if (bClearAll == 1)
|
|
{
|
|
bClearAll = TRUE;
|
|
}
|
|
else if (bClearAll == 0)
|
|
{
|
|
bClearAll = FALSE;
|
|
DBGPRINT(RT_DEBUG_WARN, ("Your input is 0!\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("The Access Control List will be kept unchanged!\n"));
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE; /* Invalid argument */
|
|
}
|
|
|
|
/* allocate memory */
|
|
os_alloc_mem(NULL, (UCHAR **)&pacl, sizeof(RT_802_11_ACL));
|
|
if (pacl == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
|
|
return FALSE;
|
|
}
|
|
|
|
NdisZeroMemory(pacl, sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(pacl, &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList, sizeof(RT_802_11_ACL));
|
|
|
|
/* Check if the list is already empty. */
|
|
if (pacl->Num == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_WARN, ("The Access Control List is empty!\n"));
|
|
DBGPRINT(RT_DEBUG_WARN, ("No need to clear the Access Control List!\n"));
|
|
|
|
if (pacl != NULL)
|
|
os_free_mem(NULL, pacl);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
ASSERT(((bClearAll == 1) && (pacl->Num > 0)));
|
|
|
|
/* Clear the entry in the list one by one */
|
|
/* Keep the corresponding policy unchanged. */
|
|
do
|
|
{
|
|
NdisZeroMemory(pacl->Entry[pacl->Num - 1].Addr, MAC_ADDR_LEN);
|
|
pacl->Num -= 1;
|
|
}while (pacl->Num > 0);
|
|
|
|
ASSERT(pacl->Num == 0);
|
|
|
|
NdisZeroMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), sizeof(RT_802_11_ACL));
|
|
NdisMoveMemory(&(pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList), pacl, sizeof(RT_802_11_ACL));
|
|
|
|
/* check if the change in ACL affects any existent association */
|
|
ApUpdateAccessControlList(pAd, (UCHAR)pObj->ioctl_if);
|
|
|
|
if (pacl != NULL)
|
|
os_free_mem(NULL, pacl);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set::%s(Policy=%ld, Entry#=%ld)\n",
|
|
__FUNCTION__, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Policy, pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList.Num));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef DBG
|
|
static void _rtmp_hexdump(int level, const char *title, const UINT8 *buf,
|
|
size_t len, int show)
|
|
{
|
|
size_t i;
|
|
if (level < RTDebugLevel)
|
|
return;
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s - hexdump(len=%lu):", title, (unsigned long) len));
|
|
if (show) {
|
|
for (i = 0; i < len; i++)
|
|
DBGPRINT(RT_DEBUG_OFF, (" %02x", buf[i]));
|
|
} else {
|
|
DBGPRINT(RT_DEBUG_OFF, (" [REMOVED]"));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
void rtmp_hexdump(int level, const char *title, const UINT8 *buf, size_t len)
|
|
{
|
|
_rtmp_hexdump(level, title, buf, len, 1);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#if 0
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA PSK key
|
|
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
arg WPA pre-shared key string
|
|
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_WPAPSK_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR keyMaterial[40];
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc::(WPAPSK=%s)\n", arg));
|
|
|
|
if ((strlen(arg) < 8) || (strlen(arg) > 64))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set failed!!(WPAPSK=%s), WPAPSK key-string required 8 ~ 64 characters \n", arg));
|
|
return FALSE;
|
|
}
|
|
|
|
if (strlen(arg) == 64)
|
|
{
|
|
AtoH(arg, pAd->ApCfg.MBSSID[apidx].PMK, 32);
|
|
}
|
|
else
|
|
{
|
|
RtmpPasswordHash(arg, (PUCHAR)pAd->ApCfg.MBSSID[apidx].Ssid, pAd->ApCfg.MBSSID[apidx].SsidLen, keyMaterial);
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].PMK, keyMaterial, 32);
|
|
}
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
NdisZeroMemory(pAd->ApCfg.MBSSID[apidx].WscControl.WpaPsk, 64);
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen = 0;
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen = strlen(arg);
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].WscControl.WpaPsk, arg, pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
return TRUE;
|
|
}
|
|
#else
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA PSK key
|
|
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
arg WPA pre-shared key string
|
|
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_WPAPSK_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
INT retval;
|
|
BSS_STRUCT *pMBSSStruct;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc::(WPAPSK=%s)\n", arg));
|
|
|
|
pMBSSStruct = &pAd->ApCfg.MBSSID[apidx];
|
|
retval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pMBSSStruct->Ssid, pMBSSStruct->SsidLen, pMBSSStruct->PMK);
|
|
if (retval == FALSE)
|
|
return FALSE;
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
NdisZeroMemory(pMBSSStruct->WscControl.WpaPsk, 64);
|
|
pMBSSStruct->WscControl.WpaPskLen = 0;
|
|
pMBSSStruct->WscControl.WpaPskLen = strlen(arg);
|
|
NdisMoveMemory(pMBSSStruct->WscControl.WpaPsk, arg, pMBSSStruct->WscControl.WpaPskLen);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Reset statistics counter
|
|
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
arg
|
|
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
|
|
INT Set_RadioOn_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR radio;
|
|
|
|
radio = (UCHAR)simple_strtol(arg, 0, 10);
|
|
|
|
pAd->iwpriv_command = FALSE;
|
|
#ifdef MT_MAC
|
|
if (pAd->chipCap.hif_type == HIF_MT) {
|
|
pAd->iwpriv_command = TRUE;
|
|
}
|
|
#endif /* MT_MAC */
|
|
|
|
if (radio)
|
|
{
|
|
MlmeRadioOn(pAd);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("==>Set_RadioOn_Proc (ON)\n"));
|
|
}
|
|
else
|
|
{
|
|
MlmeRadioOff(pAd);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("==>Set_RadioOn_Proc (OFF)\n"));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef AP_SCAN_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Issue a site survey command to driver
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 set site_survey
|
|
==========================================================================
|
|
*/
|
|
#if 0
|
|
INT Set_SiteSurvey_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
NDIS_802_11_SSID Ssid;
|
|
NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
|
|
if ((strlen(arg) != 0) && (strlen(arg) <= MAX_LEN_OF_SSID))
|
|
{
|
|
NdisMoveMemory(Ssid.Ssid, arg, strlen(arg));
|
|
Ssid.SsidLength = strlen(arg);
|
|
}
|
|
|
|
if (Ssid.SsidLength == 0)
|
|
ApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, FALSE);
|
|
else
|
|
ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, FALSE);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_SiteSurvey_Proc\n"));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Issue a Auto-Channel Selection command to driver
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 set AutoChannelSel=1
|
|
Ues the number of AP to choose
|
|
2.) iwpriv ra0 set AutoChannelSel=2
|
|
Ues the False CCA count to choose
|
|
==========================================================================
|
|
*/
|
|
INT Set_AutoChannelSel_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
NDIS_802_11_SSID Ssid;
|
|
|
|
|
|
NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
|
|
if (strlen(arg) <= MAX_LEN_OF_SSID)
|
|
{
|
|
if (strlen(arg) != 0)
|
|
{
|
|
NdisMoveMemory(Ssid.Ssid, arg, strlen(arg));
|
|
Ssid.SsidLength = strlen(arg);
|
|
}
|
|
else /*ANY ssid */
|
|
{
|
|
Ssid.SsidLength = 0;
|
|
memcpy(Ssid.Ssid, "", 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Error!!! SsidLength is larger than %d!\n",MAX_LEN_OF_SSID));
|
|
return FALSE;
|
|
}
|
|
|
|
if (strcmp(arg,"1") == 0)
|
|
pAd->ApCfg.AutoChannelAlg = ChannelAlgApCnt;
|
|
else if (strcmp(arg,"2") == 0)
|
|
pAd->ApCfg.AutoChannelAlg = ChannelAlgCCA;
|
|
else if (strcmp(arg,"3") == 0)
|
|
pAd->ApCfg.AutoChannelAlg =ChannelAlgBusyTime;
|
|
#ifdef SUPPORT_ACS_ALL_CHANNEL_RANK
|
|
else if (strcmp(arg,"4") == 0)
|
|
pAd->ApCfg.AutoChannelAlg =ChannelAlgCombined;
|
|
#endif
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set_AutoChannelSel_Proc Alg isn't defined\n"));
|
|
return FALSE;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_AutoChannelSel_Proc Alg=%d \n", pAd->ApCfg.AutoChannelAlg));
|
|
if (Ssid.SsidLength == 0)
|
|
ApSiteSurvey(pAd, &Ssid, SCAN_PASSIVE, TRUE);
|
|
else
|
|
ApSiteSurvey(pAd, &Ssid, SCAN_ACTIVE, TRUE);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set a periodic check time for auto channel selection (unit: hour)
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
|
|
Return Value:
|
|
TRUE if success, FALSE otherwise
|
|
|
|
Note:
|
|
Usage:
|
|
iwpriv ra0 set ACSCheckTime=3 (unit: hour)
|
|
|
|
==========================================================================
|
|
*/
|
|
INT Set_AutoChannelSelCheckTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
UINT8 Hour = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->ApCfg.ACSCheckTime = Hour*3600; /* Hour to second */
|
|
pAd->ApCfg.ACSCheckCount = 0; /* Reset counter */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s(): ACSCheckTime=%u seconds(%u hours)\n",
|
|
__FUNCTION__, pAd->ApCfg.ACSCheckTime, Hour));
|
|
return TRUE;
|
|
}
|
|
#endif /* AP_SCAN_SUPPORT */
|
|
|
|
|
|
INT Show_DriverInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("driver version: %s.\n", AP_DRIVER_VERSION));
|
|
|
|
#ifdef CONFIG_ANDES_SUPPORT
|
|
if (pAd->chipCap.MCUType == ANDES) {
|
|
UINT32 loop = 0;
|
|
RTMP_CHIP_CAP *cap = &pAd->chipCap;
|
|
|
|
if (pAd->chipCap.need_load_fw) {
|
|
USHORT fw_ver, build_ver;
|
|
fw_ver = (*(cap->FWImageName + 11) << 8) | (*(cap->FWImageName + 10));
|
|
build_ver = (*(cap->FWImageName + 9) << 8) | (*(cap->FWImageName + 8));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("fw version:%d.%d.%02d ", (fw_ver & 0xf000) >> 8,
|
|
(fw_ver & 0x0f00) >> 8, fw_ver & 0x00ff));
|
|
DBGPRINT(RT_DEBUG_OFF, ("build:%x\n", build_ver));
|
|
DBGPRINT(RT_DEBUG_OFF, ("build time:"));
|
|
|
|
for (loop = 0; loop < 16; loop++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%c", *(cap->FWImageName + 16 + loop)));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
if (pAd->chipCap.need_load_rom_patch) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("rom patch version = \n"));
|
|
|
|
for (loop = 0; loop < 4; loop++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%c", *(cap->rom_patch + 24 + loop)));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("build time = \n"));
|
|
|
|
for (loop = 0; loop < 16; loop++)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%c", *(cap->rom_patch + loop)));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if defined(MT7603_FPGA) || defined(MT7628_FPGA)
|
|
if ((IS_MT7603(pAd) || IS_MT7628(pAd)) && pAd->chipCap.hif_type == HIF_MT) {
|
|
UINT32 mac_val, ver, date_code, rev;
|
|
|
|
RTMP_IO_READ32(pAd, 0x2700, &ver);
|
|
RTMP_IO_READ32(pAd, 0x2704, &rev);
|
|
RTMP_IO_READ32(pAd, 0x2708, &date_code);
|
|
RTMP_IO_READ32(pAd, 0x21f8, &mac_val);
|
|
DBGPRINT(RT_DEBUG_OFF, ("##########################################\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MT7603 FPGA Version:\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\tFGPA1: Code[0x700]:0x%x, [0x704]:0x%x, [0x708]:0x%x\n",
|
|
ver, rev, date_code));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\tFPGA2: Version[0x21f8]:0x%x\n", mac_val));
|
|
DBGPRINT(RT_DEBUG_OFF, ("##########################################\n"));
|
|
}
|
|
#endif /* MT7603_FPGA */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Show_StaCount_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT i = 0, bss_idx=0;
|
|
BSS_STRUCT *pMbss = NULL;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
for (bss_idx=0; bss_idx < pAd->ApCfg.BssidNum; bss_idx++)
|
|
{
|
|
pMbss = &pAd->ApCfg.MBSSID[bss_idx];
|
|
DBGPRINT(RT_DEBUG_OFF, ("BSS[%02d]: %5d\n", bss_idx, pMbss->StaCount));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
#ifdef DOT11_N_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("HT Operating Mode : %d\n", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%-19s%-4s%-12s%-12s%-12s%-12s\n"
|
|
, "MAC", "AID", "TxPackets", "RxPackets", "TxBytes", "RxBytes"));
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
|
|
if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry))
|
|
&& (pEntry->Sst == SST_ASSOC))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X:%02X:%02X:%02X:%02X:%02X "
|
|
, pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2]
|
|
, pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->Aid));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-12ld", (ULONG)pEntry->TxPackets.QuadPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-12ld", (ULONG)pEntry->RxPackets.QuadPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-12ld", (ULONG)pEntry->TxBytes));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-12ld", (ULONG)pEntry->RxBytes));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Show_StaSecurityInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT i;
|
|
UCHAR apidx;
|
|
struct wifi_dev *wdev;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)
|
|
{
|
|
wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
DBGPRINT(RT_DEBUG_OFF, (" BSS(%d) AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s, WPAMixPairCipher(0x%02X)\n"
|
|
, apidx, wdev->AuthMode, GetAuthMode((CHAR)wdev->AuthMode)
|
|
, wdev->WepStatus, GetEncryptType((CHAR)wdev->WepStatus)
|
|
, wdev->GroupKeyWepStatus
|
|
, GetEncryptType((CHAR)wdev->GroupKeyWepStatus)
|
|
, wdev->WpaMixPairCipher));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%-19s%-4s%-4s%-15s%-12s\n",
|
|
"MAC", "AID", "BSS", "Auth", "Encrypt"));
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
|
|
if (pEntry && IS_ENTRY_CLIENT(pEntry) && pEntry->Sst == SST_ASSOC)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X:%02X:%02X:%02X:%02X:%02X ",
|
|
PRINT_MAC(pEntry->Addr)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->Aid));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->func_tb_idx));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-15s", GetAuthMode((CHAR)pEntry->AuthMode)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-12s", GetEncryptType((CHAR)pEntry->WepStatus)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Show_RAInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
#ifdef PRE_ANT_SWITCH
|
|
DBGPRINT(RT_DEBUG_OFF, ("PreAntSwitch: %d\n", pAd->CommonCfg.PreAntSwitch));
|
|
DBGPRINT(RT_DEBUG_OFF, ("PreAntSwitchRSSI: %d\n", pAd->CommonCfg.PreAntSwitchRSSI));
|
|
#endif /* PRE_ANT_SWITCH */
|
|
|
|
#ifdef CFO_TRACK
|
|
DBGPRINT(RT_DEBUG_OFF, ("CFOTrack: %d\n", pAd->CommonCfg.CFOTrack));
|
|
#endif /* CFO_TRACK */
|
|
|
|
#if defined (RT2883) || defined (RT3883)
|
|
DBGPRINT(RT_DEBUG_OFF, ("FixedRate: %d\n", pAd->CommonCfg.FixedRate));
|
|
#endif /* defined (RT2883) || defined (RT3883) */
|
|
|
|
#ifdef NEW_RATE_ADAPT_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("LowTrafficThrd: %d\n", pAd->CommonCfg.lowTrafficThrd));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TrainUpRule: %d\n", pAd->CommonCfg.TrainUpRule));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TrainUpRuleRSSI: %d\n", pAd->CommonCfg.TrainUpRuleRSSI));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TrainUpLowThrd: %d\n", pAd->CommonCfg.TrainUpLowThrd));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TrainUpHighThrd: %d\n", pAd->CommonCfg.TrainUpHighThrd));
|
|
#endif /* NEW_RATE_ADAPT_SUPPORT */
|
|
|
|
#ifdef STREAM_MODE_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("StreamMode: %d\n", pAd->CommonCfg.StreamMode));
|
|
DBGPRINT(RT_DEBUG_OFF, ("StreamModeMCS: 0x%04x\n", pAd->CommonCfg.StreamModeMCS));
|
|
#endif /* STREAM_MODE_SUPPORT */
|
|
#ifdef TXBF_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("ITxBfEn: %d\n", pAd->CommonCfg.RegTransmitSetting.field.ITxBfEn));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ITxBfTimeout: %ld\n", pAd->CommonCfg.ITxBfTimeout));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ETxBfTimeout: %ld\n", pAd->CommonCfg.ETxBfTimeout));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ETxBfEnCond: %ld\n", pAd->CommonCfg.ETxBfEnCond));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ETxBfNoncompress: %d\n", pAd->CommonCfg.ETxBfNoncompress));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ETxBfIncapable: %d\n", pAd->CommonCfg.ETxBfIncapable));
|
|
#endif /* TXBF_SUPPORT */
|
|
|
|
#ifdef DBG_CTRL_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("DebugFlags: 0x%lx\n", pAd->CommonCfg.DebugFlags));
|
|
#endif /* DBG_CTRL_SUPPORT */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef RTMP_MAC_PCI
|
|
#ifdef DBG_DIAGNOSE
|
|
INT Set_DiagOpt_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG diagOpt;
|
|
/*POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; */
|
|
|
|
diagOpt = simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("DiagOpt=%ld!\n", diagOpt));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_BDInfo_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT32 i, QueIdx=0;
|
|
UINT32 RegValue;
|
|
RXD_STRUC *pRxD;
|
|
TXD_STRUC *pTxD;
|
|
#ifdef RT_BIG_ENDIAN
|
|
RXD_STRUC *pDestRxD, *pDestTxD;
|
|
RXD_STRUC RxD, TxD;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
RTMP_TX_RING *pTxRing = &pAd->TxRing[QueIdx];
|
|
RTMP_MGMT_RING *pMgmtRing = &pAd->MgmtRing;
|
|
RTMP_RX_RING *pRxRing = &pAd->RxRing[0];
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("HT Operating Mode : %d\n",
|
|
pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode));
|
|
#endif /* DOT11_N_SUPPORT */
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("[Tx]: SwFreeIdx=%d, CpuIdx=%d, DmaIdx=%d\n",
|
|
pAd->TxRing[QueIdx].TxSwFreeIdx,
|
|
pAd->TxRing[QueIdx].TxCpuIdx,
|
|
pAd->TxRing[QueIdx].TxDmaIdx));
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxSwFreeIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxSwFreeIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Tx SwFreeIdx Descriptor", (char *)pTxD, 16);
|
|
DBGPRINT(RT_DEBUG_OFF, ("pTxD->DMADONE = %x\n", pTxD->DMADONE));
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxCpuIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxCpuIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Tx CpuIdx Descriptor", (char *)pTxD, 16);
|
|
DBGPRINT(RT_DEBUG_OFF, ("pTxD->DMADONE = %x\n", pTxD->DMADONE));
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxDmaIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pTxRing->Cell[pAd->TxRing[QueIdx].TxDmaIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Tx DmaIdx Descriptor", (char *)pTxD, 16);
|
|
DBGPRINT(RT_DEBUG_OFF, ("pTxD->DMADONE = %x\n", pTxD->DMADONE));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("[Mgmt]: SwFreeIdx=%d, CpuIdx=%d, DmaIdx=%d\n",
|
|
pAd->MgmtRing.TxSwFreeIdx,
|
|
pAd->MgmtRing.TxCpuIdx,
|
|
pAd->MgmtRing.TxDmaIdx));
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Mgmt SwFreeIdx Descriptor", (char *)pTxD, 16);
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxCpuIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxCpuIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Mgmt CpuIdx Descriptor", (char *)pTxD, 16);
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxDmaIdx].AllocVa;
|
|
TxD = *pDestTxD;
|
|
pTxD = &TxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
|
#else
|
|
pTxD = (TXD_STRUC *) pMgmtRing->Cell[pAd->MgmtRing.TxDmaIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("Mgmt DmaIdx Descriptor", (char *)pTxD, 16);
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("[Rx]: SwRedIdx=%d, CpuIdx=%d, DmaIdx=%d\n",
|
|
pAd->RxRing[0].RxSwReadIdx,
|
|
pAd->RxRing[0].RxCpuIdx,
|
|
pAd->RxRing[0].RxDmaIdx));
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxSwReadIdx].AllocVa;
|
|
RxD = *pDestRxD;
|
|
pRxD = &RxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD);
|
|
#else
|
|
pRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxSwReadIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("RX SwRedIdx Descriptor", (char *)pRxD, 16);
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxCpuIdx].AllocVa;
|
|
RxD = *pDestRxD;
|
|
pRxD = &RxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD);
|
|
#else
|
|
pRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxCpuIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("RX RxCupIdx Descriptor", (char *)pRxD, 16);
|
|
|
|
#ifdef RT_BIG_ENDIAN
|
|
pDestRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxDmaIdx].AllocVa;
|
|
RxD = *pDestRxD;
|
|
pRxD = &RxD;
|
|
RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD);
|
|
#else
|
|
pRxD = (RXD_STRUC *) pRxRing->Cell[pAd->RxRing[0].RxDmaIdx].AllocVa;
|
|
#endif /* RT_BIG_ENDIAN */
|
|
hex_dump("RX RxDmaIdx Descritpro", (char *)pRxD, 16);
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%-19s%-4s%-4s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\n"
|
|
, "MAC", "AID", "PSM", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC"));
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
|
|
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%02X:%02X:%02X:%02X:%02X:%02X ",
|
|
pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
|
|
pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->Aid));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->PsMode));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi[0]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi[1]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi[2]));
|
|
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-10s", get_phymode_str(pEntry->HTPhyMode.field.MODE)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-6s", get_bw_str(pEntry->HTPhyMode.field.BW)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.MCS));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.ShortGI));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.STBC));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-10d, %d, %d\n", pEntry->FIFOCount, pEntry->DebugTxCount
|
|
, pEntry->DebugTxCount-pEntry->FIFOCount));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_diag_cond_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
UINT32 cond;
|
|
|
|
cond = simple_strtol(arg, 0, 10);
|
|
pAd->DiagStruct.diag_cond = cond;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Show_Diag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
RtmpDiagStruct *pDiag = NULL;
|
|
UCHAR i, start, stop, McsIdx, SwQNumLevel, TxDescNumLevel, que_idx;
|
|
unsigned long irqFlags;
|
|
UCHAR McsMaxIdx = MAX_MCS_SET;
|
|
#ifdef DOT11_VHT_AC
|
|
UCHAR vht_mcs_max_idx = MAX_VHT_MCS_SET;
|
|
#endif /* DOT11_VHT_AC */
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&pDiag, sizeof(RtmpDiagStruct));
|
|
if (!pDiag) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s():AllocMem failed!\n", __FUNCTION__));
|
|
return FALSE;
|
|
}
|
|
|
|
RTMP_IRQ_LOCK(&pAd->irq_lock, irqFlags);
|
|
NdisMoveMemory(pDiag, &pAd->DiagStruct, sizeof(RtmpDiagStruct));
|
|
RTMP_IRQ_UNLOCK(&pAd->irq_lock, irqFlags);
|
|
|
|
#ifdef DOT11N_SS3_SUPPORT
|
|
if (IS_RT2883(pAd) || IS_RT3883(pAd))
|
|
McsMaxIdx = 24;
|
|
#endif /* DOT11N_SS3_SUPPORT */
|
|
|
|
if (pDiag->inited == FALSE)
|
|
goto done;
|
|
|
|
start = pDiag->ArrayStartIdx;
|
|
stop = pDiag->ArrayCurIdx;
|
|
DBGPRINT(RT_DEBUG_OFF, ("Start=%d, stop=%d!\n\n", start, stop));
|
|
DBGPRINT(RT_DEBUG_OFF, (" %-12s", "Time(Sec)"));
|
|
for(i=1; i< DIAGNOSE_TIME; i++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", i));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n -------------------------------------------------------------------------------\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Tx Info:\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, (" %-12s", "TxDataCnt\n"));
|
|
for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("\tQueue[%d]:", que_idx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxDataCnt[que_idx]));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s", "TxFailCnt"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxFailCnt));
|
|
}
|
|
|
|
#ifdef DBG_TX_AGG_CNT
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s", "TxAggCnt"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxAggCnt));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
#endif /* DBG_TX_AGG_CNT */
|
|
|
|
#ifdef DBG_TXQ_DEPTH
|
|
DBGPRINT(RT_DEBUG_OFF, ("DeQueue Info:\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "DeQueueFunc Called Distribution"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-8d", pDiag->diag_info[i].deq_called));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "DeQueueRound(Per-Call) Distribution"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-8d", pDiag->diag_info[i].deq_round));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "DeQueueCount(Per-Round) Distribution"));
|
|
for (SwQNumLevel = 0 ; SwQNumLevel < 9; SwQNumLevel++)
|
|
{
|
|
if (SwQNumLevel == 8)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t>%-5d", SwQNumLevel));
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", SwQNumLevel));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].deq_cnt[SwQNumLevel]);
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s%d", "Sw-Queued TxSwQCnt for WCID ", pDiag->wcid));
|
|
for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %s[%d]\n", "Queue", que_idx));
|
|
for (SwQNumLevel = 0 ; SwQNumLevel < 9; SwQNumLevel++)
|
|
{
|
|
if (SwQNumLevel == 8)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t>%-5d", SwQNumLevel));
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", SwQNumLevel));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxSWQueCnt[que_idx][SwQNumLevel]));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, (" %-12s\n", "TxEnQFailCnt"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-7d", pDiag->diag_info[i].enq_fall_cnt[que_idx]));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %s\n", "DeQueFailedCnt:Reason NotTxResource"));
|
|
for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %s[%d]:", "Queue", que_idx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-7d", pDiag->diag_info[i].deq_fail_no_resource_cnt[que_idx]));
|
|
}
|
|
#endif /* DBG_TXQ_DEPTH */
|
|
|
|
#ifdef DBG_TX_RING_DEPTH
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "DMA-Queued TxDescCnt"));
|
|
for (que_idx = 0; que_idx < WMM_NUM_OF_AC; que_idx++) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n Queue[%d]\n", que_idx);
|
|
for(TxDescNumLevel = 0; TxDescNumLevel < 16; TxDescNumLevel++)
|
|
{
|
|
if (TxDescNumLevel == 15)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t>%-5d", TxDescNumLevel));
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", TxDescNumLevel));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxDescCnt[que_idx][TxDescNumLevel]));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
#endif /* DBG_TX_RING_DEPTH */
|
|
|
|
#ifdef MT_MAC
|
|
#ifdef DBG_PSE_DEPTH
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n",
|
|
"PSE-Queued TxPageCnt in unit of Packets (mod 13)"));
|
|
{
|
|
UCHAR pg_level;
|
|
for(pg_level = 0; pg_level < 50; pg_level++)
|
|
{
|
|
if (pg_level == 49)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t>%-5d", pg_level));
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", pg_level));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].pse_pg_cnt[pg_level]));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
}
|
|
#endif /* DBG_PSE_DEPTH */
|
|
#endif /* MT_MAC */
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
#ifdef DBG_TX_AGG_CNT
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "Tx-Agged AMPDUCnt"));
|
|
for (McsIdx =0 ; McsIdx < 16; McsIdx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", (McsIdx+1)));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%d(%d%%) ", pDiag->diag_info[i].TxAMPDUCnt[McsIdx],
|
|
pDiag->diag_info[i].TxAMPDUCnt[McsIdx] ? (pDiag->diag_info[i].TxAMPDUCnt[McsIdx] * 100 / pDiag->diag_info[i].TxAggCnt) : 0));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif /* DBG_TX_AGG_CNT */
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
#ifdef DBG_TX_MCS
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "TxMcsCnt_HT"));
|
|
for (McsIdx =0 ; McsIdx < McsMaxIdx; McsIdx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", McsIdx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxMcsCnt_HT[McsIdx]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
#ifdef DOT11_VHT_AC
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "TxMcsCnt_VHT"));
|
|
for (McsIdx =0 ; McsIdx < vht_mcs_max_idx; McsIdx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", McsIdx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].TxMcsCnt_VHT[McsIdx]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif /* DOT11_VHT_AC */
|
|
#endif /* DBG_TX_MCS */
|
|
|
|
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Rx Info\n"));
|
|
DBGPRINT(RT_DEBUG_OFF, (" %-12s", "RxDataCnt"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].RxDataCnt));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s", "RxCrcErrCnt"));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].RxCrcErrCnt));
|
|
}
|
|
|
|
#ifdef DBG_RX_MCS
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "RxMcsCnt_HT"));
|
|
for (McsIdx =0 ; McsIdx < McsMaxIdx; McsIdx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", McsIdx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].RxMcsCnt_HT[McsIdx]));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
|
|
#ifdef DOT11_VHT_AC
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n %-12s\n", "RxMcsCnt_VHT"));
|
|
for (McsIdx =0 ; McsIdx < vht_mcs_max_idx; McsIdx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-6d", McsIdx));
|
|
for (i = start; i != stop; i = (i+1) % DIAGNOSE_TIME)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-7d", pDiag->diag_info[i].RxMcsCnt_VHT[McsIdx]));
|
|
}
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#endif /* DOT11_VHT_AC */
|
|
|
|
#endif /* DBG_RX_MCS */
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n-------------\n"));
|
|
|
|
done:
|
|
os_free_mem(pAd, pDiag);
|
|
return TRUE;
|
|
}
|
|
#endif /* DBG_DIAGNOSE */
|
|
#endif /* RTMP_MAC_PCI */
|
|
|
|
|
|
INT Show_Sat_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
/* Sanity check for calculation of sucessful count */
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmitCountFromOS = %d\n"
|
|
, pAd->WlanCounters.TransmitCountFrmOs.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedFragmentCount = %lld\n"
|
|
, pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MulticastTransmittedFrameCount = %d\n"
|
|
, pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FailedCount = %d\n", pAd->WlanCounters.FailedCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RetryCount = %d\n", pAd->WlanCounters.RetryCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MultipleRetryCount = %d\n"
|
|
, pAd->WlanCounters.MultipleRetryCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RTSSuccessCount = %d\n", pAd->WlanCounters.RTSSuccessCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RTSFailureCount = %d\n", pAd->WlanCounters.RTSFailureCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ACKFailureCount = %d\n", pAd->WlanCounters.ACKFailureCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FrameDuplicateCount = %d\n", pAd->WlanCounters.FrameDuplicateCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ReceivedFragmentCount = %d\n", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MulticastReceivedFrameCount = %d\n", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Rx drop due to out of resource = %ld\n", (ULONG)pAd->Counters8023.RxNoBuffer));
|
|
#ifdef DBG
|
|
DBGPRINT(RT_DEBUG_OFF, ("RealFcsErrCount = %d\n", pAd->RalinkCounters.RealFcsErrCount.u.LowPart));
|
|
#else
|
|
DBGPRINT(RT_DEBUG_OFF, ("FCSErrorCount = %d\n", pAd->WlanCounters.FCSErrorCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FrameDuplicateCount.LowPart = %d\n", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100));
|
|
#endif
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedFrameCount = %d\n", pAd->WlanCounters.TransmittedFragmentCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("WEPUndecryptableCount = %d\n", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart));
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n===Some 11n statistics variables:\n"));
|
|
/* Some 11n statistics variables */
|
|
DBGPRINT(RT_DEBUG_OFF, ("TxAMSDUCount = %ld\n", (ULONG)pAd->RalinkCounters.TxAMSDUCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RxAMSDUCount = %ld\n", (ULONG)pAd->RalinkCounters.RxAMSDUCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedAMPDUCount = %ld\n", (ULONG)pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedMPDUsInAMPDUCount = %ld\n", (ULONG)pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedOctetsInAMPDUCount = %ld\n", (ULONG)pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MPDUInReceivedAMPDUCount = %ld\n", (ULONG)pAd->RalinkCounters.MPDUInReceivedAMPDUCount.u.LowPart));
|
|
#ifdef DOT11N_DRAFT3
|
|
DBGPRINT(RT_DEBUG_OFF, ("fAnyStaFortyIntolerant=%d\n", pAd->MacTab.fAnyStaFortyIntolerant));
|
|
#endif /* DOT11N_DRAFT3 */
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
{
|
|
int apidx;
|
|
|
|
for (apidx=0; apidx < pAd->ApCfg.BssidNum; apidx++)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("-- IF-ra%d --\n", apidx));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Packets Received = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].RxCount));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Packets Sent = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].TxCount));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Bytes Received = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].ReceivedByteCount));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Byte Sent = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].TransmittedByteCount));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Error Packets Received = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].RxErrorCount));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Drop Received Packets = %ld\n",
|
|
(ULONG)pAd->ApCfg.MBSSID[apidx].RxDropCount));
|
|
|
|
#ifdef WSC_INCLUDED
|
|
if (pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE)
|
|
{
|
|
WSC_CTRL *pWscCtrl;
|
|
|
|
pWscCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_OFF, ("WscInfo:\n"
|
|
"\tWscConfMode=%d\n"
|
|
"\tWscMode=%s\n"
|
|
"\tWscConfStatus=%d\n"
|
|
"\tWscPinCode=%d\n"
|
|
"\tWscState=0x%x\n"
|
|
"\tWscStatus=0x%x\n",
|
|
pWscCtrl->WscConfMode,
|
|
((pWscCtrl->WscMode == WSC_PIN_MODE) ? "PIN" : "PBC"),
|
|
pWscCtrl->WscConfStatus, pWscCtrl->WscEnrolleePinCode,
|
|
pWscCtrl->WscState, pWscCtrl->WscStatus))));
|
|
}
|
|
#endif /* WSC_INCLUDED */
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("-- IF-ra%d end --\n", apidx));
|
|
}
|
|
}
|
|
|
|
{
|
|
int i, j, k, maxMcs = MAX_MCS_SET -1;
|
|
PMAC_TABLE_ENTRY pEntry;
|
|
|
|
#ifdef DOT11N_SS3_SUPPORT
|
|
if (IS_RT2883(pAd) || IS_RT3883(pAd))
|
|
maxMcs = 23;
|
|
#endif /* DOT11N_SS3_SUPPORT */
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
pEntry = &pAd->MacTab.Content[i];
|
|
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x - ",
|
|
PRINT_MAC(pEntry->Addr)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d\n", (int)pEntry->Aid));
|
|
|
|
for (j=maxMcs; j>=0; j--)
|
|
{
|
|
if ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\n"
|
|
, j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j]
|
|
, pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0
|
|
, pEntry->TXMCSFailed[j]));
|
|
for(k=maxMcs; k>=0; k--)
|
|
{
|
|
if (pEntry->TXMCSAutoFallBack[j][k] != 0) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t\t\tAutoMCS[%02d]: %u (%d%%)\n", k
|
|
, pEntry->TXMCSAutoFallBack[j][k]
|
|
, (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
/* Display Tx Aggregation statistics */
|
|
DisplayTxAgg(pAd);
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
INT Show_Sat_Reset_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
/* Sanity check for calculation of sucessful count */
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedFragmentCount = %lld\n"
|
|
, pAd->WlanCounters.TransmittedFragmentCount.u.LowPart + pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MulticastTransmittedFrameCount = %d\n"
|
|
, pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FailedCount = %d\n", pAd->WlanCounters.FailedCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RetryCount = %d\n", pAd->WlanCounters.RetryCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MultipleRetryCount = %d\n", pAd->WlanCounters.MultipleRetryCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RTSSuccessCount = %d\n", pAd->WlanCounters.RTSSuccessCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("RTSFailureCount = %d\n", pAd->WlanCounters.RTSFailureCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ACKFailureCount = %d\n", pAd->WlanCounters.ACKFailureCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FrameDuplicateCount = %d\n", pAd->WlanCounters.FrameDuplicateCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("ReceivedFragmentCount = %d\n", pAd->WlanCounters.ReceivedFragmentCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("MulticastReceivedFrameCount = %d\n", pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Rx drop due to out of resource = %ld\n", (ULONG)pAd->Counters8023.RxNoBuffer));
|
|
#ifdef DBG
|
|
DBGPRINT(RT_DEBUG_OFF, ("RealFcsErrCount = %d\n", pAd->RalinkCounters.RealFcsErrCount.u.LowPart));
|
|
#else
|
|
DBGPRINT(RT_DEBUG_OFF, ("FCSErrorCount = %d\n", pAd->WlanCounters.FCSErrorCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("FrameDuplicateCount.LowPart = %d\n", pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100));
|
|
#endif
|
|
DBGPRINT(RT_DEBUG_OFF, ("TransmittedFrameCount = %d\n", pAd->WlanCounters.TransmittedFrameCount.u.LowPart));
|
|
DBGPRINT(RT_DEBUG_OFF, ("WEPUndecryptableCount = %d\n", pAd->WlanCounters.WEPUndecryptableCount.u.LowPart));
|
|
|
|
pAd->WlanCounters.TransmittedFragmentCount.u.LowPart = 0;
|
|
pAd->WlanCounters.MulticastTransmittedFrameCount.u.LowPart = 0;
|
|
pAd->WlanCounters.FailedCount.u.LowPart = 0;
|
|
pAd->WlanCounters.RetryCount.u.LowPart = 0;
|
|
pAd->WlanCounters.MultipleRetryCount.u.LowPart = 0;
|
|
pAd->WlanCounters.RTSSuccessCount.u.LowPart = 0;
|
|
pAd->WlanCounters.RTSFailureCount.u.LowPart = 0;
|
|
pAd->WlanCounters.ACKFailureCount.u.LowPart = 0;
|
|
pAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;
|
|
pAd->WlanCounters.ReceivedFragmentCount.u.LowPart = 0;
|
|
pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart = 0;
|
|
pAd->Counters8023.RxNoBuffer = 0;
|
|
#ifdef DBG
|
|
pAd->RalinkCounters.RealFcsErrCount.u.LowPart = 0;
|
|
#else
|
|
pAd->WlanCounters.FCSErrorCount.u.LowPart = 0;
|
|
pAd->WlanCounters.FrameDuplicateCount.u.LowPart = 0;
|
|
#endif
|
|
|
|
pAd->WlanCounters.TransmittedFrameCount.u.LowPart = 0;
|
|
pAd->WlanCounters.WEPUndecryptableCount.u.LowPart = 0;
|
|
|
|
{
|
|
int i, j, k, maxMcs = 15;
|
|
PMAC_TABLE_ENTRY pEntry;
|
|
|
|
#ifdef DOT11N_SS3_SUPPORT
|
|
if (IS_RT2883(pAd) || IS_RT3883(pAd))
|
|
maxMcs = 23;
|
|
#endif /* DOT11N_SS3_SUPPORT */
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
pEntry = &pAd->MacTab.Content[i];
|
|
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC))
|
|
{
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%02X:%02X:%02X:%02X:%02X:%02X - ",
|
|
pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
|
|
pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%-4d\n", (int)pEntry->Aid));
|
|
|
|
for (j = maxMcs; j >= 0; j--)
|
|
{
|
|
if ((pEntry->TXMCSExpected[j] != 0) || (pEntry->TXMCSFailed[j] !=0))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("MCS[%02d]: Expected %u, Successful %u (%d%%), Failed %u\n"
|
|
, j, pEntry->TXMCSExpected[j], pEntry->TXMCSSuccessful[j]
|
|
, pEntry->TXMCSExpected[j] ? (100*pEntry->TXMCSSuccessful[j])/pEntry->TXMCSExpected[j] : 0
|
|
, pEntry->TXMCSFailed[j]));
|
|
for(k = maxMcs; k >= 0; k--)
|
|
{
|
|
if (pEntry->TXMCSAutoFallBack[j][k] != 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t\t\tAutoMCS[%02d]: %u (%d%%)\n"
|
|
, k, pEntry->TXMCSAutoFallBack[j][k]
|
|
, (100*pEntry->TXMCSAutoFallBack[j][k])/pEntry->TXMCSExpected[j]));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (j = 0; j < (maxMcs + 1); j++)
|
|
{
|
|
pEntry->TXMCSExpected[j] = 0;
|
|
pEntry->TXMCSSuccessful[j] = 0;
|
|
pEntry->TXMCSFailed[j] = 0;
|
|
for(k = maxMcs; k >= 0; k--)
|
|
{
|
|
pEntry->TXMCSAutoFallBack[j][k] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#ifdef DOT11_N_SUPPORT
|
|
/* Display Tx Aggregation statistics */
|
|
DisplayTxAgg(pAd);
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef MAT_SUPPORT
|
|
INT Show_MATTable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
extern VOID dumpIPMacTb(MAT_STRUCT *pMatCfg, int index);
|
|
extern NDIS_STATUS dumpSesMacTb(MAT_STRUCT *pMatCfg, int hashIdx);
|
|
extern NDIS_STATUS dumpUidMacTb(MAT_STRUCT *pMatCfg, int hashIdx);
|
|
extern NDIS_STATUS dumpIPv6MacTb(MAT_STRUCT *pMatCfg, int hashIdx);
|
|
|
|
dumpIPMacTb(&pAd->MatCfg, -1);
|
|
dumpSesMacTb(&pAd->MatCfg, -1);
|
|
dumpUidMacTb(&pAd->MatCfg, -1);
|
|
dumpIPv6MacTb(&pAd->MatCfg, -1);
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("Default BroadCast Address=%02x:%02x:%02x:%02x:%02x:%02x!\n",
|
|
BROADCAST_ADDR[0], BROADCAST_ADDR[1], BROADCAST_ADDR[2],
|
|
BROADCAST_ADDR[3], BROADCAST_ADDR[4], BROADCAST_ADDR[5]));
|
|
return TRUE;
|
|
}
|
|
#endif /* MAT_SUPPORT */
|
|
|
|
|
|
#ifdef DOT1X_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
It only shall be queried by 802.1x daemon for querying radius configuration.
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlQueryRadiusConf(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
UCHAR apidx, srv_idx, keyidx, KeyLen = 0;
|
|
UCHAR *mpool;
|
|
PDOT1X_CMM_CONF pConf;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlQueryRadiusConf==>\n"));
|
|
|
|
/* Allocate memory */
|
|
os_alloc_mem(NULL, (PUCHAR *)&mpool, sizeof(DOT1X_CMM_CONF));
|
|
if (mpool == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("!!!%s: out of resource!!!\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
NdisZeroMemory(mpool, sizeof(DOT1X_CMM_CONF));
|
|
|
|
pConf = (PDOT1X_CMM_CONF)mpool;
|
|
|
|
/* get MBSS number */
|
|
pConf->mbss_num = pAd->ApCfg.BssidNum;
|
|
|
|
/* get own ip address */
|
|
pConf->own_ip_addr = pAd->ApCfg.own_ip_addr;
|
|
|
|
/* get retry interval */
|
|
pConf->retry_interval = pAd->ApCfg.retry_interval;
|
|
|
|
/* get session timeout interval */
|
|
pConf->session_timeout_interval = pAd->ApCfg.session_timeout_interval;
|
|
|
|
/* Get the quiet interval */
|
|
pConf->quiet_interval = pAd->ApCfg.quiet_interval;
|
|
|
|
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)
|
|
{
|
|
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
PDOT1X_BSS_INFO p1xBssInfo = &pConf->Dot1xBssInfo[apidx];
|
|
|
|
p1xBssInfo->radius_srv_num = pMbss->radius_srv_num;
|
|
|
|
/* prepare radius ip, port and key */
|
|
for (srv_idx = 0; srv_idx < pMbss->radius_srv_num; srv_idx++)
|
|
{
|
|
if (pMbss->radius_srv_info[srv_idx].radius_ip != 0)
|
|
{
|
|
p1xBssInfo->radius_srv_info[srv_idx].radius_ip = pMbss->radius_srv_info[srv_idx].radius_ip;
|
|
p1xBssInfo->radius_srv_info[srv_idx].radius_port = pMbss->radius_srv_info[srv_idx].radius_port;
|
|
p1xBssInfo->radius_srv_info[srv_idx].radius_key_len = pMbss->radius_srv_info[srv_idx].radius_key_len;
|
|
if (pMbss->radius_srv_info[srv_idx].radius_key_len > 0)
|
|
{
|
|
NdisMoveMemory(p1xBssInfo->radius_srv_info[srv_idx].radius_key,
|
|
pMbss->radius_srv_info[srv_idx].radius_key,
|
|
pMbss->radius_srv_info[srv_idx].radius_key_len);
|
|
}
|
|
}
|
|
}
|
|
|
|
p1xBssInfo->ieee8021xWEP = (pMbss->wdev.IEEE8021X) ? 1 : 0;
|
|
|
|
if (p1xBssInfo->ieee8021xWEP)
|
|
{
|
|
/* Default Key index, length and material */
|
|
keyidx = pMbss->wdev.DefaultKeyId;
|
|
p1xBssInfo->key_index = keyidx;
|
|
|
|
/* Determine if the key is valid. */
|
|
KeyLen = pAd->SharedKey[apidx][keyidx].KeyLen;
|
|
if (KeyLen == 5 || KeyLen == 13)
|
|
{
|
|
p1xBssInfo->key_length = KeyLen;
|
|
NdisMoveMemory(p1xBssInfo->key_material, pAd->SharedKey[apidx][keyidx].Key, KeyLen);
|
|
}
|
|
}
|
|
|
|
/* Get NAS-ID per BSS */
|
|
if (pMbss->NasIdLen > 0)
|
|
{
|
|
p1xBssInfo->nasId_len = pMbss->NasIdLen;
|
|
NdisMoveMemory(p1xBssInfo->nasId, pMbss->NasId, pMbss->NasIdLen);
|
|
}
|
|
|
|
/* get EAPifname */
|
|
if (pAd->ApCfg.EAPifname_len[apidx] > 0)
|
|
{
|
|
pConf->EAPifname_len[apidx] = pAd->ApCfg.EAPifname_len[apidx];
|
|
NdisMoveMemory(pConf->EAPifname[apidx], pAd->ApCfg.EAPifname[apidx], pAd->ApCfg.EAPifname_len[apidx]);
|
|
}
|
|
|
|
/* get PreAuthifname */
|
|
if (pAd->ApCfg.PreAuthifname_len[apidx] > 0)
|
|
{
|
|
pConf->PreAuthifname_len[apidx] = pAd->ApCfg.PreAuthifname_len[apidx];
|
|
NdisMoveMemory(pConf->PreAuthifname[apidx], pAd->ApCfg.PreAuthifname[apidx], pAd->ApCfg.PreAuthifname_len[apidx]);
|
|
}
|
|
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(DOT1X_CMM_CONF);
|
|
if (copy_to_user(wrq->u.data.pointer, pConf, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
UI should not call this function, it only used by 802.1x daemon
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlRadiusData(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("RTMPIoctlRadiusData, IF(ra%d)\n", pObj->ioctl_if));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
if (pObj->ioctl_if > pAd->ApCfg.BssidNum)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s():Invalid MBSSID index(%d)!\n",
|
|
__FUNCTION__, pObj->ioctl_if));
|
|
return;
|
|
}
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
if ((wdev->AuthMode == Ndis802_11AuthModeWPA)
|
|
|| (wdev->AuthMode == Ndis802_11AuthModeWPA2)
|
|
|| (wdev->AuthMode == Ndis802_11AuthModeWPA1WPA2)
|
|
|| (wdev->IEEE8021X == TRUE))
|
|
WpaSend(pAd, (PUCHAR)wrq->u.data.pointer, wrq->u.data.length);
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
UI should not call this function, it only used by 802.1x daemon
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlAddWPAKey(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
NDIS_AP_802_11_KEY *pKey;
|
|
ULONG KeyIdx;
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
UCHAR apidx;
|
|
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
apidx = (UCHAR) pObj->ioctl_if;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("RTMPIoctlAddWPAKey-IF(ra%d)\n", apidx));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
pKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;
|
|
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA)
|
|
{
|
|
if ((pKey->KeyLength == 32) || (pKey->KeyLength == 64))
|
|
{
|
|
if ((pEntry = MacTableLookup(pAd, pKey->addr)) != NULL)
|
|
{
|
|
INT k_offset = 0;
|
|
|
|
#ifdef DOT11R_FT_SUPPORT
|
|
/* The key shall be the second 256 bits of the MSK. */
|
|
if (IS_FT_RSN_STA(pEntry) && pKey->KeyLength == 64)
|
|
k_offset = 32;
|
|
#endif /* DOT11R_FT_SUPPORT */
|
|
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].PMK, pKey->KeyMaterial + k_offset, 32);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlAddWPAKey-IF(ra%d) : Add PMK=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x....\n", apidx,
|
|
pAd->ApCfg.MBSSID[apidx].PMK[0],pAd->ApCfg.MBSSID[apidx].PMK[1],pAd->ApCfg.MBSSID[apidx].PMK[2],pAd->ApCfg.MBSSID[apidx].PMK[3],
|
|
pAd->ApCfg.MBSSID[apidx].PMK[4],pAd->ApCfg.MBSSID[apidx].PMK[5],pAd->ApCfg.MBSSID[apidx].PMK[6],pAd->ApCfg.MBSSID[apidx].PMK[7]));
|
|
}
|
|
}
|
|
}
|
|
else /* Old WEP stuff */
|
|
{
|
|
UCHAR CipherAlg;
|
|
//PUCHAR Key;
|
|
|
|
if(pKey->KeyLength > 16)
|
|
return;
|
|
|
|
KeyIdx = pKey->KeyIndex & 0x0fffffff;
|
|
|
|
if (KeyIdx < 4)
|
|
{
|
|
/* it is a shared key */
|
|
if (pKey->KeyIndex & 0x80000000)
|
|
{
|
|
UINT8 Wcid;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlAddWPAKey-IF(ra%d) : Set Group Key\n", apidx));
|
|
|
|
/* Default key for tx (shared key) */
|
|
pAd->ApCfg.MBSSID[apidx].wdev.DefaultKeyId = (UCHAR) KeyIdx;
|
|
|
|
/* set key material and key length */
|
|
if (pKey->KeyLength > 16)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlAddWPAKey-IF(ra%d) : Key length too long %d\n", apidx, pKey->KeyLength));
|
|
pKey->KeyLength = 16;
|
|
}
|
|
pAd->SharedKey[apidx][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;
|
|
NdisMoveMemory(pAd->SharedKey[apidx][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);
|
|
|
|
/* Set Ciper type */
|
|
if (pKey->KeyLength == 5)
|
|
pAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP64;
|
|
else
|
|
pAd->SharedKey[apidx][KeyIdx].CipherAlg = CIPHER_WEP128;
|
|
|
|
CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;
|
|
//Key = pAd->SharedKey[apidx][KeyIdx].Key;
|
|
|
|
/* Set Group key material to Asic */
|
|
AsicAddSharedKeyEntry(pAd, apidx, (UINT8)KeyIdx, &pAd->SharedKey[apidx][KeyIdx]);
|
|
|
|
/* Get a specific WCID to record this MBSS key attribute */
|
|
GET_GroupKey_WCID(pAd, Wcid, apidx);
|
|
|
|
RTMPSetWcidSecurityInfo(pAd, apidx,(UINT8)KeyIdx,
|
|
CipherAlg, Wcid, SHAREDKEYTABLE);
|
|
#ifdef MT_MAC
|
|
if (pAd->chipCap.hif_type == HIF_MT)
|
|
CmdProcAddRemoveKey(pAd, 0, apidx, KeyIdx, Wcid, SHAREDKEYTABLE, &pAd->SharedKey[apidx][KeyIdx], BROADCAST_ADDR);
|
|
#endif
|
|
}
|
|
else /* For Pairwise key setting */
|
|
{
|
|
pEntry = MacTableLookup(pAd, pKey->addr);
|
|
if (pEntry)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlAddWPAKey-IF(ra%d) : Set Pair-wise Key\n", apidx));
|
|
|
|
/* set key material and key length */
|
|
pEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength;
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);
|
|
|
|
/* set Cipher type */
|
|
if (pKey->KeyLength == 5)
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;
|
|
else
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;
|
|
|
|
/* Add Pair-wise key to Asic */
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
/* update WCID attribute table and IVEIV table for this entry */
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
pEntry->func_tb_idx,
|
|
(UINT8)KeyIdx,
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry->wcid,
|
|
PAIRWISEKEYTABLE);
|
|
#ifdef MT_MAC
|
|
if (pAd->chipCap.hif_type == HIF_MT)
|
|
CmdProcAddRemoveKey(pAd, 0, pEntry->func_tb_idx, KeyIdx, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr);
|
|
#endif
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
UI should not call this function, it only used by 802.1x daemon
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlAddPMKIDCache(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
UCHAR apidx;
|
|
NDIS_AP_802_11_KEY *pKey;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
apidx = (UCHAR) pObj->ioctl_if;
|
|
|
|
pKey = (PNDIS_AP_802_11_KEY) wrq->u.data.pointer;
|
|
|
|
if (pAd->ApCfg.MBSSID[apidx].wdev.AuthMode >= Ndis802_11AuthModeWPA2)
|
|
{
|
|
if(pKey->KeyLength == 32)
|
|
{
|
|
UCHAR digest[80], PMK_key[20], macaddr[MAC_ADDR_LEN];
|
|
|
|
/* Calculate PMKID */
|
|
#if 1
|
|
NdisMoveMemory(&PMK_key[0], "PMK Name", 8);
|
|
NdisMoveMemory(&PMK_key[8], pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN);
|
|
NdisMoveMemory(&PMK_key[14], pKey->addr, MAC_ADDR_LEN);
|
|
RT_HMAC_SHA1(pKey->KeyMaterial, PMK_LEN, PMK_key, 20, digest, SHA1_DIGEST_SIZE);
|
|
#else
|
|
/* Todo */
|
|
RTMPDerivePMKID(pAd->ApCfg.MBSSID[apidx].Bssid,
|
|
pKey->addr,
|
|
pKey->KeyMaterial, IN PUINT8 pAkm_oui, OUT PUINT8 pPMKID);
|
|
#endif
|
|
|
|
NdisMoveMemory(macaddr, pKey->addr, MAC_ADDR_LEN);
|
|
RTMPAddPMKIDCache(pAd, apidx, macaddr, digest, pKey->KeyMaterial);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPA2(pre-auth):(%02x:%02x:%02x:%02x:%02x:%02x)Calc PMKID=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
|
pKey->addr[0],pKey->addr[1],pKey->addr[2],pKey->addr[3],pKey->addr[4],pKey->addr[5],digest[0],digest[1],digest[2],digest[3],digest[4],digest[5]));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("PMK =%02x:%02x:%02x:%02x-%02x:%02x:%02x:%02x\n",pKey->KeyMaterial[0],pKey->KeyMaterial[1],
|
|
pKey->KeyMaterial[2],pKey->KeyMaterial[3],pKey->KeyMaterial[4],pKey->KeyMaterial[5],pKey->KeyMaterial[6],pKey->KeyMaterial[7]));
|
|
}
|
|
else
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Set::RT_OID_802_11_WPA2_ADD_PMKID_CACHE ERROR or is wep key \n"));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPIoctlAddPMKIDCache\n"));
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
UI should not call this function, it only used by 802.1x daemon
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlStaticWepCopy(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
UCHAR MacAddr[MAC_ADDR_LEN];
|
|
UCHAR apidx;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
apidx = (UCHAR) pObj->ioctl_if;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlStaticWepCopy-IF(ra%d)\n", apidx));
|
|
|
|
if (wrq->u.data.length != sizeof(MacAddr))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("RTMPIoctlStaticWepCopy: the length isn't match (%d)\n", wrq->u.data.length));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
//UINT32 len;
|
|
|
|
/*len = */copy_from_user(&MacAddr, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, MacAddr);
|
|
if (!pEntry)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("RTMPIoctlStaticWepCopy: the mac address isn't match\n"));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
UCHAR KeyIdx;
|
|
|
|
KeyIdx = pAd->ApCfg.MBSSID[apidx].wdev.DefaultKeyId;
|
|
|
|
/* need to copy the default shared-key to pairwise key table for this entry in 802.1x mode */
|
|
if (pAd->SharedKey[apidx][KeyIdx].KeyLen == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("ERROR: Can not get Default shared-key (index-%d)\n", KeyIdx));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
pEntry->PairwiseKey.KeyLen = pAd->SharedKey[apidx][KeyIdx].KeyLen;
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[apidx][KeyIdx].Key, pEntry->PairwiseKey.KeyLen);
|
|
pEntry->PairwiseKey.CipherAlg = pAd->SharedKey[apidx][KeyIdx].CipherAlg;
|
|
|
|
/* Add Pair-wise key to Asic */
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
/* update WCID attribute table and IVEIV table for this entry */
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
pEntry->func_tb_idx,
|
|
(UINT8)KeyIdx,
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry->wcid,
|
|
PAIRWISEKEYTABLE);
|
|
}
|
|
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
UI should not call this function, it only used by 802.1x daemon
|
|
Arguments:
|
|
pAd Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlSetIdleTimeout(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
PDOT1X_IDLE_TIMEOUT pIdleTime;
|
|
|
|
if (wrq->u.data.length != sizeof(DOT1X_IDLE_TIMEOUT))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s : the length is mis-match\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
|
|
pIdleTime = (PDOT1X_IDLE_TIMEOUT)wrq->u.data.pointer;
|
|
|
|
if ((pEntry = MacTableLookup(pAd, pIdleTime->StaAddr)) == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s : the entry is empty\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
pEntry->NoDataIdleCount = 0;
|
|
// TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry!
|
|
pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0;
|
|
|
|
pEntry->StaIdleTimeout = pIdleTime->idle_timeout;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s : Update Idle-Timeout(%d) from dot1x daemon\n",
|
|
__FUNCTION__, pEntry->StaIdleTimeout));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
VOID RTMPIoctlQueryStaAid(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
DOT1X_QUERY_STA_AID macBuf;
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
|
|
if (wrq->u.data.length != sizeof(DOT1X_QUERY_STA_AID))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s : the length is mis-match\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
copy_from_user(&macBuf, wrq->u.data.pointer, wrq->u.data.length);
|
|
pEntry = MacTableLookup(pAd, macBuf.StaAddr);
|
|
|
|
if (pEntry != NULL)
|
|
{
|
|
wrq->u.data.length = sizeof(DOT1X_QUERY_STA_AID);
|
|
macBuf.aid = pEntry->Aid;
|
|
if (copy_to_user(wrq->u.data.pointer, &macBuf, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_DOT1X_QUERY_STA_AID(%02x:%02x:%02x:%02x:%02x:%02x, AID=%d)\n",
|
|
PRINT_MAC(macBuf.StaAddr), macBuf.aid));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_DOT1X_QUERY_STA_AID(%02x:%02x:%02x:%02x:%02x:%02x, Not Found)\n",
|
|
PRINT_MAC(macBuf.StaAddr)));
|
|
}
|
|
}
|
|
}
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
|
|
#if defined(DBG) ||(defined(BB_SOC)&&defined(CONFIG_ATE))
|
|
|
|
#ifdef RT65xx
|
|
VOID RTMPAPIoctlBBP32(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
RTMP_STRING *this_char, *value, *arg, *ptr;
|
|
UINT32 regBBP = 0;
|
|
RTMP_STRING *mpool, *msg;
|
|
INT bbpId;
|
|
LONG bbpValue;
|
|
BOOLEAN bIsPrintAllBBP = FALSE, bAllowDump, bCopyMsg;
|
|
INT argLen;
|
|
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlBBP32()\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(MAX_BBP_MSG_SIZE * 2 +256+12));
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
NdisZeroMemory(mpool, MAX_BBP_MSG_SIZE * 2 +256+12);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
arg = (RTMP_STRING *)((ULONG)(msg+MAX_BBP_MSG_SIZE * 2+3) & (ULONG)~0x03);
|
|
|
|
bAllowDump = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NODUMPMSG) == RTPRIV_IOCTL_FLAG_NODUMPMSG) ? FALSE : TRUE;
|
|
bCopyMsg = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NOSPACE) == RTPRIV_IOCTL_FLAG_NOSPACE) ? FALSE : TRUE;
|
|
argLen = strlen((char *)(wrq->u.data.pointer));
|
|
|
|
if (argLen > 0)
|
|
{
|
|
NdisMoveMemory(arg, wrq->u.data.pointer, (argLen > 255) ? 255 : argLen);
|
|
ptr = arg;
|
|
sprintf(msg, "\n");
|
|
/* Parsing Read or Write */
|
|
while ((this_char = strsep((char **)&ptr, ",")) != NULL)
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
if ((value = strchr(this_char, '=')) != NULL)
|
|
*value++ = 0;
|
|
|
|
if (!value || !*value)
|
|
{
|
|
/*Read */
|
|
if (sscanf(this_char, "%x", &(bbpId)) == 1)
|
|
{
|
|
if ((bbpId <= 0x2fff) && (bbpId >= 0x2000))
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command bbp shall read BBP register directly for dubug. */
|
|
RTMP_BBP_IO_READ32(pAd, bbpId, ®BBP);
|
|
sprintf(msg+strlen(msg), "BBP[0x%04x]:%08x \n", bbpId, regBBP);
|
|
}
|
|
else
|
|
{
|
|
/*Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/*Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ /* Write */
|
|
if ((sscanf(this_char, "%x", &(bbpId)) == 1) && (sscanf(value, "%lx", &(bbpValue)) == 1))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("bbpID=%04x, value=0x%lx\n", bbpId, bbpValue));
|
|
if ((bbpId <= 0x2fff) && (bbpId >= 0x2000))
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command bbp shall read/write BBP register directly for dubug. */
|
|
RTMP_BBP_IO_WRITE32(pAd, bbpId, bbpValue);
|
|
/*Read it back for showing */
|
|
RTMP_BBP_IO_READ32(pAd, bbpId, ®BBP);
|
|
sprintf(msg+strlen(msg), "BBP[0x%04x]:%08x\n", bbpId, regBBP);
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
bIsPrintAllBBP = TRUE;
|
|
|
|
if (bIsPrintAllBBP)
|
|
{
|
|
static RTMP_REG_PAIR bbp_regs[]={
|
|
{CORE_R0, CORE_R44},
|
|
{IBI_R0, IBI_R15},
|
|
{AGC1_R0, AGC1_R63},
|
|
{TXC_R0, TXC_R1},
|
|
{RXC_R0, RXC_R9},
|
|
{TXO_R0, TXO_R13},
|
|
{TXBE_R0, TXBE_R52},
|
|
{RXFE_R0, RXFE_R17},
|
|
{RXO_R0, RXO_R63},
|
|
{DFS_R0, DFS_R37},
|
|
{TR_R0, TR_R9},
|
|
{CAL_R0, CAL_R62},
|
|
{DSC_R0, DSC_R10},
|
|
{PFMU_R0, PFMU_R57}
|
|
};
|
|
UINT32 reg, i;
|
|
|
|
memset(msg, 0x00, MAX_BBP_MSG_SIZE * 2);
|
|
sprintf(msg, "\n");
|
|
for (i = 0; i < sizeof(bbp_regs) / sizeof(RTMP_REG_PAIR); i++)
|
|
{
|
|
for (reg = bbp_regs[i].Register; reg <= bbp_regs[i].Value; reg += 4)
|
|
{
|
|
RTMP_BBP_IO_READ32(pAd, reg, ®BBP);
|
|
if (strlen(msg) >= (MAX_BBP_MSG_SIZE * 2 - 25))
|
|
break;
|
|
sprintf(msg+strlen(msg), "BBP[0x%04x]:%08x\n", reg, regBBP);
|
|
if (bbpId%5 == 4)
|
|
sprintf(msg+strlen(msg), "\n");
|
|
}
|
|
}
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_INFO, ("copy to user:msg[len=%d]=%s\n", strlen(msg), msg));
|
|
}
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
|
|
if (!bAllowDump)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
if (!bAllowDump)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlBBP\n\n"));
|
|
}
|
|
#endif /* RT65xx */
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Read / Write BBP
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 bbp ==> read all BBP
|
|
2.) iwpriv ra0 bbp 1 ==> read BBP where RegID=1
|
|
3.) iwpriv ra0 bbp 1=10 ==> write BBP R1=0x10
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPAPIoctlBBP(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
#ifdef RTMP_BBP
|
|
RTMP_STRING *this_char, *value;
|
|
UCHAR regBBP = 0;
|
|
RTMP_STRING *mpool, *msg; /*msg[2048]; */
|
|
RTMP_STRING *arg; /*arg[255]; */
|
|
RTMP_STRING *ptr;
|
|
INT bbpId;
|
|
LONG bbpValue;
|
|
BOOLEAN bIsPrintAllBBP = FALSE, bAllowDump, bCopyMsg;
|
|
INT argLen;
|
|
#endif /* RTMP_BBP */
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlBBP\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef RT65xx
|
|
if (IS_RT65XX(pAdapter)) {
|
|
RTMPAPIoctlBBP32(pAdapter, wrq);
|
|
return;
|
|
}
|
|
#endif /* RT65xx */
|
|
|
|
#ifdef RTMP_BBP
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(MAX_BBP_MSG_SIZE+256+12));
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
NdisZeroMemory(mpool, MAX_BBP_MSG_SIZE+256+12);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
arg = (RTMP_STRING *)((ULONG)(msg+MAX_BBP_MSG_SIZE+3) & (ULONG)~0x03);
|
|
|
|
bAllowDump = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NODUMPMSG) == RTPRIV_IOCTL_FLAG_NODUMPMSG) ? FALSE : TRUE;
|
|
bCopyMsg = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_NOSPACE) == RTPRIV_IOCTL_FLAG_NOSPACE) ? FALSE : TRUE;
|
|
argLen = strlen((char *)(wrq->u.data.pointer));
|
|
|
|
#if 0
|
|
if ((wrq->u.data.length > 1) /*No parameters. */
|
|
#ifdef VXWORKS
|
|
&& (!(wrq->u.data.length == 4096 && bAllowDump))
|
|
#endif /* VXWORKS */
|
|
)
|
|
#endif
|
|
|
|
if (argLen > 0)
|
|
{
|
|
NdisMoveMemory(arg, wrq->u.data.pointer, (argLen > 255) ? 255 : argLen);
|
|
ptr = arg;
|
|
sprintf(msg, "\n");
|
|
/* Parsing Read or Write */
|
|
while ((this_char = strsep((char **)&ptr, ",")) != NULL)
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
if ((value = strchr(this_char, '=')) != NULL)
|
|
*value++ = 0;
|
|
|
|
if (!value || !*value)
|
|
{ /*Read */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s, value=%s\n", this_char, value));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (sscanf(this_char, "%d", &(bbpId)) == 1)
|
|
{
|
|
if (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access BBP directly.
|
|
For RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", bbpId, regBBP);
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command bbp shall read BBP register directly for dubug. */
|
|
BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02x]:%02X ", bbpId, bbpId, regBBP);
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
{
|
|
/*Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/*Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ /* Write */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s, value=%s\n", this_char, value));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if ((sscanf(this_char, "%d", &(bbpId)) == 1) && (sscanf(value, "%lx", &(bbpValue)) == 1))
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("bbpID=%02d, value=0x%lx\n", bbpId, bbpValue));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (bbpId <= pAdapter->chipCap.MaxNumOfBbpId)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access BBP directly.
|
|
For RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);
|
|
|
|
/*Read it back for showing */
|
|
ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", bbpId, regBBP);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command bbp shall read/write BBP register directly for dubug. */
|
|
BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);
|
|
/*Read it back for showing */
|
|
BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X\n", bbpId, bbpId, regBBP);
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all bbp */
|
|
bIsPrintAllBBP = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
bIsPrintAllBBP = TRUE;
|
|
|
|
if (bIsPrintAllBBP)
|
|
{
|
|
memset(msg, 0x00, MAX_BBP_MSG_SIZE);
|
|
sprintf(msg, "\n");
|
|
for (bbpId = 0; bbpId <= pAdapter->chipCap.MaxNumOfBbpId; bbpId++)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access BBP directly.
|
|
For RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", bbpId, regBBP);
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
#ifdef __ECOS
|
|
BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
DBGPRINT(RT_DEBUG_OFF, ("R%02d[0x%02X]:%02X "
|
|
, bbpId, bbpId, regBBP));
|
|
if ((bbpId%5 == 4) || (bbpId == pAdapter->chipCap.MaxNumOfBbpId))
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
#else
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command bbp shall read/write BBP register directly for dubug. */
|
|
BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X ", bbpId, bbpId, regBBP);
|
|
if (bbpId%5 == 4)
|
|
sprintf(msg+strlen(msg), "\n");
|
|
#endif /* __ECOS */
|
|
}
|
|
}
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_INFO, ("copy to user:msg[len=%d]=%s\n", strlen(msg), msg));
|
|
}
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#if 0
|
|
if (bCopyMsg)
|
|
{
|
|
/* Copy the information into the user buffer */
|
|
if (wrq->u.data.length <= strlen(msg)) {
|
|
wrq->u.data.length = strlen(msg);
|
|
Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
}
|
|
}
|
|
#endif
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
|
|
if (!bAllowDump)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Dump BBP msg[%d]=\n", (UINT32)strlen(msg)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
if (!bAllowDump)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlBBP\n\n"));
|
|
#endif /* RTMP_BBP */
|
|
}
|
|
|
|
|
|
#ifdef MT76x2
|
|
VOID RTMPAPIoctlRF_mt76x2(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
CHAR *value;
|
|
UINT regRF = 0;
|
|
CHAR *mpool, *msg; /*msg[2048]; */
|
|
BOOLEAN bIsPrintAllRF = TRUE;
|
|
UINT rfidx =0, offset = 0;
|
|
INT memLen = sizeof(CHAR) * 9000; //(2048+256+12);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("==>RTMPIoctlRF\n"));
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, memLen);
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
NdisZeroMemory(mpool, memLen);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
|
|
if (bIsPrintAllRF)
|
|
{
|
|
RTMPZeroMemory(msg, memLen);
|
|
sprintf(msg, "\n");
|
|
for (rfidx = 0; rfidx <= 1; rfidx++)
|
|
{
|
|
for (offset = 0; offset <= 0x3ff; offset+=4)
|
|
{
|
|
mt76x2_rf_read(pAd, rfidx, offset, ®RF);
|
|
sprintf(msg+strlen(msg), "%d %03x = %08X\n", rfidx, offset, regRF);
|
|
}
|
|
offset = 0xfff;
|
|
mt76x2_rf_read(pAd, rfidx, offset, ®RF);
|
|
sprintf(msg+strlen(msg), "%d %03x = %08X\n", rfidx, offset, regRF);
|
|
}
|
|
RtmpDrvAllRFPrint(NULL, msg, strlen(msg));
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(msg)));
|
|
/* Copy the information into the user buffer */
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen("Dump to RFDump.txt");
|
|
if (copy_to_user(wrq->u.data.pointer, "Dump to RFDump.txt", wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n\n"));
|
|
}
|
|
#endif /* MT76x2 */
|
|
|
|
//CFG TODO
|
|
#ifndef RT_CFG80211_P2P_SUPPORT
|
|
#if defined (MT7603) || defined (MT7628)
|
|
VOID RTMPAPIoctlRF_mt7603(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
UINT32 regRF = 0;
|
|
CHAR *mpool, *msg;
|
|
BOOLEAN bIsPrintAllRF = TRUE;
|
|
UINT offset = 0;
|
|
INT memLen = sizeof(CHAR) * 50000;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("==>RTMPIoctlRF\n"));
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, memLen);
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
NdisZeroMemory(mpool, memLen);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
|
|
if (bIsPrintAllRF)
|
|
{
|
|
RTMPZeroMemory(msg, memLen);
|
|
sprintf(msg, "WF0 : \n");
|
|
for (offset = 0; offset < 0x1000; offset+=4)
|
|
{
|
|
CmdRFRegAccessRead(pAd, (UINT32)0, (UINT32)offset, (UINT32 *)®RF);
|
|
sprintf(msg+strlen(msg), "0x%08X = 0x%08X\n", offset, regRF);
|
|
}
|
|
|
|
sprintf(msg+strlen(msg), "\n");
|
|
sprintf(msg+strlen(msg), "WF1 : \n");
|
|
for (offset = 0; offset < 0x1000; offset+=4)
|
|
{
|
|
CmdRFRegAccessRead(pAd, (UINT32)1, (UINT32)offset, (UINT32 *)®RF);
|
|
sprintf(msg+strlen(msg), "0x%08X = 0x%08X\n", offset, regRF);
|
|
}
|
|
|
|
RtmpDrvAllRFPrint(NULL, msg, strlen(msg));
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(msg)));
|
|
/* Copy the information into the user buffer */
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen("Dump to RFDump.txt");
|
|
if (copy_to_user(wrq->u.data.pointer, "Dump to RFDump.txt", wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n\n"));
|
|
}
|
|
#endif /* MT7603 */
|
|
#endif /* RT_CFG80211_P2P_SUPPORT */
|
|
|
|
#ifdef RLT_RF
|
|
VOID RTMPAPIoctlRF_rlt(RTMP_ADAPTER *pAdapter, RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
UCHAR regRF = 0;
|
|
RTMP_STRING *mpool, *msg;
|
|
RTMP_STRING *arg;
|
|
INT rfId, maxRFIdx, bank_Id;
|
|
BOOLEAN bIsPrintAllRF = TRUE, bFromUI;
|
|
INT memLen = sizeof(CHAR) * (2048+256+12);
|
|
INT argLen;
|
|
|
|
maxRFIdx = pAdapter->chipCap.MaxNumOfRfId;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("==>RTMPIoctlRF (maxRFIdx = %d)\n", maxRFIdx));
|
|
|
|
memLen = 12*(maxRFIdx+1)*MAC_RF_BANK;
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, memLen);
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
bFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;
|
|
|
|
NdisZeroMemory(mpool, memLen);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
arg = (RTMP_STRING *)((ULONG)(msg+2048+3) & (ULONG)~0x03);
|
|
argLen = strlen((char *)(wrq->u.data.pointer));
|
|
if (bIsPrintAllRF)
|
|
{
|
|
RTMPZeroMemory(msg, memLen);
|
|
sprintf(msg, "\n");
|
|
for (bank_Id = 0; bank_Id <= MAC_RF_BANK; bank_Id++)
|
|
{
|
|
if (IS_MT76x0(pAdapter))
|
|
{
|
|
if ((bank_Id <=4) && (bank_Id >=1))
|
|
continue;
|
|
}
|
|
for (rfId = 0; rfId <= maxRFIdx; rfId++)
|
|
{
|
|
rlt_rf_read(pAdapter, bank_Id, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "%d %03d = %02X\n", bank_Id, rfId, regRF);
|
|
}
|
|
}
|
|
RtmpDrvAllRFPrint(NULL, msg, strlen(msg));
|
|
/* Copy the information into the user buffer */
|
|
#ifdef RELEASE_EXCLUDE
|
|
if (!bFromUI)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(msg)));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen("Dump to RFDump.txt");
|
|
if (copy_to_user(wrq->u.data.pointer, "Dump to RFDump.txt", wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n"));
|
|
}
|
|
#endif /* RLT_RF */
|
|
|
|
|
|
#ifdef RTMP_RF_RW_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Read / Write RF register
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 rf ==> read all RF registers
|
|
2.) iwpriv ra0 rf 1 ==> read RF where RegID=1
|
|
3.) iwpriv ra0 rf 1=10 ==> write RF R1=0x10
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPAPIoctlRF(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
#ifdef RT_RF
|
|
RTMP_STRING *this_char;
|
|
RTMP_STRING *value;
|
|
UCHAR regRF = 0;
|
|
RTMP_STRING *mpool, *msg; /*msg[2048]; */
|
|
RTMP_STRING *arg; /*arg[255]; */
|
|
RTMP_STRING *ptr;
|
|
INT rfId, maxRFIdx;
|
|
LONG rfValue;
|
|
BOOLEAN bIsPrintAllRF = FALSE, bFromUI;
|
|
INT memLen = sizeof(CHAR) * (2048+256+12);
|
|
#endif /* RT_RF */
|
|
|
|
#ifdef RLT_RF
|
|
if (IS_MT7601(pAdapter) || IS_MT76x0(pAdapter)) {
|
|
RTMPAPIoctlRF_rlt(pAdapter, wrq);
|
|
return;
|
|
}
|
|
#endif /* RLT_RF */
|
|
|
|
#ifdef MT76x2
|
|
if (IS_MT76x2(pAdapter)) {
|
|
RTMPAPIoctlRF_mt76x2(pAdapter, wrq);
|
|
return;
|
|
}
|
|
#endif /* MT76x2 */
|
|
|
|
#ifndef RT_CFG80211_P2P_SUPPORT
|
|
#if defined (MT7603) || defined (MT7628)
|
|
if (IS_MT7603(pAdapter) || IS_MT7628(pAdapter)) {
|
|
RTMPAPIoctlRF_mt7603(pAdapter, wrq);
|
|
return;
|
|
}
|
|
#endif /* MT7603 */
|
|
#endif /* RT_CFG80211_P2P_SUPPORT */
|
|
|
|
#ifdef RT_RF
|
|
maxRFIdx = pAdapter->chipCap.MaxNumOfRfId;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlRF\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, memLen);
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
bFromUI = ((wrq->u.data.flags & RTPRIV_IOCTL_FLAG_UI) == RTPRIV_IOCTL_FLAG_UI) ? TRUE : FALSE;
|
|
|
|
NdisZeroMemory(mpool, memLen);
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
arg = (RTMP_STRING *)((ULONG)(msg+2048+3) & (ULONG)~0x03);
|
|
|
|
if ((wrq->u.data.length > 1) /* No parameters. */
|
|
#ifdef VXWORKS
|
|
&& (!(wrq->u.data.length == 4096 && bFromUI))
|
|
#endif
|
|
)
|
|
{
|
|
NdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);
|
|
ptr = arg;
|
|
sprintf(msg, "\n");
|
|
/*Parsing Read or Write */
|
|
while ((this_char = strsep((char **)&ptr, ",")) != NULL)
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
if ((value = strchr(this_char, '=')) != NULL)
|
|
*value++ = 0;
|
|
|
|
if (!value || !*value)
|
|
{ /*Read */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s, value=%s\n", this_char, value));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (sscanf(this_char, "%d", &(rfId)) == 1)
|
|
{
|
|
if (rfId <= pAdapter->chipCap.MaxNumOfRfId)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
#ifdef RELEASE_EXCLUDE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access BBP directly.
|
|
For RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
ATE_RF_IO_READ8_BY_REG_ID(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
else
|
|
#endif /* RT6352 */
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", rfId, regRF);
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command rf shall read rf register directly for dubug. */
|
|
/* BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); */
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
{
|
|
RT635xReadRFRegister(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "Bank_%02d_R%02d[0x%02x]:%02X ",
|
|
pAdapter->RfBank, rfId, rfId, regRF);
|
|
}
|
|
else
|
|
#endif /* RT6352 */
|
|
{
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02x]:%02X ", rfId, rfId, regRF);
|
|
}
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all RF */
|
|
bIsPrintAllRF = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Invalid parametes, so default printk all RF */
|
|
bIsPrintAllRF = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ /* Write */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s, value=%s\n", this_char, value));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if ((sscanf(this_char, "%d", &(rfId)) == 1) && (sscanf(value, "%lx", &(rfValue)) == 1))
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("rfID=%02d, value=0x%lx\n", rfId, rfValue));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (rfId <= pAdapter->chipCap.MaxNumOfRfId)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
#ifdef RELEASE_EXCLUDE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access BBP directly.
|
|
For RT2870 ATE mode, ATE_BBP_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
{
|
|
ATE_RF_IO_READ8_BY_REG_ID(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
ATE_RF_IO_WRITE8_BY_REG_ID(pAdapter, pAdapter->RfBank, (UCHAR)rfId,(UCHAR) rfValue);
|
|
}
|
|
else
|
|
#endif /* RT6352 */
|
|
{
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
RT30xxWriteRFRegister(pAdapter, (UCHAR)rfId,(UCHAR) rfValue);
|
|
}
|
|
|
|
|
|
/* Read it back for showing. */
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
ATE_RF_IO_READ8_BY_REG_ID(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
else
|
|
#endif /* RT6352 */
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", rfId, regRF);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command RF shall read/write RF register directly for dubug. */
|
|
/*BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); */
|
|
/*BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue); */
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
{
|
|
RT635xReadRFRegister(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
RT635xWriteRFRegister(pAdapter, pAdapter->RfBank, (UCHAR)rfId, (UCHAR)rfValue);
|
|
/* Read it back for showing */
|
|
RT635xReadRFRegister(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "Bank_%02d_R%02d[0x%02x]:%02X ",
|
|
pAdapter->RfBank, rfId, rfId, regRF);
|
|
|
|
}
|
|
else
|
|
#endif /* RT6352 */
|
|
{
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
RT30xxWriteRFRegister(pAdapter, (UCHAR)rfId,(UCHAR) rfValue);
|
|
/* Read it back for showing */
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X\n", rfId, rfId, regRF);
|
|
}
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
}
|
|
else
|
|
{ /* Invalid parametes, so default printk all RF */
|
|
bIsPrintAllRF = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{ /* Invalid parametes, so default printk all RF */
|
|
bIsPrintAllRF = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
bIsPrintAllRF = TRUE;
|
|
|
|
if (bIsPrintAllRF)
|
|
{
|
|
memset(msg, 0x00, 2048);
|
|
sprintf(msg, "\n");
|
|
for (rfId = 0; rfId <= maxRFIdx; rfId++)
|
|
{
|
|
#ifdef CONFIG_ATE
|
|
/*
|
|
In RT2860 ATE mode, we do not load 8051 firmware.
|
|
We must access RF registers directly.
|
|
For RT2870 ATE mode, ATE_RF_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
|
|
*/
|
|
if (ATE_ON(pAdapter))
|
|
{
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
ATE_RF_IO_READ8_BY_REG_ID(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
else
|
|
#endif /* RT6352 */
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
|
|
/* Sync with QA for comparation */
|
|
sprintf(msg+strlen(msg), "%03d = %02X\n", rfId, regRF);
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
#ifdef __ECOS
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
DBGPRINT(RT_DEBUG_OFF, ("R%02d[0x%02X]:%02X ", rfId, rfId*2, regRF));
|
|
if ((rfId%5 == 4) || (rfId == maxRFIdx))
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
#else
|
|
/* according to Andy, Gary, David require. */
|
|
/* the command RF shall read/write RF register directly for dubug. */
|
|
#ifdef RT6352
|
|
if (IS_RT6352(pAdapter))
|
|
{
|
|
RT635xReadRFRegister(pAdapter, pAdapter->RfBank, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "Bank_%02d_R%02d[0x%02X]:%02X ", pAdapter->RfBank, rfId, rfId*2, regRF);
|
|
if (rfId%4 == 3)
|
|
sprintf(msg+strlen(msg), "\n");
|
|
}
|
|
else
|
|
#endif /* RT6352 */
|
|
{
|
|
RT30xxReadRFRegister(pAdapter, rfId, ®RF);
|
|
sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X ", rfId, rfId*2, regRF);
|
|
if (rfId%5 == 4)
|
|
sprintf(msg+strlen(msg), "\n");
|
|
}
|
|
#endif /* __ECOS */
|
|
}
|
|
}
|
|
/* Copy the information into the user buffer */
|
|
#ifdef RELEASE_EXCLUDE
|
|
if (!bFromUI)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(msg)));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
#ifdef VXWORKS
|
|
if (bFromUI && (wrq->u.data.length >= strlen(msg)))
|
|
{
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", msg));
|
|
}
|
|
#endif /* VXWORKS */
|
|
#ifdef LINUX
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
}
|
|
else
|
|
{
|
|
#ifdef VXWORKS
|
|
if (bFromUI && (wrq->u.data.length >= strlen(msg)))
|
|
{
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
}
|
|
#endif /* VXWORKS */
|
|
#ifdef LINUX
|
|
/* Copy the information into the user buffer */
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
#endif /* LINUX */
|
|
}
|
|
|
|
if (!bFromUI)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Dump RF msg[%d]=\n", (UINT32)strlen(msg)));
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, mpool);
|
|
if (!bFromUI)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n\n"));
|
|
#endif /* RT_RF */
|
|
|
|
}
|
|
#endif /* RTMP_RF_RW_SUPPORT */
|
|
#endif /*#ifdef DBG */
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Read / Write E2PROM
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 e2p 0 ==> read E2PROM where Addr=0x0
|
|
2.) iwpriv ra0 e2p 0=1234 ==> write E2PROM where Addr=0x0, value=1234
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPAPIoctlE2PROM(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
RTMP_STRING *this_char, *value;
|
|
INT j = 0, k = 0;
|
|
RTMP_STRING *mpool, *msg;/*msg[1024]; */
|
|
RTMP_STRING *arg, *ptr;
|
|
USHORT eepAddr = 0;
|
|
UCHAR temp[16];
|
|
RTMP_STRING temp2[16];
|
|
USHORT eepValue;
|
|
BOOLEAN bIsPrintAllE2PROM = FALSE;
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlE2PROM\n"));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
os_alloc_mem(NULL, (UCHAR **)&mpool, sizeof(CHAR)*(4096+256+12));
|
|
|
|
if (mpool == NULL) {
|
|
return;
|
|
}
|
|
|
|
msg = (RTMP_STRING *)((ULONG)(mpool+3) & (ULONG)~0x03);
|
|
arg = (RTMP_STRING *)((ULONG)(msg+4096+3) & (ULONG)~0x03);
|
|
|
|
|
|
memset(msg, 0x00, 4096);
|
|
memset(arg, 0x00, 256);
|
|
|
|
if (
|
|
#ifdef __ECOS
|
|
(wrq->u.data.length > 0) /*No parameters. */
|
|
#endif /* __ECOS */
|
|
#ifdef LINUX
|
|
(wrq->u.data.length > 1) /* If no parameter, dump all e2p. */
|
|
#endif /* LINUX */
|
|
#ifdef VXWORKS
|
|
(wrq->u.data.length > 1) && (!(wrq->u.data.length == 4096 && wrq->u.data.flags== RT_OID_802_11_HARDWARE_REGISTER))
|
|
#endif
|
|
)
|
|
{
|
|
NdisMoveMemory(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);
|
|
ptr = arg;
|
|
sprintf(msg, "\n");
|
|
/*Parsing Read or Write */
|
|
while ((this_char = strsep((char **)&ptr, ",")) != NULL)
|
|
{
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
if (!*this_char)
|
|
continue;
|
|
|
|
if ((value = strchr(this_char, '=')) != NULL)
|
|
*value++ = 0;
|
|
|
|
if (!value || !*value)
|
|
{ /*Read */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Read: this_char=%s, strlen=%d\n", this_char, (UINT32)strlen(this_char)));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
/* Sanity check */
|
|
if(strlen(this_char) > 4)
|
|
break;
|
|
|
|
j = strlen(this_char);
|
|
while(j-- > 0)
|
|
{
|
|
if(this_char[j] > 'f' || this_char[j] < '0')
|
|
goto done; /*return; */
|
|
}
|
|
|
|
/* E2PROM addr */
|
|
k = j = strlen(this_char);
|
|
while(j-- > 0)
|
|
{
|
|
this_char[4-k+j] = this_char[j];
|
|
}
|
|
|
|
while(k < 4)
|
|
this_char[3-k++]='0';
|
|
this_char[4]='\0';
|
|
|
|
if(strlen(this_char) == 4)
|
|
{
|
|
AtoH(this_char, temp, 2);
|
|
eepAddr = *temp*256 + temp[1];
|
|
if (eepAddr < 0xFFFF)
|
|
{
|
|
RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("eepAddr=%x, eepValue=0x%x\n", eepAddr, eepValue));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
sprintf(msg+strlen(msg), "[0x%04X]:0x%04X ", eepAddr , eepValue);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
else
|
|
{/*Invalid parametes, so default printk all bbp */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{ /*Write */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("Write: this_char=%s, strlen(value)=%d, value=%s\n", this_char, (UINT32)strlen(value), value));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
NdisMoveMemory(&temp2, value, strlen(value));
|
|
temp2[strlen(value)] = '\0';
|
|
|
|
/* Sanity check */
|
|
if((strlen(this_char) > 4) || strlen(temp2) > 8)
|
|
break;
|
|
|
|
j = strlen(this_char);
|
|
while(j-- > 0)
|
|
{
|
|
if(this_char[j] > 'f' || this_char[j] < '0')
|
|
goto done; /* return; */
|
|
}
|
|
j = strlen(temp2);
|
|
while(j-- > 0)
|
|
{
|
|
if(temp2[j] > 'f' || temp2[j] < '0')
|
|
goto done; /* return; */
|
|
}
|
|
|
|
/* MAC Addr */
|
|
k = j = strlen(this_char);
|
|
while(j-- > 0)
|
|
{
|
|
this_char[4-k+j] = this_char[j];
|
|
}
|
|
|
|
while(k < 4)
|
|
this_char[3-k++]='0';
|
|
this_char[4]='\0';
|
|
|
|
/* MAC value */
|
|
k = j = strlen(temp2);
|
|
while(j-- > 0)
|
|
{
|
|
temp2[4-k+j] = temp2[j];
|
|
}
|
|
|
|
while(k < 4)
|
|
temp2[3-k++]='0';
|
|
temp2[4]='\0';
|
|
|
|
AtoH(this_char, temp, 2);
|
|
eepAddr = *temp*256 + temp[1];
|
|
|
|
AtoH(temp2, temp, 2);
|
|
eepValue = *temp*256 + temp[1];
|
|
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("eepAddr=%02x, eepValue=0x%x\n", eepAddr, eepValue));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
RT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue);
|
|
sprintf(msg+strlen(msg), "[0x%02X]:%02X ", eepAddr, eepValue);
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bIsPrintAllE2PROM = TRUE;
|
|
}
|
|
|
|
if (bIsPrintAllE2PROM)
|
|
{
|
|
#ifdef __ECOS
|
|
for (eepAddr = 0x00; eepAddr < 0x200; eepAddr += 2)
|
|
{
|
|
RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
|
|
DBGPRINT(RT_DEBUG_OFF, ("[0x%04X]:%04X ", eepAddr, eepValue));
|
|
if ((eepAddr & 0x6) == 0x6)
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
|
}
|
|
#else
|
|
sprintf(msg, "\n");
|
|
|
|
/* E2PROM Registers */
|
|
for (eepAddr = 0x00; eepAddr < 0x200; eepAddr += 2)
|
|
{
|
|
RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
|
|
sprintf(msg+strlen(msg), "[0x%04X]:%04X ", eepAddr , eepValue);
|
|
if ((eepAddr & 0x6) == 0x6)
|
|
sprintf(msg+strlen(msg), "\n");
|
|
}
|
|
#endif /* __ECOS */
|
|
}
|
|
|
|
if(strlen(msg) == 1)
|
|
sprintf(msg+strlen(msg), "===>Error command format!");
|
|
|
|
/* Copy the information into the user buffer */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("copy to user [msg=%s]\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
|
|
AP_E2PROM_IOCTL_PostCtrl(wrq, msg);
|
|
|
|
done:
|
|
os_free_mem(NULL, mpool);
|
|
if (wrq->u.data.flags != RT_OID_802_11_HARDWARE_REGISTER)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlE2PROM\n"));
|
|
}
|
|
|
|
|
|
//#define ENHANCED_STAT_DISPLAY // Display PER and PLR statistics
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Read statistics counter
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 stat 0 ==> Read statistics counter
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlStatistics(RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
ULONG Status;
|
|
RTMP_STRING *msg;
|
|
#ifdef WSC_AP_SUPPORT
|
|
UCHAR idx = 0;
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
#endif /* P2P_SUPPORT */
|
|
ULONG txCount = 0;
|
|
#ifdef MT_MAC
|
|
//ULONG txFailCount = 0;
|
|
#endif /* MT_MAC */
|
|
UINT32 rxCount = 0;
|
|
#ifdef ENHANCED_STAT_DISPLAY
|
|
ULONG per, plr;
|
|
INT i;
|
|
#endif
|
|
#ifdef RTMP_EFUSE_SUPPORT
|
|
UINT efusefreenum=0;
|
|
#endif /* RTMP_EFUSE_SUPPORT */
|
|
|
|
#ifdef BB_SOC
|
|
ULONG txPackets=0, rxPackets=0, txBytes=0, rxBytes=0;
|
|
UCHAR index=0;
|
|
#endif
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
|
|
memset(msg, 0x00, 1600);
|
|
sprintf(msg, "\n");
|
|
|
|
#ifdef CONFIG_ATE
|
|
if(ATE_ON(pAd))
|
|
{
|
|
#ifdef CONFIG_QA
|
|
txCount = pAd->ATECtrl.TxDoneCount;
|
|
//rxCount = pAd->ATECtrl.U2M + pAd->ATECtrl.OtherData + pAd->ATECtrl.OtherCount;
|
|
rxCount = pAd->ATECtrl.RxTotalCnt;
|
|
#else
|
|
txCount = pAd->ATECtrl.TxDoneCount;
|
|
rxCount = pAd->ATECtrl.RxTotalCnt;
|
|
#endif
|
|
}
|
|
else
|
|
#endif /* CONFIG_ATE */
|
|
{
|
|
txCount = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;
|
|
rxCount = (UINT32)pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
|
|
}
|
|
|
|
sprintf(msg+strlen(msg), "Tx success = %ld\n", txCount);
|
|
#ifdef ENHANCED_STAT_DISPLAY
|
|
if (pAd->chipCap.hif_type == HIF_MT) {
|
|
per = txCount==0? 0: 1000*(pAd->WlanCounters.FailedCount.u.LowPart)/(pAd->WlanCounters.FailedCount.u.LowPart+txCount);
|
|
sprintf(msg+strlen(msg), "Tx fail count = %ld, PER=%ld.%1ld%%\n",
|
|
(ULONG)pAd->WlanCounters.FailedCount.u.LowPart,
|
|
per/10, per % 10);
|
|
} else {
|
|
per = txCount==0? 0: 1000*(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart)/(pAd->WlanCounters.RetryCount.u.LowPart+pAd->WlanCounters.FailedCount.u.LowPart+txCount);
|
|
sprintf(msg+strlen(msg), "Tx retry count = %ld, PER=%ld.%1ld%%\n",
|
|
(ULONG)pAd->WlanCounters.RetryCount.u.LowPart,
|
|
per/10, per % 10);
|
|
plr = txCount==0? 0: 10000*pAd->WlanCounters.FailedCount.u.LowPart/(pAd->WlanCounters.FailedCount.u.LowPart+txCount);
|
|
sprintf(msg+strlen(msg), "Tx fail to Rcv ACK after retry = %ld, PLR=%ld.%02ld%%\n",
|
|
(ULONG)pAd->WlanCounters.FailedCount.u.LowPart, plr/100, plr%100);
|
|
}
|
|
sprintf(msg+strlen(msg), "Rx success = %ld\n", (ULONG)rxCount);
|
|
#ifdef CONFIG_QA
|
|
if(ATE_ON(pAd))
|
|
per = rxCount==0? 0: 1000*(pAd->WlanCounters.FCSErrorCount.u.LowPart)/(pAd->WlanCounters.FCSErrorCount.u.LowPart+rxCount);
|
|
else
|
|
#endif /* CONFIG_QA */
|
|
per = pAd->WlanCounters.ReceivedFragmentCount.u.LowPart==0? 0: 1000*(pAd->WlanCounters.FCSErrorCount.u.LowPart)/(pAd->WlanCounters.FCSErrorCount.u.LowPart+pAd->WlanCounters.ReceivedFragmentCount.u.LowPart);
|
|
sprintf(msg+strlen(msg), "Rx with CRC = %ld, PER=%ld.%1ld%%\n",
|
|
(ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart, per/10, per % 10);
|
|
sprintf(msg+strlen(msg), "Rx with PhyErr = %ld\n",
|
|
(ULONG)pAd->RalinkCounters.PhyErrCnt);
|
|
sprintf(msg+strlen(msg), "Rx with PlcpErr = %ld\n",
|
|
(ULONG)pAd->RalinkCounters.PlcpErrCnt);
|
|
sprintf(msg+strlen(msg), "Rx drop due to out of resource = %ld\n", (ULONG)pAd->Counters8023.RxNoBuffer);
|
|
sprintf(msg+strlen(msg), "Rx duplicate frame = %ld\n", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);
|
|
|
|
sprintf(msg+strlen(msg), "False CCA = %ld\n", (ULONG)pAd->RalinkCounters.FalseCCACnt);
|
|
#else
|
|
sprintf(msg+strlen(msg), "Tx retry count = %ld\n", (ULONG)pAd->WlanCounters.RetryCount.u.LowPart);
|
|
sprintf(msg+strlen(msg), "Tx fail to Rcv ACK after retry = %ld\n", (ULONG)pAd->WlanCounters.FailedCount.u.LowPart);
|
|
sprintf(msg+strlen(msg), "RTS Success Rcv CTS = %ld\n", (ULONG)pAd->WlanCounters.RTSSuccessCount.u.LowPart);
|
|
sprintf(msg+strlen(msg), "RTS Fail Rcv CTS = %ld\n", (ULONG)pAd->WlanCounters.RTSFailureCount.u.LowPart);
|
|
|
|
sprintf(msg+strlen(msg), "Rx success = %ld\n", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart);
|
|
sprintf(msg+strlen(msg), "Rx with CRC = %ld\n", (ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart);
|
|
sprintf(msg+strlen(msg), "Rx drop due to out of resource = %ld\n", (ULONG)pAd->Counters8023.RxNoBuffer);
|
|
sprintf(msg+strlen(msg), "Rx duplicate frame = %ld\n", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart);
|
|
|
|
sprintf(msg+strlen(msg), "False CCA (one second) = %ld\n", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt);
|
|
#endif /* ENHANCED_STAT_DISPLAY */
|
|
|
|
#ifdef CONFIG_QA
|
|
if(ATE_ON(pAd))
|
|
{
|
|
if (pAd->ATECtrl.RxAntennaSel == 0)
|
|
{
|
|
sprintf(msg+strlen(msg), "RSSI-A = %ld\n", (LONG)(pAd->ATECtrl.LastRssi0 - pAd->BbpRssiToDbmDelta));
|
|
sprintf(msg+strlen(msg), "RSSI-B (if available) = %ld\n", (LONG)(pAd->ATECtrl.LastRssi1 - pAd->BbpRssiToDbmDelta));
|
|
sprintf(msg+strlen(msg), "RSSI-C (if available) = %ld\n\n", (LONG)(pAd->ATECtrl.LastRssi2 - pAd->BbpRssiToDbmDelta));
|
|
}
|
|
else
|
|
{
|
|
sprintf(msg+strlen(msg), "RSSI = %ld\n", (LONG)(pAd->ATECtrl.LastRssi0 - pAd->BbpRssiToDbmDelta));
|
|
}
|
|
sprintf(msg+strlen(msg), "Rx U2M = %ld\n", (ULONG)pAd->ATECtrl.U2M);
|
|
sprintf(msg+strlen(msg), "Rx other Data = %ld\n", (ULONG)pAd->ATECtrl.OtherData);
|
|
sprintf(msg+strlen(msg), "Rx others(Mgmt+Cntl) = %ld\n", (ULONG)pAd->ATECtrl.OtherCount);
|
|
}
|
|
else
|
|
#endif /* CONFIG_QA */
|
|
{
|
|
#ifdef ENHANCED_STAT_DISPLAY
|
|
sprintf(msg+strlen(msg), "RSSI = %ld %ld %ld\n",
|
|
(LONG)(pAd->ApCfg.RssiSample.LastRssi[0] - pAd->BbpRssiToDbmDelta),
|
|
(LONG)(pAd->ApCfg.RssiSample.LastRssi[1] - pAd->BbpRssiToDbmDelta),
|
|
(LONG)(pAd->ApCfg.RssiSample.LastRssi[2] - pAd->BbpRssiToDbmDelta));
|
|
|
|
/* Display Last Rx Rate and BF SNR of first Associated entry in MAC table */
|
|
if (pAd->MacTab.Size > 0)
|
|
{
|
|
static char *phyMode[5] = {"CCK", "OFDM", "MM", "GF", "VHT"};
|
|
#ifdef RT65xx
|
|
static char *bw[3] = {"20M", "40M", "80M"};
|
|
static char *fec_coding[2] = {"bcc", "ldpc"};
|
|
#endif /* RT65xx */
|
|
|
|
#if 0
|
|
// TODO: shiang-usw, these code used for reference only!
|
|
#ifdef MT76x0
|
|
if (IS_MT76x0(pAd))
|
|
{
|
|
RXWI_STRUC *pRxWI;
|
|
pEntry->LastRxRate = (ULONG)((pRxWI->RXWI_N.mcs) + (pRxWI->RXWI_N.bw <<7) +
|
|
(pRxWI->RXWI_N.sgi <<9) + (pRxWI->RXWI_N.stbc <<10) +
|
|
(pRxWI->RXWI_N.phy_mode <<14));
|
|
}
|
|
else
|
|
#else
|
|
{
|
|
RXWI_STRUC *pRxWI;
|
|
pEntry->LastRxRate = (ULONG)((pRxWI->RXWI_O.mcs) + (pRxWI->RXWI_O.bw <<7) +
|
|
(pRxWI->RXWI_O.sgi<<8) + (pRxWI->RXWI_O.stbc <<9) +
|
|
(pRxWI->RXWI_O.phy_mode<<14));
|
|
}
|
|
#endif
|
|
#endif
|
|
for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &(pAd->MacTab.Content[i]);
|
|
if (IS_ENTRY_CLIENT(pEntry) && pEntry->Sst==SST_ASSOC)
|
|
{
|
|
//sprintf(msg+strlen(msg), "sta mac: %02x:%02x:%02x:%02x:%02x:%02x\n", pEntry->wdev->if_addr[0], pEntry->wdev->if_addr[1], pEntry->wdev->if_addr[2], pEntry->wdev->if_addr[3], pEntry->wdev->if_addr[4], pEntry->wdev->if_addr[5]);
|
|
UINT32 lastRxRate = pEntry->LastRxRate;
|
|
UINT32 lastTxRate = pEntry->LastTxRate;
|
|
#ifdef RT65xx
|
|
if (IS_RT65XX(pAd)) {
|
|
if (((lastTxRate >> 13) & 0x7) == 0x04) {
|
|
sprintf(msg+strlen(msg), "Last TX Rate = MCS%d, %dSS, %s, %s, %cGI, %s%s\n",
|
|
lastTxRate & 0x0F,
|
|
(((lastTxRate >> 4) & 0x3) + 1),
|
|
fec_coding[((lastTxRate >> 6) & 0x1)],
|
|
bw[((lastTxRate >> 7) & 0x3)],
|
|
((lastTxRate >> 9) & 0x1)? 'S': 'L',
|
|
phyMode[(lastTxRate >> 13) & 0x7],
|
|
((lastTxRate >> 10) & 0x3)? ", STBC": " ");
|
|
} else {
|
|
sprintf(msg+strlen(msg), "Last TX Rate = MCS%d, %s, %s, %cGI, %s%s\n",
|
|
lastTxRate & 0x3F,
|
|
fec_coding[((lastTxRate >> 6) & 0x1)],
|
|
bw[((lastTxRate >> 7) & 0x3)],
|
|
((lastTxRate >> 9) & 0x1)? 'S': 'L',
|
|
phyMode[(lastTxRate >> 13) & 0x7],
|
|
((lastTxRate >> 10) & 0x3)? ", STBC": " ");
|
|
}
|
|
|
|
if (((lastRxRate >> 13) & 0x7) == 0x04) {
|
|
sprintf(msg+strlen(msg), "Last RX Rate = MCS%d, %dSS, %s, %s, %cGI, %s%s\n",
|
|
lastRxRate & 0x0F,
|
|
(((lastRxRate >> 4) & 0x3) + 1),
|
|
fec_coding[((lastRxRate >> 6) & 0x1)],
|
|
bw[((lastRxRate >> 7) & 0x3)],
|
|
((lastRxRate >> 9) & 0x1)? 'S': 'L',
|
|
phyMode[(lastRxRate >> 13) & 0x7],
|
|
((lastRxRate >> 10) & 0x3)? ", STBC": " ");
|
|
} else {
|
|
sprintf(msg+strlen(msg), "Last RX Rate = MCS%d, %s, %s, %cGI, %s%s\n",
|
|
lastRxRate & 0x3F,
|
|
fec_coding[((lastRxRate >> 6) & 0x1)],
|
|
bw[((lastRxRate >> 7) & 0x3)],
|
|
((lastRxRate >> 9) & 0x1)? 'S': 'L',
|
|
phyMode[(lastRxRate >> 13) & 0x7],
|
|
((lastRxRate >> 10) & 0x3)? ", STBC": " ");
|
|
}
|
|
}
|
|
else
|
|
#endif /* RT65xx */
|
|
#ifdef MT_MAC
|
|
if (pAd->chipCap.hif_type == HIF_MT) {
|
|
StatRateToString(pAd, msg, 0, lastTxRate);
|
|
StatRateToString(pAd, msg, 1, lastRxRate);
|
|
}
|
|
else
|
|
#endif /* MT_MAC */
|
|
{
|
|
sprintf(msg+strlen(msg), "Last TX Rate = MCS%d, %2dM, %cGI, %s%s\n",
|
|
lastTxRate & 0x7F, ((lastTxRate>>7) & 0x1)? 40: 20,
|
|
((lastTxRate>>8) & 0x1)? 'S': 'L',
|
|
phyMode[(lastTxRate>>14) & 0x3],
|
|
((lastTxRate>>9) & 0x3)? ", STBC": " ");
|
|
sprintf(msg+strlen(msg), "Last RX Rate = MCS%d, %2dM, %cGI, %s%s\n",
|
|
lastRxRate & 0x7F, ((lastRxRate>>7) & 0x1)? 40: 20,
|
|
((lastRxRate>>8) & 0x1)? 'S': 'L',
|
|
phyMode[(lastRxRate>>14) & 0x3],
|
|
((lastRxRate>>9) & 0x3)? ", STBC": " ");
|
|
}
|
|
|
|
#if defined(RT2883) || defined(RT3883)
|
|
sprintf(msg+strlen(msg), "BF SNR = %d.%02d, %d.%02d, %d.%02d FO:%02X\n",
|
|
pEntry->BF_SNR[0]/4, (pEntry->BF_SNR[0] % 4)*25,
|
|
pEntry->BF_SNR[1]/4, (pEntry->BF_SNR[1] % 4)*25,
|
|
pEntry->BF_SNR[2]/4, (pEntry->BF_SNR[2] % 4)*25,
|
|
pEntry->freqOffset & 0xFF);
|
|
#endif /* defined(RT2883) || defined(RT3883) */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
#ifdef MT_MAC
|
|
if (pAd->chipCap.hif_type == HIF_MT)
|
|
{
|
|
sprintf(msg+strlen(msg), "TX AGG Range 1 (1) = %ld\n", (LONG)(pAd->WlanCounters.TxAggRange1Count.u.LowPart));
|
|
sprintf(msg+strlen(msg), "TX AGG Range 2 (2~5) = %ld\n", (LONG)(pAd->WlanCounters.TxAggRange2Count.u.LowPart));
|
|
sprintf(msg+strlen(msg), "TX AGG Range 3 (6~15) = %ld\n", (LONG)(pAd->WlanCounters.TxAggRange3Count.u.LowPart));
|
|
sprintf(msg+strlen(msg), "TX AGG Range 4 (>15) = %ld\n", (LONG)(pAd->WlanCounters.TxAggRange4Count.u.LowPart));
|
|
{
|
|
ULONG mpduTXCount;
|
|
|
|
mpduTXCount = pAd->WlanCounters.AmpduSuccessCount.u.LowPart;
|
|
|
|
sprintf(msg+strlen(msg), "AMPDU Tx success = %ld\n", mpduTXCount);
|
|
|
|
per = mpduTXCount==0? 0: 1000*(pAd->WlanCounters.AmpduFailCount.u.LowPart)/(pAd->WlanCounters.AmpduFailCount.u.LowPart+mpduTXCount);
|
|
sprintf(msg+strlen(msg), "AMPDU Tx fail count = %ld, PER=%ld.%1ld%%\n",
|
|
(ULONG)pAd->WlanCounters.AmpduFailCount.u.LowPart,
|
|
per/10, per % 10);
|
|
}
|
|
|
|
if (pAd->CommonCfg.bTXRX_RXV_ON) {
|
|
sprintf(msg+strlen(msg), "/* Condition Number should enable mode4 of 0x6020_426c */\n");
|
|
sprintf(msg+strlen(msg),
|
|
"--10 packets Condition Number = [%d|%d|%d|%d|%d|%d|%d|%d|%d|%d]\n",
|
|
(UINT8)(pAd->rxv2_cyc3[0] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[1] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[2] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[3] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[4] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[5] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[6] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[7] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[8] & 0xff),
|
|
(UINT8)(pAd->rxv2_cyc3[9] & 0xff)
|
|
);
|
|
}
|
|
}
|
|
#endif /* MT_MAC */
|
|
|
|
#else
|
|
sprintf(msg+strlen(msg), "RSSI-A = %ld\n", (LONG)(pAd->ApCfg.RssiSample.LastRssi[0] - pAd->BbpRssiToDbmDelta));
|
|
sprintf(msg+strlen(msg), "RSSI-B (if available) = %ld\n", (LONG)(pAd->ApCfg.RssiSample.LastRssi[1] - pAd->BbpRssiToDbmDelta));
|
|
sprintf(msg+strlen(msg), "RSSI-C (if available) = %ld\n\n", (LONG)(pAd->ApCfg.RssiSample.LastRssi[2] - pAd->BbpRssiToDbmDelta));
|
|
#endif /* ENHANCED_STAT_DISPLAY */
|
|
}
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
sprintf(msg+strlen(msg), "WPS Information:\n");
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCodeLen == 8)
|
|
sprintf(msg+strlen(msg), "P2P Client PinCode %08u\n",
|
|
pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);
|
|
else
|
|
sprintf(msg+strlen(msg), "P2P Client PinCode %04u\n",
|
|
pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);
|
|
sprintf(msg+strlen(msg), "P2P Client WPS Profile Count = %d\n",
|
|
pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt);
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
#ifdef BB_SOC
|
|
for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++){
|
|
// sprintf(msg+strlen(msg), "Enrollee PinCode(ra%d) = %08u\n", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCode);
|
|
// sprintf(msg+strlen(msg), "WPS Query Status(ra%d) = %d\n", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscStatus);
|
|
sprintf(msg+strlen(msg), "WPS Wsc2MinsTimerRunning(ra%d) = %d\n", idx, pAd->ApCfg.MBSSID[idx].WscControl.Wsc2MinsTimerRunning);
|
|
}
|
|
#else
|
|
for (idx = 0; idx < pAd->ApCfg.BssidNum; idx++)
|
|
{
|
|
/* display pin code */
|
|
if (pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCodeLen == 8)
|
|
sprintf(msg+strlen(msg), "Enrollee PinCode(ra%d) %08u\n", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCode);
|
|
else
|
|
sprintf(msg+strlen(msg), "Enrollee PinCode(ra%d) %04u\n", idx, pAd->ApCfg.MBSSID[idx].WscControl.WscEnrolleePinCode);
|
|
}
|
|
#endif
|
|
}
|
|
#ifdef APCLI_SUPPORT
|
|
sprintf(msg+strlen(msg), "\n");
|
|
if (pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCodeLen == 8)
|
|
sprintf(msg+strlen(msg), "Enrollee PinCode(ApCli0) %08u\n", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);
|
|
else
|
|
sprintf(msg+strlen(msg), "Enrollee PinCode(ApCli0) %04u\n", pAd->ApCfg.ApCliTab[0].WscControl.WscEnrolleePinCode);
|
|
sprintf(msg+strlen(msg), "Ap Client WPS Profile Count = %d\n", pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt);
|
|
for (idx = 0; idx < pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.ProfileCnt ; idx++)
|
|
{
|
|
PWSC_CREDENTIAL pCredential = &pAd->ApCfg.ApCliTab[0].WscControl.WscProfile.Profile[idx];
|
|
sprintf(msg+strlen(msg), "Profile[%d]:\n", idx);
|
|
sprintf(msg+strlen(msg), "SSID = %s\n", pCredential->SSID.Ssid);
|
|
sprintf(msg+strlen(msg), "AuthType = %s\n", WscGetAuthTypeStr(pCredential->AuthType));
|
|
sprintf(msg+strlen(msg), "EncrypType = %s\n", WscGetEncryTypeStr(pCredential->EncrType));
|
|
sprintf(msg+strlen(msg), "KeyIndex = %d\n", pCredential->KeyIndex);
|
|
if (pCredential->KeyLength != 0)
|
|
{
|
|
sprintf(msg+strlen(msg), "Key = %s\n", pCredential->Key);
|
|
}
|
|
}
|
|
sprintf(msg+strlen(msg), "\n");
|
|
#endif /* APCLI_SUPPORT */
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#if /*TCSUPPORT_COMPILE*/ defined(TCSUPPORT_SCHEDULE)
|
|
if(pAd->Flags & fRTMP_ADAPTER_RADIO_OFF)
|
|
sprintf(msg+strlen(msg), "Enable Wireless LAN = %s\n", "0");
|
|
else
|
|
sprintf(msg+strlen(msg), "Enable Wireless LAN = %s\n", "1");
|
|
sprintf(msg+strlen(msg), "\n");
|
|
#endif /*TCSUPPORT_COMPILE*/
|
|
|
|
/*
|
|
* Let "iwpriv ra0 stat" can print out Tx/Rx Packet and Byte count.
|
|
* Therefore, we can parse them out in cfg_manager. --Trey */
|
|
#ifdef BB_SOC
|
|
for (index = 0; index < pAd->ApCfg.BssidNum; index++){
|
|
rxPackets += (ULONG)pAd->ApCfg.MBSSID[index].RxCount;
|
|
txPackets += (ULONG)pAd->ApCfg.MBSSID[index].TxCount;
|
|
rxBytes += (ULONG)pAd->ApCfg.MBSSID[index].ReceivedByteCount;
|
|
txBytes += (ULONG)pAd->ApCfg.MBSSID[index].TransmittedByteCount;
|
|
}
|
|
sprintf(msg+strlen(msg), "Packets Received = %lu\n", rxPackets);
|
|
sprintf(msg+strlen(msg), "Packets Sent = %lu\n", txPackets);
|
|
sprintf(msg+strlen(msg), "Bytes Received = %lu\n", rxBytes);
|
|
sprintf(msg+strlen(msg), "Bytes Sent = %lu\n", txBytes);
|
|
sprintf(msg+strlen(msg), "\n");
|
|
#endif
|
|
|
|
#ifdef RTMP_EFUSE_SUPPORT
|
|
if (pAd->bUseEfuse == TRUE)
|
|
{
|
|
eFuseGetFreeBlockCount(pAd, &efusefreenum);
|
|
sprintf(msg+strlen(msg), "efuseFreeNumber = %d\n", efusefreenum);
|
|
}
|
|
#endif /* RTMP_EFUSE_SUPPORT */
|
|
|
|
#ifdef CONFIG_HOTSPOT
|
|
{
|
|
PHOTSPOT_CTRL pHSCtrl;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[apidx].WNMCtrl;
|
|
#endif
|
|
pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl;
|
|
PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl;
|
|
sprintf(msg+strlen(msg), "\n");
|
|
sprintf(msg+strlen(msg), "hotspot enable = %d\n", pHSCtrl->HotSpotEnable);
|
|
sprintf(msg+strlen(msg), "daemon ready = %d\n", pHSCtrl->HSDaemonReady);
|
|
sprintf(msg+strlen(msg), "hotspot DGAFDisable = %d\n", pHSCtrl->DGAFDisable);
|
|
sprintf(msg+strlen(msg), "hotspot L2Filter = %d\n", pHSCtrl->L2Filter);
|
|
sprintf(msg+strlen(msg), "hotspot ICMPv4Deny = %d\n", pHSCtrl->ICMPv4Deny);
|
|
sprintf(msg+strlen(msg), "hotspot QosMapEnable = %d\n", pHSCtrl->QosMapEnable);
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
sprintf(msg+strlen(msg), "proxy arp enable = %d\n", pWNMCtrl->ProxyARPEnable);
|
|
sprintf(msg+strlen(msg), "WNMNotify enable = %d\n", pWNMCtrl->WNMNotifyEnable);
|
|
#endif
|
|
sprintf(msg+strlen(msg), "hotspot OSEN enable = %d\n", pHSCtrl->bASANEnable);
|
|
sprintf(msg+strlen(msg), "GAS come back delay = %d\n", pGASCtrl->cb_delay);
|
|
sprintf(msg+strlen(msg), "\n");
|
|
}
|
|
#endif
|
|
|
|
/* Copy the information into the user buffer */
|
|
#ifdef RELEASE_EXCLUDE
|
|
DBGPRINT(RT_DEBUG_INFO, ("copy to user [msg=%s]\n", msg));
|
|
#endif /* RELEASE_EXCLUDE */
|
|
wrq->u.data.length = (UINT16)strlen(msg);
|
|
Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
|
|
os_free_mem(NULL, msg);
|
|
|
|
#if defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY)
|
|
#ifdef DBG_CTRL_SUPPORT
|
|
/* Debug code to display BF statistics */
|
|
if (pAd->CommonCfg.DebugFlags & DBF_SHOW_BF_STATS)
|
|
{
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) {
|
|
PMAC_TABLE_ENTRY pEntry = &(pAd->MacTab.Content[i]);
|
|
COUNTER_TXBF *pCnt;
|
|
ULONG totalNBF, totalEBF, totalIBF, totalTx, totalRetry, totalSuccess;
|
|
|
|
if (!IS_ENTRY_CLIENT(pEntry) || pEntry->Sst!=SST_ASSOC)
|
|
continue;
|
|
|
|
pCnt = &pEntry->TxBFCounters;
|
|
|
|
totalNBF = pCnt->TxSuccessCount + pCnt->TxFailCount;
|
|
totalEBF = pCnt->ETxSuccessCount + pCnt->ETxFailCount;
|
|
totalIBF = pCnt->ITxSuccessCount + pCnt->ITxFailCount;
|
|
|
|
totalTx = totalNBF + totalEBF + totalIBF;
|
|
totalRetry = pCnt->TxRetryCount + pCnt->ETxRetryCount + pCnt->ITxRetryCount;
|
|
totalSuccess = pCnt->TxSuccessCount + pCnt->ETxSuccessCount + pCnt->ITxSuccessCount;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("MacTable[%d] Success Retry/PER Fail/PLR\n", i) );
|
|
if (totalTx==0) {
|
|
DBGPRINT(RT_DEBUG_OFF, (" Total = 0\n") );
|
|
continue;
|
|
}
|
|
|
|
if (totalNBF!=0) {
|
|
DBGPRINT(RT_DEBUG_OFF, (" NonBF (%3lu%%): %7lu %7lu (%2lu%%) %5lu (%1lu%%)\n",
|
|
100*totalNBF/totalTx, pCnt->TxSuccessCount,
|
|
pCnt->TxRetryCount, 100*pCnt->TxRetryCount/(pCnt->TxSuccessCount+pCnt->TxRetryCount),
|
|
pCnt->TxFailCount, 100*pCnt->TxFailCount/totalNBF) );
|
|
}
|
|
|
|
if (totalEBF!=0) {
|
|
DBGPRINT(RT_DEBUG_OFF, (" ETxBF (%3lu%%): %7lu %7lu (%2lu%%) %5lu (%1lu%%)\n",
|
|
100*totalEBF/totalTx, pCnt->ETxSuccessCount,
|
|
pCnt->ETxRetryCount, 100*pCnt->ETxRetryCount/(pCnt->ETxSuccessCount+pCnt->ETxRetryCount),
|
|
pCnt->ETxFailCount, 100*pCnt->ETxFailCount/totalEBF) );
|
|
}
|
|
|
|
if (totalIBF!=0) {
|
|
DBGPRINT(RT_DEBUG_OFF, (" ITxBF (%3lu%%): %7lu %7lu (%2lu%%) %5lu (%1lu%%)\n",
|
|
100*totalIBF/totalTx, pCnt->ITxSuccessCount,
|
|
pCnt->ITxRetryCount, 100*pCnt->ITxRetryCount/(pCnt->ITxSuccessCount+pCnt->ITxRetryCount),
|
|
pCnt->ITxFailCount, 100*pCnt->ITxFailCount/totalIBF) );
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, (" Total %7lu %7lu (%2lu%%) %5lu (%1lu%%)\n",
|
|
totalSuccess, totalRetry, 100*totalRetry/(totalSuccess + totalRetry),
|
|
pCnt->TxFailCount+pCnt->ETxFailCount+pCnt->ITxFailCount,
|
|
100*(pCnt->TxFailCount+pCnt->ETxFailCount+pCnt->ITxFailCount)/totalTx) );
|
|
}
|
|
}
|
|
#endif /* DBG_CTRL_SUPPORT */
|
|
#endif /* defined(TXBF_SUPPORT) && defined(ENHANCED_STAT_DISPLAY) */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlStatistics\n"));
|
|
}
|
|
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Get Block ACK Table
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 get_ba_table
|
|
3.) UI needs to prepare at least 4096bytes to get the results
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlQueryBaTable(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
/*char *msg; */
|
|
UINT16 TotalEntry;
|
|
UCHAR i, j, index;
|
|
QUERYBA_TABLE *BAT;
|
|
|
|
BAT = vmalloc(sizeof(QUERYBA_TABLE));
|
|
|
|
if (BAT == NULL)
|
|
return;
|
|
|
|
RTMPZeroMemory(BAT, sizeof(QUERYBA_TABLE));
|
|
|
|
TotalEntry = pAd->MacTab.Size;
|
|
index = 0;
|
|
for (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
|
|
|
|
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->TXBAbitmap))
|
|
{
|
|
NdisMoveMemory(BAT->BAOriEntry[index].MACAddr, pEntry->Addr, 6);
|
|
for (j=0;j<8;j++)
|
|
{
|
|
if (pEntry->BAOriWcidArray[j] != 0)
|
|
BAT->BAOriEntry[index].BufSize[j] = pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]].BAWinSize;
|
|
else
|
|
BAT->BAOriEntry[index].BufSize[j] = 0;
|
|
}
|
|
|
|
TotalEntry--;
|
|
index++;
|
|
BAT->OriNum++;
|
|
}
|
|
}
|
|
|
|
TotalEntry = pAd->MacTab.Size;
|
|
index = 0;
|
|
for (i=0; ((i < MAX_LEN_OF_MAC_TABLE) && (TotalEntry > 0)); i++)
|
|
{
|
|
PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
|
|
|
|
if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC) && (pEntry->RXBAbitmap))
|
|
{
|
|
NdisMoveMemory(BAT->BARecEntry[index].MACAddr, pEntry->Addr, 6);
|
|
BAT->BARecEntry[index].BaBitmap = (UCHAR)pEntry->RXBAbitmap;
|
|
for (j = 0; j < 8; j++)
|
|
{
|
|
if (pEntry->BARecWcidArray[j] != 0)
|
|
BAT->BARecEntry[index].BufSize[j] = pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]].BAWinSize;
|
|
else
|
|
BAT->BARecEntry[index].BufSize[j] = 0;
|
|
}
|
|
|
|
TotalEntry--;
|
|
index++;
|
|
BAT->RecNum++;
|
|
}
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(QUERYBA_TABLE);
|
|
|
|
if (copy_to_user(wrq->u.data.pointer, BAT, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
|
|
vfree(BAT);
|
|
|
|
#if 0
|
|
os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
memset(msg, 0x00, 2048);
|
|
sprintf(msg,"%s","\n");
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s\n", "Configured", "SSID", "AuthMode", "EncrypType");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-13s%-26s\n", "Configured", "SSID", "AuthMode", "EncrypType", "DefaultKeyID", "Key");
|
|
}
|
|
else
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-64s\n", "Configured", "SSID", "AuthMode", "EncrypType", "Key");
|
|
}
|
|
|
|
if (Profile.WscConfigured == 1)
|
|
sprintf(msg+strlen(msg),"%-12s", "No");
|
|
else
|
|
sprintf(msg+strlen(msg),"%-12s", "Yes");
|
|
sprintf(msg+strlen(msg), "%-33s", Profile.WscSsid);
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetAuthTypeStr(Profile.WscAuthMode));
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetEncryTypeStr(Profile.WscEncrypType));
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg), "%s\n", "");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-13d",Profile.DefaultKeyIdx);
|
|
sprintf(msg+strlen(msg), "%-26s\n",Profile.WscWPAKey);
|
|
}
|
|
else if (Profile.WscEncrypType >= 4)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-64s\n",Profile.WscWPAKey);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
|
|
|
|
os_free_mem(NULL, msg);
|
|
#endif
|
|
}
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
INT Set_ApCli_Enable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT Enable;
|
|
POS_COOKIE pObj;
|
|
INT ifIndex;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
Enable = simple_strtol(arg, 0, 16);
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_Enable_Proc::(enable = %d)\n", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable));
|
|
|
|
ApCliIfDown(pAd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_ApCli_Ssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
INT ifIndex;
|
|
BOOLEAN apcliEn;
|
|
INT success = FALSE;
|
|
/*UCHAR keyMaterial[40]; */
|
|
#ifndef WPA3_SUPPORT
|
|
UCHAR PskKey[100];
|
|
#endif
|
|
APCLI_STRUCT *apcli_entry;
|
|
struct wifi_dev *wdev;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
if(strlen(arg) <= MAX_LEN_OF_SSID)
|
|
{
|
|
apcli_entry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
wdev = &apcli_entry->wdev;
|
|
|
|
/* bring apcli interface down first */
|
|
apcliEn = apcli_entry->Enable;
|
|
if(apcliEn == TRUE )
|
|
{
|
|
apcli_entry->Enable = FALSE;
|
|
ApCliIfDown(pAd);
|
|
}
|
|
|
|
NdisZeroMemory(apcli_entry->CfgSsid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(apcli_entry->CfgSsid, arg, strlen(arg));
|
|
apcli_entry->CfgSsidLen = (UCHAR)strlen(arg);
|
|
success = TRUE;
|
|
#ifndef WPA3_SUPPORT
|
|
/* Upadte PMK and restart WPAPSK state machine for ApCli link */
|
|
if (((wdev->AuthMode == Ndis802_11AuthModeWPAPSK) ||
|
|
(wdev->AuthMode == Ndis802_11AuthModeWPA2PSK)
|
|
#ifdef WPA3_SUPPORT
|
|
|| (wdev->AuthMode == Ndis802_11AuthModeWPA3SAE)
|
|
#endif
|
|
) && apcli_entry->PSKLen > 0) {
|
|
NdisZeroMemory(PskKey, 100);
|
|
NdisMoveMemory(PskKey, apcli_entry->PSK, apcli_entry->PSKLen);
|
|
|
|
#if 0
|
|
if ((strlen((RTMP_STRING *) PskKey) >= 8) && (strlen((RTMP_STRING *) PskKey) < 64))
|
|
{
|
|
RtmpPasswordHash((char *)PskKey, (PUCHAR)apcli_entry->CfgSsid, apcli_entry->CfgSsidLen, keyMaterial);
|
|
NdisMoveMemory(apcli_entry->PMK, keyMaterial, 32);
|
|
}
|
|
else if ((INT) strlen((RTMP_STRING *) PskKey) == 64)
|
|
{
|
|
AtoH((RTMP_STRING *) PskKey, apcli_entry->PMK, 32);
|
|
}
|
|
#else
|
|
RT_CfgSetWPAPSKKey(pAd, (RTMP_STRING *)PskKey,
|
|
apcli_entry->PSKLen,
|
|
(PUCHAR)apcli_entry->CfgSsid,
|
|
apcli_entry->CfgSsidLen,
|
|
apcli_entry->PMK);
|
|
#endif
|
|
}
|
|
#endif
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_Ssid_Proc::(Len=%d,Ssid=%s)\n",
|
|
ifIndex, apcli_entry->CfgSsidLen, apcli_entry->CfgSsid));
|
|
|
|
apcli_entry->Enable = apcliEn;
|
|
}
|
|
else
|
|
success = FALSE;
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
INT Set_ApCli_Bssid_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT i;
|
|
RTMP_STRING *value;
|
|
INT ifIndex;
|
|
BOOLEAN apcliEn;
|
|
POS_COOKIE pObj;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
/* bring apcli interface down first */
|
|
if(apcliEn == TRUE )
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;
|
|
ApCliIfDown(pAd);
|
|
}
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);
|
|
|
|
if(strlen(arg) == 17) /* Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
{
|
|
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"), i++)
|
|
{
|
|
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
return FALSE; /* Invalid */
|
|
|
|
AtoH(value, &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1);
|
|
}
|
|
|
|
if(i != 6)
|
|
return FALSE; /* Invalid */
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_ApCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\n",
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5]));
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set ApCli-IF Authentication mode
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG i;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
struct wifi_dev *wdev;
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = (UCHAR)pObj->ioctl_if;
|
|
wdev = &pAd->ApCfg.ApCliTab[ifIndex].wdev;
|
|
|
|
if (rtstrcasecmp(arg, "WEPAUTO") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeAutoSwitch;
|
|
else if (rtstrcasecmp(arg, "SHARED") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeShared;
|
|
else if (rtstrcasecmp(arg, "WPAPSK") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeWPAPSK;
|
|
else if ((rtstrcasecmp(arg, "WPA2PSK") == TRUE) || (rtstrcasecmp(arg, "WPAPSKWPA2PSK") == TRUE))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA2PSK;
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
else if (rtstrcasecmp(arg, "WPA") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA;
|
|
else if (rtstrcasecmp(arg, "WPA2") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA2;
|
|
#endif /*WPA_SUPPLICANT_SUPPORT */
|
|
#ifdef WPA3_SUPPORT
|
|
else if (rtstrcasecmp(arg, "SAE") == TRUE)
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA3SAE;
|
|
#endif
|
|
else
|
|
wdev->AuthMode = Ndis802_11AuthModeOpen;
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))
|
|
{
|
|
pAd->MacTab.tr_entry[i].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
}
|
|
}
|
|
#ifndef WPA3_SUPPORT
|
|
RTMPMakeRSNIE(pAd, wdev->AuthMode, wdev->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
|
|
wdev->DefaultKeyId = 0;
|
|
|
|
if(wdev->AuthMode >= Ndis802_11AuthModeWPA)
|
|
wdev->DefaultKeyId = 1;
|
|
#endif
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_AuthMode_Proc::(AuthMode=%d)\n", ifIndex, wdev->AuthMode));
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set ApCli-IF Encryption Type
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_EncrypType_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = (UCHAR)pObj->ioctl_if;
|
|
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
wdev = &pApCliEntry->wdev;
|
|
|
|
wdev->WepStatus = Ndis802_11WEPDisabled;
|
|
#ifdef WPA3_SUPPORT
|
|
if (rtstrcasecmp(arg, "GCMP256") == TRUE) {
|
|
if (wdev->AuthMode < Ndis802_11AuthModeWPA)
|
|
return TRUE; /* do nothing */
|
|
|
|
wdev->WepStatus = Ndis802_11Encryption5Enabled;
|
|
} else
|
|
#endif
|
|
if (rtstrcasecmp(arg, "WEP") == TRUE)
|
|
{
|
|
if (wdev->AuthMode < Ndis802_11AuthModeWPA)
|
|
wdev->WepStatus = Ndis802_11WEPEnabled;
|
|
}
|
|
else if (rtstrcasecmp(arg, "TKIP") == TRUE)
|
|
{
|
|
if (wdev->AuthMode >= Ndis802_11AuthModeWPA)
|
|
wdev->WepStatus = Ndis802_11TKIPEnable;
|
|
}
|
|
else if ((rtstrcasecmp(arg, "AES") == TRUE) || (rtstrcasecmp(arg, "TKIPAES") == TRUE))
|
|
{
|
|
if (wdev->AuthMode >= Ndis802_11AuthModeWPA)
|
|
wdev->WepStatus = Ndis802_11AESEnable;
|
|
}
|
|
else
|
|
{
|
|
wdev->WepStatus = Ndis802_11WEPDisabled;
|
|
}
|
|
|
|
pApCliEntry->PairCipher = wdev->WepStatus;
|
|
pApCliEntry->GroupCipher = wdev->WepStatus;
|
|
pApCliEntry->bMixCipher = FALSE;
|
|
#ifndef WPA3_SUPPORT
|
|
if (wdev->WepStatus >= Ndis802_11TKIPEnable)
|
|
wdev->DefaultKeyId = 1;
|
|
|
|
RTMPMakeRSNIE(pAd, wdev->AuthMode, wdev->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
#endif
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_EncrypType_Proc::(EncrypType=%d)\n", ifIndex, wdev->WepStatus));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Default Key ID
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_DefaultKeyID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG KeyIdx;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev;
|
|
|
|
KeyIdx = simple_strtol(arg, 0, 10);
|
|
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
|
|
wdev->DefaultKeyId = (UCHAR) (KeyIdx - 1 );
|
|
else
|
|
return FALSE; /* Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\n", pObj->ioctl_if, wdev->DefaultKeyId));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA PSK key for ApCli link
|
|
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
arg WPA pre-shared key string
|
|
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_WPAPSK_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT ifIndex;
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT retval;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_ApCli_WPAPSK_Proc::(WPAPSK=%s)\n", arg));
|
|
|
|
retval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pApCliEntry->PMK);
|
|
if (retval == FALSE)
|
|
return FALSE;
|
|
|
|
NdisMoveMemory(pApCliEntry->PSK, arg, strlen(arg));
|
|
pApCliEntry->PSKLen = (UCHAR)strlen(arg);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY1 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_Key1_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT ifIndex;
|
|
INT retVal;
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[0], 0);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_Key1_Proc::(Key1=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY2 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_Key2_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[1], 1);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_Key2_Proc::(Key2=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY3 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_Key3_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[2], 2);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_Key3_Proc::(Key3=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY4 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_Key4_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[3], 3);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_ApCli_Key4_Proc::(Key4=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
INT Set_ApCli_TxMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev;
|
|
|
|
wdev->DesiredTransmitSetting.field.FixedTxMode = (USHORT)RT_CfgSetFixedTxPhyMode(arg);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_TxMode_Proc = %d\n",
|
|
pObj->ioctl_if, wdev->DesiredTransmitSetting.field.FixedTxMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_ApCli_TxMcs_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
wdev = &pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev;
|
|
|
|
wdev->DesiredTransmitSetting.field.MCS =
|
|
(USHORT)RT_CfgSetTxMCSProc(arg, &wdev->bAutoTxRateSwitch);
|
|
|
|
if (wdev->DesiredTransmitSetting.field.MCS == MCS_AUTO)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_TxMcs_Proc = AUTO\n", pObj->ioctl_if));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_TxMcs_Proc = %d\n",
|
|
pObj->ioctl_if, wdev->DesiredTransmitSetting.field.MCS));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
INT Set_ApCli_Wpa_Support(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
INT ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
if ( simple_strtol(arg, 0, 10) == 0)
|
|
pApCliEntry->wpa_supplicant_info.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
|
|
else if ( simple_strtol(arg, 0, 10) == 1)
|
|
pApCliEntry->wpa_supplicant_info.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
|
|
else if ( simple_strtol(arg, 0, 10) == 2)
|
|
pApCliEntry->wpa_supplicant_info.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI;
|
|
else
|
|
pApCliEntry->wpa_supplicant_info.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_ApCli_Wpa_Support::(WpaSupplicantUP=%d)\n",
|
|
pApCliEntry->wpa_supplicant_info.WpaSupplicantUP));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_ApCli_IEEE8021X_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG ieee8021x;
|
|
POS_COOKIE pObj;
|
|
INT ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
ieee8021x = simple_strtol(arg, 0, 10);
|
|
|
|
if (ieee8021x == 1)
|
|
pApCliEntry->wdev.IEEE8021X = TRUE;
|
|
else if (ieee8021x == 0)
|
|
pApCliEntry->wdev.IEEE8021X = FALSE;
|
|
else
|
|
return FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_ApCli_IEEE8021X_Proc::(IEEE8021X=%d)\n", pObj->ioctl_if, pApCliEntry->wdev.IEEE8021X));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* WPA_SUPPLICANT_SUPPORT */
|
|
|
|
#ifdef MAC_REPEATER_SUPPORT
|
|
INT Set_ReptMode_Enable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR Enable = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->ApCfg.bMACRepeaterEn = (Enable ? TRUE : FALSE);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("MACRepeaterEn = %d, Repeater Mode (%s)\n",
|
|
pAd->ApCfg.bMACRepeaterEn, (Enable ? "ON" : "OFF")));
|
|
|
|
AsicSetMacAddrExt(pAd, pAd->ApCfg.bMACRepeaterEn);
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Trigger Apcli Auto connect to find the missed AP.
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_ApCli_AutoConnect_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj= (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
AP_ADMIN_CONFIG *pApCfg;
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
pApCfg = &pAd->ApCfg;
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
if (pApCfg->ApCliAutoConnectRunning == FALSE)
|
|
{
|
|
Set_ApCli_Enable_Proc(pAd, "0");
|
|
pApCfg->ApCliAutoConnectRunning = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_ApCli_AutoConnect_Proc() is still running\n"));
|
|
return TRUE;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(apcli%d) Set_ApCli_AutoConnect_Proc::(Len=%d,Ssid=%s)\n",
|
|
ifIndex, pApCfg->ApCliTab[ifIndex].CfgSsidLen, pApCfg->ApCliTab[ifIndex].CfgSsid));
|
|
|
|
|
|
/*
|
|
use site survey function to trigger auto connecting (when pAd->ApCfg.ApAutoConnectRunning == TRUE)
|
|
*/
|
|
Set_SiteSurvey_Proc(pAd, "");//pApCfg->ApCliTab[ifIndex].CfgSsid);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
|
|
|
#if 0
|
|
INT Set_ReptCli_Addr_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR tempMAC[6], apCliIdx;
|
|
RTMP_STRING *token;
|
|
RTMP_STRING sepValue[] = ":", DASH = '-';
|
|
ULONG offset, Addr;
|
|
INT i, CliIdx;
|
|
PREPEATER_CLIENT_ENTRY pReptCliEntry = NULL;
|
|
|
|
if(strlen(arg) < 19) /*Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.*/
|
|
return FALSE;
|
|
|
|
token = strchr(arg, DASH);
|
|
if ((token != NULL) && (strlen(token)>1))
|
|
{
|
|
APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg;
|
|
|
|
apCliIdx = (UCHAR) simple_strtol((token+1), 0, 10);
|
|
|
|
if (apCliIdx > 7)
|
|
return FALSE;
|
|
|
|
*token = '\0';
|
|
for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)
|
|
{
|
|
if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))
|
|
return FALSE;
|
|
AtoH(token, (&tempMAC[i]), 1);
|
|
}
|
|
|
|
if(i != 6)
|
|
return FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n",
|
|
tempMAC[0], tempMAC[1], tempMAC[2], tempMAC[3], tempMAC[4], tempMAC[5], apCliIdx));
|
|
|
|
for (CliIdx = 0; CliIdx < MAX_EXT_MAC_ADDR_SIZE; CliIdx++)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[apCliIdx].RepeaterCli[CliIdx].bValid == FALSE)
|
|
break;
|
|
}
|
|
|
|
if (CliIdx >= MAX_EXT_MAC_ADDR_SIZE)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, (" Repeate Client Full !!!\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
pReptCliEntry = &pAd->ApCfg.ApCliTab[apCliIdx].RepeaterCli[CliIdx];
|
|
COPY_MAC_ADDR(pReptCliEntry->OriginalAddress, tempMAC);
|
|
tempMAC[0] = pAd->ApCfg.ApCliTab[apCliIdx].CurrentAddress[0];
|
|
tempMAC[0] |= 0x2;
|
|
tempMAC[1] = pAd->ApCfg.ApCliTab[apCliIdx].CurrentAddress[1];
|
|
tempMAC[2] = pAd->ApCfg.ApCliTab[apCliIdx].CurrentAddress[2];
|
|
COPY_MAC_ADDR(pReptCliEntry->CurrentAddress, tempMAC);
|
|
pReptCliEntry->bValid = TRUE;
|
|
pReptCliEntry->CliConnectState = 1;
|
|
|
|
NdisZeroMemory(&ApCliCtrlMsg, sizeof(APCLI_CTRL_MSG_STRUCT));
|
|
ApCliCtrlMsg.Status = MLME_SUCCESS;
|
|
COPY_MAC_ADDR(&ApCliCtrlMsg.SrcAddr[0], tempMAC);
|
|
ApCliCtrlMsg.BssIdx = apCliIdx;
|
|
ApCliCtrlMsg.CliIdx = CliIdx;
|
|
|
|
offset = 0x1480 + (HW_WCID_ENTRY_SIZE * CliIdx);
|
|
Addr = tempMAC[0] + (tempMAC[1] << 8) +(tempMAC[2] << 16) +(tempMAC[3] << 24);
|
|
RTMP_IO_WRITE32(pAd, offset, Addr);
|
|
Addr = tempMAC[4] + (tempMAC[5] << 8);
|
|
RTMP_IO_WRITE32(pAd, offset + 4, Addr);
|
|
|
|
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_MT2_AUTH_REQ,
|
|
sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, apCliIdx);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
#endif
|
|
#endif /* MAC_REPEATER_SUPPORT */
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_AP_WscSsid_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex = pObj->ioctl_if;
|
|
PWSC_CTRL pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl;
|
|
|
|
if (pObj->ioctl_if_type != INT_APCLI)
|
|
return FALSE;
|
|
|
|
NdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));
|
|
|
|
if( (strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID))
|
|
{
|
|
NdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg));
|
|
pWscControl->WscSsid.SsidLength = strlen(arg);
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\n",
|
|
pWscControl->WscSsid.SsidLength, pWscControl->WscSsid.Ssid));
|
|
}
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_AP_WscConfMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT ConfModeIdx;
|
|
/*INT IsAPConfigured; */
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];
|
|
BOOLEAN bFromApCli = FALSE;
|
|
PWSC_CTRL pWscControl;
|
|
|
|
ConfModeIdx = simple_strtol(arg, 0, 10);
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
bFromApCli = FALSE;
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
bFromApCli = FALSE;
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
pWscControl->bWscTrigger = FALSE;
|
|
if ((ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR) == WSC_DISABLE)
|
|
{
|
|
pWscControl->WscConfMode = WSC_DISABLE;
|
|
pWscControl->WscStatus = STATUS_WSC_NOTUSED;
|
|
if (bFromApCli)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscConfMode_Proc:: WPS is disabled.\n", apidx));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscConfMode_Proc:: WPS is disabled.\n", apidx));
|
|
/* Clear WPS IE in Beacon and ProbeResp */
|
|
pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = 0;
|
|
pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen = 0;
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
if (ConfModeIdx == WSC_ENROLLEE)
|
|
{
|
|
pWscControl->WscConfMode = WSC_ENROLLEE;
|
|
WscInit(pAd, TRUE, apidx);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscConfMode_Proc:: Ap Client only supports Enrollee mode.(ConfModeIdx=%d)\n",
|
|
apidx, ConfModeIdx));
|
|
return FALSE;
|
|
}
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
pWscControl->WscConfMode = (ConfModeIdx & WSC_ENROLLEE_PROXY_REGISTRAR);
|
|
WscInit(pAd, FALSE, apidx);
|
|
}
|
|
pWscControl->WscStatus = STATUS_WSC_IDLE;
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
memcpy(mac_addr, &pAd->ApCfg.ApCliTab[apidx].wdev.if_addr[0], MAC_ADDR_LEN);
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
memcpy(mac_addr, &pAd->ApCfg.MBSSID[apidx].wdev.bssid[0], MAC_ADDR_LEN);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfMode_Proc::(WscConfMode(0~7)=%d)\n",
|
|
PRINT_MAC(mac_addr), pWscControl->WscConfMode));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_AP_WscConfStatus_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR IsAPConfigured = 0;
|
|
INT IsSelectedRegistrar;
|
|
USHORT WscMode;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscConfStatus_Proc:: Ap Client doesn't need this command.\n", apidx));
|
|
return FALSE;
|
|
}
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
#ifdef WSC_V2_SUPPORT
|
|
if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bWpsEnable == FALSE) &&
|
|
(pAd->ApCfg.MBSSID[apidx].WscControl.WscV2Info.bEnableWpsV2))
|
|
{
|
|
pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen = 0;
|
|
pAd->ApCfg.MBSSID[apidx].WscIEProbeResp.ValueLen = 0;
|
|
return FALSE;
|
|
}
|
|
#endif /* WSC_V2_SUPPORT */
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfStatus_Proc:: P2P Client doesn't need this command.\n", apidx));
|
|
return FALSE;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscConfStatus_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
IsAPConfigured = (UCHAR)simple_strtol(arg, 0, 10);
|
|
IsSelectedRegistrar = pAd->ApCfg.MBSSID[apidx].WscControl.WscSelReg;
|
|
if (pAd->ApCfg.MBSSID[apidx].WscControl.WscMode == 1)
|
|
WscMode = DEV_PASS_ID_PIN;
|
|
else
|
|
WscMode = DEV_PASS_ID_PBC;
|
|
|
|
if ((IsAPConfigured > 0) && (IsAPConfigured <= 2))
|
|
{
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus = IsAPConfigured;
|
|
/* Change SC State of WPS IE in Beacon and ProbeResp */
|
|
WscBuildBeaconIE(pAd, IsAPConfigured, IsSelectedRegistrar, WscMode, 0, apidx, NULL, 0, AP_MODE);
|
|
WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, IsSelectedRegistrar, WscMode, 0, apidx, NULL, 0, AP_MODE);
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscConfStatus_Proc:: Set failed!!(WscConfStatus=%s), WscConfStatus is 1 or 2 \n", apidx, arg));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscConfStatus_Proc:: WscConfStatus is not changed (%d) \n", apidx, pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus));
|
|
return FALSE; /*Invalid argument */
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscConfStatus_Proc::(WscConfStatus=%d)\n",
|
|
PRINT_MAC(pAd->ApCfg.MBSSID[apidx].wdev.bssid),
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_AP_WscMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT WscMode;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];
|
|
PWSC_CTRL pWscControl;
|
|
#ifdef APCLI_SUPPORT
|
|
BOOLEAN bFromApCli = FALSE;
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscMode_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = TRUE;
|
|
#endif /* APCLI_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = FALSE;
|
|
#endif /* APCLI_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = FALSE;
|
|
#endif /* APCLI_SUPPORT */
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscMode_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
WscMode = simple_strtol(arg, 0, 10);
|
|
|
|
if ((WscMode > 0) && (WscMode <= 2))
|
|
{
|
|
pWscControl->WscMode = WscMode;
|
|
if (WscMode == WSC_PBC_MODE)
|
|
{
|
|
WscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscMode_Proc:: Set failed!!(Set_WscMode_Proc=%s), WscConfStatus is 1 or 2 \n", arg));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscMode_Proc:: WscMode is not changed (%d) \n", pWscControl->WscMode));
|
|
return FALSE; /*Invalid argument */
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, MAC_ADDR_LEN);
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscMode_Proc::(WscMode=%d)\n",
|
|
PRINT_MAC(mac_addr), pWscControl->WscMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscStatus_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscStatus_Proc::(WscStatus=%d)\n", apidx, pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus));
|
|
return TRUE;
|
|
}
|
|
|
|
#define WSC_GET_CONF_MODE_EAP 1
|
|
#define WSC_GET_CONF_MODE_UPNP 2
|
|
INT Set_AP_WscGetConf_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT WscMode, wscGetConfMode = 0;
|
|
INT IsAPConfigured;
|
|
PWSC_CTRL pWscControl;
|
|
//PWSC_UPNP_NODE_INFO pWscUPnPNodeInfo;
|
|
INT idx;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];
|
|
BOOLEAN bFromApCli = FALSE;
|
|
#ifdef APCLI_SUPPORT
|
|
BOOLEAN apcliEn = pAd->ApCfg.ApCliTab[apidx].Enable;
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef WSC_V2_SUPPORT
|
|
PWSC_V2_INFO pWscV2Info = NULL;
|
|
#endif /* WSC_V2_SUPPORT */
|
|
#ifdef WSC_LED_SUPPORT
|
|
UCHAR WPSLEDStatus;
|
|
#endif /* WSC_LED_SUPPORT */
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
if (apcliEn == FALSE)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_AP_WscGetConf_Proc:: ApCli is disabled.\n", apidx));
|
|
return FALSE;
|
|
}
|
|
bFromApCli = TRUE;
|
|
apidx &= (~MIN_NET_DEVICE_FOR_APCLI);
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_AP_WscGetConf_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
bFromApCli = FALSE;
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_AP_WscGetConf_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
bFromApCli = FALSE;
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_AP_WscGetConf_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
NdisZeroMemory(mac_addr, MAC_ADDR_LEN);
|
|
|
|
#ifdef WSC_V2_SUPPORT
|
|
pWscV2Info = &pWscControl->WscV2Info;
|
|
#endif /* WSC_V2_SUPPORT */
|
|
wscGetConfMode = simple_strtol(arg, 0, 10);
|
|
|
|
IsAPConfigured = pWscControl->WscConfStatus;
|
|
//pWscUPnPNodeInfo = &pWscControl->WscUPnPNodeInfo;
|
|
|
|
if ((pWscControl->WscConfMode == WSC_DISABLE)
|
|
#ifdef WSC_V2_SUPPORT
|
|
|| ((pWscV2Info->bWpsEnable == FALSE) && (pWscV2Info->bEnableWpsV2))
|
|
#endif /* WSC_V2_SUPPORT */
|
|
)
|
|
{
|
|
pWscControl->bWscTrigger = FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscGetConf_Proc: WPS is disabled.\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
WscStop(pAd, bFromApCli, pWscControl);
|
|
|
|
/* trigger wsc re-generate public key */
|
|
pWscControl->RegData.ReComputePke = 1;
|
|
|
|
if (pWscControl->WscMode == 1)
|
|
WscMode = DEV_PASS_ID_PIN;
|
|
else
|
|
{
|
|
WscMode = DEV_PASS_ID_PBC;
|
|
}
|
|
#ifdef P2P_SUPPORT
|
|
if (pAd->P2pCfg.Dpid != DEV_PASS_ID_NOSPEC)
|
|
WscMode = pAd->P2pCfg.Dpid;
|
|
#endif /* P2P_SUPPORT */
|
|
WscInitRegistrarPair(pAd, pWscControl, apidx);
|
|
/* Enrollee 192 random bytes for DH key generation */
|
|
for (idx = 0; idx < 192; idx++)
|
|
pWscControl->RegData.EnrolleeRandom[idx] = RandomByte(pAd);
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
/* bring apcli interface down first */
|
|
pAd->ApCfg.ApCliTab[apidx].Enable = FALSE;
|
|
ApCliIfDown(pAd);
|
|
|
|
if (WscMode == DEV_PASS_ID_PIN)
|
|
{
|
|
NdisMoveMemory(pWscControl->RegData.SelfInfo.MacAddr,
|
|
pAd->ApCfg.ApCliTab[apidx].wdev.if_addr,
|
|
6);
|
|
|
|
pAd->ApCfg.ApCliTab[apidx].Enable = apcliEn;
|
|
NdisMoveMemory(mac_addr, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, MAC_ADDR_LEN);
|
|
}
|
|
else
|
|
{
|
|
pWscControl->WscSsid.SsidLength = 0;
|
|
NdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));
|
|
pWscControl->WscPBCBssCount = 0;
|
|
/* WPS - SW PBC */
|
|
WscPushPBCAction(pAd, pWscControl);
|
|
}
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
WscBuildBeaconIE(pAd, IsAPConfigured, TRUE, WscMode, pWscControl->WscConfigMethods, apidx, NULL, 0, AP_MODE);
|
|
WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, TRUE, WscMode, pWscControl->WscConfigMethods, apidx, NULL, 0, AP_MODE);
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
NdisMoveMemory(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN);
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli && (WscMode == DEV_PASS_ID_PBC))
|
|
;
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
/* 2mins time-out timer */
|
|
RTMPSetTimer(&pWscControl->Wsc2MinsTimer, WSC_TWO_MINS_TIME_OUT);
|
|
pWscControl->Wsc2MinsTimerRunning = TRUE;
|
|
pWscControl->WscStatus = STATUS_WSC_LINK_UP;
|
|
pWscControl->bWscTrigger = TRUE;
|
|
}
|
|
pWscControl->bWscAutoTigeer = FALSE;
|
|
|
|
if (!bFromApCli)
|
|
{
|
|
if (WscMode == DEV_PASS_ID_PIN)
|
|
{
|
|
WscAssignEntryMAC(pAd, pWscControl);
|
|
WscSendUPnPConfReqMsg(pAd, pWscControl->EntryIfIdx,
|
|
(PUCHAR)pAd->ApCfg.MBSSID[pWscControl->EntryIfIdx].Ssid,
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid, 3, 0, AP_MODE);
|
|
}
|
|
else
|
|
{
|
|
RTMP_SEM_LOCK(&pWscControl->WscPeerListSemLock);
|
|
WscClearPeerList(&pWscControl->WscPeerList);
|
|
RTMP_SEM_UNLOCK(&pWscControl->WscPeerListSemLock);
|
|
}
|
|
}
|
|
|
|
#ifdef WSC_LED_SUPPORT
|
|
#ifdef CONFIG_WIFI_LED_SHARE
|
|
/* Change FW default mode to HUAWEI WPS mode*/
|
|
pAd->LedCntl.MCULedCntl.word &= 0x80;
|
|
pAd->LedCntl.MCULedCntl.word |= WPS_LED_MODE_SHARE;
|
|
|
|
if (LED_MODE(pAd) == WPS_LED_MODE_SHARE)
|
|
{
|
|
WPSLEDStatus = LED_WPS_PRE_STAGE;
|
|
RTMPSetTimer(&pWscControl->WscLEDTimer, WSC_WPS_PREPOST_WIFI_LED_TIMEOUT);
|
|
}
|
|
else
|
|
#endif /* CONFIG_WIFI_LED_SHARE */
|
|
WPSLEDStatus = LED_WPS_IN_PROCESS;
|
|
RTMPSetLED(pAd, WPSLEDStatus);
|
|
#endif /* WSC_LED_SUPPORT */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscGetConf_Proc trigger WSC state machine, wscGetConfMode=%d\n",
|
|
PRINT_MAC(mac_addr), wscGetConfMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_AP_WscPinCode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT PinCode = 0;
|
|
BOOLEAN validatePin;
|
|
#ifdef APCLI_SUPPORT
|
|
BOOLEAN bFromApCli = FALSE;
|
|
#endif /* APCLI_SUPPORT */
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if, mac_addr[MAC_ADDR_LEN];
|
|
PWSC_CTRL pWscControl;
|
|
#define IsZero(c) ('0' == (c) ? TRUE:FALSE)
|
|
PinCode = simple_strtol(arg, 0, 10); /* When PinCode is 03571361, return value is 3571361. */
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscPinCode_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef P2P_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_P2P)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = TRUE;
|
|
#endif
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
}
|
|
else
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = FALSE;
|
|
#endif
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_WscMode_Proc:: This command is from p2p interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* P2P_SUPPORT */
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = FALSE;
|
|
#endif
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscPinCode_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
if (strlen(arg) == 4)
|
|
validatePin = TRUE;
|
|
else
|
|
validatePin = ValidateChecksum(PinCode);
|
|
|
|
if ( validatePin )
|
|
{
|
|
if (pWscControl->WscRejectSamePinFromEnrollee &&
|
|
(PinCode == pWscControl->WscLastPinFromEnrollee))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("PIN authentication or communication error occurs!!\n"
|
|
"Registrar does NOT accept the same PIN again!(PIN:%s)\n", arg));
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
pWscControl->WscPinCode = PinCode;
|
|
pWscControl->WscLastPinFromEnrollee = pWscControl->WscPinCode;
|
|
pWscControl->WscRejectSamePinFromEnrollee = FALSE;
|
|
/* PIN Code */
|
|
if (strlen(arg) == 4)
|
|
{
|
|
pWscControl->WscPinCodeLen = 4;
|
|
pWscControl->RegData.PinCodeLen = 4;
|
|
NdisMoveMemory(pWscControl->RegData.PIN, arg, 4);
|
|
}
|
|
else
|
|
{
|
|
pWscControl->WscPinCodeLen = 8;
|
|
|
|
if (IsZero(*arg))
|
|
{
|
|
pWscControl->RegData.PinCodeLen = 8;
|
|
NdisMoveMemory(pWscControl->RegData.PIN, arg, 8);
|
|
}
|
|
else
|
|
WscGetRegDataPIN(pAd, pWscControl->WscPinCode, pWscControl);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set failed!!(Set_WscPinCode_Proc=%s), PinCode Checksum invalid \n", arg));
|
|
return FALSE; /*Invalid argument */
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
memcpy(mac_addr, pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, MAC_ADDR_LEN);
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
memcpy(mac_addr, pAd->ApCfg.MBSSID[apidx].wdev.bssid, MAC_ADDR_LEN);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(%02X:%02X:%02X:%02X:%02X:%02X) Set_WscPinCode_Proc::(PinCode=%d)\n",
|
|
PRINT_MAC(mac_addr), pWscControl->WscPinCode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscOOB_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
char *pTempSsid = NULL;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\n", apidx));
|
|
return FALSE;
|
|
}
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
Set_AP_WscConfStatus_Proc(pAd, "1");
|
|
Set_AP_AuthMode_Proc(pAd, "WPA2PSK");
|
|
Set_AP_EncrypType_Proc(pAd, "AES");
|
|
pTempSsid = vmalloc(33);
|
|
if (pTempSsid)
|
|
{
|
|
memset(pTempSsid, 0, 33);
|
|
snprintf(pTempSsid, 33,"RalinkInitialAP%02X%02X%02X",
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[3],
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[4],
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[5]);
|
|
Set_AP_SSID_Proc(pAd, pTempSsid);
|
|
vfree(pTempSsid);
|
|
}
|
|
Set_AP_WPAPSK_Proc(pAd, "RalinkInitialAPxx1234");
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscOOB_Proc\n", apidx));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscStop_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PWSC_CTRL pWscControl;
|
|
#ifdef APCLI_SUPPORT
|
|
BOOLEAN bFromApCli = FALSE;
|
|
#endif
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pAd->ApCfg.MBSSID[apidx].Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return FALSE;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
bFromApCli = TRUE;
|
|
pWscControl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscStop_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
bFromApCli = FALSE;
|
|
#endif
|
|
pWscControl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscStop_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (bFromApCli)
|
|
{
|
|
WscStop(pAd, TRUE, pWscControl);
|
|
pWscControl->WscConfMode = WSC_DISABLE;
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
INT IsAPConfigured = pWscControl->WscConfStatus;
|
|
WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, apidx, NULL, 0, AP_MODE);
|
|
WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, apidx, NULL, 0, AP_MODE);
|
|
APUpdateBeaconFrame(pAd, apidx);
|
|
WscStop(pAd, FALSE, pWscControl);
|
|
}
|
|
|
|
pWscControl->bWscTrigger = FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<===== Set_WscStop_Proc"));
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Get WSC Profile
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 get_wsc_profile
|
|
3.) UI needs to prepare at least 4096bytes to get the results
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPIoctlWscProfile(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
WSC_CONFIGURED_VALUE Profile;
|
|
RTMP_STRING *msg;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss;
|
|
struct wifi_dev *wdev;
|
|
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
wdev = &pMbss->wdev;
|
|
#ifdef HOSTAPD_SUPPORT
|
|
if (pMbss->Hostapd == Hostapd_EXT)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("WPS is control by hostapd now.\n"));
|
|
return;
|
|
}
|
|
#endif /*HOSTAPD_SUPPORT*/
|
|
|
|
|
|
memset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE));
|
|
Profile.WscConfigured = pMbss->WscControl.WscConfStatus;
|
|
NdisZeroMemory(Profile.WscSsid, 32 + 1);
|
|
NdisMoveMemory(Profile.WscSsid, pMbss->Ssid, pMbss->SsidLen);
|
|
Profile.WscSsid[pMbss->SsidLen] = '\0';
|
|
if (wdev->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)
|
|
Profile.WscAuthMode = WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK;
|
|
else
|
|
Profile.WscAuthMode = WscGetAuthType(wdev->AuthMode);
|
|
if (wdev->WepStatus == Ndis802_11TKIPAESMix)
|
|
Profile.WscEncrypType = WSC_ENCRTYPE_TKIP |WSC_ENCRTYPE_AES;
|
|
else
|
|
Profile.WscEncrypType = WscGetEncryType(wdev->WepStatus);
|
|
NdisZeroMemory(Profile.WscWPAKey, 64 + 1);
|
|
|
|
if (Profile.WscEncrypType == 2)
|
|
{
|
|
Profile.DefaultKeyIdx = wdev->DefaultKeyId + 1;
|
|
#if 0
|
|
if (pAd->SharedKey[apidx][wdev->DefaultKeyId].WepKeyType == WEP_ASCII_TYPE)
|
|
{
|
|
int i;
|
|
for (i=0; i<pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen; i++)
|
|
{
|
|
sprintf(Profile.WscWPAKey,
|
|
"%s%02x", Profile.WscWPAKey,
|
|
pAd->SharedKey[apidx][wdev->DefaultKeyId].Key[i]);
|
|
}
|
|
Profile.WscWPAKey[(pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen)*2] = '\0';
|
|
}
|
|
else /* Hex WEP Key */
|
|
#endif /* if 0 */
|
|
{
|
|
int i;
|
|
for (i=0; i<pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen; i++)
|
|
{
|
|
snprintf((RTMP_STRING *) Profile.WscWPAKey, sizeof(Profile.WscWPAKey),
|
|
"%s%02x", Profile.WscWPAKey,
|
|
pAd->SharedKey[apidx][wdev->DefaultKeyId].Key[i]);
|
|
}
|
|
Profile.WscWPAKey[(pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen)*2] = '\0';
|
|
}
|
|
}
|
|
else if (Profile.WscEncrypType >= 4)
|
|
{
|
|
Profile.DefaultKeyIdx = 2;
|
|
NdisMoveMemory(Profile.WscWPAKey, pMbss->WscControl.WpaPsk,
|
|
pMbss->WscControl.WpaPskLen);
|
|
Profile.WscWPAKey[pMbss->WscControl.WpaPskLen] = '\0';
|
|
}
|
|
else
|
|
{
|
|
Profile.DefaultKeyIdx = 1;
|
|
}
|
|
|
|
wrq->u.data.length = sizeof(Profile);
|
|
|
|
if (copy_to_user(wrq->u.data.pointer, &Profile, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
|
|
}
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
memset(msg, 0x00, 2048);
|
|
sprintf(msg,"%s","\n");
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s\n", "Configured", "SSID", "AuthMode", "EncrypType");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-13s%-26s\n", "Configured", "SSID", "AuthMode", "EncrypType", "DefaultKeyID", "Key");
|
|
}
|
|
else
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-64s\n", "Configured", "SSID", "AuthMode", "EncrypType", "Key");
|
|
}
|
|
|
|
if (Profile.WscConfigured == 1)
|
|
sprintf(msg+strlen(msg),"%-12s", "No");
|
|
else
|
|
sprintf(msg+strlen(msg),"%-12s", "Yes");
|
|
sprintf(msg+strlen(msg), "%-33s", Profile.WscSsid);
|
|
if (wdev->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)
|
|
sprintf(msg+strlen(msg), "%-12s", "WPAPSKWPA2PSK");
|
|
else
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetAuthTypeStr(Profile.WscAuthMode));
|
|
if (wdev->WepStatus == Ndis802_11TKIPAESMix)
|
|
sprintf(msg+strlen(msg), "%-12s", "TKIPAES");
|
|
else
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetEncryTypeStr(Profile.WscEncrypType));
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg), "%s\n", "");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-13d",Profile.DefaultKeyIdx);
|
|
sprintf(msg+strlen(msg), "%-26s\n",Profile.WscWPAKey);
|
|
}
|
|
else if (Profile.WscEncrypType >= 4)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-64s\n",Profile.WscWPAKey);
|
|
}
|
|
#ifdef INF_AR9
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
#endif/* INF_AR9 */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
|
|
#if defined(INF_AR9) || defined(BB_SOC)
|
|
#if defined(AR9_MAPI_SUPPORT) || defined(BB_SOC)
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Get WSC Profile
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
wrq Pointer to the ioctl argument
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
Usage:
|
|
1.) iwpriv ra0 ar9_show get_wsc_profile
|
|
3.) UI needs to prepare at least 4096bytes to get the results
|
|
==========================================================================
|
|
*/
|
|
VOID RTMPAR9IoctlWscProfile(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
WSC_CONFIGURED_VALUE Profile;
|
|
RTMP_STRING *msg;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss;
|
|
struct wifi_dev *wdev;
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
wdev = &pMbss->wdev;
|
|
|
|
memset(&Profile, 0x00, sizeof(WSC_CONFIGURED_VALUE));
|
|
Profile.WscConfigured = pAd->ApCfg.MBSSID[apidx].WscControl.WscConfStatus;
|
|
NdisZeroMemory(Profile.WscSsid, 32 + 1);
|
|
NdisMoveMemory(Profile.WscSsid, pAd->ApCfg.MBSSID[apidx].Ssid,
|
|
pAd->ApCfg.MBSSID[apidx].SsidLen);
|
|
Profile.WscSsid[pAd->ApCfg.MBSSID[apidx].SsidLen] = '\0';
|
|
if (wdev->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)
|
|
Profile.WscAuthMode = WSC_AUTHTYPE_WPAPSK | WSC_AUTHTYPE_WPA2PSK;
|
|
else
|
|
Profile.WscAuthMode = WscGetAuthType(wdev->AuthMode);
|
|
if (wdev->WepStatus == Ndis802_11Encryption4Enabled)
|
|
Profile.WscEncrypType = WSC_ENCRTYPE_TKIP |WSC_ENCRTYPE_AES;
|
|
else
|
|
Profile.WscEncrypType = WscGetEncryType(wdev->WepStatus);
|
|
NdisZeroMemory(Profile.WscWPAKey, 64 + 1);
|
|
|
|
if (Profile.WscEncrypType == 2)
|
|
{
|
|
Profile.DefaultKeyIdx = wdev->DefaultKeyId + 1;
|
|
{
|
|
int i;
|
|
for (i=0; i<pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen; i++)
|
|
{
|
|
snprintf((RTMP_STRING *) Profile.WscWPAKey, sizeof(Profile.WscWPAKey),
|
|
"%s%02x", Profile.WscWPAKey,
|
|
pAd->SharedKey[apidx][wdev->DefaultKeyId].Key[i]);
|
|
}
|
|
Profile.WscWPAKey[(pAd->SharedKey[apidx][wdev->DefaultKeyId].KeyLen)*2] = '\0';
|
|
}
|
|
}
|
|
else if (Profile.WscEncrypType >= 4)
|
|
{
|
|
Profile.DefaultKeyIdx = 2;
|
|
NdisMoveMemory(Profile.WscWPAKey, pAd->ApCfg.MBSSID[apidx].WscControl.WpaPsk,
|
|
pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen);
|
|
Profile.WscWPAKey[pAd->ApCfg.MBSSID[apidx].WscControl.WpaPskLen] = '\0';
|
|
}
|
|
else
|
|
{
|
|
Profile.DefaultKeyIdx = 1;
|
|
}
|
|
|
|
os_alloc_mem(pAd, (UCHAR **)&msg, sizeof(CHAR)*(2048));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
memset(msg, 0x00, 2048);
|
|
sprintf(msg,"%s","\n");
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s\n", "Configured", "SSID", "AuthMode", "EncrypType");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-13s%-26s\n", "Configured", "SSID", "AuthMode", "EncrypType", "DefaultKeyID", "Key");
|
|
}
|
|
else
|
|
{
|
|
sprintf(msg+strlen(msg),"%-12s%-33s%-12s%-12s%-64s\n", "Configured", "SSID", "AuthMode", "EncrypType", "Key");
|
|
}
|
|
|
|
if (Profile.WscConfigured == 1)
|
|
sprintf(msg+strlen(msg),"%-12s", "No");
|
|
else
|
|
sprintf(msg+strlen(msg),"%-12s", "Yes");
|
|
sprintf(msg+strlen(msg), "%-33s", Profile.WscSsid);
|
|
if (wdev->AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)
|
|
sprintf(msg+strlen(msg), "%-12s", "WPAPSKWPA2PSK");
|
|
else
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetAuthTypeStr(Profile.WscAuthMode));
|
|
if (wdev->WepStatus == Ndis802_11Encryption4Enabled)
|
|
sprintf(msg+strlen(msg), "%-12s", "TKIPAES");
|
|
else
|
|
sprintf(msg+strlen(msg), "%-12s", WscGetEncryTypeStr(Profile.WscEncrypType));
|
|
|
|
if (Profile.WscEncrypType == 1)
|
|
{
|
|
sprintf(msg+strlen(msg), "%s\n", "");
|
|
}
|
|
else if (Profile.WscEncrypType == 2)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-13d",Profile.DefaultKeyIdx);
|
|
sprintf(msg+strlen(msg), "%-26s\n",Profile.WscWPAKey);
|
|
}
|
|
else if (Profile.WscEncrypType >= 4)
|
|
{
|
|
sprintf(msg+strlen(msg), "%-64s\n",Profile.WscWPAKey);
|
|
}
|
|
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
|
|
}
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
|
|
VOID RTMPIoctlWscPINCode(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
RTMP_STRING *msg;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
UCHAR tempPIN[9]={0};
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(128));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
memset(msg, 0x00, 128);
|
|
sprintf(msg,"%s","\n");
|
|
sprintf(msg+strlen(msg),"WSC_PINCode=");
|
|
if(pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode)
|
|
{
|
|
if (pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCodeLen == 8)
|
|
sprintf((RTMP_STRING *) tempPIN, "%08u", pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode);
|
|
else
|
|
sprintf((RTMP_STRING *) tempPIN, "%04u", pAd->ApCfg.MBSSID[apidx].WscControl.WscEnrolleePinCode);
|
|
sprintf(msg,"%s%s\n",msg,tempPIN);
|
|
}
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
|
|
VOID RTMPIoctlWscStatus(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
RTMP_STRING *msg;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(128));
|
|
if (msg == NULL) {
|
|
return;
|
|
}
|
|
|
|
memset(msg, 0x00, 128);
|
|
sprintf(msg,"%s","\n");
|
|
sprintf(msg+strlen(msg),"WSC_Status=");
|
|
sprintf(msg,"%s%d\n",msg,pAd->ApCfg.MBSSID[apidx].WscControl.WscStatus);
|
|
wrq->u.data.length = strlen(msg);
|
|
copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
|
|
VOID RTMPIoctlGetWscDynInfo(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
char *msg;
|
|
BSS_STRUCT *pMbss;
|
|
INT apidx,configstate;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)));
|
|
if (msg == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s():Alloc memory failed\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
memset(msg, 0 ,pAd->ApCfg.BssidNum*(14*128));
|
|
sprintf(msg,"%s","\n");
|
|
|
|
for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)
|
|
{
|
|
pMbss=&pAd->ApCfg.MBSSID[apidx];
|
|
|
|
if(pMbss->WscControl.WscConfStatus == WSC_SCSTATE_UNCONFIGURED)
|
|
configstate = 0;
|
|
else
|
|
configstate = 1;
|
|
|
|
sprintf(msg+strlen(msg),"ra%d\n",apidx);
|
|
#ifdef BB_SOC
|
|
sprintf(msg+strlen(msg),"DeviceName = %s\n",(pMbss->WscControl.RegData.SelfInfo.DeviceName));
|
|
#endif
|
|
sprintf(msg+strlen(msg),"UUID = %s\n",(pMbss->WscControl.Wsc_Uuid_Str));
|
|
sprintf(msg+strlen(msg),"wpsVersion = 0x%x\n",WSC_VERSION);
|
|
sprintf(msg+strlen(msg),"setuoLockedState = %d\n",0);
|
|
sprintf(msg+strlen(msg),"configstate = %d\n",configstate);
|
|
sprintf(msg+strlen(msg),"lastConfigError = %d\n",0);
|
|
|
|
}
|
|
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
|
|
VOID RTMPIoctlGetWscRegsDynInfo(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
|
{
|
|
char *msg;
|
|
BSS_STRUCT *pMbss;
|
|
INT apidx;
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&msg, sizeof(CHAR)*(pAd->ApCfg.BssidNum*(14*128)));
|
|
if (msg == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s():Alloc memory failed\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
memset(msg, 0 ,pAd->ApCfg.BssidNum*(14*128));
|
|
sprintf(msg,"%s","\n");
|
|
|
|
for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++)
|
|
{
|
|
pMbss=&pAd->ApCfg.MBSSID[apidx];
|
|
sprintf(msg+strlen(msg),"ra%d\n",apidx);
|
|
#ifdef BB_SOC
|
|
sprintf(msg+strlen(msg),"DeviceName = %s\n",(pMbss->WscControl.RegData.SelfInfo.DeviceName));
|
|
#endif
|
|
sprintf(msg+strlen(msg),"UUID_R = %s\n",(pMbss->WscControl.RegData.PeerInfo.Uuid));
|
|
}
|
|
|
|
wrq->u.data.length = strlen(msg);
|
|
if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s", msg));
|
|
}
|
|
|
|
os_free_mem(NULL, msg);
|
|
}
|
|
#endif /* defined(AR9_MAPI_SUPPORT) || defined(BB_SOC) */
|
|
#endif /* defined(INF_AR9) || defined(BB_SOC) */
|
|
|
|
BOOLEAN WscCheckEnrolleeNonceFromUpnp(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING *pData,
|
|
IN USHORT Length,
|
|
IN PWSC_CTRL pWscControl)
|
|
{
|
|
USHORT WscType, WscLen;
|
|
USHORT WscId = WSC_ID_ENROLLEE_NONCE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("check Enrollee Nonce\n"));
|
|
|
|
/* We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */
|
|
while (Length > 4)
|
|
{
|
|
WSC_IE TLV_Recv;
|
|
char ZeroNonce[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
|
|
|
memcpy((UINT8 *)&TLV_Recv, pData, 4);
|
|
WscType = be2cpu16(TLV_Recv.Type);
|
|
WscLen = be2cpu16(TLV_Recv.Length);
|
|
pData += 4;
|
|
Length -= 4;
|
|
|
|
if (WscType == WscId)
|
|
{
|
|
if (RTMPCompareMemory(pWscControl->RegData.SelfNonce, pData, 16) == 0)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Nonce match!!\n"));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<----- WscCheckNonce\n"));
|
|
return TRUE;
|
|
}
|
|
else if (NdisEqualMemory(pData, ZeroNonce, 16))
|
|
{
|
|
/* Intel external registrar will send WSC_NACK with enrollee nonce */
|
|
/* "10 1A 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" */
|
|
/* when AP is configured and user selects not to configure AP. */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Zero Enrollee Nonce!!\n"));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("<----- WscCheckNonce\n"));
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
/* Offset to net WSC Ie */
|
|
pData += WscLen;
|
|
Length -= WscLen;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Nonce mismatch!!\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
UCHAR WscRxMsgTypeFromUpnp(
|
|
IN PRTMP_ADAPTER pAdapter,
|
|
IN RTMP_STRING * pData,
|
|
IN USHORT Length)
|
|
{
|
|
|
|
USHORT WscType, WscLen;
|
|
|
|
{ /* Eap-Esp(Messages) */
|
|
/* the first TLV item in EAP Messages must be WSC_IE_VERSION */
|
|
NdisMoveMemory(&WscType, pData, 2);
|
|
if (ntohs(WscType) != WSC_ID_VERSION)
|
|
goto out;
|
|
|
|
/* Not Wsc Start, We have to look for WSC_IE_MSG_TYPE to classify M2 ~ M8, the remain size must large than 4 */
|
|
while (Length > 4)
|
|
{
|
|
/* arm-cpu has packet alignment issue, it's better to use memcpy to retrieve data */
|
|
NdisMoveMemory(&WscType, pData, 2);
|
|
NdisMoveMemory(&WscLen, pData + 2, 2);
|
|
WscLen = ntohs(WscLen);
|
|
if (ntohs(WscType) == WSC_ID_MSG_TYPE)
|
|
{
|
|
return(*(pData + 4)); /* Found the message type */
|
|
}
|
|
else
|
|
{
|
|
pData += (WscLen + 4);
|
|
Length -= (WscLen + 4);
|
|
}
|
|
}
|
|
}
|
|
|
|
out:
|
|
return WSC_MSG_UNKNOWN;
|
|
}
|
|
|
|
VOID RTMPIoctlSetWSCOOB(
|
|
IN PRTMP_ADAPTER pAd)
|
|
{
|
|
char *pTempSsid = NULL;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscPinCode_Proc:: Ap Client doesn't need this command.\n", apidx));
|
|
return;
|
|
}
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
Set_AP_WscConfStatus_Proc(pAd, "1");
|
|
Set_AP_AuthMode_Proc(pAd, "WPAPSK");
|
|
Set_AP_EncrypType_Proc(pAd, "TKIP");
|
|
pTempSsid = vmalloc(33);
|
|
if (pTempSsid)
|
|
{
|
|
memset(pTempSsid, 0, 33);
|
|
snprintf(pTempSsid, 33, "RalinkInitialAP%02X%02X%02X",
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[3],
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[4],
|
|
pAd->ApCfg.MBSSID[apidx].wdev.bssid[5]);
|
|
Set_AP_SSID_Proc(pAd, pTempSsid);
|
|
vfree(pTempSsid);
|
|
}
|
|
Set_AP_WPAPSK_Proc(pAd, "RalinkInitialAPxx1234");
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscOOB_Proc\n", apidx));
|
|
return;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Wsc Security Mode
|
|
0 : WPA2PSK AES
|
|
1 : WPA2PSK TKIP
|
|
2 : WPAPSK AES
|
|
3 : WPAPSK TKIP
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_AP_WscSecurityMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
if (strcmp(arg, "0") == 0)
|
|
pAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPA2PSKAES;
|
|
else if (strcmp(arg, "1") == 0)
|
|
pAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPA2PSKTKIP;
|
|
else if (strcmp(arg, "2") == 0)
|
|
pAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPAPSKAES;
|
|
else if (strcmp(arg, "3") == 0)
|
|
pAd->ApCfg.MBSSID[apidx].WscSecurityMode = WPAPSKTKIP;
|
|
else
|
|
return FALSE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscSecurityMode_Proc::(WscSecurityMode=%d)\n",
|
|
apidx, pAd->ApCfg.MBSSID[apidx].WscSecurityMode ));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_AP_WscMultiByteCheck_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
BOOLEAN bEnable = FALSE;
|
|
PWSC_CTRL pWpsCtrl = NULL;
|
|
//BOOLEAN bFromApCli = FALSE;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pObj->ioctl_if_type == INT_APCLI)
|
|
{
|
|
//bFromApCli = TRUE;
|
|
pWpsCtrl = &pAd->ApCfg.ApCliTab[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(apcli%d) Set_WscConfMode_Proc:: This command is from apcli interface now.\n", apidx));
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
//bFromApCli = FALSE;
|
|
pWpsCtrl = &pAd->ApCfg.MBSSID[apidx].WscControl;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_WscConfMode_Proc:: This command is from ra interface now.\n", apidx));
|
|
}
|
|
|
|
if (strcmp(arg, "0") == 0)
|
|
bEnable = FALSE;
|
|
else if (strcmp(arg, "1") == 0)
|
|
bEnable = TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
if (pWpsCtrl->bCheckMultiByte != bEnable)
|
|
{
|
|
pWpsCtrl->bCheckMultiByte = bEnable;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_AP_WscMultiByteCheck_Proc::(bCheckMultiByte=%d)\n",
|
|
apidx, pWpsCtrl->bCheckMultiByte));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscVersion_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR version = (UCHAR)simple_strtol(arg, 0, 16);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscVersion_Proc::(version=%x)\n",version));
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.RegData.SelfInfo.Version = version;
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef WSC_V2_SUPPORT
|
|
INT Set_WscFragment_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR bool_flag = (UCHAR)simple_strtol(arg, 0, 16);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscFragment_Proc::(bool_flag=%d)\n",bool_flag));
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.bWscFragment = bool_flag;
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscFragmentSize_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
USHORT WscFragSize = (USHORT)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscFragmentSize_Proc::(WscFragSize=%d)\n", WscFragSize));
|
|
if ((WscFragSize >=128) && (WscFragSize <=300))
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscFragSize = WscFragSize;
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscSetupLock_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR bEnable = (UCHAR)simple_strtol(arg, 0, 10);
|
|
PWSC_CTRL pWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;
|
|
|
|
if (bEnable == 0)
|
|
{
|
|
BOOLEAN bCancelled = FALSE;
|
|
pWscControl->PinAttackCount = 0;
|
|
if (pWscControl->WscSetupLockTimerRunning)
|
|
{
|
|
RTMPCancelTimer(&pWscControl->WscSetupLockTimer, &bCancelled);
|
|
}
|
|
WscSetupLockTimeout(NULL, pWscControl, NULL, NULL);
|
|
}
|
|
else
|
|
{
|
|
pWscControl->bSetupLock = TRUE;
|
|
WscBuildBeaconIE(pAd,
|
|
pWscControl->WscConfStatus,
|
|
FALSE,
|
|
0,
|
|
0,
|
|
pObj->ioctl_if,
|
|
NULL,
|
|
0,
|
|
AP_MODE);
|
|
WscBuildProbeRespIE(pAd,
|
|
WSC_MSGTYPE_AP_WLAN_MGR,
|
|
pWscControl->WscConfStatus,
|
|
FALSE,
|
|
0,
|
|
0,
|
|
pObj->ioctl_if,
|
|
NULL,
|
|
0,
|
|
AP_MODE);
|
|
APUpdateBeaconFrame(pAd, pObj->ioctl_if);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscSetupLock_Proc::(bSetupLock=%d)\n",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.bSetupLock));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscV2Support_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR bEnable = (UCHAR)simple_strtol(arg, 0, 10);
|
|
PWSC_CTRL pWscControl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;
|
|
|
|
if (bEnable == 0)
|
|
pWscControl->WscV2Info.bEnableWpsV2 = FALSE;
|
|
else
|
|
pWscControl->WscV2Info.bEnableWpsV2 = TRUE;
|
|
|
|
if (pWscControl->WscV2Info.bEnableWpsV2)
|
|
{
|
|
/*
|
|
WPS V2 doesn't support WEP and WPA/WPAPSK-TKIP.
|
|
*/
|
|
if ((pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WepStatus == Ndis802_11WEPEnabled) ||
|
|
(pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.WepStatus == Ndis802_11TKIPEnable) ||
|
|
(pAd->ApCfg.MBSSID[pObj->ioctl_if].bHideSsid))
|
|
WscOnOff(pAd, pObj->ioctl_if, TRUE);
|
|
else
|
|
WscOnOff(pAd, pObj->ioctl_if, FALSE);
|
|
|
|
APUpdateBeaconFrame(pAd, pObj->ioctl_if);
|
|
}
|
|
else
|
|
{
|
|
WscInit(pAd, FALSE, pObj->ioctl_if);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscV2Support_Proc::(bEnableWpsV2=%d)\n",
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.bEnableWpsV2));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscVersion2_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR version = (UCHAR)simple_strtol(arg, 0, 16);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscVersion2_Proc::(version=%x)\n",version));
|
|
if (version >= 0x20)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.RegData.SelfInfo.Version2 = version;
|
|
else
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscExtraTlvTag_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
USHORT new_tag = (USHORT)simple_strtol(arg, 0, 16);
|
|
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv.TlvTag = new_tag;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscExtraTlvTag_Proc::(new_tag=0x%04X)\n",new_tag));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscExtraTlvType_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR type = (UCHAR)simple_strtol(arg, 0, 10);
|
|
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv.TlvType = type;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscExtraTlvType_Proc::(type=%d)\n",type));
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_WscExtraTlvData_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UINT DataLen = (UINT)strlen(arg);
|
|
PWSC_TLV pWscTLV = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.WscV2Info.ExtraTlv;
|
|
INT i;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscExtraTlvData_Proc::(DataLen = %d)\n", DataLen));
|
|
|
|
if ((DataLen != 0) && (pWscTLV->TlvType == TLV_HEX))
|
|
{
|
|
for(i=0; i < DataLen; i++)
|
|
{
|
|
if( !isxdigit(*(arg+i)) )
|
|
return FALSE; /*Not Hex value; */
|
|
}
|
|
}
|
|
|
|
if (pWscTLV->pTlvData)
|
|
{
|
|
os_free_mem(NULL, pWscTLV->pTlvData);
|
|
pWscTLV->pTlvData = NULL;
|
|
}
|
|
|
|
if (DataLen == 0)
|
|
return TRUE;
|
|
|
|
pWscTLV->TlvLen = 0;
|
|
os_alloc_mem(NULL, &pWscTLV->pTlvData, DataLen);
|
|
if (pWscTLV->pTlvData)
|
|
{
|
|
if (pWscTLV->TlvType == TLV_ASCII)
|
|
{
|
|
NdisMoveMemory(pWscTLV->pTlvData, arg, DataLen);
|
|
pWscTLV->TlvLen = DataLen;
|
|
}
|
|
else
|
|
{
|
|
pWscTLV->TlvLen = DataLen/2;
|
|
AtoH(arg, pWscTLV->pTlvData, pWscTLV->TlvLen);
|
|
}
|
|
return TRUE;
|
|
}
|
|
else
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscExtraTlvData_Proc::os_alloc_mem fail\n"));
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
INT Set_WscMaxPinAttack_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR MaxPinAttack = (UCHAR)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscMaxPinAttack_Proc::(MaxPinAttack=%d)\n", MaxPinAttack));
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.MaxPinAttack = MaxPinAttack;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_WscSetupLockTime_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UINT SetupLockTime = (UINT)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscSetupLockTime_Proc::(SetupLockTime=%d)\n", SetupLockTime));
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl.SetupLockTime = SetupLockTime;
|
|
return TRUE;
|
|
}
|
|
|
|
#endif /* WSC_V2_SUPPORT */
|
|
|
|
INT Set_WscAutoTriggerDisable_Proc(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR bEnable = (UCHAR)simple_strtol(arg, 0, 10);
|
|
PWSC_CTRL pWscCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl;
|
|
|
|
if (bEnable == 0)
|
|
pWscCtrl->bWscAutoTriggerDisable = FALSE;
|
|
else
|
|
pWscCtrl->bWscAutoTriggerDisable = TRUE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_WscAutoTriggerDisable_Proc::(bWscAutoTriggerDisable=%d)\n",
|
|
pWscCtrl->bWscAutoTriggerDisable));
|
|
return TRUE;
|
|
}
|
|
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#ifdef EASY_CONFIG_SETUP
|
|
INT Set_AP_AutoProvisionEnable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PEASY_CONFIG_INFO pEasyConfig = &pAd->ApCfg.MBSSID[apidx].EasyConfigInfo;
|
|
BOOLEAN bEnable = FALSE;
|
|
|
|
if (strcmp(arg, "0") == 0)
|
|
bEnable = FALSE;
|
|
else if (strcmp(arg, "1") == 0)
|
|
bEnable = TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
if (pEasyConfig->bEnable != bEnable)
|
|
{
|
|
pEasyConfig->bEnable = bEnable;
|
|
#ifdef WSC_AP_SUPPORT
|
|
WscInit(pAd, FALSE, apidx);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_AP_AutoProvisionEnable_Proc::(AutoProvisionEnable=%d)\n",
|
|
apidx, pEasyConfig->bEnable));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_RssiThreshold_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
CHAR Value;
|
|
PEASY_CONFIG_INFO pEasyConfig = NULL;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
if (apidx != MAIN_MBSSID)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_RssiThreshold_Proc:: Only support ra0\n",apidx));
|
|
return FALSE;
|
|
}
|
|
Value = (CHAR)simple_strtol(arg, 0, 10);
|
|
|
|
pEasyConfig = &pAd->ApCfg.MBSSID[apidx].EasyConfigInfo;
|
|
|
|
if (Value > 70 || Value < 40)
|
|
pEasyConfig->RssiThreshold = -50;
|
|
else
|
|
pEasyConfig->RssiThreshold = (CHAR)(-1)*Value;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_RssiThreshold_Proc::(RssiThreshold=%d)\n",pEasyConfig->RssiThreshold));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#endif /* EASY_CONFIG_SETUP */
|
|
|
|
#ifdef WAC_SUPPORT
|
|
INT Set_AP_WACEnable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PEASY_CONFIG_INFO pEasyConfig = &pAd->ApCfg.MBSSID[apidx].EasyConfigInfo;
|
|
BOOLEAN bEnable = FALSE;
|
|
|
|
if (strcmp(arg, "0") == 0)
|
|
bEnable = FALSE;
|
|
else if (strcmp(arg, "1") == 0)
|
|
bEnable = TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
pEasyConfig->bEnableWAC = bEnable;
|
|
APUpdateBeaconFrame(pAd, pObj->ioctl_if);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_AP_WACEnable_Proc::(bEnableWAC=%d)\n",
|
|
apidx, pEasyConfig->bEnableWAC));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* WAC_SUPPORT */
|
|
|
|
#ifdef IAPP_SUPPORT
|
|
INT Set_IappPID_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
unsigned long IappPid;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
IappPid = simple_strtol(arg, 0, 10);
|
|
RTMP_GET_OS_PID(pObj->IappPid, IappPid);
|
|
pObj->IappPid_nr = IappPid;
|
|
|
|
/* DBGPRINT(RT_DEBUG_TRACE, ("pObj->IappPid = %d", GET_PID_NUMBER(pObj->IappPid))); */
|
|
return TRUE;
|
|
} /* End of Set_IappPID_Proc */
|
|
#endif /* IAPP_SUPPORT */
|
|
|
|
|
|
INT Set_DisConnectSta_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR macAddr[MAC_ADDR_LEN];
|
|
RTMP_STRING *value;
|
|
INT i;
|
|
MAC_TABLE_ENTRY *pEntry = NULL;
|
|
|
|
if(strlen(arg) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
return FALSE;
|
|
|
|
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"))
|
|
{
|
|
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
return FALSE; /*Invalid */
|
|
|
|
AtoH(value, (UCHAR *)&macAddr[i++], 1);
|
|
}
|
|
|
|
pEntry = MacTableLookup(pAd, macAddr);
|
|
if (pEntry)
|
|
{
|
|
MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);
|
|
/* MacTableDeleteEntry(pAd, pEntry->wcid, Addr); */
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_DisConnectAllSta_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
#ifdef DOT11W_PMF_SUPPORT
|
|
CHAR value = simple_strtol(arg, 0, 10);
|
|
|
|
if (value == 2)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
INT i;
|
|
|
|
DBGPRINT(RT_DEBUG_WARN, ("[PMF]%s:: apidx=%d\n", __FUNCTION__, pObj->ioctl_if));
|
|
APMlmeKickOutAllSta(pAd, pObj->ioctl_if, REASON_DEAUTH_STA_LEAVING);
|
|
for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];
|
|
if (IS_ENTRY_CLIENT(pEntry)) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("[PMF]%s: MacTableDeleteEntry %x:%x:%x:%x:%x:%x\n",
|
|
__FUNCTION__, PRINT_MAC(pEntry->Addr)));
|
|
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
|
|
}
|
|
}
|
|
} else
|
|
#endif /* DOT11W_PMF_SUPPORT */
|
|
{
|
|
MacTableReset(pAd, 1);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef DOT1X_SUPPORT
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set IEEE8021X.
|
|
This parameter is 1 when 802.1x-wep turn on, otherwise 0
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_IEEE8021X_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG ieee8021x;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
struct wifi_dev *wdev;
|
|
|
|
ieee8021x = simple_strtol(arg, 0, 10);
|
|
|
|
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
|
if (ieee8021x == 1)
|
|
wdev->IEEE8021X = TRUE;
|
|
else if (ieee8021x == 0)
|
|
wdev->IEEE8021X = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_IEEE8021X_Proc::(IEEE8021X=%d)\n", pObj->ioctl_if, wdev->IEEE8021X));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set pre-authentication enable or disable when WPA/WPA2 turn on
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_PreAuth_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG PreAuth;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
|
|
PreAuth = simple_strtol(arg, 0, 10);
|
|
|
|
if (PreAuth == 1)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = TRUE;
|
|
else if (PreAuth == 0)
|
|
pAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth = FALSE;
|
|
else
|
|
return FALSE; /*Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) Set_PreAuth_Proc::(PreAuth=%d)\n", pObj->ioctl_if, pAd->ApCfg.MBSSID[pObj->ioctl_if].PreAuth));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_OwnIPAddr_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT32 ip_addr;
|
|
|
|
if (rtinet_aton(arg, &ip_addr))
|
|
{
|
|
pAd->ApCfg.own_ip_addr = ip_addr;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("own_ip_addr=%s(%x)\n", arg, pAd->ApCfg.own_ip_addr));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_EAPIfName_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT i;
|
|
RTMP_STRING *macptr;
|
|
|
|
for (i=0, macptr = rstrtok(arg,";"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,";"), i++)
|
|
{
|
|
if (strlen(macptr) > 0)
|
|
{
|
|
pAd->ApCfg.EAPifname_len[i] = strlen(macptr);
|
|
NdisMoveMemory(pAd->ApCfg.EAPifname[i], macptr, strlen(macptr));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("NO.%d EAPifname=%s, len=%d\n", i,
|
|
pAd->ApCfg.EAPifname[i],
|
|
pAd->ApCfg.EAPifname_len[i]));
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_PreAuthIfName_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
INT i;
|
|
RTMP_STRING *macptr;
|
|
|
|
for (i=0, macptr = rstrtok(arg,";"); (macptr && i < MAX_MBSSID_NUM(pAd)); macptr = rstrtok(NULL,";"), i++)
|
|
{
|
|
if (strlen(macptr) > 0)
|
|
{
|
|
pAd->ApCfg.PreAuthifname_len[i] = strlen(macptr);
|
|
NdisMoveMemory(pAd->ApCfg.PreAuthifname[i], macptr, strlen(macptr));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("NO.%d PreAuthifname=%s, len=%d\n", i,
|
|
pAd->ApCfg.PreAuthifname[i],
|
|
pAd->ApCfg.PreAuthifname_len[i]));
|
|
}
|
|
}
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
INT Set_RADIUS_Server_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
RTMP_STRING *macptr;
|
|
INT count;
|
|
UINT32 ip_addr;
|
|
INT srv_cnt = 0;
|
|
|
|
for (count = 0, macptr = rstrtok(arg,";"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,";"), count++)
|
|
{
|
|
if (rtinet_aton(macptr, &ip_addr))
|
|
{
|
|
PRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];
|
|
|
|
pSrvInfo->radius_ip = ip_addr;
|
|
srv_cnt++;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d), radius_ip(seq-%d)=%s(%x)\n",
|
|
apidx, srv_cnt, macptr,
|
|
pSrvInfo->radius_ip));
|
|
}
|
|
}
|
|
|
|
if (srv_cnt > 0)
|
|
pAd->ApCfg.MBSSID[apidx].radius_srv_num = srv_cnt;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_RADIUS_Port_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
RTMP_STRING *macptr;
|
|
INT count;
|
|
INT srv_cnt = 0;
|
|
|
|
for (count = 0, macptr = rstrtok(arg,";"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,";"), count++)
|
|
{
|
|
if (srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)
|
|
{
|
|
PRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];
|
|
|
|
pSrvInfo->radius_port = (UINT32) simple_strtol(macptr, 0, 10);
|
|
srv_cnt ++;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d), radius_port(seq-%d)=%d\n",
|
|
apidx, srv_cnt, pSrvInfo->radius_port));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_RADIUS_Key_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
RTMP_STRING *macptr;
|
|
INT count;
|
|
INT srv_cnt = 0;
|
|
|
|
for (count = 0, macptr = rstrtok(arg,";"); (macptr && count < MAX_RADIUS_SRV_NUM); macptr = rstrtok(NULL,";"), count++)
|
|
{
|
|
if (strlen(macptr) > 0 && srv_cnt < pAd->ApCfg.MBSSID[apidx].radius_srv_num)
|
|
{
|
|
PRADIUS_SRV_INFO pSrvInfo = &pAd->ApCfg.MBSSID[apidx].radius_srv_info[srv_cnt];
|
|
|
|
pSrvInfo->radius_key_len = strlen(macptr);
|
|
NdisMoveMemory(pSrvInfo->radius_key, macptr, pSrvInfo->radius_key_len);
|
|
srv_cnt ++;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d), radius_key(seq-%d)=%s, len=%d\n",
|
|
apidx, srv_cnt,
|
|
pSrvInfo->radius_key,
|
|
pSrvInfo->radius_key_len));
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
#endif /* DOT1X_SUPPORT */
|
|
|
|
#ifdef UAPSD_SUPPORT
|
|
INT Set_UAPSD_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR IdMbss = pObj->ioctl_if;
|
|
|
|
if (simple_strtol(arg, 0, 10) != 0)
|
|
pAd->ApCfg.MBSSID[IdMbss].wdev.UapsdInfo.bAPSDCapable = TRUE;
|
|
else
|
|
pAd->ApCfg.MBSSID[IdMbss].wdev.UapsdInfo.bAPSDCapable = FALSE;
|
|
|
|
return TRUE;
|
|
} /* End of Set_UAPSD_Proc */
|
|
#endif /* UAPSD_SUPPORT */
|
|
|
|
|
|
|
|
#ifdef MCAST_RATE_SPECIFIC
|
|
INT Set_McastPhyMode(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR PhyMode = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
|
|
switch (PhyMode)
|
|
{
|
|
case MCAST_DISABLE: /* disable */
|
|
NdisMoveMemory(&pAd->CommonCfg.MCastPhyMode, &pAd->MacTab.Content[MCAST_WCID].HTPhyMode, sizeof(HTTRANSMIT_SETTING));
|
|
break;
|
|
|
|
case MCAST_CCK: /* CCK */
|
|
pAd->CommonCfg.MCastPhyMode.field.MODE = MODE_CCK;
|
|
pAd->CommonCfg.MCastPhyMode.field.BW = BW_20;
|
|
break;
|
|
|
|
case MCAST_OFDM: /* OFDM */
|
|
pAd->CommonCfg.MCastPhyMode.field.MODE = MODE_OFDM;
|
|
break;
|
|
#ifdef DOT11_N_SUPPORT
|
|
case MCAST_HTMIX: /* HTMIX */
|
|
pAd->CommonCfg.MCastPhyMode.field.MODE = MODE_HTMIX;
|
|
break;
|
|
#endif /* DOT11_N_SUPPORT */
|
|
default:
|
|
DBGPRINT(RT_DEBUG_OFF, ("unknown Multicast PhyMode %d.\n", PhyMode));
|
|
DBGPRINT(RT_DEBUG_OFF, ("0:Disable 1:CCK, 2:OFDM, 3:HTMIX.\n"));
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_McastMcs(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR Mcs = simple_strtol(arg, 0, 10);
|
|
|
|
if (Mcs > 15)
|
|
DBGPRINT(RT_DEBUG_OFF, ("Mcs must in range of 0 to 15\n"));
|
|
|
|
switch(pAd->CommonCfg.MCastPhyMode.field.MODE)
|
|
{
|
|
case MODE_CCK:
|
|
if ((Mcs <= 3) || (Mcs >= 8 && Mcs <= 11))
|
|
pAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("MCS must in range of 0 ~ 3 and 8 ~ 11 for CCK Mode.\n"));
|
|
break;
|
|
|
|
case MODE_OFDM:
|
|
if (Mcs > 7)
|
|
DBGPRINT(RT_DEBUG_OFF, ("MCS must in range from 0 to 7 for CCK Mode.\n"));
|
|
else
|
|
pAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;
|
|
break;
|
|
|
|
default:
|
|
pAd->CommonCfg.MCastPhyMode.field.MCS = Mcs;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Show_McastRate(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("Mcast PhyMode =%d\n", pAd->CommonCfg.MCastPhyMode.field.MODE));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Mcast Mcs =%d\n", pAd->CommonCfg.MCastPhyMode.field.MCS));
|
|
return TRUE;
|
|
}
|
|
#endif /* MCAST_RATE_SPECIFIC */
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
#ifdef DOT11N_DRAFT3
|
|
INT Set_OBSSScanParam_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT ObssScanValue;
|
|
UINT Idx;
|
|
RTMP_STRING *thisChar;
|
|
|
|
Idx = 0;
|
|
while ((thisChar = strsep((char **)&arg, "-")) != NULL)
|
|
{
|
|
ObssScanValue = (INT) simple_strtol(thisChar, 0, 10);
|
|
switch (Idx)
|
|
{
|
|
case 0:
|
|
if (ObssScanValue < 5 || ObssScanValue > 1000)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\n", ObssScanValue));
|
|
}
|
|
else
|
|
{
|
|
pAd->CommonCfg.Dot11OBssScanPassiveDwell = ObssScanValue; /* Unit : TU. 5~1000 */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanPassiveDwell=%d\n", ObssScanValue));
|
|
}
|
|
break;
|
|
case 1:
|
|
if (ObssScanValue < 10 || ObssScanValue > 1000)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\n", ObssScanValue));
|
|
}
|
|
else
|
|
{
|
|
pAd->CommonCfg.Dot11OBssScanActiveDwell = ObssScanValue; /* Unit : TU. 10~1000 */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanActiveDwell=%d\n", ObssScanValue));
|
|
}
|
|
break;
|
|
case 2:
|
|
pAd->CommonCfg.Dot11BssWidthTriggerScanInt = ObssScanValue; /* Unit : Second */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\n", ObssScanValue));
|
|
break;
|
|
case 3:
|
|
if (ObssScanValue < 200 || ObssScanValue > 10000)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\n", ObssScanValue));
|
|
}
|
|
else
|
|
{
|
|
pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = ObssScanValue; /* Unit : TU. 200~10000 */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\n", ObssScanValue));
|
|
}
|
|
break;
|
|
case 4:
|
|
if (ObssScanValue < 20 || ObssScanValue > 10000)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\n", ObssScanValue));
|
|
}
|
|
else
|
|
{
|
|
pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = ObssScanValue; /* Unit : TU. 20~10000 */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\n", ObssScanValue));
|
|
}
|
|
break;
|
|
case 5:
|
|
pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = ObssScanValue;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", ObssScanValue));
|
|
break;
|
|
case 6:
|
|
pAd->CommonCfg.Dot11OBssScanActivityThre = ObssScanValue; /* Unit : percentage */
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", ObssScanValue));
|
|
break;
|
|
}
|
|
Idx++;
|
|
}
|
|
|
|
if (Idx != 7)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("Wrong OBSSScanParamtetrs format in ioctl cmd!!!!! Use default value\n"));
|
|
|
|
pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell; /* Unit : TU. 5~1000 */
|
|
pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell; /* Unit : TU. 10~1000 */
|
|
pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval; /* Unit : Second */
|
|
pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel; /* Unit : TU. 200~10000 */
|
|
pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel; /* Unit : TU. 20~10000 */
|
|
pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;
|
|
pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold; /* Unit : percentage */
|
|
}
|
|
pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\n", pAd->CommonCfg.Dot11BssWidthChanTranDelay));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_AP2040ReScan_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
APOverlappingBSSScan(pAd);
|
|
|
|
/* apply setting */
|
|
SetCommonHT(pAd);
|
|
AsicBBPAdjust(pAd);
|
|
AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
|
|
AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_AP2040ReScan_Proc() Trigger AP ReScan !!!\n"));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* DOT11N_DRAFT3 */
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
INT Set_EntryLifeCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG LifeCheckCnt = (ULONG) simple_strtol(arg, 0, 10);
|
|
|
|
if (LifeCheckCnt <= 65535)
|
|
pAd->ApCfg.EntryLifeCheck = LifeCheckCnt;
|
|
else
|
|
DBGPRINT(RT_DEBUG_OFF, ("LifeCheckCnt must in range of 0 to 65535\n"));
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("EntryLifeCheck Cnt = %ld.\n", pAd->ApCfg.EntryLifeCheck));
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Authentication mode
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT ApCfg_Set_AuthMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN INT apidx,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
struct wifi_dev *wdev = &pAd->ApCfg.MBSSID[apidx].wdev;
|
|
|
|
if ((strcmp(arg, "WEPAUTO") == 0) || (strcmp(arg, "wepauto") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeAutoSwitch;
|
|
else if ((strcmp(arg, "OPEN") == 0) || (strcmp(arg, "open") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeOpen;
|
|
else if ((strcmp(arg, "SHARED") == 0) || (strcmp(arg, "shared") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeShared;
|
|
else if ((strcmp(arg, "WPAPSK") == 0) || (strcmp(arg, "wpapsk") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPAPSK;
|
|
else if ((strcmp(arg, "WPA2PSK") == 0) || (strcmp(arg, "wpa2psk") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA2PSK;
|
|
else if ((strcmp(arg, "WPAPSKWPA2PSK") == 0) || (strcmp(arg, "wpapskwpa2psk") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA1PSKWPA2PSK;
|
|
#ifdef DOT1X_SUPPORT
|
|
else if ((strcmp(arg, "WPA") == 0) || (strcmp(arg, "wpa") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA;
|
|
else if ((strcmp(arg, "WPA2") == 0) || (strcmp(arg, "wpa2") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA2;
|
|
else if ((strcmp(arg, "WPA1WPA2") == 0) || (strcmp(arg, "wpa1wpa2") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWPA1WPA2;
|
|
#endif /* DOT1X_SUPPORT */
|
|
#ifdef WAPI_SUPPORT
|
|
else if ((strcmp(arg, "WAICERT") == 0) || (strcmp(arg, "waicert") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWAICERT;
|
|
else if ((strcmp(arg, "WAIPSK") == 0) || (strcmp(arg, "waipsk") == 0))
|
|
wdev->AuthMode = Ndis802_11AuthModeWAIPSK;
|
|
#endif /* WAPI_SUPPORT */
|
|
else
|
|
wdev->AuthMode = Ndis802_11AuthModeOpen;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d)::AuthMode=%d\n", apidx, wdev->AuthMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT ApCfg_Set_MaxStaNum_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN INT apidx,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
pAd->ApCfg.MBSSID[apidx].MaxStaNum = (UCHAR)simple_strtol(arg, 0, 10);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(ra%d) %s::(MaxStaNum=%d)\n",
|
|
apidx, __FUNCTION__, pAd->ApCfg.MBSSID[apidx].MaxStaNum));
|
|
return TRUE;
|
|
}
|
|
|
|
INT ApCfg_Set_IdleTimeout_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
LONG idle_time;
|
|
|
|
idle_time = simple_strtol(arg, 0, 10);
|
|
|
|
if (idle_time < MAC_TABLE_MIN_AGEOUT_TIME)
|
|
pAd->ApCfg.StaIdleTimeout = MAC_TABLE_MIN_AGEOUT_TIME;
|
|
else
|
|
pAd->ApCfg.StaIdleTimeout = idle_time;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("%s : IdleTimeout=%d\n", __FUNCTION__, pAd->ApCfg.StaIdleTimeout));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef RTMP_RBUS_SUPPORT
|
|
#ifdef LED_CONTROL_SUPPORT
|
|
INT Set_WlanLed_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bWlanLed;
|
|
#ifdef CONFIG_SWMCU_SUPPORT
|
|
PSWMCU_LED_CONTROL pSWMCULedCntl = &pAd->LedCntl.SWMCULedCntl;
|
|
#endif /* CONFIG_SWMCU_SUPPORT */
|
|
|
|
bWlanLed = (BOOLEAN) simple_strtol(arg, 0, 10);
|
|
|
|
#ifdef CONFIG_SWMCU_SUPPORT
|
|
if (bWlanLed != pSWMCULedCntl->bWlanLed)
|
|
#endif /* CONFIG_SWMCU_SUPPORT */
|
|
{
|
|
if (bWlanLed)
|
|
RTMPStartLEDMode(pAd);
|
|
else
|
|
RTMPExitLEDMode(pAd);
|
|
};
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* LED_CONTROL_SUPPORT */
|
|
#endif /* RTMP_RBUS_SUPPORT */
|
|
|
|
|
|
|
|
#ifdef RT3883
|
|
INT Set_CwCTest_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
char *Cwc_mode_str[] = {"OFF", "ON", "AUTO"};
|
|
long x = simple_strtol(arg, 0, 10);
|
|
|
|
if ((x >= 0) && (x <= 2))
|
|
{
|
|
pAd->FlgCWC = x;
|
|
if (x == 0 || x == 1)
|
|
RT3883_CWC_AsicSet(pAd, x);
|
|
DBGPRINT(RT_DEBUG_OFF, ("CwC %s\n", Cwc_mode_str[x]));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("current FlgCWC = %d\n", pAd->FlgCWC));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* RT3883 */
|
|
|
|
|
|
INT Set_MemDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
#ifdef VENDOR_FEATURE2_SUPPORT
|
|
DBGPRINT(RT_DEBUG_OFF, ("Number of Packet Allocated = %lu\n", OS_NumOfPktAlloc));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Number of Packet Freed = %lu\n", OS_NumOfPktFree));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Offset of Packet Allocated/Freed = %lu\n",
|
|
OS_NumOfPktAlloc - OS_NumOfPktFree));
|
|
#endif /* VENDOR_FEATURE2_SUPPORT */
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WPA_SUPPLICANT_SUPPORT
|
|
VOID RTMPApCliAddKey(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN INT apidx,
|
|
IN PNDIS_APCLI_802_11_KEY pKey)
|
|
{
|
|
ULONG KeyIdx;
|
|
MAC_TABLE_ENTRY *pEntry;
|
|
STA_TR_ENTRY *tr_entry;
|
|
UCHAR ifIndex, BssIdx;
|
|
PAPCLI_STRUCT pApCliEntry;
|
|
struct wifi_dev *wdev;
|
|
MAC_TABLE_ENTRY *pMacEntry=(MAC_TABLE_ENTRY *)NULL;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPApCliAddKey ------>\n"));
|
|
|
|
ifIndex = (UCHAR)apidx;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
wdev = &pApCliEntry->wdev;
|
|
pMacEntry = &pAd->MacTab.Content[pApCliEntry->MacTabWCID];
|
|
tr_entry = &pAd->MacTab.tr_entry[pApCliEntry->MacTabWCID];
|
|
BssIdx = pAd->ApCfg.BssidNum + MAX_MESH_NUM + ifIndex;
|
|
|
|
if (wdev->AuthMode >= Ndis802_11AuthModeWPA)
|
|
{
|
|
if (pKey->KeyIndex & 0x80000000)
|
|
{
|
|
if (wdev->AuthMode == Ndis802_11AuthModeWPANone)
|
|
{
|
|
NdisZeroMemory(pApCliEntry->PMK, 32);
|
|
NdisMoveMemory(pApCliEntry->PMK, pKey->KeyMaterial, pKey->KeyLength);
|
|
goto end;
|
|
}
|
|
/* Update PTK */
|
|
NdisZeroMemory(&pMacEntry->PairwiseKey, sizeof(CIPHER_KEY));
|
|
pMacEntry->PairwiseKey.KeyLen = LEN_TK;
|
|
NdisMoveMemory(pMacEntry->PairwiseKey.Key, pKey->KeyMaterial, LEN_TK);
|
|
|
|
if (pApCliEntry->PairCipher == Ndis802_11TKIPEnable)
|
|
{
|
|
NdisMoveMemory(pMacEntry->PairwiseKey.RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);
|
|
NdisMoveMemory(pMacEntry->PairwiseKey.TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);
|
|
}
|
|
else
|
|
|
|
{
|
|
NdisMoveMemory(pMacEntry->PairwiseKey.TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);
|
|
NdisMoveMemory(pMacEntry->PairwiseKey.RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);
|
|
}
|
|
|
|
/* Decide its ChiperAlg */
|
|
if (pApCliEntry->PairCipher == Ndis802_11TKIPEnable)
|
|
pMacEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;
|
|
else if (pApCliEntry->PairCipher == Ndis802_11AESEnable)
|
|
pMacEntry->PairwiseKey.CipherAlg = CIPHER_AES;
|
|
else
|
|
pMacEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
|
|
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pMacEntry->Aid,
|
|
&pMacEntry->PairwiseKey);
|
|
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
BssIdx,
|
|
0,
|
|
pMacEntry->PairwiseKey.CipherAlg,
|
|
(UCHAR)pMacEntry->Aid,
|
|
PAIRWISEKEYTABLE);
|
|
|
|
if (pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)
|
|
{
|
|
/* set 802.1x port control */
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
|
|
pMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Update GTK */
|
|
wdev->DefaultKeyId = (pKey->KeyIndex & 0xFF);
|
|
NdisZeroMemory(&pApCliEntry->SharedKey[wdev->DefaultKeyId], sizeof(CIPHER_KEY));
|
|
pApCliEntry->SharedKey[wdev->DefaultKeyId].KeyLen = LEN_TK;
|
|
NdisMoveMemory(pApCliEntry->SharedKey[wdev->DefaultKeyId].Key, pKey->KeyMaterial, LEN_TK);
|
|
|
|
if (pApCliEntry->GroupCipher == Ndis802_11TKIPEnable)
|
|
{
|
|
NdisMoveMemory(pApCliEntry->SharedKey[wdev->DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);
|
|
NdisMoveMemory(pApCliEntry->SharedKey[wdev->DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);
|
|
}
|
|
else
|
|
|
|
{
|
|
NdisMoveMemory(pApCliEntry->SharedKey[wdev->DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC);
|
|
NdisMoveMemory(pApCliEntry->SharedKey[wdev->DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC);
|
|
}
|
|
|
|
/* Update Shared Key CipherAlg */
|
|
pApCliEntry->SharedKey[wdev->DefaultKeyId].CipherAlg = CIPHER_NONE;
|
|
if (pApCliEntry->GroupCipher == Ndis802_11TKIPEnable)
|
|
pApCliEntry->SharedKey[wdev->DefaultKeyId].CipherAlg = CIPHER_TKIP;
|
|
else if (pApCliEntry->GroupCipher == Ndis802_11AESEnable)
|
|
pApCliEntry->SharedKey[wdev->DefaultKeyId].CipherAlg = CIPHER_AES;
|
|
|
|
/* Update group key information to ASIC Shared Key Table */
|
|
AsicAddSharedKeyEntry(pAd,
|
|
BssIdx,
|
|
(UCHAR)wdev->DefaultKeyId,
|
|
&pApCliEntry->SharedKey[wdev->DefaultKeyId]);
|
|
|
|
|
|
|
|
/* Update ASIC WCID attribute table and IVEIV table */
|
|
RTMPAddWcidAttributeEntry(pAd,
|
|
BssIdx,
|
|
wdev->DefaultKeyId,
|
|
pApCliEntry->SharedKey[wdev->DefaultKeyId].CipherAlg,
|
|
NULL);
|
|
|
|
|
|
/* set 802.1x port control */
|
|
if (pMacEntry->AuthMode >= Ndis802_11AuthModeWPA)
|
|
{
|
|
/* set 802.1x port control */
|
|
tr_entry->PortSecured = WPA_802_1X_PORT_SECURED;
|
|
pMacEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
|
|
}
|
|
}
|
|
}
|
|
else /* dynamic WEP from wpa_supplicant */
|
|
{
|
|
UCHAR CipherAlg;
|
|
PUCHAR Key;
|
|
|
|
if(pKey->KeyLength == 32)
|
|
goto end;
|
|
|
|
KeyIdx = pKey->KeyIndex & 0x0fffffff;
|
|
|
|
if (KeyIdx < 4)
|
|
{
|
|
/* it is a default shared key, for Pairwise key setting */
|
|
if (pKey->KeyIndex & 0x80000000)
|
|
{
|
|
pEntry = MacTableLookup(pAd, pKey->BSSID);
|
|
|
|
if (pEntry && IS_ENTRY_APCLI(pEntry))
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey: Set Pair-wise Key\n"));
|
|
|
|
/* set key material and key length */
|
|
pEntry->PairwiseKey.KeyLen = (UCHAR )pKey->KeyLength;
|
|
NdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength);
|
|
|
|
/* set Cipher type */
|
|
if (pKey->KeyLength == 5)
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_WEP64;
|
|
else
|
|
pEntry->PairwiseKey.CipherAlg = CIPHER_WEP128;
|
|
|
|
/* Add Pair-wise key to Asic */
|
|
AsicAddPairwiseKeyEntry(
|
|
pAd,
|
|
(UCHAR)pEntry->wcid,
|
|
&pEntry->PairwiseKey);
|
|
|
|
/* update WCID attribute table and IVEIV table for this entry */
|
|
RTMPSetWcidSecurityInfo(pAd,
|
|
BssIdx,
|
|
(UINT8)KeyIdx,
|
|
pEntry->PairwiseKey.CipherAlg,
|
|
pEntry->wcid,
|
|
PAIRWISEKEYTABLE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* Default key for tx (shared key) */
|
|
wdev->DefaultKeyId = (UCHAR) KeyIdx;
|
|
|
|
/*/ set key material and key length */
|
|
pApCliEntry->SharedKey[KeyIdx].KeyLen = (UCHAR) pKey->KeyLength;
|
|
NdisMoveMemory(pApCliEntry->SharedKey[KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength);
|
|
|
|
/* Set Ciper type */
|
|
if (pKey->KeyLength == 5)
|
|
pApCliEntry->SharedKey[KeyIdx].CipherAlg = CIPHER_WEP64;
|
|
else
|
|
pApCliEntry->SharedKey[KeyIdx].CipherAlg = CIPHER_WEP128;
|
|
|
|
CipherAlg = pApCliEntry->SharedKey[KeyIdx].CipherAlg;
|
|
Key = pApCliEntry->SharedKey[KeyIdx].Key;
|
|
|
|
/* Set Group key material to Asic */
|
|
AsicAddSharedKeyEntry(pAd, BssIdx, (UCHAR)KeyIdx
|
|
, &pApCliEntry->SharedKey[KeyIdx]);
|
|
|
|
/* STA doesn't need to set WCID attribute for group key */
|
|
|
|
/* Update WCID attribute table and IVEIV table for this group key table */
|
|
RTMPAddWcidAttributeEntry(pAd, BssIdx
|
|
, (UCHAR)KeyIdx, CipherAlg, NULL);
|
|
|
|
}
|
|
}
|
|
}
|
|
end:
|
|
|
|
DBGPRINT(RT_DEBUG_INFO, ("<------ RTMPApCliAddKey\n"));
|
|
|
|
return;
|
|
}
|
|
#endif/*WPA_SUPPLICANT_SUPPORT*/
|
|
#endif/*APCLI_SUPPORT*/
|
|
|
|
#ifdef CONFIG_AP_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Set power save life time.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Arg - Input arguments
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
INT Set_PowerSaveLifeTime_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
pAd->MacTab.MsduLifeTime = (USHORT)simple_strtol(arg, 0, 10);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set new life time = %d\n", pAd->MacTab.MsduLifeTime));
|
|
return TRUE;
|
|
}
|
|
#endif /* CONFIG_AP_SUPPORT */
|
|
|
|
|
|
#ifdef MBSS_SUPPORT
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Show MBSS information.
|
|
|
|
Arguments:
|
|
pAd - WLAN control block pointer
|
|
Arg - Input arguments
|
|
|
|
Return Value:
|
|
None
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
INT Show_MbssInfo_Display_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
UINT32 IdBss;
|
|
UINT PhyMode;
|
|
CHAR *mod_str = NULL;
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("\n\tBSS Idx\t\tPhy Mode\n"));
|
|
|
|
for(IdBss=0; IdBss<=pAd->ApCfg.BssidNum; IdBss++)
|
|
{
|
|
if (IdBss == 0)
|
|
{
|
|
PhyMode = pAd->CommonCfg.PhyMode;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("\tMAX\t\t"));
|
|
}
|
|
else
|
|
{
|
|
PhyMode = pAd->ApCfg.MBSSID[IdBss-1].wdev.PhyMode;
|
|
DBGPRINT(RT_DEBUG_ERROR, ("\t%d\t\t", IdBss-1));
|
|
} /* End of if */
|
|
|
|
switch(PhyMode)
|
|
{
|
|
case (WMODE_B | WMODE_G):
|
|
mod_str = "BG Mixed";
|
|
break;
|
|
|
|
case (WMODE_B):
|
|
mod_str = "B Only";
|
|
break;
|
|
|
|
case (WMODE_A):
|
|
mod_str = "A Only";
|
|
break;
|
|
|
|
case (WMODE_A | WMODE_B | WMODE_G):
|
|
mod_str = "ABG Mixed ==> BG Mixed";
|
|
break;
|
|
|
|
case (WMODE_G):
|
|
mod_str = "G Only";
|
|
break;
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
case (WMODE_A | WMODE_B | WMODE_G | WMODE_AN | WMODE_GN):
|
|
mod_str = "ABGN Mixed ==> BGN Mixed";
|
|
break;
|
|
|
|
case (WMODE_GN):
|
|
mod_str = "2.4G N Only";
|
|
break;
|
|
|
|
case (WMODE_G | WMODE_GN):
|
|
mod_str = "GN Mixed";
|
|
break;
|
|
|
|
case (WMODE_A | WMODE_AN):
|
|
mod_str = "AN Mixed";
|
|
break;
|
|
|
|
case (WMODE_B | WMODE_G | WMODE_GN):
|
|
mod_str = "BGN Mixed";
|
|
break;
|
|
|
|
case (WMODE_A | WMODE_G | WMODE_GN | WMODE_AN):
|
|
mod_str = "AGN Mixed";
|
|
break;
|
|
|
|
case (WMODE_AN):
|
|
mod_str = "5G N Only";
|
|
break;
|
|
#endif /* DOT11_N_SUPPORT */
|
|
}
|
|
}
|
|
|
|
if (mod_str)
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s\n", mod_str));
|
|
DBGPRINT(RT_DEBUG_ERROR, ("\n"));
|
|
|
|
return TRUE;
|
|
} /* End of Show_MbssInfo_Display_Proc */
|
|
#endif /* MBSS_SUPPORT */
|
|
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
VOID RtmpHostapdSecuritySet(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrqin)
|
|
{
|
|
if(wrqin->u.data.length > 20 && MAX_LEN_OF_RSNIE > wrqin->u.data.length && wrqin->u.data.pointer)
|
|
{
|
|
UCHAR RSNIE_Len[2];
|
|
UCHAR RSNIe[2];
|
|
int offset_next_ie=0;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE,("ioctl SIOCSIWGENIE pAd->IoctlIF=%d\n",apidx));
|
|
|
|
RSNIe[0]=*(UINT8 *)wrqin->u.data.pointer;
|
|
if(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE,("IE %02x != 0x30/0xdd\n",RSNIe[0]));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
RSNIE_Len[0]=*((UINT8 *)wrqin->u.data.pointer + 1);
|
|
if(wrqin->u.data.length != RSNIE_Len[0]+2)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE,("IE use WPA1 WPA2\n"));
|
|
NdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], MAX_LEN_OF_RSNIE);
|
|
RSNIe[1]=*(UINT8 *)wrqin->u.data.pointer;
|
|
RSNIE_Len[1]=*((UINT8 *)wrqin->u.data.pointer + 1);
|
|
DBGPRINT(RT_DEBUG_TRACE,( "IE1 %02x %02x\n",RSNIe[1],RSNIE_Len[1]));
|
|
pAd->ApCfg.MBSSID[apidx].RSNIE_Len[1] = RSNIE_Len[1];
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[1], (UCHAR *)(wrqin->u.data.pointer)+2, RSNIE_Len[1]);
|
|
offset_next_ie=RSNIE_Len[1]+2;
|
|
}
|
|
else
|
|
DBGPRINT(RT_DEBUG_TRACE,("IE use only %02x\n",RSNIe[0]));
|
|
|
|
NdisZeroMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], MAX_LEN_OF_RSNIE);
|
|
RSNIe[0]=*(((UINT8 *)wrqin->u.data.pointer)+offset_next_ie);
|
|
RSNIE_Len[0]=*(((UINT8 *)wrqin->u.data.pointer) + offset_next_ie + 1);
|
|
if(IE_WPA != RSNIe[0] && IE_RSN != RSNIe[0] )
|
|
{
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
pAd->ApCfg.MBSSID[apidx].RSNIE_Len[0] = RSNIE_Len[0];
|
|
NdisMoveMemory(pAd->ApCfg.MBSSID[apidx].RSN_IE[0], ((UCHAR *)(wrqin->u.data.pointer))+2+offset_next_ie, RSNIE_Len[0]);
|
|
APMakeAllBssBeacon(pAd);
|
|
APUpdateAllBeaconFrame(pAd);
|
|
}
|
|
}
|
|
#endif /* HOSTAPD_SUPPORT */
|
|
|
|
#ifdef MT_MAC
|
|
/* Only for TimReq frame generating */
|
|
//TODO: Tim service establish.
|
|
INT Set_AP_TimEnable_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
LONG interval;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR APIndex = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss;
|
|
UINT32 Value = 0;
|
|
|
|
interval = simple_strtol(arg, 0, 10);
|
|
|
|
if ((interval < 0) || (interval > 255)) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: interval is incorrect!!\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[APIndex];
|
|
|
|
ASSERT(pMbss);
|
|
if (pMbss)
|
|
wdev_tim_buf_init(pAd, &pMbss->tim_buf);
|
|
|
|
if (interval > 0) //valid interval --> enable
|
|
{
|
|
RTMP_IO_WRITE32(pAd, LPON_PTTISR, 0x50);//set PreTTTT interval.
|
|
|
|
RTMP_IO_READ32(pAd, LPON_TT0TPCR, &Value);
|
|
Value = 0;
|
|
//Carter, test 10ms after TBTT//Carter, I make TTTT always before than TBTT 10ms.
|
|
Value &= ~TTTTn_OFFSET_OF_TBTTn_MASK;
|
|
Value |= TTTTn_OFFSET_OF_TBTTn(0x2800);
|
|
Value |= TTTTn_CAL_EN;
|
|
RTMP_IO_WRITE32(pAd, LPON_TT0TPCR, Value);//enable TTTT0 calculation.
|
|
|
|
RTMP_IO_READ32(pAd, LPON_TT4TPCR, &Value);
|
|
Value = 0;
|
|
Value &= ~TIM_PERIODn_MASK;
|
|
Value |= TIM_PERIODn(interval * pAd->CommonCfg.BeaconPeriod);
|
|
RTMP_IO_WRITE32(pAd, LPON_TT4TPCR, Value);//enable TTTT0 tim interval.
|
|
|
|
RTMP_IO_READ32(pAd, LPON_MPTCR4, &Value);
|
|
Value = 0;
|
|
Value |= TTTT0_PERIODTIMER_EN;
|
|
Value |= TTTT0_TIMEUP_EN;
|
|
Value |= PRETTTT0TIMEUP_EN;
|
|
Value |= PRETTTT0_TRIG_EN;
|
|
Value |= PRETTTT0INT_EN;
|
|
RTMP_IO_WRITE32(pAd, LPON_MPTCR4, Value);
|
|
|
|
//enable dual_btim_enable
|
|
RTMP_IO_READ32(pAd, AGG_ARCR, &Value);
|
|
Value = Value | (1 << 31);
|
|
RTMP_IO_WRITE32(pAd, AGG_ARCR, Value);
|
|
|
|
RTMP_IO_WRITE32(pAd, 0x21280, 0x4f);//setting rate OFDM 9M
|
|
|
|
Value = 0x00000000;
|
|
|
|
if (APIndex == 0)
|
|
Value |= 0x1;
|
|
else if ((APIndex >= 1) && (APIndex <= 15))
|
|
Value |= (0x1 << (APIndex + 15));
|
|
|
|
RTMP_IO_WRITE32(pAd, ARB_BTIMCR0, Value);//enable BTIM_EN bit in ARB_BTIMCR0
|
|
RTMP_IO_WRITE32(pAd, ARB_BTIMCR1, Value);//enable 2 TIM broadcast
|
|
|
|
RTMP_IO_WRITE32(pAd, HWIER4, 0x80008000);//enable TTTT0/PRETTTT0 interrupt.
|
|
}
|
|
else //interval 0 --> disable
|
|
{
|
|
if (APIndex == 0)
|
|
Value = Value & 0x0;
|
|
else if ((APIndex >= 1) && (APIndex <= 15))
|
|
Value = Value & (0x0 << (APIndex + 15));
|
|
|
|
RTMP_IO_WRITE32(pAd, ARB_BTIMCR0, Value);//disable BTIM_EN bit in ARB_BTIMCR0
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef DBG
|
|
INT Set_AP_DumpTime_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
int apidx = 0, i = 0;
|
|
BSS_STRUCT *pMbss;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n\t%-10s\t%-10s\n", "PreTBTTTime", "TBTTTime"));
|
|
DBGPRINT(RT_DEBUG_OFF, ("Idx[%d]:%-10lu\t%-10lu\n", i, pAd->HandlePreInterruptTime,
|
|
pAd->HandleInterruptTime));
|
|
|
|
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++) {
|
|
pMbss = &pAd->ApCfg.MBSSID[apidx];
|
|
|
|
if(!BeaconTransmitRequired(pAd, apidx, pMbss))
|
|
continue;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("\n%s:%d\tBcn_State:%d\t%-10s: %d\n", "Apidx"
|
|
, apidx, pMbss->bcn_buf.bcn_state, "recover", pMbss->bcn_recovery_num));
|
|
DBGPRINT(RT_DEBUG_OFF, ("\t%-10s\t%-10s\t%-10s\t%-10s\n", "WriteBcnRing", "BcnDmaDone", "TXS_TSF", "TXS_SN"));
|
|
for (i = 0; i < MAX_TIME_RECORD; i++) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("Idx[%d]:\t%-10lu\t%-10lu\t%-10lu\t%-10lu\n"
|
|
, i, pMbss->WriteBcnDoneTime[i], pMbss->BcnDmaDoneTime[i], pMbss->TXS_TSF[i], pMbss->TXS_SN[i]));
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_BcnStateCtrl_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UCHAR bcn_state;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR apIndex = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss = NULL;
|
|
|
|
bcn_state = (UCHAR)simple_strtol(arg, 0, 10);
|
|
|
|
if (pAd->chipCap.hif_type != HIF_MT) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: chipCap is not HIF_MT\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
if ((bcn_state < BCN_TX_IDLE) || (bcn_state > BCN_TX_STOP)) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: bcn_state is incorrect!!\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apIndex];
|
|
|
|
ASSERT(pMbss);
|
|
if (pMbss == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: pMbss == NULL!!\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
if (pMbss->bcn_buf.bcn_state != BCN_TX_IDLE) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("MBSSID[%d], bcn_buf.bcn_state = %d, will change to %d\n"
|
|
, apIndex, pMbss->bcn_buf.bcn_state, bcn_state));
|
|
RTMP_SEM_LOCK(&pAd->BcnRingLock);
|
|
pMbss->bcn_buf.bcn_state = bcn_state;
|
|
RTMP_SEM_UNLOCK(&pAd->BcnRingLock);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
INT setApTmrEnableProc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
LONG enable;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR apIndex = pObj->ioctl_if;
|
|
BSS_STRUCT *pMbss = NULL;
|
|
UINT32 value = 0;
|
|
|
|
enable = simple_strtol(arg, 0, 10);
|
|
|
|
if (pAd->chipCap.hif_type != HIF_MT) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: chipCap is not HIF_MT\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
if ((enable < 0) || (enable > 2)) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: enable is incorrect!!\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
pMbss = &pAd->ApCfg.MBSSID[apIndex];
|
|
|
|
ASSERT(pMbss);
|
|
if (pMbss == NULL)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: pMbss == NULL!!\n", __func__));
|
|
return FALSE;
|
|
}
|
|
|
|
switch (enable)
|
|
{
|
|
case 1://initialiter
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s: enable TMR report, as Initialiter\n", __func__));
|
|
RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value);
|
|
value = value | BIT31;
|
|
value = value & ~BIT30;
|
|
value = value | 0x34;//Action frame register
|
|
RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value);
|
|
pAd->chipCap.TmrEnable = 1;
|
|
}
|
|
break;
|
|
case 2://responder
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s: enable TMR report, as Responser\n", __func__));
|
|
RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value);
|
|
value = value | BIT31;
|
|
value = value | BIT30;
|
|
value = value | 0x34;//Action frame register
|
|
RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value);
|
|
pAd->chipCap.TmrEnable = 2;
|
|
}
|
|
break;
|
|
|
|
case 0://disable
|
|
default:
|
|
{
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s: disable TMR report\n", __func__));
|
|
RTMP_IO_READ32(pAd, RMAC_TMR_PA, &value);
|
|
value = value & ~BIT31;
|
|
RTMP_IO_WRITE32(pAd, RMAC_TMR_PA, value);
|
|
pAd->chipCap.TmrEnable = FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
#endif /* MT_MAC */
|
|
|
|
|
|
/*
|
|
========================================================================
|
|
Routine Description:
|
|
Driver Ioctl for AP.
|
|
|
|
Arguments:
|
|
pAdSrc - WLAN control block pointer
|
|
wrq - the IOCTL parameters
|
|
cmd - the command ID
|
|
subcmd - the sub-command ID
|
|
pData - the IOCTL private data pointer
|
|
Data - the IOCTL private data
|
|
|
|
Return Value:
|
|
NDIS_STATUS_SUCCESS - IOCTL OK
|
|
Otherwise - IOCTL fail
|
|
|
|
Note:
|
|
========================================================================
|
|
*/
|
|
INT RTMP_AP_IoctlHandle(
|
|
IN VOID *pAdSrc,
|
|
IN RTMP_IOCTL_INPUT_STRUCT *wrq,
|
|
IN INT cmd,
|
|
IN USHORT subcmd,
|
|
IN VOID *pData,
|
|
IN ULONG Data)
|
|
{
|
|
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
INT Status = NDIS_STATUS_SUCCESS;
|
|
|
|
|
|
switch(cmd)
|
|
{
|
|
case CMD_RTPRIV_IOCTL_SET:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_SET\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
Status = RTMPAPPrivIoctlSet(pAd, wrq);
|
|
break;
|
|
|
|
case CMD_RT_PRIV_IOCTL:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RT_PRIV_IOCTL\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
if (subcmd & OID_GET_SET_TOGGLE)
|
|
Status = RTMPAPSetInformation(pAd, wrq, (INT)subcmd);
|
|
else
|
|
{
|
|
#ifdef LLTD_SUPPORT
|
|
if (subcmd == RT_OID_GET_PHY_MODE)
|
|
{
|
|
if(pData != NULL)
|
|
{
|
|
UINT modetmp = 0;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Query::Get phy mode (%02X) \n", pAd->CommonCfg.PhyMode));
|
|
modetmp = (UINT) pAd->CommonCfg.PhyMode;
|
|
wrq->u.data.length = 4;
|
|
/**(ULONG *)pData = (ULONG)pAd->CommonCfg.PhyMode; */
|
|
if (copy_to_user(pData, &modetmp, wrq->u.data.length))
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
Status = -EFAULT;
|
|
}
|
|
else
|
|
#endif /* LLTD_SUPPORT */
|
|
Status = RTMPAPQueryInformation(pAd, wrq, (INT)subcmd);
|
|
}
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_SHOW:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_SHOW\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
Status = RTMPAPPrivIoctlShow(pAd, wrq);
|
|
break;
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_SET_WSCOOB:
|
|
RTMPIoctlSetWSCOOB(pAd);
|
|
break;
|
|
#endif/*WSC_AP_SUPPORT*/
|
|
|
|
case CMD_RTPRIV_IOCTL_GET_MAC_TABLE:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_GET_MAC_TABLE\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlGetMacTable(pAd,wrq);
|
|
break;
|
|
|
|
#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT)
|
|
case CMD_RTPRIV_IOCTL_GSITESURVEY:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_GSITESURVEY\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlGetSiteSurvey(pAd,wrq);
|
|
break;
|
|
#endif /* AP_SCAN_SUPPORT */
|
|
|
|
case CMD_RTPRIV_IOCTL_STATISTICS:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_STATISTICS\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlStatistics(pAd, wrq);
|
|
break;
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_WSC_PROFILE:
|
|
RTMPIoctlWscProfile(pAd, wrq);
|
|
break;
|
|
#endif /* WSC_AP_SUPPORT */
|
|
|
|
#ifdef DOT11_N_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_QUERY_BATABLE:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_QUERY_BATABLE\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlQueryBaTable(pAd, wrq);
|
|
break;
|
|
#endif /* DOT11_N_SUPPORT */
|
|
|
|
case CMD_RTPRIV_IOCTL_E2P:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_E2P\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPAPIoctlE2PROM(pAd, wrq);
|
|
break;
|
|
|
|
#ifdef DBG
|
|
case CMD_RTPRIV_IOCTL_BBP:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_BBP\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPAPIoctlBBP(pAd, wrq);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MAC:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_MAC\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlMAC(pAd, wrq);
|
|
break;
|
|
|
|
#ifdef RTMP_RF_RW_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_RF:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_RF\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPAPIoctlRF(pAd, wrq);
|
|
break;
|
|
#endif /* RTMP_RF_RW_SUPPORT */
|
|
#endif /* DBG */
|
|
|
|
#ifdef INF_AR9
|
|
#ifdef AR9_MAPI_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_GET_AR9_SHOW:
|
|
Status = RTMPAPPrivIoctlAR9Show(pAd, wrq);
|
|
break;
|
|
#endif /*AR9_MAPI_SUPPORT*/
|
|
#endif/* INF_AR9 */
|
|
|
|
case CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
RTMPIoctlGetMacTableStaInfo(pAd, wrq);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR:
|
|
if (!wrq) {
|
|
DBGPRINT(RT_DEBUG_WARN,
|
|
("null wrq in CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR\n"));
|
|
Status = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd))
|
|
NdisCopyMemory((RTMP_STRING *) wrq->u.name, (RTMP_STRING *) pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bssid, 6);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID:
|
|
{
|
|
RT_CMD_AP_IOCTL_SSID *pSSID = (RT_CMD_AP_IOCTL_SSID *)pData;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (pSSID->priv_flags == INT_APCLI)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)
|
|
{
|
|
pSSID->length = pAd->ApCfg.ApCliTab[pObj->ioctl_if].SsidLen;
|
|
pSSID->pSsidStr = (char *)&pAd->ApCfg.ApCliTab[pObj->ioctl_if].Ssid;
|
|
}
|
|
else {
|
|
pSSID->length = 0;
|
|
pSSID->pSsidStr = NULL;
|
|
}
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
pSSID->length = pAd->ApCfg.MBSSID[pSSID->apidx].SsidLen;
|
|
pSSID->pSsidStr = (char *)pAd->ApCfg.MBSSID[pSSID->apidx].Ssid;
|
|
}
|
|
}
|
|
break;
|
|
|
|
#ifdef MBSS_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_MBSS_BEACON_UPDATE:
|
|
//CFG TODO
|
|
APMakeAllBssBeacon(pAd);
|
|
APUpdateAllBeaconFrame(pAd);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MBSS_OPEN:
|
|
if (MBSS_Open(pData) != 0)
|
|
return NDIS_STATUS_FAILURE;
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MBSS_CLOSE:
|
|
MBSS_Close(pData);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MBSS_INIT:
|
|
MBSS_Init(pAd, pData);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MBSS_REMOVE:
|
|
MBSS_Remove(pAd);
|
|
break;
|
|
|
|
#ifdef MT_MAC
|
|
case CMD_RTPRIV_IOCTL_MBSS_CR_ENABLE:
|
|
if (mbss_cr_enable(pData) != 0)
|
|
return NDIS_STATUS_FAILURE;
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_MBSS_CR_DISABLE:
|
|
if (mbss_cr_disable(pData) != 0)
|
|
return NDIS_STATUS_FAILURE;
|
|
break;
|
|
#endif /* MT_MAC */
|
|
#endif /* MBSS_SUPPORT */
|
|
|
|
case CMD_RTPRIV_IOCTL_WSC_INIT:
|
|
{
|
|
#ifdef APCLI_SUPPORT
|
|
#ifdef WSC_AP_SUPPORT
|
|
#ifdef WSC_V2_SUPPORT
|
|
PWSC_V2_INFO pWscV2Info;
|
|
#endif /* WSC_V2_SUPPORT */
|
|
APCLI_STRUCT *pApCliEntry = (APCLI_STRUCT *)pData;
|
|
WscGenerateUUID(pAd, &pApCliEntry->WscControl.Wsc_Uuid_E[0],
|
|
&pApCliEntry->WscControl.Wsc_Uuid_Str[0], 0, FALSE);
|
|
pApCliEntry->WscControl.bWscFragment = FALSE;
|
|
pApCliEntry->WscControl.WscFragSize = 128;
|
|
pApCliEntry->WscControl.WscRxBufLen = 0;
|
|
pApCliEntry->WscControl.pWscRxBuf = NULL;
|
|
os_alloc_mem(pAd, &pApCliEntry->WscControl.pWscRxBuf, MGMT_DMA_BUFFER_SIZE);
|
|
if (pApCliEntry->WscControl.pWscRxBuf)
|
|
NdisZeroMemory(pApCliEntry->WscControl.pWscRxBuf, MGMT_DMA_BUFFER_SIZE);
|
|
pApCliEntry->WscControl.WscTxBufLen = 0;
|
|
pApCliEntry->WscControl.pWscTxBuf = NULL;
|
|
os_alloc_mem(pAd, &pApCliEntry->WscControl.pWscTxBuf, MGMT_DMA_BUFFER_SIZE);
|
|
if (pApCliEntry->WscControl.pWscTxBuf)
|
|
NdisZeroMemory(pApCliEntry->WscControl.pWscTxBuf, MGMT_DMA_BUFFER_SIZE);
|
|
initList(&pApCliEntry->WscControl.WscPeerList);
|
|
NdisAllocateSpinLock(pAd, &pApCliEntry->WscControl.WscPeerListSemLock);
|
|
pApCliEntry->WscControl.PinAttackCount = 0;
|
|
pApCliEntry->WscControl.bSetupLock = FALSE;
|
|
#ifdef WSC_V2_SUPPORT
|
|
pWscV2Info = &pApCliEntry->WscControl.WscV2Info;
|
|
pWscV2Info->bWpsEnable = TRUE;
|
|
pWscV2Info->ExtraTlv.TlvLen = 0;
|
|
pWscV2Info->ExtraTlv.TlvTag = 0;
|
|
pWscV2Info->ExtraTlv.pTlvData = NULL;
|
|
pWscV2Info->ExtraTlv.TlvType = TLV_ASCII;
|
|
pWscV2Info->bEnableWpsV2 = TRUE;
|
|
#endif /* WSC_V2_SUPPORT */
|
|
WscInit(pAd, TRUE, Data);
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* APCLI_SUPPORT */
|
|
}
|
|
break;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_APC_UP:
|
|
ApCliIfUp(pAd);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_APC_DISCONNECT:
|
|
MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_DISCONNECT_REQ, 0, NULL, Data);
|
|
RTMP_MLME_HANDLER(pAd);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_APC_INIT:
|
|
APCli_Init(pAd, pData);
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_APC_OPEN:
|
|
if (ApCli_Open(pAd, pData) != TRUE)
|
|
return NDIS_STATUS_FAILURE;
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_APC_CLOSE:
|
|
if (ApCli_Close(pAd, pData) != TRUE)
|
|
return NDIS_STATUS_FAILURE;
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_APC_REMOVE:
|
|
ApCli_Remove(pAd);
|
|
break;
|
|
#endif /* APCLI_SUPPORT */
|
|
|
|
case CMD_RTPRIV_IOCTL_MAIN_OPEN:
|
|
pAd->ApCfg.MBSSID[MAIN_MBSSID].bcn_buf.bBcnSntReq = TRUE;
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_PREPARE:
|
|
{
|
|
RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pData;
|
|
pConfig->Status = RTMP_AP_IoctlPrepare(pAd, pData);
|
|
if (pConfig->Status != 0)
|
|
return NDIS_STATUS_FAILURE;
|
|
}
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_AP_SIOCGIWAP:
|
|
{
|
|
UCHAR *pBssidDest = (UCHAR *)pData;
|
|
PCHAR pBssidStr;
|
|
|
|
#ifdef APCLI_SUPPORT
|
|
if (Data == INT_APCLI)
|
|
{
|
|
if (pAd->ApCfg.ApCliTab[pObj->ioctl_if].Valid == TRUE)
|
|
pBssidStr = (PCHAR)&APCLI_ROOT_BSSID_GET(pAd, pAd->ApCfg.ApCliTab[pObj->ioctl_if].MacTabWCID);
|
|
else
|
|
pBssidStr = NULL;
|
|
}
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
{
|
|
pBssidStr = (PCHAR) &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.bssid[0];
|
|
}
|
|
|
|
if (pBssidStr != NULL)
|
|
{
|
|
memcpy(pBssidDest, pBssidStr, ETH_ALEN);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n",
|
|
PRINT_MAC(pBssidStr)));
|
|
}
|
|
else
|
|
{
|
|
memset(pBssidDest, 0, ETH_ALEN);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:
|
|
/* handle for SIOCGIWRATEQ */
|
|
{
|
|
RT_CMD_IOCTL_RATE *pRate = (RT_CMD_IOCTL_RATE *)pData;
|
|
HTTRANSMIT_SETTING HtPhyMode;
|
|
|
|
#ifdef MESH_SUPPORT
|
|
if (pRate->priv_flags == INT_MESH)
|
|
HtPhyMode = pAd->MeshTab.wdev.HTPhyMode;
|
|
else
|
|
#endif /* MESH_SUPPORT */
|
|
#ifdef APCLI_SUPPORT
|
|
if (pRate->priv_flags == INT_APCLI)
|
|
HtPhyMode = pAd->ApCfg.ApCliTab[pObj->ioctl_if].wdev.HTPhyMode;
|
|
else
|
|
#endif /* APCLI_SUPPORT */
|
|
#ifdef WDS_SUPPORT
|
|
if (pRate->priv_flags == INT_WDS)
|
|
HtPhyMode = pAd->WdsTab.WdsEntry[pObj->ioctl_if].wdev.HTPhyMode;
|
|
else
|
|
#endif /* WDS_SUPPORT */
|
|
HtPhyMode = pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev.HTPhyMode;
|
|
|
|
RtmpDrvMaxRateGet(pAd, (UINT8)HtPhyMode.field.MODE
|
|
, (UINT8)HtPhyMode.field.ShortGI
|
|
, (UINT8)HtPhyMode.field.BW
|
|
, (UINT8)HtPhyMode.field.MCS
|
|
, (UINT32 *)&pRate->BitRate);
|
|
}
|
|
break;
|
|
|
|
#ifdef HOSTAPD_SUPPORT
|
|
case CMD_RTPRIV_IOCTL_AP_SIOCGIWRATEQ:
|
|
RtmpHostapdSecuritySet(pAd, wrq);
|
|
break;
|
|
#endif /* HOSTAPD_SUPPORT */
|
|
|
|
default:
|
|
Status = RTMP_COM_IoctlHandle(pAd, wrq, cmd, subcmd, pData, Data);
|
|
break;
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
#ifdef P2P_SUPPORT
|
|
INT Set_P2p_OpMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT OpMode;
|
|
POS_COOKIE pObj;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
OpMode = simple_strtol(arg, 0, 16);
|
|
|
|
|
|
if (OpMode == OPMODE_AP)
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
P2P_CliStop(pAd);
|
|
|
|
if ((!P2P_GO_ON(pAd)) || (P2P_GO_ON(pAd)))
|
|
{
|
|
P2PCfgInit(pAd);
|
|
P2P_GoStartUp(pAd, MAIN_MBSSID);
|
|
}
|
|
}
|
|
else if (OpMode == OPMODE_APSTA)
|
|
{
|
|
if (P2P_GO_ON(pAd))
|
|
P2P_GoStop(pAd);
|
|
|
|
if ((!P2P_CLI_ON(pAd)) || (P2P_CLI_ON(pAd)))
|
|
{
|
|
P2PCfgInit(pAd);
|
|
P2P_CliStartUp(pAd);
|
|
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (P2P_CLI_ON(pAd))
|
|
P2P_CliStop(pAd);
|
|
else if (P2P_GO_ON(pAd))
|
|
{
|
|
P2P_GoStop(pAd);
|
|
if (INFRA_ON(pAd))
|
|
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
|
}
|
|
P2PCfgInit(pAd);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2p_OpMode_Proc::(OpMode = %d)\n", pObj->ioctl_if, OpMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_P2pCli_Enable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT Enable;
|
|
POS_COOKIE pObj;
|
|
UCHAR ifIndex;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
Enable = simple_strtol(arg, 0, 16);
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = (Enable > 0) ? TRUE : FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_Enable_Proc::(enable = %d)\n", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].Enable));
|
|
|
|
ApCliIfDown(pAd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT Set_P2pCli_Ssid_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR ifIndex;
|
|
BOOLEAN apcliEn;
|
|
INT success = FALSE;
|
|
/*UCHAR keyMaterial[40]; */
|
|
UCHAR PskKey[100];
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
if(strlen(arg) <= MAX_LEN_OF_SSID)
|
|
{
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
/* bring apcli interface down first */
|
|
if(apcliEn == TRUE )
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;
|
|
ApCliIfDown(pAd);
|
|
}
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, arg, strlen(arg));
|
|
pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength = (UCHAR)strlen(arg);
|
|
|
|
success = TRUE;
|
|
|
|
/* Upadte PMK and restart WPAPSK state machine for ApCli link */
|
|
if (((pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode == Ndis802_11AuthModeWPAPSK) ||
|
|
(pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode == Ndis802_11AuthModeWPA2PSK)
|
|
#ifdef WPA3_SUPPORT
|
|
|| (pAd->ApCfg.ApCliTab[ifIndex].wdev.AuthMode == Ndis802_11AuthModeWPA3SAE)
|
|
#endif
|
|
) && pAd->ApCfg.ApCliTab[ifIndex].PSKLen > 0) {
|
|
NdisZeroMemory(PskKey, 100);
|
|
NdisMoveMemory(PskKey, pAd->ApCfg.ApCliTab[ifIndex].PSK, pAd->ApCfg.ApCliTab[ifIndex].PSKLen);
|
|
|
|
#if 0
|
|
if ((strlen((RTMP_STRING *) PskKey) >= 8) && (strlen((RTMP_STRING *) PskKey) < 64))
|
|
{
|
|
RtmpPasswordHash((char *)PskKey, (PUCHAR) pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, keyMaterial);
|
|
NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].PMK, keyMaterial, 32);
|
|
}
|
|
else if ((INT) strlen((RTMP_STRING *) PskKey) == 64)
|
|
{
|
|
AtoH((RTMP_STRING *) PskKey, pAd->ApCfg.ApCliTab[ifIndex].PMK, 32);
|
|
}
|
|
#else
|
|
RT_CfgSetWPAPSKKey(pAd, (RTMP_STRING *)PskKey,
|
|
pAd->ApCfg.ApCliTab[ifIndex].PSKLen,
|
|
(PUCHAR)pAd->ApCfg.ApCliTab[ifIndex].CfgSsid,
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen,
|
|
pAd->ApCfg.ApCliTab[ifIndex].PMK);
|
|
#endif
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_Ssid_Proc::(Len=%d,Ssid=%s)\n", ifIndex,
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid));
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;
|
|
}
|
|
else
|
|
success = FALSE;
|
|
|
|
return success;
|
|
}
|
|
|
|
|
|
INT Set_P2pCli_Bssid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
INT i;
|
|
RTMP_STRING *value;
|
|
UCHAR ifIndex;
|
|
BOOLEAN apcliEn;
|
|
POS_COOKIE pObj;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
apcliEn = pAd->ApCfg.ApCliTab[ifIndex].Enable;
|
|
|
|
/* bring apcli interface down first */
|
|
if(apcliEn == TRUE )
|
|
{
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = FALSE;
|
|
ApCliIfDown(pAd);
|
|
}
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN);
|
|
|
|
if(strlen(arg) == 17) /* Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
|
{
|
|
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"), i++)
|
|
{
|
|
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
|
return FALSE; /* Invalid */
|
|
|
|
AtoH(value, &pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[i], 1);
|
|
}
|
|
|
|
if(i != 6)
|
|
return FALSE; /* Invalid */
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set_P2pCli_Bssid_Proc (%2X:%2X:%2X:%2X:%2X:%2X)\n",
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[0],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[1],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[2],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[3],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[4],
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid[5]));
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].Enable = apcliEn;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set ApCli-IF Authentication mode
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_AuthMode_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG i;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
if (rtstrcasecmp(arg, "WEPAUTO") == TRUE)
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeAutoSwitch;
|
|
else if (rtstrcasecmp(arg, "SHARED") == TRUE)
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeShared;
|
|
else if (rtstrcasecmp(arg, "WPAPSK") == TRUE)
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPAPSK;
|
|
else if (rtstrcasecmp(arg, "WPA2PSK") == TRUE)
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA2PSK;
|
|
#ifdef WPA3_SUPPORT
|
|
else if (rtstrcasecmp(arg, "WPA3SAE") == TRUE)
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeWPA3SAE;
|
|
#endif
|
|
else
|
|
pAd->ApCfg.ApCliTab[ifIndex].AuthMode = Ndis802_11AuthModeOpen;
|
|
|
|
for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)
|
|
{
|
|
if (IS_ENTRY_APCLI(&pAd->MacTab.Content[i]))
|
|
{
|
|
pAd->MacTab.tr_entry[i].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
|
|
}
|
|
}
|
|
|
|
RTMPMakeRSNIE(pAd, pAd->ApCfg.ApCliTab[ifIndex].AuthMode, pAd->ApCfg.ApCliTab[ifIndex].WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
|
|
pAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 0;
|
|
|
|
if(pAd->ApCfg.ApCliTab[ifIndex].AuthMode >= Ndis802_11AuthModeWPA)
|
|
pAd->ApCfg.ApCliTab[ifIndex].DefaultKeyId = 1;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_AuthMode_Proc::(AuthMode=%d)\n", ifIndex, pAd->ApCfg.ApCliTab[ifIndex].AuthMode));
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set ApCli-IF Encryption Type
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_EncrypType_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
pApCliEntry->WepStatus = Ndis802_11WEPDisabled;
|
|
if (rtstrcasecmp(arg, "WEP") == TRUE)
|
|
{
|
|
if (pApCliEntry->AuthMode < Ndis802_11AuthModeWPA)
|
|
pApCliEntry->WepStatus = Ndis802_11WEPEnabled;
|
|
}
|
|
else if (rtstrcasecmp(arg, "TKIP") == TRUE)
|
|
{
|
|
if (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)
|
|
pApCliEntry->WepStatus = Ndis802_11TKIPEnable;
|
|
}
|
|
else if (rtstrcasecmp(arg, "AES") == TRUE)
|
|
{
|
|
if (pApCliEntry->AuthMode >= Ndis802_11AuthModeWPA)
|
|
pApCliEntry->WepStatus = Ndis802_11AESEnable;
|
|
}
|
|
else
|
|
{
|
|
pApCliEntry->WepStatus = Ndis802_11WEPDisabled;
|
|
}
|
|
|
|
pApCliEntry->PairCipher = pApCliEntry->WepStatus;
|
|
pApCliEntry->GroupCipher = pApCliEntry->WepStatus;
|
|
pApCliEntry->bMixCipher = FALSE;
|
|
|
|
if (pApCliEntry->WepStatus >= Ndis802_11TKIPEnable)
|
|
pApCliEntry->DefaultKeyId = 1;
|
|
|
|
RTMPMakeRSNIE(pAd, pApCliEntry->AuthMode, pApCliEntry->WepStatus, (ifIndex + MIN_NET_DEVICE_FOR_APCLI));
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_EncrypType_Proc::(EncrypType=%d)\n", ifIndex, pApCliEntry->WepStatus));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set Default Key ID
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_DefaultKeyID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
ULONG KeyIdx;
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
KeyIdx = simple_strtol(arg, 0, 10);
|
|
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
|
|
pApCliEntry->DefaultKeyId = (UCHAR) (KeyIdx - 1 );
|
|
else
|
|
return FALSE; /* Invalid argument */
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_DefaultKeyID_Proc::(DefaultKeyID(0~3)=%d)\n", ifIndex, pApCliEntry->DefaultKeyId));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WPA PSK key for ApCli link
|
|
|
|
Arguments:
|
|
pAdapter Pointer to our adapter
|
|
arg WPA pre-shared key string
|
|
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_WPAPSK_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
UCHAR ifIndex;
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
INT retval;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_WPAPSK_Proc::(WPAPSK=%s)\n", ifIndex, arg));
|
|
|
|
retval = RT_CfgSetWPAPSKKey(pAd, arg, strlen(arg), (PUCHAR)pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, pApCliEntry->PMK);
|
|
if (retval == FALSE)
|
|
return FALSE;
|
|
|
|
NdisMoveMemory(pApCliEntry->PSK, arg, strlen(arg));
|
|
pApCliEntry->PSKLen = strlen(arg);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY1 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_Key1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
UCHAR ifIndex;
|
|
INT retVal;
|
|
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[0], 0);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_Key1_Proc::(Key1=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY2 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_Key2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
UCHAR ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[1], 1);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_Key2_Proc::(Key2=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY3 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_Key3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
UCHAR ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[2], 2);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_Key3_Proc::(Key3=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
|
|
/*
|
|
==========================================================================
|
|
Description:
|
|
Set WEP KEY4 for ApCli-IF
|
|
Return:
|
|
TRUE if all parameters are OK, FALSE otherwise
|
|
==========================================================================
|
|
*/
|
|
INT Set_P2pCli_Key4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
UCHAR ifIndex;
|
|
INT retVal;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
retVal = RT_CfgSetWepKey(pAd, arg, &pApCliEntry->SharedKey[3], 3);
|
|
if(retVal == TRUE)
|
|
DBGPRINT(RT_DEBUG_TRACE, ("IF(p2p%d) Set_P2pCli_Key4_Proc::(Key4=%s) success!\n", ifIndex, arg));
|
|
|
|
return retVal;
|
|
}
|
|
|
|
INT Set_P2pCli_TxMode_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
pApCliEntry->DesiredTransmitSetting.field.FixedTxMode = RT_CfgSetFixedTxPhyMode(arg);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_TxMode_Proc = %d\n", ifIndex,
|
|
pApCliEntry->DesiredTransmitSetting.field.FixedTxMode));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_P2pCli_TxMcs_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj;
|
|
UCHAR ifIndex;
|
|
PAPCLI_STRUCT pApCliEntry = NULL;
|
|
|
|
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
ifIndex = pObj->ioctl_if;
|
|
pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex];
|
|
|
|
pApCliEntry->DesiredTransmitSetting.field.MCS =
|
|
RT_CfgSetTxMCSProc(arg, &pApCliEntry->bAutoTxRateSwitch);
|
|
|
|
if (pApCliEntry->DesiredTransmitSetting.field.MCS == MCS_AUTO)
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_TxMcs_Proc = AUTO\n", ifIndex));
|
|
}
|
|
else
|
|
{
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_TxMcs_Proc = %d\n", ifIndex,
|
|
pApCliEntry->DesiredTransmitSetting.field.MCS));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef WSC_AP_SUPPORT
|
|
INT Set_P2pCli_WscSsid_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR ifIndex = pObj->ioctl_if;
|
|
PWSC_CTRL pWscControl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl;
|
|
|
|
if (pObj->ioctl_if_type != INT_P2P)
|
|
return FALSE;
|
|
|
|
NdisZeroMemory(&pWscControl->WscSsid, sizeof(NDIS_802_11_SSID));
|
|
|
|
if ( (strlen(arg) > 0) && (strlen(arg) <= MAX_LEN_OF_SSID))
|
|
{
|
|
NdisMoveMemory(pWscControl->WscSsid.Ssid, arg, strlen(arg));
|
|
pWscControl->WscSsid.SsidLength = strlen(arg);
|
|
|
|
NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, MAX_LEN_OF_SSID);
|
|
NdisMoveMemory(pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, arg, strlen(arg));
|
|
pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen = (UCHAR)strlen(arg);
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("I/F(p2p%d) Set_P2pCli_WscSsid_Proc:: (Select SsidLen=%d,Ssid=%s)\n", ifIndex,
|
|
pWscControl->WscSsid.SsidLength, pWscControl->WscSsid.Ssid));
|
|
}
|
|
else
|
|
return FALSE; /* Invalid argument */
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
#endif /* WSC_AP_SUPPORT */
|
|
#endif /* P2P_SUPPORT */
|
|
|
|
#ifdef RT6352
|
|
INT Set_MacWatchDog_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bEnableWD;
|
|
|
|
bEnableWD = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->bEnableMacWD = bEnableWD;
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE, ("EnableMacWD = %d \n", pAd->bEnableMacWD));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
#if 0 /* Not Used */
|
|
INT Set_DumpRF_Proc(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
int i;
|
|
UCHAR Value;
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfRfId; i++)
|
|
{
|
|
RT635xReadRFRegister(pAd, RF_BANK0, i, &Value);
|
|
printk("%d %03d %02X\n", RF_BANK0, i, Value);
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfRfId; i++)
|
|
{
|
|
RT635xReadRFRegister(pAd, RF_BANK4, i, &Value);
|
|
printk("%d %03d %02X\n", RF_BANK4, i, Value);
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfRfId; i++)
|
|
{
|
|
RT635xReadRFRegister(pAd, RF_BANK5, i, &Value);
|
|
printk("%d %03d %02X\n", RF_BANK5, i, Value);
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfRfId; i++)
|
|
{
|
|
RT635xReadRFRegister(pAd, RF_BANK6, i, &Value);
|
|
printk("%d %03d %02X\n", RF_BANK6, i, Value);
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfRfId; i++)
|
|
{
|
|
RT635xReadRFRegister(pAd, RF_BANK7, i, &Value);
|
|
printk("%d %03d %02X\n", RF_BANK7, i, Value);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
INT Set_DumpBBP_Proc(
|
|
IN RTMP_ADAPTER *pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
int i;
|
|
UCHAR BBPValue = 0;
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfBbpId; i++)
|
|
{
|
|
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, i, &BBPValue);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%03d = %02X\n", i, BBPValue));
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfBbpId; i++)
|
|
{
|
|
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R158, i);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%03d = %02X\n", BBP_R158, i));
|
|
|
|
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R159, &BBPValue);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%03d = %02X\n", BBP_R159, BBPValue));
|
|
}
|
|
|
|
for (i = 0; i < pAd->chipCap.MaxNumOfBbpId; i++)
|
|
{
|
|
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R195, i);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%03d = %02X\n", BBP_R195, i));
|
|
|
|
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R196, &BBPValue);
|
|
DBGPRINT(RT_DEBUG_OFF, ("%03d = %02X\n", BBP_R196, BBPValue));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_KickOutHwNull_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
|
{
|
|
BOOLEAN bEnableWD;
|
|
|
|
bEnableWD = simple_strtol(arg, 0, 10);
|
|
|
|
RtmpKickOutHwNullFrame(pAd, TRUE, TRUE);
|
|
|
|
DBGPRINT(RT_DEBUG_ERROR, ("KickOutHwNull = %d \n", bEnableWD));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* RT6352 */
|
|
|
|
#ifdef DYNAMIC_VGA_SUPPORT
|
|
#if 0 /* Not Used */
|
|
INT Set_DyncVga_FalseCCATh_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG th;
|
|
|
|
th = simple_strtol(arg, 0, 10);
|
|
|
|
if (th > 65535)
|
|
th = 65535;
|
|
|
|
pAd->CommonCfg.lna_vga_ctl.nFalseCCATh = th;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s: set falseCCA threshold %lu for microwave oven application!!\n", __FUNCTION__, th));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT Set_DyncVga_LowFalseCCATh_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
ULONG th;
|
|
|
|
th = simple_strtol(arg, 0, 10);
|
|
|
|
if (th > 65535)
|
|
th = 65535;
|
|
|
|
pAd->CommonCfg.lna_vga_ctl.nLowFalseCCATh = th;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s: set low falseCCA threshold %lu for microwave oven application!!\n", __FUNCTION__, th));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* Not Used */
|
|
INT Set_DyncVgaEnable_Proc(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *arg)
|
|
{
|
|
UINT Enable;
|
|
|
|
Enable = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable = (Enable > 0) ? TRUE : FALSE;
|
|
|
|
if (pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable == TRUE) {
|
|
dynamic_vga_enable(pAd);
|
|
} else {
|
|
dynamic_vga_disable(pAd);
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_TRACE,
|
|
("Set_DyncVgaEnable_Proc::(enable = %d)\n",
|
|
pAd->CommonCfg.lna_vga_ctl.bDyncVgaEnable));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT set_false_cca_hi_th(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
|
|
{
|
|
INT32 val = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->CommonCfg.lna_vga_ctl.nFalseCCATh = (val <= 0) ? 800 : val;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s::(false cca high threshould = %d)\n",
|
|
__FUNCTION__, pAd->CommonCfg.lna_vga_ctl.nFalseCCATh));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT set_false_cca_low_th(PRTMP_ADAPTER pAd, RTMP_STRING *arg)
|
|
{
|
|
INT32 val = simple_strtol(arg, 0, 10);
|
|
|
|
pAd->CommonCfg.lna_vga_ctl.nLowFalseCCATh = (val <= 0) ? 10 : val;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s::(false cca low threshould = %d)\n",
|
|
__FUNCTION__, pAd->CommonCfg.lna_vga_ctl.nLowFalseCCATh));
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* DYNAMIC_VGA_SUPPORT */
|
|
|
|
#ifdef CONFIG_HOTSPOT
|
|
static INT Set_AP_HS_IE(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN UINT8 EID,
|
|
IN RTMP_STRING *IE,
|
|
IN UINT32 IELen)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl;
|
|
|
|
switch (EID)
|
|
{
|
|
case IE_INTERWORKING:
|
|
os_alloc_mem(NULL, &pHSCtrl->InterWorkingIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->InterWorkingIE, IE, IELen);
|
|
pHSCtrl->InterWorkingIELen = IELen;
|
|
pHSCtrl->AccessNetWorkType = (*(IE + 2)) & 0x0F;
|
|
if (IELen > 3)
|
|
{
|
|
pHSCtrl->IsHessid = TRUE;
|
|
if (IELen == 7)
|
|
NdisMoveMemory(pHSCtrl->Hessid, IE + 3, MAC_ADDR_LEN);
|
|
else
|
|
NdisMoveMemory(pHSCtrl->Hessid, IE + 5 , MAC_ADDR_LEN);
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Interworking IE\n"));
|
|
break;
|
|
case IE_ADVERTISEMENT_PROTO:
|
|
os_alloc_mem(NULL, &pHSCtrl->AdvertisementProtoIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->AdvertisementProtoIE, IE, IELen);
|
|
pHSCtrl->AdvertisementProtoIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Advertisement Protocol IE\n"));
|
|
break;
|
|
case IE_QOS_MAP_SET:
|
|
{
|
|
int tmp = 0;
|
|
char *pos = (char *)(IE+2);
|
|
os_alloc_mem(NULL, &pHSCtrl->QosMapSetIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->QosMapSetIE, IE, IELen);
|
|
pHSCtrl->QosMapSetIELen = IELen;
|
|
for(tmp = 0;tmp<(IELen-16-2)/2;tmp++)
|
|
{
|
|
pHSCtrl->DscpException[tmp] = *pos & 0xff;
|
|
pHSCtrl->DscpException[tmp] |= (*(pos+1) & 0xff) << 8;
|
|
pos += 2;
|
|
}
|
|
for(tmp = 0;tmp<8;tmp++)
|
|
{
|
|
pHSCtrl->DscpRange[tmp] = *pos & 0xff;
|
|
pHSCtrl->DscpRange[tmp] |= (*(pos+1) & 0xff) << 8;
|
|
pos += 2;
|
|
}
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Qos MAP Set IE\n"));
|
|
}
|
|
break;
|
|
case IE_ROAMING_CONSORTIUM:
|
|
os_alloc_mem(NULL, &pHSCtrl->RoamingConsortiumIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->RoamingConsortiumIE, IE, IELen);
|
|
pHSCtrl->RoamingConsortiumIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Roaming Consortium IE\n"));
|
|
break;
|
|
default:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknown IE(EID = %d)\n", __FUNCTION__, EID));
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
static INT Set_AP_VENDOR_SPECIFIC_IE(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN UINT8 OUIType,
|
|
IN RTMP_STRING *IE,
|
|
IN UINT32 IELen)
|
|
{
|
|
#ifdef CONFIG_HOTSPOT
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl;
|
|
#endif
|
|
|
|
switch (OUIType) {
|
|
#ifdef CONFIG_HOTSPOT
|
|
case OUI_P2P:
|
|
os_alloc_mem(NULL, &pHSCtrl->P2PIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->P2PIE, IE, IELen);
|
|
pHSCtrl->P2PIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set P2P IE\n"));
|
|
break;
|
|
case OUI_HS2_INDICATION:
|
|
os_alloc_mem(NULL, &pHSCtrl->HSIndicationIE, IELen);
|
|
NdisMoveMemory(pHSCtrl->HSIndicationIE, IE, IELen);
|
|
pHSCtrl->HSIndicationIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set HS2.0 Indication IE\n"));
|
|
break;
|
|
#endif
|
|
default:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknown OUIType = %d\n", __FUNCTION__, OUIType));
|
|
break;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
static INT Set_AP_WNM_IE(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN UINT8 EID,
|
|
IN RTMP_STRING *IE,
|
|
IN UINT32 IELen)
|
|
{
|
|
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[apidx].WNMCtrl;
|
|
|
|
switch (EID)
|
|
{
|
|
case IE_TIME_ADVERTISEMENT:
|
|
os_alloc_mem(NULL, &pWNMCtrl->TimeadvertisementIE, IELen);
|
|
NdisMoveMemory(pWNMCtrl->TimeadvertisementIE, IE, IELen);
|
|
pWNMCtrl->TimeadvertisementIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Time Advertisement IE\n"));
|
|
break;
|
|
case IE_TIME_ZONE:
|
|
os_alloc_mem(NULL, &pWNMCtrl->TimezoneIE, IELen);
|
|
NdisMoveMemory(pWNMCtrl->TimezoneIE, IE, IELen);
|
|
pWNMCtrl->TimezoneIELen = IELen;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("Set Time Zone IE\n"));
|
|
break;
|
|
default:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknown IE(EID = %d)\n", __FUNCTION__, EID));
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
|
|
INT Set_AP_IE(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *IE,
|
|
IN UINT32 IELen)
|
|
{
|
|
UINT8 EID;
|
|
UINT8 OUIType;
|
|
|
|
EID = *IE;
|
|
|
|
switch (EID)
|
|
{
|
|
#ifdef CONFIG_HOTSPOT
|
|
case IE_INTERWORKING:
|
|
case IE_ADVERTISEMENT_PROTO:
|
|
case IE_QOS_MAP_SET:
|
|
case IE_ROAMING_CONSORTIUM:
|
|
Set_AP_HS_IE(pAd, EID, IE, IELen);
|
|
break;
|
|
#endif
|
|
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
case IE_TIME_ADVERTISEMENT:
|
|
case IE_TIME_ZONE:
|
|
Set_AP_WNM_IE(pAd, EID, IE, IELen);
|
|
break;
|
|
#endif
|
|
case IE_VENDOR_SPECIFIC:
|
|
OUIType = *(IE + 5);
|
|
Set_AP_VENDOR_SPECIFIC_IE(pAd, OUIType, IE, IELen);
|
|
break;
|
|
default:
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknown IE(EID = %d)\n", __FUNCTION__, EID));
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#ifdef CONFIG_HOTSPOT
|
|
INT Send_ANQP_Rsp(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *PeerMACAddr,
|
|
IN RTMP_STRING *ANQPRsp,
|
|
IN UINT32 ANQPRspLen)
|
|
{
|
|
UCHAR *Buf;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR apidx = pObj->ioctl_if;
|
|
PHOTSPOT_CTRL pHSCtrl = &pAd->ApCfg.MBSSID[apidx].HotSpotCtrl;
|
|
PGAS_CTRL pGASCtrl = &pAd->ApCfg.MBSSID[apidx].GASCtrl;
|
|
GAS_EVENT_DATA *Event;
|
|
GAS_PEER_ENTRY *GASPeerEntry;
|
|
GAS_QUERY_RSP_FRAGMENT *GASQueryRspFrag, *Tmp;
|
|
UINT32 Len = 0, i, QueryRspOffset = 0;
|
|
BOOLEAN Cancelled;
|
|
BOOLEAN IsFound = FALSE;
|
|
unsigned long irqFlags=0;
|
|
|
|
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
|
|
/* Cancel PostReply timer after receiving daemon response */
|
|
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
if (GASPeerEntry->PostReplyTimerRunning)
|
|
{
|
|
RTMPCancelTimer(&GASPeerEntry->PostReplyTimer, &Cancelled);
|
|
GASPeerEntry->PostReplyTimerRunning = FALSE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + ANQPRspLen);
|
|
|
|
if (!Buf)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
|
|
//RTMP_SEM_EVENT_WAIT(&pGASCtrl->GASPeerListLock, Ret);
|
|
RTMP_INT_LOCK(&pAd->irq_lock, irqFlags);
|
|
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
IsFound = TRUE;
|
|
DBGPRINT(RT_DEBUG_OFF, ("!!GAS RSP DialogToken!! = %x\n",
|
|
GASPeerEntry->DialogToken));
|
|
break;
|
|
}
|
|
}
|
|
//RTMP_SEM_EVENT_UP(&pGASCtrl->GASPeerListLock);
|
|
RTMP_INT_UNLOCK(&pAd->irq_lock, irqFlags);
|
|
|
|
if (IsFound) {
|
|
//RTMP_SEM_EVENT_WAIT(&pGASCtrl->GASPeerListLock, Ret);
|
|
RTMP_INT_LOCK(&pAd->irq_lock, irqFlags);
|
|
DlListDel(&GASPeerEntry->List);
|
|
DlListInit(&GASPeerEntry->GASQueryRspFragList);
|
|
//RTMP_SEM_EVENT_UP(&pGASCtrl->GASPeerListLock);
|
|
RTMP_INT_UNLOCK(&pAd->irq_lock, irqFlags);
|
|
if (GASPeerEntry->PostReplyTimerRunning)
|
|
{
|
|
RTMPCancelTimer(&GASPeerEntry->PostReplyTimer, &Cancelled);
|
|
GASPeerEntry->PostReplyTimerRunning = FALSE;
|
|
}
|
|
RTMPReleaseTimer(&GASPeerEntry->PostReplyTimer, &Cancelled);
|
|
|
|
if (GASPeerEntry->GASRspBufferingTimerRunning)
|
|
{
|
|
RTMPCancelTimer(&GASPeerEntry->GASRspBufferingTimer, &Cancelled);
|
|
GASPeerEntry->GASRspBufferingTimerRunning = FALSE;
|
|
}
|
|
RTMPReleaseTimer(&GASPeerEntry->GASRspBufferingTimer, &Cancelled);
|
|
os_free_mem(NULL, GASPeerEntry);
|
|
}
|
|
goto error0;
|
|
}
|
|
|
|
NdisZeroMemory(Buf, sizeof(*Event) + ANQPRspLen);
|
|
|
|
Event = (GAS_EVENT_DATA *)Buf;
|
|
|
|
Event->ControlIndex = apidx;
|
|
Len += 1;
|
|
NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN);
|
|
Len += MAC_ADDR_LEN;
|
|
|
|
if (ANQPRspLen <= pHSCtrl->MMPDUSize)
|
|
{
|
|
Event->EventType = GAS_RSP;
|
|
Len += 2;
|
|
|
|
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
|
|
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
IsFound = TRUE;
|
|
DBGPRINT(RT_DEBUG_OFF, ("GAS RSP DialogToken = %x\n", GASPeerEntry->DialogToken));
|
|
Event->u.GAS_RSP_DATA.DialogToken = GASPeerEntry->DialogToken;
|
|
Len += 1;
|
|
|
|
break;
|
|
}
|
|
}
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
|
|
if (!IsFound) {
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Can not find peer address in GASPeerList\n", __FUNCTION__));
|
|
goto error1;
|
|
}
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("GAS RSP DialogToken = %x\n", GASPeerEntry->DialogToken));
|
|
Event->u.GAS_RSP_DATA.StatusCode = 0;
|
|
Len += 2;
|
|
Event->u.GAS_RSP_DATA.GASComebackDelay = 0;
|
|
Len += 2;
|
|
Event->u.GAS_RSP_DATA.AdvertisementProID = ACCESS_NETWORK_QUERY_PROTOCOL;
|
|
Len += 1;
|
|
Event->u.GAS_RSP_DATA.QueryRspLen = ANQPRspLen;
|
|
Len += 2;
|
|
|
|
NdisMoveMemory(Event->u.GAS_RSP_DATA.QueryRsp, ANQPRsp, ANQPRspLen);
|
|
Len += ANQPRspLen;
|
|
|
|
GASPeerEntry->CurrentState = WAIT_GAS_RSP;
|
|
|
|
SendGASRsp(pAd, (GAS_EVENT_DATA *)Buf);
|
|
}
|
|
else
|
|
{
|
|
Event->EventType = GAS_RSP_MORE;
|
|
Len += 2;
|
|
|
|
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
|
|
DlListForEach(GASPeerEntry, &pGASCtrl->GASPeerList, GAS_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(GASPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
IsFound = TRUE;
|
|
|
|
Event->u.GAS_RSP_MORE_DATA.DialogToken = GASPeerEntry->DialogToken;
|
|
Len += 1;
|
|
|
|
if ((ANQPRspLen % pHSCtrl->MMPDUSize) == 0)
|
|
GASPeerEntry->GASRspFragNum = ANQPRspLen / pHSCtrl->MMPDUSize;
|
|
else
|
|
GASPeerEntry->GASRspFragNum = (ANQPRspLen / pHSCtrl->MMPDUSize) + 1;
|
|
|
|
GASPeerEntry->CurrentGASFragNum = 0;
|
|
|
|
for (i = 0; i < GASPeerEntry->GASRspFragNum; i++)
|
|
{
|
|
os_alloc_mem(NULL, (UCHAR **)&GASQueryRspFrag, sizeof(*GASQueryRspFrag));
|
|
|
|
if (!GASQueryRspFrag)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
goto error1;
|
|
}
|
|
GASPeerEntry->AllocResource++;
|
|
|
|
NdisZeroMemory(GASQueryRspFrag, sizeof(*GASQueryRspFrag));
|
|
|
|
GASQueryRspFrag->GASRspFragID = i;
|
|
|
|
if (i < (GASPeerEntry->GASRspFragNum - 1))
|
|
GASQueryRspFrag->FragQueryRspLen = pHSCtrl->MMPDUSize;
|
|
else
|
|
GASQueryRspFrag->FragQueryRspLen = ANQPRspLen - (pHSCtrl->MMPDUSize * i);
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&GASQueryRspFrag->FragQueryRsp,
|
|
GASQueryRspFrag->FragQueryRspLen);
|
|
GASPeerEntry->AllocResource++;
|
|
|
|
if (!GASQueryRspFrag->FragQueryRsp)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
goto error2;
|
|
}
|
|
|
|
NdisMoveMemory(GASQueryRspFrag->FragQueryRsp, &ANQPRsp[QueryRspOffset],
|
|
GASQueryRspFrag->FragQueryRspLen);
|
|
|
|
QueryRspOffset += GASQueryRspFrag->FragQueryRspLen;
|
|
|
|
DlListAddTail(&GASPeerEntry->GASQueryRspFragList,
|
|
&GASQueryRspFrag->List);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
|
|
if (!IsFound) {
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s Can not find peer address[%02x:%02x:%02x:%02x:%02x:%02x] in GASPeerList (ComeRsp)\n", __FUNCTION__, PeerMACAddr[0],PeerMACAddr[1],PeerMACAddr[2],PeerMACAddr[3],PeerMACAddr[4],PeerMACAddr[5]));
|
|
goto error1;
|
|
}
|
|
|
|
Event->u.GAS_RSP_MORE_DATA.StatusCode = 0;
|
|
Len += 2;
|
|
Event->u.GAS_RSP_MORE_DATA.GASComebackDelay = pGASCtrl->cb_delay ? \
|
|
pGASCtrl->cb_delay : 3; //1000;
|
|
Len += 2;
|
|
Event->u.GAS_RSP_MORE_DATA.AdvertisementProID = ACCESS_NETWORK_QUERY_PROTOCOL;
|
|
Len += 1;
|
|
|
|
GASPeerEntry->CurrentState = WAIT_GAS_RSP;
|
|
|
|
SendGASRsp(pAd, (GAS_EVENT_DATA *)Buf);
|
|
}
|
|
|
|
os_free_mem(NULL, Buf);
|
|
|
|
return TRUE;
|
|
|
|
error2:
|
|
RTMP_SEM_LOCK(&pGASCtrl->GASPeerListLock);
|
|
DlListForEachSafe(GASQueryRspFrag, Tmp, &GASPeerEntry->GASQueryRspFragList,
|
|
GAS_QUERY_RSP_FRAGMENT, List)
|
|
{
|
|
DlListDel(&GASQueryRspFrag->List);
|
|
os_free_mem(NULL, GASQueryRspFrag);
|
|
}
|
|
|
|
DlListInit(&GASPeerEntry->GASQueryRspFragList);
|
|
RTMP_SEM_UNLOCK(&pGASCtrl->GASPeerListLock);
|
|
error1:
|
|
os_free_mem(NULL, Buf);
|
|
error0:
|
|
return FALSE;
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_DOT11V_WNM
|
|
INT Send_BTM_Req(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *PeerMACAddr,
|
|
IN RTMP_STRING *BTMReq,
|
|
IN UINT32 BTMReqLen)
|
|
{
|
|
UCHAR *Buf;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR APIndex = pObj->ioctl_if;
|
|
PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl;
|
|
BTM_EVENT_DATA *Event;
|
|
BTM_PEER_ENTRY *BTMPeerEntry;
|
|
UINT32 Len = 0;
|
|
INT32 Ret;
|
|
BOOLEAN IsFound = FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
|
|
|
RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret);
|
|
DlListForEach(BTMPeerEntry, &pWNMCtrl->BTMPeerList, BTM_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(BTMPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
IsFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock);
|
|
|
|
if (!IsFound)
|
|
{
|
|
os_alloc_mem(NULL, (UCHAR **)&BTMPeerEntry, sizeof(*BTMPeerEntry));
|
|
|
|
if (!BTMPeerEntry)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
goto error0;
|
|
}
|
|
|
|
NdisZeroMemory(BTMPeerEntry, sizeof(*BTMPeerEntry));
|
|
|
|
BTMPeerEntry->CurrentState = WAIT_BTM_REQ;
|
|
BTMPeerEntry->ControlIndex = APIndex;
|
|
NdisMoveMemory(BTMPeerEntry->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN);
|
|
BTMPeerEntry->DialogToken = 1;
|
|
BTMPeerEntry->Priv = pAd;
|
|
|
|
RTMPInitTimer(pAd, &BTMPeerEntry->WaitPeerBTMRspTimer,
|
|
GET_TIMER_FUNCTION(WaitPeerBTMRspTimeout), BTMPeerEntry, FALSE);
|
|
RTMP_SEM_EVENT_WAIT(&pWNMCtrl->BTMPeerListLock, Ret);
|
|
DlListAddTail(&pWNMCtrl->BTMPeerList, &BTMPeerEntry->List);
|
|
RTMP_SEM_EVENT_UP(&pWNMCtrl->BTMPeerListLock);
|
|
}
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + BTMReqLen);
|
|
|
|
if (!Buf)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
goto error1;
|
|
}
|
|
|
|
NdisZeroMemory(Buf, sizeof(*Event) + BTMReqLen);
|
|
|
|
Event = (BTM_EVENT_DATA *)Buf;
|
|
|
|
Event->ControlIndex = APIndex;
|
|
Len += 1;
|
|
|
|
NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN);
|
|
Len += MAC_ADDR_LEN;
|
|
|
|
Event->EventType = BTM_REQ;
|
|
Len += 2;
|
|
|
|
Event->u.BTM_REQ_DATA.DialogToken = BTMPeerEntry->DialogToken;
|
|
Len += 1;
|
|
|
|
Event->u.BTM_REQ_DATA.BTMReqLen = BTMReqLen;
|
|
Len += 2;
|
|
|
|
NdisMoveMemory(Event->u.BTM_REQ_DATA.BTMReq, BTMReq, BTMReqLen);
|
|
Len += BTMReqLen;
|
|
|
|
MlmeEnqueue(pAd, BTM_STATE_MACHINE, BTM_REQ, Len, Buf, 0);
|
|
|
|
os_free_mem(NULL, Buf);
|
|
|
|
return TRUE;
|
|
|
|
error1:
|
|
if (!IsFound)
|
|
os_free_mem(NULL, BTMPeerEntry);
|
|
error0:
|
|
return FALSE;
|
|
}
|
|
|
|
#ifdef CONFIG_HOTSPOT_R2
|
|
INT Send_WNM_Notify_Req(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *PeerMACAddr,
|
|
IN RTMP_STRING *WNMNotifyReq,
|
|
IN UINT32 WNMNotifyReqLen,
|
|
IN UINT32 type)
|
|
{
|
|
UCHAR *Buf;
|
|
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
|
UCHAR APIndex = pObj->ioctl_if;
|
|
PWNM_CTRL pWNMCtrl = &pAd->ApCfg.MBSSID[APIndex].WNMCtrl;
|
|
WNM_NOTIFY_EVENT_DATA *Event;
|
|
WNM_NOTIFY_PEER_ENTRY *WNMNotifyPeerEntry;
|
|
UINT32 Len = 0;
|
|
INT32 Ret;
|
|
BOOLEAN IsFound = FALSE;
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
|
|
|
RTMP_SEM_EVENT_WAIT(&pWNMCtrl->WNMNotifyPeerListLock, Ret);
|
|
DlListForEach(WNMNotifyPeerEntry, &pWNMCtrl->WNMNotifyPeerList, WNM_NOTIFY_PEER_ENTRY, List)
|
|
{
|
|
if (MAC_ADDR_EQUAL(WNMNotifyPeerEntry->PeerMACAddr, PeerMACAddr))
|
|
{
|
|
IsFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
RTMP_SEM_EVENT_UP(&pWNMCtrl->WNMNotifyPeerListLock);
|
|
|
|
DBGPRINT(RT_DEBUG_OFF, ("*%d\n", IsFound));
|
|
if (!IsFound)
|
|
{
|
|
os_alloc_mem(NULL, (UCHAR **)&WNMNotifyPeerEntry, sizeof(*WNMNotifyPeerEntry));
|
|
|
|
if (!WNMNotifyPeerEntry)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
goto error0;
|
|
}
|
|
|
|
NdisZeroMemory(WNMNotifyPeerEntry, sizeof(*WNMNotifyPeerEntry));
|
|
|
|
WNMNotifyPeerEntry->CurrentState = WNM_NOTIFY_REQ;
|
|
WNMNotifyPeerEntry->ControlIndex = APIndex;
|
|
NdisMoveMemory(WNMNotifyPeerEntry->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN);
|
|
WNMNotifyPeerEntry->DialogToken = 1;
|
|
WNMNotifyPeerEntry->Priv = pAd;
|
|
|
|
RTMPInitTimer(pAd, &WNMNotifyPeerEntry->WaitPeerWNMNotifyRspTimer,
|
|
GET_TIMER_FUNCTION(WaitPeerWNMNotifyRspTimeout), WNMNotifyPeerEntry, FALSE);
|
|
RTMP_SEM_EVENT_WAIT(&pWNMCtrl->WNMNotifyPeerListLock, Ret);
|
|
DlListAddTail(&pWNMCtrl->WNMNotifyPeerList, &WNMNotifyPeerEntry->List);
|
|
RTMP_SEM_EVENT_UP(&pWNMCtrl->WNMNotifyPeerListLock);
|
|
}
|
|
|
|
os_alloc_mem(NULL, (UCHAR **)&Buf, sizeof(*Event) + WNMNotifyReqLen);
|
|
|
|
if (!Buf)
|
|
{
|
|
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
|
goto error1;
|
|
}
|
|
|
|
//RTMPusecDelay(200000); //200ms
|
|
|
|
NdisZeroMemory(Buf, sizeof(*Event) + WNMNotifyReqLen);
|
|
|
|
Event = (WNM_NOTIFY_EVENT_DATA *)Buf;
|
|
|
|
Event->ControlIndex = APIndex;
|
|
Len += 1;
|
|
|
|
NdisMoveMemory(Event->PeerMACAddr, PeerMACAddr, MAC_ADDR_LEN);
|
|
Len += MAC_ADDR_LEN;
|
|
|
|
Event->EventType = type; //WNM_NOTIFY_REQ;
|
|
Len += 2;
|
|
|
|
Event->u.WNM_NOTIFY_REQ_DATA.DialogToken = WNMNotifyPeerEntry->DialogToken;
|
|
Len += 1;
|
|
|
|
Event->u.WNM_NOTIFY_REQ_DATA.WNMNotifyReqLen = WNMNotifyReqLen;
|
|
Len += 2;
|
|
|
|
NdisMoveMemory(Event->u.WNM_NOTIFY_REQ_DATA.WNMNotifyReq, WNMNotifyReq, WNMNotifyReqLen);
|
|
Len += WNMNotifyReqLen;
|
|
|
|
MlmeEnqueue(pAd, WNM_NOTIFY_STATE_MACHINE, WNM_NOTIFY_REQ, Len, Buf, 0);
|
|
|
|
os_free_mem(NULL, Buf);
|
|
|
|
return TRUE;
|
|
|
|
error1:
|
|
if (!IsFound)
|
|
os_free_mem(NULL, WNMNotifyPeerEntry);
|
|
error0:
|
|
return FALSE;
|
|
}
|
|
|
|
INT Send_QOSMAP_Configure(
|
|
IN PRTMP_ADAPTER pAd,
|
|
IN RTMP_STRING *PeerMACAddr,
|
|
IN RTMP_STRING *QosMapBuf,
|
|
IN UINT32 QosMapLen,
|
|
IN UINT8 Apidx)
|
|
{
|
|
UCHAR *Buf;
|
|
MLME_QOS_ACTION_STRUCT QosMapConfig;
|
|
QOSMAP_SET *pQOSMap = &QosMapConfig.QOSMap;
|
|
|
|
NdisZeroMemory(&QosMapConfig, sizeof(MLME_QOS_ACTION_STRUCT));
|
|
COPY_MAC_ADDR(QosMapConfig.Addr, PeerMACAddr);
|
|
QosMapConfig.ActionField = ACTION_QOSMAP_CONFIG;
|
|
QosMapConfig.apidx = Apidx;
|
|
pQOSMap->DSCP_Field_Len = QosMapLen;
|
|
NdisMoveMemory(pQOSMap->DSCP_Field, QosMapBuf, QosMapLen);
|
|
MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_QOS_CATE, sizeof(MLME_QOS_ACTION_STRUCT), (PVOID)&QosMapConfig, 0);
|
|
RTMP_MLME_HANDLER(pAd);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif /* CONFIG_HOTSPOT_R2 */
|
|
#endif /* CONFIG_DOT11V_WNM */
|