void UnsupportRsvdFields_r11b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); SharedWritePtr writeCmd = CreateCmd(); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "none.set", true); LOG_NRM("Set all cmd's rsvd bits"); uint32_t work = writeCmd->GetDword(0); work |= 0x00007c00; // Set DW0_b14:10 bits writeCmd->SetDword(work, 0); writeCmd->SetDword(0xffffffff, 2); writeCmd->SetDword(0xffffffff, 3); work = writeCmd->GetDword(12); work |= 0x03ff0000; // Set DW12_b25:16 bits writeCmd->SetDword(work, 12); work = writeCmd->GetDword(13); work |= 0xffffff00; // Set DW13_b31:8 bits writeCmd->SetDword(work, 13); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "all.set", true); LOG_NRM("Set DSM field reserved coded values"); uint32_t cdw13 = writeCmd->GetDword(13) & ~0xf; for (uint32_t accFreq = BOOST_BINARY(111); accFreq <= BOOST_BINARY(1111); ++accFreq) { work = cdw13 | accFreq; writeCmd->SetDword(work, 13); /* Controller may ignore context attributes */ IO::SendAndReapCmdIgnore(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "rsvd.val.set", true); } }
bool TCPClient::Send(NetCmd *pCmd, bool bNoneUse) { UNREFERENCED_PARAMETER(bNoneUse); if (!IsConnected()) return false; if (m_SendList->HasSpace() == false) { Log("发送数据失败,发送队列已满:%d, %d", m_SendList->ArraySize(), m_SendList->Count()); return false; } NetCmd *pNewCmd = CreateCmd(pCmd->GetCmdType(),pCmd->GetCmdSize()); if (!pNewCmd) return false; memcpy_s(pNewCmd, pCmd->GetCmdSize(), pCmd, pCmd->GetCmdSize()); m_SendList->AddItem(pNewCmd); return true; }
bool TestClient::RecvData(ClientData *pscd, int nRecvSize) { pscd->RecvSize += nRecvSize; UINT cmdSize = sizeof(NetCmd); if (pscd->RecvSize > m_InitData.BuffSize) { Log(L"Recv Size Error1:%d", pscd->RecvSize); return false; } while (pscd->RecvSize >= cmdSize) { BYTE *pBuff = pscd->Buff + pscd->Offset; cmdSize = *((USHORT*)&pBuff[0]); if (cmdSize > m_InitData.BuffSize) { Log(L"Recv Size Error2:%d", cmdSize); return false; } if (pscd->RecvSize >= cmdSize) { NetCmd *pCmd = (NetCmd*)pBuff; if (pCmd->GetCmdType() == m_InitData.CmdHearbeat) { } else { pscd->RecvList.AddItem(pCmd); pCmd = CreateCmd(ConvertDWORDToWORD(cmdSize), pBuff); } pscd->Offset += cmdSize; pscd->RecvSize -= cmdSize; } else break; } UINT freeBuffSize = m_InitData.BuffSize - (pscd->Offset + pscd->RecvSize); if (freeBuffSize < 32 || freeBuffSize < cmdSize - pscd->RecvSize) { memmove(pscd->Buff, pscd->Buff + pscd->Offset, pscd->RecvSize); pscd->Offset = 0; } return true; }
void FUA_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); SharedReadPtr readCmd = CreateCmd(); IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, readCmd, "none.set", true); readCmd->SetFUA(true); IO::SendAndReapCmd(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, iosq, iocq, readCmd, "all.set", true); }
void LimitedRetry_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); SharedWritePtr writeCmd = CreateCmd(); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "none.set", true); writeCmd->SetLR(true); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "all.set", true); }
void UnsupportRsvdFields_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedIOSQPtr iosq = CAST_TO_IOSQ(gRsrcMngr->GetObj(IOSQ_GROUP_ID)); SharedIOCQPtr iocq = CAST_TO_IOCQ(gRsrcMngr->GetObj(IOCQ_GROUP_ID)); SharedWritePtr writeCmd = CreateCmd(); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "none.set", true); LOG_NRM("Set all cmd's rsvd bits"); uint32_t work = writeCmd->GetDword(0); work |= 0x0000fc00; // Set DW0_b15:10 bits writeCmd->SetDword(work, 0); writeCmd->SetDword(0xffffffff, 2); writeCmd->SetDword(0xffffffff, 3); work = writeCmd->GetDword(12); work |= 0x03ff0000; // Set DW12_b25:16 bits writeCmd->SetDword(work, 12); work = writeCmd->GetDword(13); work |= 0xffffff00; // Set DW13_b31:8 bits writeCmd->SetDword(work, 13); IO::SendAndReapCmd(mGrpName, mTestName, CALC_TIMEOUT_ms(1), iosq, iocq, writeCmd, "all.set", true); }
void TCPClient::RecvThread() { while (m_bConnected) { int curPos = m_Offset + m_RecvSize; int nRet = recv(m_Socket, (char*)m_Buff + curPos, m_InitData.BuffSize - curPos, 0); if (nRet == 0 || (nRet == SOCKET_ERROR && (WSAGetLastError() == WSAECONNRESET || WSAGetLastError() == WSAECONNABORTED))) { //Log(L"Recv Error:%d, Error:%d", nRet, WSAGetLastError()); m_bConnected = false; break; } m_RecvTick = timeGetTime(); m_RecvSize += nRet; while (m_RecvSize >= sizeof(UINT)) { BYTE *pBuff = m_Buff + m_Offset; UINT recvID = *((UINT*)(pBuff)); if (recvID == HEARBEAT_ID) { m_Offset += sizeof(UINT); m_RecvSize -= sizeof(UINT); } else if (recvID == PING_ID) { m_Offset += sizeof(UINT); m_RecvSize -= sizeof(UINT); } else if (m_RecvSize >= sizeof(NetCmd)) { NetCmd *pCmdRecv = ((NetCmd*)pBuff); UINT cmdSize = ((NetCmd*)pCmdRecv)->GetCmdSize(); if (cmdSize > m_InitData.BuffSize) { Log(L"RecvSize Error:%d", cmdSize); m_bConnected = false; break; } if (m_RecvSize >= cmdSize) { NetCmd *pCmd = (NetCmd*)pBuff; if (pCmd->GetCmdType() != m_InitData.CmdHearbeat) { pCmd = CreateCmd(ushort(cmdSize), pBuff); if (m_RecvList->HasSpace()) m_RecvList->AddItem(pCmd); else Log("*接收队列已满:Size;%d, Count:%d, CmdSize:%d*", m_RecvList->ArraySize(), m_RecvList->Count(), cmdSize); } m_Offset += cmdSize; m_RecvSize -= cmdSize; } else break; } else break; } UINT freeBuffSize = m_InitData.BuffSize - (m_Offset + m_RecvSize); if (freeBuffSize < 128) { memmove(m_Buff, m_Buff + m_Offset, m_RecvSize); m_Offset = 0; } Sleep(m_InitData.SleepTime); } ::InterlockedIncrement(&m_ExitCount); }
void PartialReapMSIX_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Requires test createResources_r10b to execute 1st * \endverbatim */ bool capable; char work[25]; uint64_t reg; uint16_t numIrqSupport; uint16_t numIrqs = 1; uint16_t uniqueId; uint32_t isrCount; uint32_t numCE; // Only allowed to execute if DUT supports MSI-X IRQ's if (gCtrlrConfig->IsMSIXCapable(capable, numIrqSupport) == false) throw FrmwkEx(HERE); else if (capable == false) { LOG_WARN("DUT does not support MSI-X IRQ's; unable to execute test"); return; } // This requirement must be met, if not then DUT is most likely at fault if (gRegisters->Read(CTLSPC_CAP, reg) == false) throw FrmwkEx(HERE, "Unable to determine CAP.MQES"); reg &= CAP_MQES; reg += 1; // convert to 1-based if (reg < (uint64_t)NUM_IOQ_ENTRY) { LOG_WARN("Desired to support >= %d elements in IOQ's for test", NUM_IOQ_ENTRY); return; } LOG_NRM("Setup the necessary IRQ's"); if (gCtrlrConfig->SetState(ST_DISABLE) == false) throw FrmwkEx(HERE); if (gCtrlrConfig->SetIrqScheme(INT_MSIX, numIrqs) == false) { throw FrmwkEx(HERE, "Unable to use %d IRQ's, but DUT reports it supports", numIrqs); } gCtrlrConfig->SetCSS(CtrlrConfig::CSS_NVM_CMDSET); if (gCtrlrConfig->SetState(ST_ENABLE) == false) throw FrmwkEx(HERE); // Lookup objs which were created in a prior test within group SharedASQPtr asq = CAST_TO_ASQ(gRsrcMngr->GetObj(ASQ_GROUP_ID)) SharedACQPtr acq = CAST_TO_ACQ(gRsrcMngr->GetObj(ACQ_GROUP_ID)) LOG_NRM("Create the IOQ pair which is needed"); gCtrlrConfig->SetIOCQES(gInformative->GetIdentifyCmdCtrlr()-> GetValue(IDCTRLRCAP_CQES) & 0xf); SharedIOCQPtr iocq = Queues::CreateIOCQContigToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, asq, acq, IOQ_ID, NUM_IOQ_ENTRY, false, "", true, 0); gCtrlrConfig->SetIOSQES(gInformative->GetIdentifyCmdCtrlr()-> GetValue(IDCTRLRCAP_SQES) & 0xf); SharedIOSQPtr iosq = Queues::CreateIOSQContigToHdw(mGrpName, mTestName, DEFAULT_CMD_WAIT_ms, asq, acq, IOQ_ID, NUM_IOQ_ENTRY, false, "", IOQ_ID, 0); // NOTE: We are overloading IRQ 0, it is being used by ACQ and we have // created 1 IOQ's, thus to start out the ACQ will already have 2 // IRQs. The following algo must add this usage. uint32_t anticipatedIrqs = (2 + 1); SharedWritePtr writeCmd = CreateCmd(); for (unsigned i = 1; i <= NUM_CMDS_ISSUE; i++) { LOG_NRM("Sending write cmd %d", i); iosq->Send(writeCmd, uniqueId); iosq->Ring(); LOG_NRM("Wait for cmd to be processed"); if (iocq->ReapInquiryWaitSpecify(DEFAULT_CMD_WAIT_ms, i, numCE, isrCount) == false) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "acq", "error"), "Unable to determine if CE's arrived"); throw FrmwkEx(HERE, "Only detected %d CE's arriving", numCE); } else if (numCE != i) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "acq", "notEnough"), "Test requires seeing all CE's"); throw FrmwkEx(HERE, "The anticipated %d CE's have not arrived", i); } else if (isrCount != anticipatedIrqs) { // 1 IRQ per cmd did not occur iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "acq", "irqBad"), "Test requires seeing all correct num of IRQ's"); throw FrmwkEx(HERE, "The anticipated %d IRQ', but detected %d", anticipatedIrqs, isrCount); } } // There is an active IRQ outstanding and another to arrive due to the // PBA pending bit being set. The pending bit makes the 4th IRQ arrive // after reaping a single cmd. LOG_NRM("Start reaping and validate %d IRQ's", anticipatedIrqs); for (int i = 0; i < NUM_CMDS_ISSUE; i++) { snprintf(work, sizeof(work), "cmd.%d", i); IO::ReapCE(iocq, 1, isrCount, mGrpName, mTestName, work); if (isrCount != anticipatedIrqs) { iocq->Dump( FileSystem::PrepDumpFile(mGrpName, mTestName, "acq", work), "Number of IRQ's changed while reaping"); throw FrmwkEx(HERE, "Anticipated %d IRQ's; but only see %d", anticipatedIrqs, isrCount); } // Now account for a new IRQ fired due to the pending bit being handled // by the DUT, but delay processing so that latency in handling this // extra IRQ is not the cause of a test failure. Rather make the // absence of the IRQ be the failure, thus delaying is OK. if (i == 0) { anticipatedIrqs++; sleep(1); } } }