VOID WscOnOff( IN PRTMP_ADAPTER pAd, IN INT ApIdx, IN BOOLEAN bOff) { PWSC_V2_INFO pWpsV2Info = &pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscV2Info; if (bOff) { /* AP must not support WEP in WPS V2 */ pWpsV2Info->bWpsEnable = FALSE; pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscIEBeacon.ValueLen = 0; pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscIEProbeResp.ValueLen = 0; DBGPRINT(RT_DEBUG_TRACE, ("WscOnOff - OFF.\n")); } else { pWpsV2Info->bWpsEnable = TRUE; if (pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscConfMode != WSC_DISABLE) { INT IsAPConfigured; IsAPConfigured = pAd->ApCfg.MBSSID[ApIdx & 0x0F].WscControl.WscConfStatus; WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, (ApIdx & 0x0F), NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, ApIdx, NULL, 0, AP_MODE); DBGPRINT(RT_DEBUG_TRACE, ("WscOnOff - ON.\n")); } } DBGPRINT(RT_DEBUG_TRACE, ("WscOnOff - bWpsEnable = %d\n", pWpsV2Info->bWpsEnable)); }
VOID WscSetupLockTimeout( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { PWSC_CTRL pWscControl = (PWSC_CTRL)FunctionContext; PRTMP_ADAPTER pAd = NULL; if (pWscControl == NULL) return; pAd = (PRTMP_ADAPTER)pWscControl->pAd; if (pAd == NULL) return; pWscControl->bSetupLock = FALSE; pWscControl->WscSetupLockTimerRunning = FALSE; pWscControl->PinAttackCount = 0; WscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0xF), NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, pWscControl->WscConfStatus, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, AP_MODE); APUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F); DBGPRINT(RT_DEBUG_TRACE, ("WscSetupLockTimeout!\n")); return; }
INT Set_NfcConfigurationToken_Proc( IN RTMP_ADAPTER *pAd, IN PSTRING arg) { POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; PWSC_CTRL pWscCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].WscControl; PUCHAR pBuf = NULL; USHORT BufLen = 0; /* Action: b¡¦<7:6>: 0x00 ¡V Request, 0x01 ¡V Notify b¡¦<5:0>: 0x00 ¡V Get, 0x01 - Set */ UCHAR action = 1, type = TYPE_CONFIGURATION; os_alloc_mem(pAd, (UCHAR **)&pBuf, (NFC_WSC_TLV_SIZE*sizeof(UCHAR))); if (pBuf == NULL) { return FALSE; } NfcBuildWscProfileTLV(pAd, pWscCtrl, pBuf, &BufLen); if (pBuf && (BufLen != 0)) { NfcCommand(pAd, action, type, BufLen, pBuf); os_free_mem(NULL, pBuf); } if ((pAd->OpMode == OPMODE_AP) && (pWscCtrl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)) { pWscCtrl->WscConfStatus = WSC_SCSTATE_CONFIGURED; WscBuildBeaconIE(pAd, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0,AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0,AP_MODE); APUpdateAllBeaconFrame(pAd); } if (pWscCtrl->WscUpdatePortCfgTimerRunning) { BOOLEAN bCancel; RTMPCancelTimer(&pWscCtrl->WscUpdatePortCfgTimer, &bCancel); } else pWscCtrl->WscUpdatePortCfgTimerRunning = TRUE; RTMPSetTimer(&pWscCtrl->WscUpdatePortCfgTimer, 1000); return TRUE; }
VOID NfcParseRspCommand( IN PRTMP_ADAPTER pAd, IN PUCHAR pData, IN USHORT DataLen) { NFC_CMD_INFO *pNfcCmdInfo = NULL; BOOLEAN bSetFromNfc = FALSE; PWSC_CTRL pWscCtrl = &pAd->ApCfg.MBSSID[0].WscControl; DBGPRINT(RT_DEBUG_TRACE, ("====> %s\n", __FUNCTION__)); hex_dump("Packet", pData, DataLen); os_alloc_mem(pAd, (UCHAR **)&pNfcCmdInfo, (DataLen*sizeof(UCHAR))); if (pNfcCmdInfo) { NdisMoveMemory(pNfcCmdInfo, pData, DataLen); hex_dump("Packet", &pNfcCmdInfo->data[0], pNfcCmdInfo->data_len); bSetFromNfc = ((pNfcCmdInfo->action & 0x41) == 0x41); DBGPRINT(RT_DEBUG_TRACE, ("==> vendor_id: 0x%04x, action = 0x%0x, type = %d, data_len = %u, bSetFromNfc = %d\n", pNfcCmdInfo->vendor_id, pNfcCmdInfo->action, pNfcCmdInfo->type, pNfcCmdInfo->data_len, bSetFromNfc)); switch(pNfcCmdInfo->type) { case TYPE_CMD_RESULT: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_CMD_RESULT(=%d): Command result = %d\n", pNfcCmdInfo->type, pNfcCmdInfo->data[0])); break; case TYPE_CONFIGURATION: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_CONFIGURATION(=%d)\n", pNfcCmdInfo->type)); if (bSetFromNfc) { if (pNfcCmdInfo->data_len != 1) { /* Receive Configuration from NFC daemon. */ if (WscProcessCredential(pAd, &pNfcCmdInfo->data[0], pNfcCmdInfo->data_len, pWscCtrl) == FALSE) { DBGPRINT(RT_DEBUG_TRACE, ("ProcessCredential fail..\n")); } else { if ((pAd->OpMode == OPMODE_AP) && (pWscCtrl->WscConfStatus == WSC_SCSTATE_UNCONFIGURED)) { pWscCtrl->WscConfStatus = WSC_SCSTATE_CONFIGURED; WscBuildBeaconIE(pAd, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, WSC_SCSTATE_CONFIGURED, FALSE, 0, 0, 0, NULL, 0, AP_MODE); APUpdateAllBeaconFrame(pAd); } if (pWscCtrl->WscUpdatePortCfgTimerRunning) { BOOLEAN bCancel; RTMPCancelTimer(&pWscCtrl->WscUpdatePortCfgTimer, &bCancel); } else pWscCtrl->WscUpdatePortCfgTimerRunning = TRUE; RTMPSetTimer(&pWscCtrl->WscUpdatePortCfgTimer, 1000); } } } else { Set_NfcConfigurationToken_Proc(pAd, "1"); } break; case TYPE_PASSWORD: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_PASSWORD(=%d)\n", pNfcCmdInfo->type)); if (bSetFromNfc) { if (pNfcCmdInfo->data_len != 1) { /* Receive Passwd from NFC daemon. */ NfcProcessPasswdTV(pAd, &pNfcCmdInfo->data[0], pNfcCmdInfo->data_len, pWscCtrl, FALSE); WscGetConfWithoutTrigger(pAd, pWscCtrl, FALSE); pWscCtrl->bTriggerByNFC = TRUE; pWscCtrl->NfcModel = MODEL_PASSWORD_TOKEN; } } else { Set_NfcPasswdToken_Proc(pAd, "1"); } break; /* New type for Handover */ case TYPE_PASSWDHO_S: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_PASSWDHO_S(=%d)\n", pNfcCmdInfo->type)); if (bSetFromNfc) { if (pNfcCmdInfo->data_len != 1) { /* Receive Passwd from NFC daemon. "So far" no this case. Due to AP always as Registrar in handover procedure, AP only receive "Handover Request Message". */ NfcProcessPasswdTV(pAd, &pNfcCmdInfo->data[0], pNfcCmdInfo->data_len, pWscCtrl, TRUE); WscGetConfWithoutTrigger(pAd, pWscCtrl, FALSE); pWscCtrl->bTriggerByNFC = TRUE; pWscCtrl->NfcModel = MODEL_HANDOVER; /* 2 */ } } else { Set_NfcPasswdToken_Proc(pAd, "2"); } break; case TYPE_PASSWDHO_R: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_PASSWDHO_R(=%d)\n", pNfcCmdInfo->type)); if (bSetFromNfc) { if (pNfcCmdInfo->data_len != 1) { /* Receive Passwd from NFC daemon. */ NfcProcessPasswdTV(pAd, &pNfcCmdInfo->data[0], pNfcCmdInfo->data_len, pWscCtrl, TRUE); WscGetConfWithoutTrigger(pAd, pWscCtrl, FALSE); pWscCtrl->bTriggerByNFC = TRUE; pWscCtrl->NfcModel = MODEL_HANDOVER; /* 2 */ } } else { /* "So far" no this case. Due to AP always as Registrar in handover procedure, AP only send "Handover Select Message". */ Set_NfcPasswdToken_Proc(pAd, "3"); } break; case TYPE_NFC_STATUS: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_NFC_STATUS(=%d): NFC Status = %d\n", pNfcCmdInfo->type, pNfcCmdInfo->data[0])); pWscCtrl->NfcStatus = pNfcCmdInfo->data[0]; break; case TYPE_WIFI_RADIO_STATUS: DBGPRINT(RT_DEBUG_TRACE, ("TYPE_WIFI_RADIO_STATUS(=%d)\n", pNfcCmdInfo->type)); if (bSetFromNfc) { if (pNfcCmdInfo->data[0] == 1) MlmeRadioOn(pAd); else MlmeRadioOff(pAd); } else { UCHAR RadioStatus = 0; if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) RadioStatus = 0; else RadioStatus = 1; NfcCommand(pAd, 0x01, TYPE_WIFI_RADIO_STATUS, 1, &RadioStatus); } break; default: DBGPRINT(RT_DEBUG_TRACE, ("Unknow type(=%d)\n", pNfcCmdInfo->type)); break; } os_free_mem(NULL, pNfcCmdInfo); } DBGPRINT(RT_DEBUG_TRACE, ("<==== %s\n", __FUNCTION__)); return; }
INT Set_P2P_Cancel_Proc( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { POS_COOKIE pObj; PRT_P2P_CONFIG pP2PCtrl = &pAd->P2pCfg; PWSC_CTRL pWscControl = NULL; INT val = (INT)simple_strtol(arg, 0, 10); pObj = (POS_COOKIE) pAd->OS_Cookie; if (pObj->ioctl_if_type != INT_P2P) return FALSE; if (val == 1) { pP2PCtrl->P2PConnectState = P2P_CONNECT_IDLE; if (!MAC_ADDR_EQUAL(&ZERO_MAC_ADDR[0], &pP2PCtrl->ConnectingMAC[0])) { UCHAR p2pindex; p2pindex = P2pGroupTabSearch(pAd, pP2PCtrl->ConnectingMAC); if (p2pindex < MAX_P2P_GROUP_SIZE) { if (pAd->P2pTable.Client[p2pindex].Rule == P2P_IS_GO) pAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY_GO; else pAd->P2pTable.Client[p2pindex].P2pClientState = P2PSTATE_DISCOVERY; pAd->P2pTable.Client[p2pindex].StateCount = 0; } NdisZeroMemory(pP2PCtrl->ConnectingMAC, MAC_ADDR_LEN); } if (P2P_GO_ON(pAd)) { UINT32 i, p2pEntryCnt=0; MAC_TABLE_ENTRY *pEntry; INT IsAPConfigured; pWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl; IsAPConfigured = pWscControl->WscConfStatus; if (pWscControl->bWscTrigger) { WscStop(pAd, FALSE, pWscControl); pWscControl->WscPinCode = 0; WscBuildBeaconIE(pAd, IsAPConfigured, FALSE, 0, 0, MAIN_MBSSID, NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, IsAPConfigured, FALSE, 0, 0, (MAIN_MBSSID | MIN_NET_DEVICE_FOR_P2P_GO), NULL, 0, AP_MODE); APUpdateBeaconFrame(pAd, pObj->ioctl_if); } for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) { pEntry = &pAd->MacTab.Content[i]; if (IS_P2P_GO_ENTRY(pEntry) && (pEntry->WpaState == AS_PTKINITDONE)) p2pEntryCnt++; } DBGPRINT(RT_DEBUG_ERROR, ("%s:: Total= %d. p2pEntry = %d.\n", __FUNCTION__, pAd->MacTab.Size, p2pEntryCnt)); if ((p2pEntryCnt == 0) && (pAd->flg_p2p_OpStatusFlags == P2P_GO_UP)) { #ifdef RTMP_MAC_USB RTEnqueueInternalCmd(pAd, CMDTHREAD_SET_P2P_LINK_DOWN, NULL, 0); #endif /* RTMP_MAC_USB */ } } else if (P2P_CLI_ON(pAd)) { pWscControl = &pAd->ApCfg.MBSSID[MAIN_MBSSID].WscControl; pWscControl->WscPinCode = 0; if (pWscControl->bWscTrigger) WscStop(pAd, TRUE, pWscControl); P2pLinkDown(pAd, P2P_DISCONNECTED); } P2pStopScan(pAd); pP2PCtrl->bPeriodicListen = TRUE; /* Reset bConfirmByUI to its default value */ pP2PCtrl->bConfirmByUI = CONFIRM_BY_UI_DEFAULT; if (INFRA_ON(pAd) || P2P_GO_ON(pAd) || P2P_CLI_ON(pAd)) { INT ch; // TODO: shiang-6590, why we set bw as 40 when BBPCurrentBW == BW_40?? if (pAd->CommonCfg.BBPCurrentBW == BW_40) { rtmp_bbp_set_bw(pAd, BW_40); ch = pAd->CommonCfg.CentralChannel; } else { ch = pAd->CommonCfg.Channel; } AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); } } DBGPRINT(RT_DEBUG_TRACE, ("%s:: Cancel P2P action\n", __FUNCTION__)); return TRUE; }
VOID WscCheckPinAttackCount( IN PRTMP_ADAPTER pAd, IN PWSC_CTRL pWscControl) { BOOLEAN bCancelled; if ((pWscControl->EntryIfIdx & MIN_NET_DEVICE_FOR_APCLI) ) { /* APCLI and P2P CLI don't need to do PIN attack checking. */ return; } /* If a static PIN is used, the AP must track multiple failed attempts to authenticate an external Registrar and then enter a lock-down state (This state is signified by setting the attribute AP Setup Locked to TRUE). After at most 10 failed, consecutive attempts, with no time limitation, from any number of external Registrars, the AP shall revert to a locked down state, and the AP shall remain in the locked down state indefinitely (i.e., until the user intervenes to unlock AP's PIN for use by external Registrars) */ pWscControl->PinAttackCount++; if (pWscControl->PinAttackCount >= pWscControl->MaxPinAttack) { pWscControl->bSetupLock = TRUE; if (pWscControl->WscSetupLockTimerRunning) { RTMPCancelTimer(&pWscControl->WscSetupLockTimer, &bCancelled); pWscControl->WscSetupLockTimerRunning = FALSE; } if (pWscControl->PinAttackCount < WSC_LOCK_FOREVER_PIN_ATTACK) { pWscControl->WscSetupLockTimerRunning = TRUE; RTMPSetTimer(&pWscControl->WscSetupLockTimer, pWscControl->SetupLockTime*60*1000); } WscBuildBeaconIE(pAd, pWscControl->WscConfStatus, FALSE, 0, 0, (pWscControl->EntryIfIdx & 0xF), NULL, 0, AP_MODE); WscBuildProbeRespIE(pAd, WSC_MSGTYPE_AP_WLAN_MGR, pWscControl->WscConfStatus, FALSE, 0, 0, pWscControl->EntryIfIdx, NULL, 0, AP_MODE); APUpdateBeaconFrame(pAd, pWscControl->EntryIfIdx & 0x0F); } }