INT RT_CfgSetFixedTxPhyMode(PSTRING arg) { INT fix_tx_mode = FIXED_TXMODE_HT; ULONG value; if (rtstrcasecmp(arg, "OFDM") == TRUE) fix_tx_mode = FIXED_TXMODE_OFDM; else if (rtstrcasecmp(arg, "CCK") == TRUE) fix_tx_mode = FIXED_TXMODE_CCK; else if (rtstrcasecmp(arg, "HT") == TRUE) fix_tx_mode = FIXED_TXMODE_HT; else if (rtstrcasecmp(arg, "VHT") == TRUE) fix_tx_mode = FIXED_TXMODE_VHT; else { value = simple_strtol(arg, 0, 10); switch (value) { case FIXED_TXMODE_CCK: case FIXED_TXMODE_OFDM: case FIXED_TXMODE_HT: case FIXED_TXMODE_VHT: fix_tx_mode = value; default: fix_tx_mode = FIXED_TXMODE_HT; } } return fix_tx_mode; }
VOID rtmp_read_wds_from_file(RTMP_ADAPTER *pAd, RTMP_STRING *tmpbuf, RTMP_STRING *buffer) { RTMP_STRING *macptr; INT i=0, j; RTMP_STRING tok_str[16]; BOOLEAN bUsePrevFormat = FALSE; UCHAR macAddress[MAC_ADDR_LEN]; UCHAR keyMaterial[40]; UCHAR KeyLen, CipherAlg = CIPHER_NONE, KeyIdx; PRT_802_11_WDS_ENTRY pWdsEntry; struct wifi_dev *wdev; /*WdsPhyMode */ if (RTMPGetKeyParameter("WdsPhyMode", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE)) { for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { pWdsEntry = &pAd->WdsTab.WdsEntry[i]; wdev = &pWdsEntry->wdev; if (rtstrcasecmp(macptr, "CCK") == TRUE) wdev->PhyMode = MODE_CCK; else if (rtstrcasecmp(macptr, "OFDM") == TRUE) wdev->PhyMode = MODE_OFDM; #ifdef DOT11_N_SUPPORT else if (rtstrcasecmp(macptr, "HTMIX") == TRUE) wdev->PhyMode = MODE_HTMIX; else if (rtstrcasecmp(macptr, "GREENFIELD") == TRUE) wdev->PhyMode = MODE_HTGREENFIELD; #endif /* DOT11_N_SUPPORT */ else wdev->PhyMode = 0xff; DBGPRINT(RT_DEBUG_TRACE, ("If/wds%d - PeerPhyMode=%d\n", i, wdev->PhyMode)); } } /*WdsList */ if (RTMPGetKeyParameter("WdsList", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE)) { if (pAd->WdsTab.Mode != WDS_LAZY_MODE) { for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { if(strlen(macptr) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */ continue; if(strcmp(macptr,"00:00:00:00:00:00") == 0) continue; if(i >= MAX_WDS_ENTRY) break; for (j=0; j<MAC_ADDR_LEN; j++) { AtoH(macptr, &macAddress[j], 1); macptr=macptr+3; } WdsEntryAlloc(pAd, macAddress); } } } /*WdsEncrypType */ if (RTMPGetKeyParameter("WdsEncrypType", tmpbuf, 128, buffer, TRUE)) { for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { pWdsEntry = &pAd->WdsTab.WdsEntry[i]; wdev = &pWdsEntry->wdev; if (rtstrcasecmp(macptr, "NONE") == TRUE) wdev->WepStatus = Ndis802_11WEPDisabled; else if (rtstrcasecmp(macptr, "WEP") == TRUE) wdev->WepStatus = Ndis802_11WEPEnabled; else if (rtstrcasecmp(macptr, "TKIP") ==TRUE) wdev->WepStatus = Ndis802_11TKIPEnable; else if (rtstrcasecmp(macptr, "AES") == TRUE) wdev->WepStatus = Ndis802_11AESEnable; else wdev->WepStatus = Ndis802_11WEPDisabled; DBGPRINT(RT_DEBUG_TRACE, ("WdsEncrypType[%d]=%d(%s)\n", i, wdev->WepStatus, GetEncryptType(wdev->WepStatus))); } /* Previous WDS only supports single encryption type. */ /* For backward compatible, other wds link encryption type shall be the same with the first. */ if (i == 1) { for (j = 1; j < MAX_WDS_ENTRY; j++) { wdev = &pAd->WdsTab.WdsEntry[j].wdev; wdev->WepStatus = pAd->WdsTab.WdsEntry[0].wdev.WepStatus; DBGPRINT(RT_DEBUG_TRACE, ("WdsEncrypType[%d]=%d(%s)\n", j, wdev->WepStatus, GetEncryptType(wdev->WepStatus))); } } } /* WdsKey */ /* This is a previous parameter and it only stores WPA key material, not WEP key */ if (RTMPGetKeyParameter("WdsKey", tmpbuf, 255, buffer, FALSE)) { for (i = 0; i < MAX_WDS_ENTRY; i++) NdisZeroMemory(&pAd->WdsTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY)); if (strlen(tmpbuf) > 0) bUsePrevFormat = TRUE; wdev = &pAd->WdsTab.WdsEntry[0].wdev; pWdsEntry = &pAd->WdsTab.WdsEntry[0]; /* check if the wds-0 link key material is valid */ if (((wdev->WepStatus == Ndis802_11TKIPEnable) || (wdev->WepStatus == Ndis802_11AESEnable)) && (strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64)) { RT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR)RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial); if (wdev->WepStatus == Ndis802_11AESEnable) pWdsEntry->WdsKey.CipherAlg = CIPHER_AES; else pWdsEntry->WdsKey.CipherAlg = CIPHER_TKIP; NdisMoveMemory(&pWdsEntry->WdsKey.Key, keyMaterial, 16); pWdsEntry->WdsKey.KeyLen = 16; NdisMoveMemory(&pWdsEntry->WdsKey.RxMic, keyMaterial+16, 8); NdisMoveMemory(&pWdsEntry->WdsKey.TxMic, keyMaterial+16, 8); } /* Previous WDS only supports single key-material. */ /* For backward compatible, other wds link key-material shall be the same with the first. */ if (pAd->WdsTab.WdsEntry[0].WdsKey.KeyLen == 16) { for (j = 1; j < MAX_WDS_ENTRY; j++) { NdisMoveMemory(&pAd->WdsTab.WdsEntry[j].WdsKey, &pAd->WdsTab.WdsEntry[0].WdsKey, sizeof(CIPHER_KEY)); } } } /* The parameters can provide different key information for each WDS-Link */ /* no matter WEP or WPA */ if (!bUsePrevFormat) { for (i = 0; i < MAX_WDS_ENTRY; i++) { AP_WDS_KeyNameMakeUp(tok_str, sizeof(tok_str), i); pWdsEntry = &pAd->WdsTab.WdsEntry[i]; wdev = &pWdsEntry->wdev; /* WdsXKey (X=0~MAX_WDS_ENTRY-1) */ if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE)) { if (wdev->WepStatus == Ndis802_11WEPEnabled) { /* Ascii type */ if (strlen(tmpbuf) == 5 || strlen(tmpbuf) == 13) { KeyLen = strlen(tmpbuf); pWdsEntry->WdsKey.KeyLen = KeyLen; NdisMoveMemory(pWdsEntry->WdsKey.Key, tmpbuf, KeyLen); if (KeyLen == 5) CipherAlg = CIPHER_WEP64; else CipherAlg = CIPHER_WEP128; pWdsEntry->WdsKey.CipherAlg = CipherAlg; DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s ,type=Ascii, CipherAlg(%s)\n", i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? "wep64" : "wep128"))); } /* Hex type */ else if (strlen(tmpbuf) == 10 || strlen(tmpbuf) == 26) { KeyLen = strlen(tmpbuf); pWdsEntry->WdsKey.KeyLen = KeyLen / 2; AtoH(tmpbuf, pWdsEntry->WdsKey.Key, KeyLen / 2); if (KeyLen == 10) CipherAlg = CIPHER_WEP64; else CipherAlg = CIPHER_WEP128; pWdsEntry->WdsKey.CipherAlg = CipherAlg; DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s ,type=Hex, CipherAlg(%s)\n", i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? "wep64" : "wep128"))); } /* Invalid type */ else { wdev->WepStatus = Ndis802_11EncryptionDisabled; NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY)); DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d has invalid key for WEP, reset encryption to OPEN\n", i)); } } else if ((wdev->WepStatus == Ndis802_11TKIPEnable) || (wdev->WepStatus == Ndis802_11AESEnable)) { if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64)) { RT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR) RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial); if (wdev->WepStatus == Ndis802_11AESEnable) pWdsEntry->WdsKey.CipherAlg = CIPHER_AES; else pWdsEntry->WdsKey.CipherAlg = CIPHER_TKIP; NdisMoveMemory(&pWdsEntry->WdsKey.Key, keyMaterial, 16); pWdsEntry->WdsKey.KeyLen = 16; NdisMoveMemory(&pWdsEntry->WdsKey.RxMic, keyMaterial+16, 8); NdisMoveMemory(&pWdsEntry->WdsKey.TxMic, keyMaterial+16, 8); DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s, CipherAlg(%s)\n", i, tmpbuf, (CipherAlg == CIPHER_AES ? "AES" : "TKIP"))); } else { DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d has invalid key for WPA, reset encryption to OPEN\n", i)); wdev->WepStatus = Ndis802_11EncryptionDisabled; NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY)); } } else { wdev->WepStatus = Ndis802_11EncryptionDisabled; NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY)); } } } } /* WdsDefaultKeyID */ if(RTMPGetKeyParameter("WdsDefaultKeyID", tmpbuf, 10, buffer, TRUE)) { for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { pWdsEntry = &pAd->WdsTab.WdsEntry[i]; wdev = &pWdsEntry->wdev; KeyIdx = (UCHAR) simple_strtol(macptr, 0, 10); if((KeyIdx >= 1 ) && (KeyIdx <= 4)) pWdsEntry->KeyIdx = (UCHAR) (KeyIdx - 1); else pWdsEntry->KeyIdx = 0; if ((wdev->WepStatus == Ndis802_11TKIPEnable) || (wdev->WepStatus == Ndis802_11AESEnable)) pWdsEntry->KeyIdx = 0; DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d - WdsDefaultKeyID(0~3)=%d\n", i, pWdsEntry->KeyIdx)); } } /* WdsTxMode */ if (RTMPGetKeyParameter("WdsTxMode", tmpbuf, 25, buffer, TRUE)) { for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { wdev = &pAd->WdsTab.WdsEntry[i].wdev; wdev->DesiredTransmitSetting.field.FixedTxMode = RT_CfgSetFixedTxPhyMode(macptr); DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx Mode = %d\n", i, wdev->DesiredTransmitSetting.field.FixedTxMode)); } } /* WdsTxMcs */ if (RTMPGetKeyParameter("WdsTxMcs", tmpbuf, 50, buffer, TRUE)) { for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { wdev = &pAd->WdsTab.WdsEntry[i].wdev; wdev->DesiredTransmitSetting.field.MCS = RT_CfgSetTxMCSProc(macptr, &wdev->bAutoTxRateSwitch); if (wdev->DesiredTransmitSetting.field.MCS == MCS_AUTO) { DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx MCS = AUTO\n", i)); } else { DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx MCS = %d\n", i, wdev->DesiredTransmitSetting.field.MCS)); } } } /*WdsEnable */ if(RTMPGetKeyParameter("WdsEnable", tmpbuf, 10, buffer, TRUE)) { RT_802_11_WDS_ENTRY *pWdsEntry; switch(simple_strtol(tmpbuf, 0, 10)) { case WDS_BRIDGE_MODE: /* Bridge mode, DisAllow association(stop Beacon generation and Probe Req. */ pAd->WdsTab.Mode = WDS_BRIDGE_MODE; break; case WDS_RESTRICT_MODE: case WDS_REPEATER_MODE: /* Repeater mode */ pAd->WdsTab.Mode = WDS_REPEATER_MODE; break; case WDS_LAZY_MODE: /* Lazy mode, Auto learn wds entry by same SSID, channel, security policy */ for(i = 0; i < MAX_WDS_ENTRY; i++) { pWdsEntry = &pAd->WdsTab.WdsEntry[i]; if (pWdsEntry->Valid) WdsEntryDel(pAd, pWdsEntry->PeerWdsAddr); /* When Lazy mode is enabled, the all wds-link shall share the same encryption type and key material */ if (i > 0) { pWdsEntry->wdev.WepStatus = pAd->WdsTab.WdsEntry[0].wdev.WepStatus; pWdsEntry->KeyIdx = pAd->WdsTab.WdsEntry[0].KeyIdx; NdisMoveMemory(&pWdsEntry->WdsKey, &pAd->WdsTab.WdsEntry[0].WdsKey, sizeof(CIPHER_KEY)); } } pAd->WdsTab.Mode = WDS_LAZY_MODE; break; case WDS_DISABLE_MODE: /* Disable mode */ default: APWdsInitialize(pAd); pAd->WdsTab.Mode = WDS_DISABLE_MODE; break; } DBGPRINT(RT_DEBUG_TRACE, ("WDS-Enable mode=%d\n", pAd->WdsTab.Mode)); } #ifdef WDS_VLAN_SUPPORT /* WdsVlan */ if (RTMPGetKeyParameter("WDS_VLANID", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE)) { for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) { pAd->WdsTab.WdsEntry[i].wdev.VLAN_VID = simple_strtol(macptr, 0, 10); pAd->WdsTab.WdsEntry[i].wdev.VLAN_Priority = 0; DBGPRINT(RT_DEBUG_TRACE, ("If/wds%d - WdsVlanId=%d\n", i, pAd->WdsTab.WdsEntry[i].wdev.VLAN_VID)); } } #endif /* WDS_VLAN_SUPPORT */ }
void CFG80211DRV_Set_NOA( VOID *pAdOrg, VOID *pData) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; //iversonmcc UINT32 Lowpart, Highpart ,NextTbtt, temp; if (pAd->Mlme.bStartMcc == TRUE) { //scan , send null fram to infra , and switch to GO Stop_MCC(pAd,1); } /* pNdev->name = wlan0 [ 2434.071449] 80211> CFG80211_OpsScan ==> wlan0(2) 10ms start scan one channel 85 ms ~ 7 channel 600ms 600 + wait 120 =720 898.328054] mt76x2_switch_channel(): Switch to Ch#9(2T2R), BBP_BW=0, bbp_ch_idx=0) interval = 400+120 ms Count =4; pNdev->name = p2p0 10ms start scan 85ms & 3 260ms count =2 */ if(RTMP_CFG80211_VIF_P2P_GO_ON(pAd)) { if(rtstrcasecmp(pData, "p2p0") == TRUE) { AsicGetTsfTime(pAd, &Highpart, &Lowpart); DBGPRINT(RT_DEBUG_ERROR,("!!!!Current Tsf LSB = = %ld \n", Lowpart)); RTMP_IO_READ32(pAd, LPON_T1STR, &temp); temp = temp & 0x0000FFFF; NextTbtt = temp % pAd->CommonCfg.BeaconPeriod; DBGPRINT(RT_DEBUG_ERROR,("!!!!NextTbtt = %ld \n", NextTbtt)); temp = NextTbtt*1024+Lowpart; DBGPRINT(RT_DEBUG_ERROR,("!!!!Tsf LSB + TimeTillTbtt= %ld \n", temp)); pAd->cfg80211_ctrl.GONoASchedule.StartTime = Lowpart + NextTbtt*1024+ 409600 + 3200; DBGPRINT(RT_DEBUG_ERROR,(" pAd->GONoASchedule.StartTime = %ld \n", pAd->cfg80211_ctrl.GONoASchedule.StartTime)); pAd->cfg80211_ctrl.GONoASchedule.Count = 9; pAd->cfg80211_ctrl.GONoASchedule.Duration= 260000; pAd->cfg80211_ctrl.GONoASchedule.Interval= 384800; } if(rtstrcasecmp(pData, "wlan0") == TRUE) { AsicGetTsfTime(pAd, &Highpart, &Lowpart); DBGPRINT(RT_DEBUG_ERROR,("!!!!Current Tsf LSB = = %ld \n", Lowpart)); RTMP_IO_READ32(pAd, LPON_T1STR, &temp); temp = temp & 0x0000FFFF; NextTbtt = temp % pAd->CommonCfg.BeaconPeriod; DBGPRINT(RT_DEBUG_ERROR,("!!!!NextTbtt = %ld \n", NextTbtt)); temp = NextTbtt*1024+Lowpart; DBGPRINT(RT_DEBUG_ERROR,("!!!!Tsf LSB + TimeTillTbtt= %ld \n", temp)); pAd->cfg80211_ctrl.GONoASchedule.StartTime = Lowpart + NextTbtt*1024 + 512000 + 3200; DBGPRINT(RT_DEBUG_ERROR,(" pAd->GONoASchedule.StartTime = %ld \n", pAd->cfg80211_ctrl.GONoASchedule.StartTime)); pAd->cfg80211_ctrl.GONoASchedule.Count = (4 + (11*5)+2); /*wait 4 beacon + (interval * 4)*/ pAd->cfg80211_ctrl.GONoASchedule.Duration= 737280; /*720*1024*/ pAd->cfg80211_ctrl.GONoASchedule.Interval= 737280+(400*1024); } } return TRUE; }