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);
    }
}
Beispiel #2
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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);
}
Beispiel #7
0
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);
}
Beispiel #8
0
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);
        }
    }
}