Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_ioctl_set.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _RTW_IOCTL_SET_C_1516#include <drv_types.h>17#include <hal_data.h>181920extern void indicate_wx_scan_complete_event(_adapter *padapter);2122#define IS_MAC_ADDRESS_BROADCAST(addr) \23(\24((addr[0] == 0xff) && (addr[1] == 0xff) && \25(addr[2] == 0xff) && (addr[3] == 0xff) && \26(addr[4] == 0xff) && (addr[5] == 0xff)) ? _TRUE : _FALSE \27)2829u8 rtw_validate_bssid(u8 *bssid)30{31u8 ret = _TRUE;3233if (is_zero_mac_addr(bssid)34|| is_broadcast_mac_addr(bssid)35|| is_multicast_mac_addr(bssid)36)37ret = _FALSE;3839return ret;40}4142u8 rtw_validate_ssid(NDIS_802_11_SSID *ssid)43{44#ifdef CONFIG_VALIDATE_SSID45u8 i;46#endif47u8 ret = _TRUE;484950if (ssid->SsidLength > 32) {51ret = _FALSE;52goto exit;53}5455#ifdef CONFIG_VALIDATE_SSID56for (i = 0; i < ssid->SsidLength; i++) {57/* wifi, printable ascii code must be supported */58if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e))) {59ret = _FALSE;60break;61}62}63#endif /* CONFIG_VALIDATE_SSID */6465exit:666768return ret;69}7071u8 rtw_do_join(_adapter *padapter);72u8 rtw_do_join(_adapter *padapter)73{74_irqL irqL;75_list *plist, *phead;76u8 *pibss = NULL;77struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);78struct sitesurvey_parm parm;79_queue *queue = &(pmlmepriv->scanned_queue);80u8 ret = _SUCCESS;818283_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);84phead = get_list_head(queue);85plist = get_next(phead);868788pmlmepriv->cur_network.join_res = -2;8990set_fwstate(pmlmepriv, _FW_UNDER_LINKING);9192pmlmepriv->pscanned = plist;9394pmlmepriv->to_join = _TRUE;9596rtw_init_sitesurvey_parm(padapter, &parm);97_rtw_memcpy(&parm.ssid[0], &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));98parm.ssid_num = 1;99100if (_rtw_queue_empty(queue) == _TRUE) {101_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);102_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);103104/* when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty */105/* we try to issue sitesurvey firstly */106107if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _FALSE108|| rtw_to_roam(padapter) > 0109) {110u8 ssc_chk = rtw_sitesurvey_condition_check(padapter, _FALSE);111112if ((ssc_chk == SS_ALLOW) || (ssc_chk == SS_DENY_BUSY_TRAFFIC) ){113/* submit site_survey_cmd */114ret = rtw_sitesurvey_cmd(padapter, &parm);115if (_SUCCESS != ret)116pmlmepriv->to_join = _FALSE;117} else {118/*if (ssc_chk == SS_DENY_BUDDY_UNDER_SURVEY)*/119pmlmepriv->to_join = _FALSE;120ret = _FAIL;121}122} else {123pmlmepriv->to_join = _FALSE;124ret = _FAIL;125}126127goto exit;128} else {129int select_ret;130_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);131select_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv);132if (select_ret == _SUCCESS) {133pmlmepriv->to_join = _FALSE;134_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);135} else {136if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) {137/* submit createbss_cmd to change to a ADHOC_MASTER */138139/* pmlmepriv->lock has been acquired by caller... */140WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network);141142/*pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;*/143init_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);144145pibss = padapter->registrypriv.dev_network.MacAddress;146147_rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));148_rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));149150rtw_update_registrypriv_dev_network(padapter);151152rtw_generate_random_ibss(pibss);153154if (rtw_create_ibss_cmd(padapter, 0) != _SUCCESS) {155ret = _FALSE;156goto exit;157}158159pmlmepriv->to_join = _FALSE;160161162} else {163/* can't associate ; reset under-linking */164_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);165166/* when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue */167/* we try to issue sitesurvey firstly */168if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _FALSE169|| rtw_to_roam(padapter) > 0170) {171u8 ssc_chk = rtw_sitesurvey_condition_check(padapter, _FALSE);172173if ((ssc_chk == SS_ALLOW) || (ssc_chk == SS_DENY_BUSY_TRAFFIC)){174/* RTW_INFO(("rtw_do_join() when no desired bss in scanning queue\n"); */175ret = rtw_sitesurvey_cmd(padapter, &parm);176if (_SUCCESS != ret)177pmlmepriv->to_join = _FALSE;178} else {179/*if (ssc_chk == SS_DENY_BUDDY_UNDER_SURVEY) {180} else {*/181ret = _FAIL;182pmlmepriv->to_join = _FALSE;183}184} else {185ret = _FAIL;186pmlmepriv->to_join = _FALSE;187}188}189190}191192}193194exit:195196return ret;197}198199u8 rtw_set_802_11_bssid(_adapter *padapter, u8 *bssid)200{201_irqL irqL;202u8 status = _SUCCESS;203204struct mlme_priv *pmlmepriv = &padapter->mlmepriv;205206207RTW_PRINT("set bssid:%pM\n", bssid);208209if ((bssid[0] == 0x00 && bssid[1] == 0x00 && bssid[2] == 0x00 && bssid[3] == 0x00 && bssid[4] == 0x00 && bssid[5] == 0x00) ||210(bssid[0] == 0xFF && bssid[1] == 0xFF && bssid[2] == 0xFF && bssid[3] == 0xFF && bssid[4] == 0xFF && bssid[5] == 0xFF)) {211status = _FAIL;212goto exit;213}214215_enter_critical_bh(&pmlmepriv->lock, &irqL);216217218RTW_INFO("Set BSSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv));219if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)220goto handle_tkip_countermeasure;221else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)222goto release_mlme_lock;223224if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) {225226if (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE) {227if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)228goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */229} else {230231rtw_disassoc_cmd(padapter, 0, 0);232233if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)234rtw_indicate_disconnect(padapter, 0, _FALSE);235236rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);237238if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {239_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);240set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);241}242}243}244245handle_tkip_countermeasure:246if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {247status = _FAIL;248goto release_mlme_lock;249}250251_rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));252_rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);253pmlmepriv->assoc_by_bssid = _TRUE;254255if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)256pmlmepriv->to_join = _TRUE;257else258status = rtw_do_join(padapter);259260release_mlme_lock:261_exit_critical_bh(&pmlmepriv->lock, &irqL);262263exit:264265266return status;267}268269u8 rtw_set_802_11_ssid(_adapter *padapter, NDIS_802_11_SSID *ssid)270{271_irqL irqL;272u8 status = _SUCCESS;273274struct mlme_priv *pmlmepriv = &padapter->mlmepriv;275struct wlan_network *pnetwork = &pmlmepriv->cur_network;276277278RTW_PRINT("set ssid [%s] fw_state=0x%08x\n",279ssid->Ssid, get_fwstate(pmlmepriv));280281if (!rtw_is_hw_init_completed(padapter)) {282status = _FAIL;283goto exit;284}285286_enter_critical_bh(&pmlmepriv->lock, &irqL);287288RTW_INFO("Set SSID under fw_state=0x%08x\n", get_fwstate(pmlmepriv));289if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)290goto handle_tkip_countermeasure;291else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)292goto release_mlme_lock;293294if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) {295296if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&297(_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE)) {298if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)) {299300if (rtw_is_same_ibss(padapter, pnetwork) == _FALSE) {301/* if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again */302rtw_disassoc_cmd(padapter, 0, 0);303304if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)305rtw_indicate_disconnect(padapter, 0, _FALSE);306307rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);308309if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {310_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);311set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);312}313} else {314goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */315}316}317#ifdef CONFIG_LPS318else319rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 0);320#endif321} else {322323rtw_disassoc_cmd(padapter, 0, 0);324325if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)326rtw_indicate_disconnect(padapter, 0, _FALSE);327328rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);329330if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {331_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);332set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);333}334}335}336337handle_tkip_countermeasure:338if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {339status = _FAIL;340goto release_mlme_lock;341}342343if (rtw_validate_ssid(ssid) == _FALSE) {344status = _FAIL;345goto release_mlme_lock;346}347348_rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));349pmlmepriv->assoc_by_bssid = _FALSE;350351if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)352pmlmepriv->to_join = _TRUE;353else354status = rtw_do_join(padapter);355356release_mlme_lock:357_exit_critical_bh(&pmlmepriv->lock, &irqL);358359exit:360361362return status;363364}365366u8 rtw_set_802_11_connect(_adapter *padapter, u8 *bssid, NDIS_802_11_SSID *ssid)367{368_irqL irqL;369u8 status = _SUCCESS;370bool bssid_valid = _TRUE;371bool ssid_valid = _TRUE;372struct mlme_priv *pmlmepriv = &padapter->mlmepriv;373374375if (!ssid || rtw_validate_ssid(ssid) == _FALSE)376ssid_valid = _FALSE;377378if (!bssid || rtw_validate_bssid(bssid) == _FALSE)379bssid_valid = _FALSE;380381if (ssid_valid == _FALSE && bssid_valid == _FALSE) {382RTW_INFO(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n",383FUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid);384status = _FAIL;385goto exit;386}387388if (!rtw_is_hw_init_completed(padapter)) {389status = _FAIL;390goto exit;391}392393_enter_critical_bh(&pmlmepriv->lock, &irqL);394395RTW_PRINT(FUNC_ADPT_FMT" fw_state=0x%08x\n",396FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));397398if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)399goto handle_tkip_countermeasure;400else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)401goto release_mlme_lock;402403handle_tkip_countermeasure:404if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {405status = _FAIL;406goto release_mlme_lock;407}408409if (ssid && ssid_valid)410_rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));411else412_rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));413414if (bssid && bssid_valid) {415_rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);416pmlmepriv->assoc_by_bssid = _TRUE;417} else418pmlmepriv->assoc_by_bssid = _FALSE;419420if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)421pmlmepriv->to_join = _TRUE;422else423status = rtw_do_join(padapter);424425release_mlme_lock:426_exit_critical_bh(&pmlmepriv->lock, &irqL);427428exit:429return status;430}431432u8 rtw_set_802_11_infrastructure_mode(_adapter *padapter,433NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, u8 flags)434{435_irqL irqL;436struct mlme_priv *pmlmepriv = &padapter->mlmepriv;437struct wlan_network *cur_network = &pmlmepriv->cur_network;438NDIS_802_11_NETWORK_INFRASTRUCTURE *pold_state = &(cur_network->network.InfrastructureMode);439u8 ap2sta_mode = _FALSE;440u8 ret = _TRUE;441u8 is_linked = _FALSE, is_adhoc_master = _FALSE;442443if (*pold_state != networktype) {444/* RTW_INFO("change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); */445446if (*pold_state == Ndis802_11APMode447|| *pold_state == Ndis802_11_mesh448) {449/* change to other mode from Ndis802_11APMode/Ndis802_11_mesh */450cur_network->join_res = -1;451ap2sta_mode = _TRUE;452#ifdef CONFIG_NATIVEAP_MLME453stop_ap_mode(padapter);454#endif455}456457_enter_critical_bh(&pmlmepriv->lock, &irqL);458is_linked = check_fwstate(pmlmepriv, _FW_LINKED);459is_adhoc_master = check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);460461/* flags = 0, means enqueue cmd and no wait */462if (flags != 0)463_exit_critical_bh(&pmlmepriv->lock, &irqL);464465if ((is_linked == _TRUE) || (*pold_state == Ndis802_11IBSS))466rtw_disassoc_cmd(padapter, 0, flags);467468if ((is_linked == _TRUE) ||469(is_adhoc_master == _TRUE))470rtw_free_assoc_resources_cmd(padapter, _TRUE, flags);471472if ((*pold_state == Ndis802_11Infrastructure) || (*pold_state == Ndis802_11IBSS)) {473if (is_linked == _TRUE) {474rtw_indicate_disconnect(padapter, 0, _FALSE); /*will clr Linked_state; before this function, we must have checked whether issue dis-assoc_cmd or not*/475}476}477478/* flags = 0, means enqueue cmd and no wait */479if (flags != 0)480_enter_critical_bh(&pmlmepriv->lock, &irqL);481482*pold_state = networktype;483484_clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);485486switch (networktype) {487case Ndis802_11IBSS:488set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);489break;490491case Ndis802_11Infrastructure:492set_fwstate(pmlmepriv, WIFI_STATION_STATE);493494if (ap2sta_mode)495rtw_init_bcmc_stainfo(padapter);496break;497498case Ndis802_11APMode:499set_fwstate(pmlmepriv, WIFI_AP_STATE);500#ifdef CONFIG_NATIVEAP_MLME501start_ap_mode(padapter);502/* rtw_indicate_connect(padapter); */503#endif504505break;506507#ifdef CONFIG_RTW_MESH508case Ndis802_11_mesh:509set_fwstate(pmlmepriv, WIFI_MESH_STATE);510start_ap_mode(padapter);511break;512#endif513514case Ndis802_11AutoUnknown:515case Ndis802_11InfrastructureMax:516break;517case Ndis802_11Monitor:518set_fwstate(pmlmepriv, WIFI_MONITOR_STATE);519break;520default:521ret = _FALSE;522rtw_warn_on(1);523}524525/* SecClearAllKeys(adapter); */526527528_exit_critical_bh(&pmlmepriv->lock, &irqL);529}530531return ret;532}533534535u8 rtw_set_802_11_disassociate(_adapter *padapter)536{537_irqL irqL;538struct mlme_priv *pmlmepriv = &padapter->mlmepriv;539540541_enter_critical_bh(&pmlmepriv->lock, &irqL);542543if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {544545rtw_disassoc_cmd(padapter, 0, 0);546rtw_indicate_disconnect(padapter, 0, _FALSE);547/* modify for CONFIG_IEEE80211W, none 11w can use it */548rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);549if (_FAIL == rtw_pwr_wakeup(padapter))550RTW_INFO("%s(): rtw_pwr_wakeup fail !!!\n", __FUNCTION__);551}552553_exit_critical_bh(&pmlmepriv->lock, &irqL);554555556return _TRUE;557}558559#if 1560u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, struct sitesurvey_parm *pparm)561{562_irqL irqL;563struct mlme_priv *pmlmepriv = &padapter->mlmepriv;564u8 res = _TRUE;565566_enter_critical_bh(&pmlmepriv->lock, &irqL);567res = rtw_sitesurvey_cmd(padapter, pparm);568_exit_critical_bh(&pmlmepriv->lock, &irqL);569570return res;571}572573#else574u8 rtw_set_802_11_bssid_list_scan(_adapter *padapter, struct sitesurvey_parm *pparm)575{576_irqL irqL;577struct mlme_priv *pmlmepriv = &padapter->mlmepriv;578u8 res = _TRUE;579580581582if (padapter == NULL) {583res = _FALSE;584goto exit;585}586if (!rtw_is_hw_init_completed(padapter)) {587res = _FALSE;588goto exit;589}590591if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) ||592(pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)) {593/* Scan or linking is in progress, do nothing. */594res = _TRUE;595596597} else {598if (rtw_is_scan_deny(padapter)) {599RTW_INFO(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter));600indicate_wx_scan_complete_event(padapter);601return _SUCCESS;602}603604_enter_critical_bh(&pmlmepriv->lock, &irqL);605606res = rtw_sitesurvey_cmd(padapter, pparm);607608_exit_critical_bh(&pmlmepriv->lock, &irqL);609}610exit:611612613return res;614}615#endif616u8 rtw_set_802_11_authentication_mode(_adapter *padapter, NDIS_802_11_AUTHENTICATION_MODE authmode)617{618struct security_priv *psecuritypriv = &padapter->securitypriv;619int res;620u8 ret;621622623624psecuritypriv->ndisauthtype = authmode;625626627if (psecuritypriv->ndisauthtype > 3)628psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;629630#ifdef CONFIG_WAPI_SUPPORT631if (psecuritypriv->ndisauthtype == 6)632psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI;633#endif634635res = rtw_set_auth(padapter, psecuritypriv);636637if (res == _SUCCESS)638ret = _TRUE;639else640ret = _FALSE;641642643return ret;644}645646u8 rtw_set_802_11_add_wep(_adapter *padapter, NDIS_802_11_WEP *wep)647{648649u8 bdefaultkey;650u8 btransmitkey;651sint keyid, res;652struct security_priv *psecuritypriv = &(padapter->securitypriv);653u8 ret = _SUCCESS;654655656bdefaultkey = (wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE; /* for ??? */657btransmitkey = (wep->KeyIndex & 0x80000000) > 0 ? _TRUE : _FALSE; /* for ??? */658keyid = wep->KeyIndex & 0x3fffffff;659660if (keyid >= 4) {661ret = _FALSE;662goto exit;663}664665switch (wep->KeyLength) {666case 5:667psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;668break;669case 13:670psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;671break;672default:673psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;674break;675}676677678_rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]), &(wep->KeyMaterial), wep->KeyLength);679680psecuritypriv->dot11DefKeylen[keyid] = wep->KeyLength;681682psecuritypriv->dot11PrivacyKeyIndex = keyid;683684685res = rtw_set_key(padapter, psecuritypriv, keyid, 1, _TRUE);686687if (res == _FAIL)688ret = _FALSE;689exit:690691692return ret;693694}695696/*697* rtw_get_cur_max_rate -698* @adapter: pointer to _adapter structure699*700* Return 0 or 100Kbps701*/702u16 rtw_get_cur_max_rate(_adapter *adapter)703{704int j;705int i = 0;706u16 rate = 0, max_rate = 0;707struct mlme_priv *pmlmepriv = &adapter->mlmepriv;708WLAN_BSSID_EX *pcur_bss = &pmlmepriv->cur_network.network;709int sta_bssrate_len = 0;710unsigned char sta_bssrate[NumRates];711struct sta_info *psta = NULL;712u8 short_GI = 0;713714#ifdef CONFIG_MP_INCLUDED715if (adapter->registrypriv.mp_mode == 1) {716if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)717return 0;718}719#endif720721if ((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE)722&& (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE))723return 0;724725psta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));726if (psta == NULL)727return 0;728729short_GI = query_ra_short_GI(psta, rtw_get_tx_bw_mode(adapter, psta));730731#ifdef CONFIG_80211N_HT732if (is_supported_ht(psta->wireless_mode)) {733max_rate = rtw_ht_mcs_rate((psta->cmn.bw_mode == CHANNEL_WIDTH_40) ? 1 : 0734, short_GI735, psta->htpriv.ht_cap.supp_mcs_set736);737}738#ifdef CONFIG_80211AC_VHT739else if (is_supported_vht(psta->wireless_mode))740max_rate = ((rtw_vht_mcs_to_data_rate(psta->cmn.bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10;741#endif /* CONFIG_80211AC_VHT */742else743#endif /* CONFIG_80211N_HT */744{745/*station mode show :station && ap support rate; softap :show ap support rate*/746if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)747get_rate_set(adapter, sta_bssrate, &sta_bssrate_len);/*get sta rate and length*/748749750while ((pcur_bss->SupportedRates[i] != 0) && (pcur_bss->SupportedRates[i] != 0xFF)) {751rate = pcur_bss->SupportedRates[i] & 0x7F;/*AP support rates*/752/*RTW_INFO("%s rate=%02X \n", __func__, rate);*/753754/*check STA support rate or not */755if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) {756for (j = 0; j < sta_bssrate_len; j++) {757/* Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP */758if ((rate | IEEE80211_BASIC_RATE_MASK)759== (sta_bssrate[j] | IEEE80211_BASIC_RATE_MASK)) {760if (rate > max_rate) {761max_rate = rate;762}763break;764}765}766} else {767768if (rate > max_rate)769max_rate = rate;770771}772i++;773}774775max_rate = max_rate * 10 / 2;776}777return max_rate;778}779780/*781* rtw_set_scan_mode -782* @adapter: pointer to _adapter structure783* @scan_mode:784*785* Return _SUCCESS or _FAIL786*/787int rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode)788{789if (scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE)790return _FAIL;791792adapter->mlmepriv.scan_mode = scan_mode;793794return _SUCCESS;795}796797/*798* rtw_set_channel_plan -799* @adapter: pointer to _adapter structure800* @channel_plan:801*802* Return _SUCCESS or _FAIL803*/804int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan)805{806/* handle by cmd_thread to sync with scan operation */807return rtw_set_chplan_cmd(adapter, RTW_CMDF_WAIT_ACK, channel_plan, 1);808}809810/*811* rtw_set_country -812* @adapter: pointer to _adapter structure813* @country_code: string of country code814*815* Return _SUCCESS or _FAIL816*/817int rtw_set_country(_adapter *adapter, const char *country_code)818{819#ifdef CONFIG_RTW_IOCTL_SET_COUNTRY820return rtw_set_country_cmd(adapter, RTW_CMDF_WAIT_ACK, country_code, 1);821#else822RTW_INFO("%s(): not applied\n", __func__);823return _SUCCESS;824#endif825}826827/*828* rtw_set_band -829* @adapter: pointer to _adapter structure830* @band: band to set831*832* Return _SUCCESS or _FAIL833*/834int rtw_set_band(_adapter *adapter, u8 band)835{836if (rtw_band_valid(band)) {837RTW_INFO(FUNC_ADPT_FMT" band:%d\n", FUNC_ADPT_ARG(adapter), band);838adapter->setband = band;839return _SUCCESS;840}841842RTW_PRINT(FUNC_ADPT_FMT" band:%d fail\n", FUNC_ADPT_ARG(adapter), band);843return _FAIL;844}845846847