Пример #1
0
	bool HTTPProxyHandler::HandleData(uint8_t *http_buff, std::size_t len)
	{
		assert(len); // This should always be called with a least a byte left to parse
		while (len > 0) 
		{
			//TODO: fallback to finding HOst: header if needed
			switch (m_state) 
			{
				case GET_METHOD:
					switch (*http_buff) 
					{
						case ' ': EnterState(GET_HOSTNAME); break;
						default: m_method.push_back(*http_buff); break;
					}
				break;
				case GET_HOSTNAME:
					switch (*http_buff) 
					{
						case ' ': EnterState(GET_HTTPV); break;
						default: m_url.push_back(*http_buff); break;
					}
				break;
				case GET_HTTPV:
					switch (*http_buff) 
					{
						case '\r': EnterState(GET_HTTPVNL); break;
						default: m_version.push_back(*http_buff); break;
					}
				break;
				case GET_HTTPVNL:
					switch (*http_buff) 
					{
						case '\n': EnterState(DONE); break;
						default:
							LogPrint(eLogError,"--- HTTP Proxy rejected invalid request ending with: ", ((int)*http_buff));
							HTTPRequestFailed(); //TODO: add correct code
							return false;
					}
				break;
				default:
					LogPrint(eLogError,"--- HTTP Proxy invalid state: ", m_state);
					HTTPRequestFailed(); //TODO: add correct code 500
					return false;
			}
			http_buff++;
			len--;
			if (m_state == DONE)
				return CreateHTTPRequest(http_buff,len);
		}
		return true;
	}
Пример #2
0
bool CStateBase::ChangeState(const string& s)
{
	if(!m_CurState.empty()) LeaveState(m_CurState);
	
	m_CurState = s;
	
	EnterState(m_CurState);
	return true;
}
Пример #3
0
            DataExchangeTestState(LapdTest& fsm, int maxDuration, TestState* pNextState): 
              TestState(fsm, "DataExchangeTestState" , maxDuration),
                  m_totalCycles(fsm.GetProfile().m_DataExchangeCycle), m_currCycle(0),
                  m_left(*new L3(fsm, &fsm.GetL3Left(), fsm.GetL2Left().getL2() ) ), 
                  m_right(*new L3(fsm, &fsm.GetL3Right(), fsm.GetL2Right().getL2() ) ),
                  //m_left (fsm, fsm.GetL3Left().GetL3Test(), fsm.GetL2Left().GetImpl() ) , 
                  //m_right (fsm, fsm.GetL3Right().GetL3Test(), fsm.GetL2Right().GetImpl() ) ,
                  m_completed(false),
                  m_pNextState(pNextState)
              {
                  GetOwner().GetL3Left().SwitchTo(&m_left); 
                  GetOwner().GetL3Right().SwitchTo(&m_right); 

                  EnterState(SEND_I_FROM_LEFT_SAFE); // установка начального состо¤ни¤
              }
Пример #4
0
            void Proc()
            {
                if (Completed()) return;

                bool leftRes = m_left.Process();
                bool rightRes = m_right.Process();

                if (leftRes && rightRes)
                {
                    InnerState next = NextState(m_state);
                    if (next == TEST_COMPLETED) 
                    {
                        ResetDrv();
                        m_completed = true;
                        return;
                    }   
                    EnterState(next);
                }
            }
Пример #5
0
G2DTestSystemDriver::G2DTestSystemDriver (int argc, char* argv[])
{
  state_sptr = 0;
  EnterState (stInit);
  SwitchBB = false;

  object_reg = csInitializer::CreateEnvironment (argc, argv);

  if (!csInitializer::SetupConfigManager (object_reg, "/config/g2dtest.cfg"))
  {
    csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,
    	"crystalspace.application.g2dtest",
        "Unable to init app!");
    exit (0);
  }

  if (!csInitializer::RequestPlugins (object_reg,
    CS_REQUEST_VFS,
    CS_REQUEST_FONTSERVER,
    CS_REQUEST_LEVELLOADER,
    CS_REQUEST_END))
  {
    csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,
    	"crystalspace.application.g2dtest",
        "Unable to init app!");
    exit (0);
  }

  csRef<iEventQueue> q (csQueryRegistry<iEventQueue> (object_reg));
  if (q != 0)
  {
    EventOutlet = q->GetEventOutlet();
    EventOutlet->IncRef();
  }

}
Пример #6
0
void App_t::ITask() {
    while(true) {
        uint32_t EvtMsk = chEvtWaitAny(ALL_EVENTS);
        // ==== Card ====
        if(EvtMsk & EVTMSK_CARD_APPEARS) ProcessCardAppearance();

#if 1 // ==== Door ====
        if(EvtMsk & EVTMSK_DOOR_OPEN) {
            DoorState = dsOpen;
            Led.StartSequence(lsqDoorOpen); // Set color
            SndList.PlayRandomFileFromDir(DIRNAME_GOOD_KEY);
            Uart.Printf("\rDoor is open");
            chSysLock();
            if(chVTIsArmedI(&IDoorTmr)) chVTResetI(&IDoorTmr);
            chVTSetI(&IDoorTmr, MS2ST(DOOR_CLOSE_TIMEOUT), TmrGeneralCallback, (void*)EVTMSK_DOOR_SHUT);
            chSysUnlock();
        }
        if(EvtMsk & EVTMSK_DOOR_SHUT) {
            DoorState = dsClosed;
            Led.StartSequence(lsqDoorClose);    // Set color
            SndList.PlayRandomFileFromDir(DIRNAME_DOOR_CLOSING);
            Uart.Printf("\rDoor is closing");
        }

        if(EvtMsk & EVTMSK_BAD_KEY) {
            Led.StartSequence(lsqDoorWrongKey);
            SndList.PlayRandomFileFromDir(DIRNAME_BAD_KEY);
            Uart.Printf("\rBadKey");
        }
#endif

#if 1 // ==== Secret key ====
        if(EvtMsk & EVTMSK_SECRET_KEY) {
            Led.StartSequence(lsqDoorSecretKey);
            SndList.PlayRandomFileFromDir(DIRNAME_SECRET);
            Uart.Printf("\rSecretKey");
        }
#endif

#if 1 // ==== Keys ====
        if(EvtMsk & EVTMSK_KEYS) {
            KeyEvtInfo_t EInfo;
            while(Keys.EvtBuf.Get(&EInfo) == OK) {
//                Uart.Printf("\rEinfo: %u, %u, %u", EInfo.Type, EInfo.KeysCnt, EInfo.KeyID[0]);
                if(EInfo.Type == kePress) {
                    switch(EInfo.KeyID[0]) {
                        // Iterate AccessAdd / AccessRemove / Idle
                        case keyA:
                            switch(State) {
                                case asAddingAccess:   EnterState(asRemovingAccess); break;
                                case asRemovingAccess: EnterState(asIdle); break;
                                default:               EnterState(asAddingAccess); break;
                            } // switch State
                            break;
                        // Iterate AdderAdd / AdderRemove / Idle
                        case keyB:
                            switch(State) {
                                case asAddingAdder:   EnterState(asRemovingAdder); break;
                                case asRemovingAdder: EnterState(asIdle); break;
                                default:              EnterState(asAddingAdder); break;
                            } // switch State
                            break;

                        // Iterate RemoverAdd / RemoverRemove / Idle
                        case keyC:
                            switch(State) {
                                case asAddingRemover:   EnterState(asRemovingRemover); break;
                                case asRemovingRemover: EnterState(asIdle); break;
                                default:                EnterState(asAddingRemover); break;
                            } // switch State
                            break;
                    } // switch
                } // if keypress
                else if(EInfo.Type == keCombo and EInfo.KeyID[0] == keyA and EInfo.KeyID[1] == keyB) {
                    LedService.StartSequence(lsqEraseAll);
                    IDStore.EraseAll();
                    chThdSleepMilliseconds(1530);   // Allow LED to complete blinking
                    EnterState(asIdle);
                }
            } // while
        } // if keys
#endif

#if USB_ENABLED // ==== USB connection ====
        if(EvtMsk & EVTMSK_USB_CONNECTED) {
            chSysLock();
            Clk.SetFreq48Mhz();
            Clk.InitSysTick();
            chSysUnlock();
            Usb.Init();
            chThdSleepMilliseconds(540);
            Usb.Connect();
            Uart.Printf("\rUsb connected, AHB freq=%uMHz", Clk.AHBFreqHz/1000000);
        }
        if(EvtMsk & EVTMSK_USB_DISCONNECTED) {
            Usb.Shutdown();
            MassStorage.Reset();
            chSysLock();
            Clk.SetFreq12Mhz();
            Clk.InitSysTick();
            chSysUnlock();
            Uart.Printf("\rUsb disconnected, AHB freq=%uMHz", Clk.AHBFreqHz/1000000);
        }
#endif

        // ==== State timeout ====
        if(EvtMsk & EVTMSK_STATE_TIMEOUT) EnterState(asIdle);
    } // while true
}
Пример #7
0
void App_t::ProcessCardAppearance() {
//    App.CurrentID.Print();
#if SAVE_LAST_ID
    if(LastID != CurrentID) {
        LastID = CurrentID;
        if(SD.OpenRewrite(LAST_ID_FILENAME) == OK) {
            for(uint32_t i=0; i<8; i++) f_printf(&SD.File, "%02X", LastID.ID8[i]);
            SD.Close();
//            Uart.Printf("\rID saved");
        }
    }
#endif
    // Proceed with check
    IdKind_t IdKind = IDStore.Check(CurrentID);
    switch(State) {
        case asIdle:
            if(DoorState == dsClosed) {
                switch(IdKind) {
                    case ikAccess:  SendEvt(EVTMSK_DOOR_OPEN); break;
                    case ikSecret:  SendEvt(EVTMSK_SECRET_KEY); break;
                    case ikAdder:   EnterState(asAddingAccess); break;
                    case ikRemover: EnterState(asRemovingAccess); break;
                    case ikNone:    SendEvt(EVTMSK_BAD_KEY); break;
                }
            }
            return;
            break;

        case asAddingAccess:
            switch(IdKind) {
                case ikAdder: EnterState(asIdle); break;
                case ikRemover: EnterState(asRemovingAccess); break;
                case ikNone:
                    if(IDStore.Add(CurrentID, ikAccess) == OK) ShowAddRemoveResult(arrAddingOk);
                    else ShowAddRemoveResult(arrAddingErr);
                    break;
                case ikAccess: ShowAddRemoveResult(arrAddingOk); break; // already in base
                case ikSecret: break;
            }
            break;
        case asRemovingAccess:
            switch(IdKind) {
                case ikAdder: EnterState(asAddingAccess); break;
                case ikRemover: EnterState(asIdle); break;
                case ikNone: ShowAddRemoveResult(arrRemovingOk); break; // already absent
                case ikAccess:
                    IDStore.Remove(CurrentID, ikAccess);
                    ShowAddRemoveResult(arrRemovingOk);
                    break;
                case ikSecret: break;
            }
            break;

        case asAddingAdder:
            Uart.Printf("\rAdding Adder");
            switch(IdKind) {
                case ikAdder: LedService.StartSequence(lsqAddingAdderNew); break; // already in base
                case ikRemover:
                    IDStore.Remove(CurrentID, ikRemover);
                    if(IDStore.Add(CurrentID, ikAdder) == OK) LedService.StartSequence(lsqAddingAdderNew);
                    else LedService.StartSequence(lsqAddingAdderError);
                    break;
                case ikNone:
                    if(IDStore.Add(CurrentID, ikAdder) == OK) LedService.StartSequence(lsqAddingAdderNew);
                    else LedService.StartSequence(lsqAddingAdderError);
                    break;
                case ikAccess:
                    IDStore.Remove(CurrentID, ikAccess);
                    if(IDStore.Add(CurrentID, ikAdder) == OK) LedService.StartSequence(lsqAddingAdderNew);
                    else LedService.StartSequence(lsqAddingAdderError);
                    break;
                case ikSecret: break;
            }
            break;

        case asRemovingAdder:
            Uart.Printf("\rRemoving Adder");
            LedService.StartSequence(lsqRemovingAdderNew);
            IDStore.Remove(CurrentID, ikAdder);
            break;

        case asAddingRemover:
            Uart.Printf("\rAdding Remover");
            switch(IdKind) {
                case ikAdder:
                    IDStore.Remove(CurrentID, ikAdder);
                    if(IDStore.Add(CurrentID, ikRemover) == OK) LedService.StartSequence(lsqAddingRemoverNew);
                    else LedService.StartSequence(lsqAddingRemoverError);
                    break;
                case ikRemover: LedService.StartSequence(lsqAddingRemoverNew); break; // already in base
                case ikNone:
                    if(IDStore.Add(CurrentID, ikRemover) == OK) LedService.StartSequence(lsqAddingRemoverNew);
                    else LedService.StartSequence(lsqAddingRemoverError);
                    break;
                case ikAccess:
                    IDStore.Remove(CurrentID, ikAccess);
                    if(IDStore.Add(CurrentID, ikRemover) == OK) LedService.StartSequence(lsqAddingRemoverNew);
                    else LedService.StartSequence(lsqAddingRemoverError);
                    break;
                case ikSecret: break;
            }
            break;

        case asRemovingRemover:
            Uart.Printf("\rRemoving Remover");
            LedService.StartSequence(lsqRemovingRemoverNew);
            IDStore.Remove(CurrentID, ikRemover);
            break;
    } // switch
    RestartStateTimer();
}
Пример #8
0
// ------------------------------------------------------------------------------------------------
int main(int argc, const char **argv)
{
    // Common variables
    NetBuf *inPkt;
    TcpHeader *inHdr;
    Packet *outPkt;
    TcpHeader *outHdr;
    TcpConn *conn;

    TestSetup();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSED, "RST", "segment dropped");

    inPkt = NetAllocBuf();
    inHdr = (TcpHeader *)inPkt->start;
    inHdr->srcPort = 100;
    inHdr->dstPort = 101;
    inHdr->seq = 1;
    inHdr->ack = 2;
    inHdr->off = 5 << 4;
    inHdr->flags = TCP_RST;
    inHdr->windowSize = TCP_WINDOW_SIZE;
    inHdr->checksum = 0;
    inHdr->urgent = 0;
    TcpInput(inPkt);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSED, "ACK", "RST sent");

    inPkt = NetAllocBuf();
    inHdr = (TcpHeader *)inPkt->start;
    inHdr->srcPort = 100;
    inHdr->dstPort = 101;
    inHdr->seq = 1;
    inHdr->ack = 2;
    inHdr->off = 5 << 4;
    inHdr->flags = TCP_ACK;
    inHdr->windowSize = TCP_WINDOW_SIZE;
    inHdr->checksum = 0;
    inHdr->urgent = 0;
    TcpInput(inPkt);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, 101);
    ASSERT_EQ_UINT(outHdr->dstPort, 100);
    ASSERT_EQ_UINT(outHdr->seq, 2);
    ASSERT_EQ_UINT(outHdr->ack, 0);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_RST);
    free(outPkt);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSED, "no ACK", "RST/ACK sent");

    inPkt = NetAllocBuf();
    inHdr = (TcpHeader *)inPkt->start;
    inHdr->srcPort = 100;
    inHdr->dstPort = 101;
    inHdr->seq = 1;
    inHdr->ack = 2;
    inHdr->off = 5 << 4;
    inHdr->flags = 0;
    inHdr->windowSize = TCP_WINDOW_SIZE;
    inHdr->checksum = 0;
    inHdr->urgent = 0;
    TcpInput(inPkt);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, 101);
    ASSERT_EQ_UINT(outHdr->dstPort, 100);
    ASSERT_EQ_UINT(outHdr->seq, 0);
    ASSERT_EQ_UINT(outHdr->ack, 1);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_RST | TCP_ACK);
    free(outPkt);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSED, "connect", "goto SYN_SENT");

    conn = CreateConn();

    ASSERT_TRUE(TcpConnect(conn, &s_ipAddr, 80));

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_TRUE(outHdr->srcPort >= 49152);
    ASSERT_EQ_UINT(outHdr->dstPort, 80);
    ASSERT_EQ_UINT(outHdr->seq, conn->iss);
    ASSERT_EQ_UINT(outHdr->ack, 0);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_SYN);
    ASSERT_EQ_UINT(outHdr->windowSize, TCP_WINDOW_SIZE);
    ASSERT_EQ_UINT(outHdr->urgent, 0);
    free(outPkt);

    ExitState(conn, TCP_SYN_SENT);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "Bad ACK, no RST", "RST sent");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss, TCP_ACK);
    TcpInput(inPkt);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort);
    ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort);
    ASSERT_EQ_UINT(outHdr->seq, inHdr->ack);
    ASSERT_EQ_UINT(outHdr->ack, 0);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_RST);
    free(outPkt);

    ExitState(conn, TCP_SYN_SENT);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "Bad ACK, RST", "segment dropped");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss, TCP_RST | TCP_ACK);
    TcpInput(inPkt);

    ExitState(conn, TCP_SYN_SENT);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "ACK, RST", "conn locally reset");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_RST | TCP_ACK);
    TcpInput(inPkt);

    ExpectError(TCP_CONN_RESET);
    ExitState(conn, TCP_CLOSED);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "no ACK, RST", "segment dropped");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_RST);
    TcpInput(inPkt);

    ExitState(conn, TCP_SYN_SENT);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "SYN, ACK", "goto ESTABLISHED");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, conn->iss + 1, TCP_SYN | TCP_ACK);
    TcpInput(inPkt);

    ASSERT_EQ_UINT(conn->irs, 1000);
    ASSERT_EQ_UINT(conn->rcvNxt, 1001);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort);
    ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort);
    ASSERT_EQ_UINT(outHdr->seq, conn->iss + 1);
    ASSERT_EQ_UINT(outHdr->ack, 1001);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK);
    free(outPkt);

    ExitState(conn, TCP_ESTABLISHED);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_SENT, "SYN, no ACK", "goto SYN_RECEIVED, resend SYN,ACK");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_SENT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, 1000, 0, TCP_SYN);
    TcpInput(inPkt);

    ASSERT_EQ_UINT(conn->irs, 1000);
    ASSERT_EQ_UINT(conn->rcvNxt, 1001);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort);
    ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort);
    ASSERT_EQ_UINT(outHdr->seq, conn->iss);
    ASSERT_EQ_UINT(outHdr->ack, 1001);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_SYN | TCP_ACK);
    free(outPkt);

    ExitState(conn, TCP_SYN_RECEIVED);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    uint generalStates[] =
    {
        TCP_SYN_RECEIVED,
        TCP_ESTABLISHED,
        TCP_FIN_WAIT_1,
        TCP_FIN_WAIT_2,
        TCP_CLOSE_WAIT,
        TCP_CLOSING,
        TCP_LAST_ACK,
        TCP_TIME_WAIT,
        0,
    };

    for (uint *pState = generalStates; *pState; ++pState)
    {
        uint state = *pState;

        TestCaseBegin(state, "Bad seq, no RST", "resend ACK");

        conn = CreateConn();
        EnterState(conn, state);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt - 1, conn->sndNxt, TCP_ACK);
        TcpInput(inPkt);

        outPkt = PopPacket();
        outHdr = (TcpHeader *)outPkt->data;
        TcpSwap(outHdr);
        ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort);
        ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort);
        ASSERT_EQ_UINT(outHdr->seq, conn->sndNxt);
        ASSERT_EQ_UINT(outHdr->ack, conn->rcvNxt);
        ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK);
        free(outPkt);

        ExitState(conn, state);

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    for (uint *pState = generalStates; *pState; ++pState)
    {
        uint state = *pState;

        TestCaseBegin(state, "Bad seq, RST", "segment dropped");

        conn = CreateConn();
        EnterState(conn, state);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt - 1, conn->sndNxt, TCP_RST | TCP_ACK);
        TcpInput(inPkt);

        ExitState(conn, state);

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_RECEIVED, "RST, active", "conn refused");

    conn = CreateConn();
    EnterState(conn, TCP_SYN_RECEIVED);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST);
    TcpInput(inPkt);

    ExpectError(TCP_CONN_REFUSED);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    uint rstStates1[] =
    {
        TCP_ESTABLISHED,
        TCP_FIN_WAIT_1,
        TCP_FIN_WAIT_2,
        TCP_CLOSE_WAIT,
        0,
    };

    for (uint *pState = rstStates1; *pState; ++pState)
    {
        uint state = *pState;

        TestCaseBegin(state, "RST", "conn reset");

        conn = CreateConn();
        EnterState(conn, state);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST);
        TcpInput(inPkt);

        ExpectError(TCP_CONN_RESET);

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    uint rstStates2[] =
    {
        TCP_CLOSING,
        TCP_LAST_ACK,
        TCP_TIME_WAIT,
        0,
    };

    for (uint *pState = rstStates2; *pState; ++pState)
    {
        uint state = *pState;

        TestCaseBegin(state, "RST", "conn closed");

        conn = CreateConn();
        EnterState(conn, state);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, 0, TCP_RST);
        TcpInput(inPkt);

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    for (uint *pState = generalStates; *pState; ++pState)
    {
        uint state = *pState;

        TestCaseBegin(state, "SYN", "conn reset, RST sent");

        conn = CreateConn();
        EnterState(conn, state);

        u16 localPort = conn->localPort;
        u16 remotePort = conn->remotePort;
        u32 rcvNxt = conn->rcvNxt;

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_SYN);
        TcpInput(inPkt);

        outPkt = PopPacket();
        outHdr = (TcpHeader *)outPkt->data;
        TcpSwap(outHdr);
        ASSERT_EQ_UINT(outHdr->srcPort, localPort);
        ASSERT_EQ_UINT(outHdr->dstPort, remotePort);
        ASSERT_EQ_UINT(outHdr->seq, 0);
        ASSERT_EQ_UINT(outHdr->ack, rcvNxt);
        ASSERT_EQ_HEX8(outHdr->flags, TCP_RST | TCP_ACK);
        free(outPkt);

        ExpectError(TCP_CONN_RESET);

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_RECEIVED, "bad ACK", "RST sent");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_SYN_RECEIVED, "ACK", "goto ESTABLISHED");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    uint ackStates[] =
    {
        TCP_ESTABLISHED,
        TCP_FIN_WAIT_1,
        TCP_FIN_WAIT_2,
        TCP_CLOSE_WAIT,
        TCP_CLOSING,
        0
    };

    for (uint *pState = ackStates; *pState; ++pState)
    {
        uint state = *pState;
        TestCaseBegin(state, "ACK", "update pointers");

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    for (uint *pState = ackStates; *pState; ++pState)
    {
        uint state = *pState;
        TestCaseBegin(state, "dup ACK", "ignore");

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    for (uint *pState = ackStates; *pState; ++pState)
    {
        uint state = *pState;
        TestCaseBegin(state, "unsent ACK", "resend ACK");

        TestCaseEnd();
    }

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_FIN_WAIT_1, "ACK, FIN not ACK'd", "ignore");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSING, "ACK, FIN not ACK'd", "ignore");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_FIN_WAIT_1, "ACK, FIN ACK'd", "goto FIN-WAIT-2");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_CLOSING, "ACK, FIN ACK'd", "goto TIME-WAIT");

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_LAST_ACK, "ACK, FIN not ACK'd", "ignore");

    conn = CreateConn();
    EnterState(conn, TCP_LAST_ACK);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt - 1, TCP_ACK);
    TcpInput(inPkt);

    ExitState(conn, TCP_LAST_ACK);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_LAST_ACK, "ACK, FIN ACK'd", "goto CLOSED");

    conn = CreateConn();
    EnterState(conn, TCP_LAST_ACK);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_ACK);
    TcpInput(inPkt);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_TIME_WAIT, "ACK, no FIN", "ignore");

    conn = CreateConn();
    EnterState(conn, TCP_TIME_WAIT);

    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_ACK);
    TcpInput(inPkt);

    ExitState(conn, TCP_TIME_WAIT);

    TestCaseEnd();

    // --------------------------------------------------------------------------------------------
    TestCaseBegin(TCP_TIME_WAIT, "FIN", "reset 2MSL timer");

    conn = CreateConn();
    EnterState(conn, TCP_TIME_WAIT);

    g_pitTicks += 1000;
    inPkt = NetAllocBuf();
    inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_FIN | TCP_ACK);
    TcpInput(inPkt);

    outPkt = PopPacket();
    outHdr = (TcpHeader *)outPkt->data;
    TcpSwap(outHdr);
    ASSERT_EQ_UINT(outHdr->srcPort, conn->localPort);
    ASSERT_EQ_UINT(outHdr->dstPort, conn->remotePort);
    ASSERT_EQ_UINT(outHdr->seq, conn->sndNxt);
    ASSERT_EQ_UINT(outHdr->ack, conn->rcvNxt);
    ASSERT_EQ_HEX8(outHdr->flags, TCP_ACK);
    free(outPkt);

    ASSERT_EQ_UINT(conn->mslWait, g_pitTicks + 2 * TCP_MSL);

    ExitState(conn, TCP_TIME_WAIT);

    TestCaseEnd();

    return EXIT_SUCCESS;
}
Пример #9
0
// ------------------------------------------------------------------------------------------------
static void EnterState(TcpConn *conn, uint state)
{
    NetBuf *inPkt;
    TcpHeader *inHdr;
    Packet *outPkt;
    //TcpHeader *outHdr;

    switch (state)
    {
    case TCP_SYN_SENT:
        ASSERT_TRUE(TcpConnect(conn, &s_ipAddr, 80));

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_SYN_RECEIVED:
        EnterState(conn, TCP_SYN_SENT);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, 1000, 0, TCP_SYN);
        TcpInput(inPkt);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_ESTABLISHED:
        EnterState(conn, TCP_SYN_SENT);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_SYN | TCP_ACK);
        TcpInput(inPkt);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_FIN_WAIT_1:
        EnterState(conn, TCP_ESTABLISHED);

        TcpClose(conn);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_FIN_WAIT_2:
        EnterState(conn, TCP_FIN_WAIT_1);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_ACK);
        TcpInput(inPkt);
        break;

    case TCP_CLOSE_WAIT:
        EnterState(conn, TCP_ESTABLISHED);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_FIN | TCP_ACK);
        TcpInput(inPkt);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_CLOSING:
        EnterState(conn, TCP_FIN_WAIT_1);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt - 1, TCP_FIN | TCP_ACK);
        TcpInput(inPkt);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_LAST_ACK:
        EnterState(conn, TCP_CLOSE_WAIT);

        TcpClose(conn);

        outPkt = PopPacket();
        free(outPkt);
        break;

    case TCP_TIME_WAIT:
        EnterState(conn, TCP_FIN_WAIT_1);

        inPkt = NetAllocBuf();
        inHdr = PrepareInPkt(conn, inPkt, conn->rcvNxt, conn->sndNxt, TCP_FIN | TCP_ACK);
        TcpInput(inPkt);

        outPkt = PopPacket();
        free(outPkt);
        break;

    default:
        ASSERT_EQ_UINT(state, 0);
        break;
    }

    ASSERT_EQ_UINT(conn->state, state);
    ASSERT_TRUE(ListIsEmpty(&s_outPackets));
}
Пример #10
0
void G2DTestSystemDriver::SetupFrame ()
{
  if (state_sptr == 0)
  {
    EventOutlet->Broadcast (csevQuit (object_reg));
    return;
  }

  appState curstate = state [state_sptr - 1];
  switch (curstate)
  {
    case stInit:
    case stStartup:
    case stContextInfo:
    case stWindowFixed:
    case stWindowResize:
    case stCustomCursor:
    case stCustomIcon:
    case stAlphaTest:
    case stTestUnicode1:
    case stTestUnicode2:
    case stTestFreetype:
    case stTestLineDraw:
    case stTestLinePerf:
    case stTestTextDraw:
    case stTestTextDraw2:
    case stPixelClipTest:
    case stLineClipTest:
    case stBoxClipTest:
    case stFontClipTest:
    case stBlitTest:
    {
      if (!myG3D->BeginDraw (CSDRAW_2DGRAPHICS))
        break;

      myG2D->Clear (black);
      LeaveState ();
      switch (curstate)
      {
        case stInit:
	  fontLarge = GetFont (CSFONT_LARGE);
	  fontItalic = GetFont (CSFONT_ITALIC);
	  fontCourier = GetFont (CSFONT_COURIER);
	  fontSmall = GetFont (CSFONT_SMALL);
	  {
	    csRef<iVFS> vfs = csQueryRegistry<iVFS> (object_reg);
	    csRef<iImageIO> iio = 
	      csQueryRegistry<iImageIO> (object_reg);
	    if (vfs.IsValid () && iio.IsValid ())
	    {
	      csRef<iFile> testFile = vfs->Open ("/lib/g2dtest/up.png", 
		VFS_FILE_READ);
	      if (testFile.IsValid ())
	      {
		csRef<iDataBuffer> fileData = testFile->GetAllData ();
		blitTestImage = iio->Load (fileData, CS_IMGFMT_TRUECOLOR 
		  | CS_IMGFMT_ALPHA);
	      }
	      testFile = vfs->Open ("/lib/std/cslogo2.png", VFS_FILE_READ);
	      if (testFile.IsValid ())
	      {
		csRef<iDataBuffer> fileData = testFile->GetAllData ();
		alphaBlitImage = iio->Load (fileData, CS_IMGFMT_TRUECOLOR |
		  CS_IMGFMT_ALPHA);
	      }
	    }
	  }
	  EnterState (stStartup);
	  break;
        case stStartup:
          DrawStartupScreen ();
	  EnterState (stContextInfo);
          EnterState (stPause, 5000);
          break;
        case stContextInfo:
          DrawContextInfoScreen ();
          EnterState (stWindowFixed);
          EnterState (stWaitKey);
          break;
        case stWindowFixed:
          DrawWindowScreen ();
          EnterState (stWindowResize);
          EnterState (stWaitKey);
          break;
        case stWindowResize:
          DrawWindowResizeScreen ();
          EnterState (stCustomCursor);
          EnterState (stWaitKey);
          break;
	case stCustomCursor:
          DrawCustomCursorScreen ();
	  SetCustomCursor ();
	  if (lastkey9)
            EnterState (stCustomIcon);
	  else
            EnterState (stCustomCursor);
          break;
	case stCustomIcon:
          SetNormalCursor ();
	  SetCustomIcon ();
          DrawCustomIconScreen ();
	  EnterState (stAlphaTest);
          EnterState (stWaitKey);
          break;
	case stAlphaTest:
          DrawAlphaTestScreen ();
          EnterState (stTestUnicode1);
          EnterState (stWaitKey);
          break;
	case stTestUnicode1:
	  DrawUnicodeTest1 ();
          EnterState (stTestUnicode2);
          EnterState (stWaitKey);
          break;
	case stTestUnicode2:
	  DrawUnicodeTest2 ();
          EnterState (stTestFreetype);
          EnterState (stWaitKey);
          break;
	case stTestFreetype:
	  DrawFreetypeTest ();
          EnterState (stTestLineDraw);
          EnterState (stWaitKey);
          break;
        case stTestLineDraw:
          DrawLineTest ();
          EnterState (stTestLinePerf);
          EnterState (stWaitKey);
          break;
        case stTestLinePerf:
          DrawLinePerf ();
          if (lastkey2)
            EnterState (stTestTextDraw);
          else
            EnterState (stTestLinePerf);
          break;
        case stTestTextDraw:
          DrawTextTest ();
          if (lastkey3)
            EnterState (stTestTextDraw2);
          else
            EnterState (stTestTextDraw);
          break;
        case stTestTextDraw2:
          DrawTextTest2 ();
          if (lastkey4)
            EnterState (stPixelClipTest);
          else
            EnterState (stTestTextDraw2);
          break;
        case stPixelClipTest:
          PixelClipTest ();
          if (lastkey5)
          {
            myG2D->SetClipRect(0,0,myG2D->GetWidth(), myG2D->GetHeight());
            EnterState (stLineClipTest);
          }
          else
            EnterState (stPixelClipTest);
          break;
        case stLineClipTest:
          LineClipTest ();
          if (lastkey6)
          {
            myG2D->SetClipRect(0,0,myG2D->GetWidth(), myG2D->GetHeight());
            EnterState (stBoxClipTest);
          }
          else
            EnterState (stLineClipTest);
          break;
        case stBoxClipTest:
          BoxClipTest ();
          if (lastkey7)
          {
            myG2D->SetClipRect(0,0,myG2D->GetWidth(), myG2D->GetHeight());
	    EnterState (stFontClipTest);
          }
          else
            EnterState (stBoxClipTest);
          break;
        case stFontClipTest:
          FontClipTest ();
          if (lastkey8)
	    EnterState (stBlitTest);
          else
            EnterState (stFontClipTest);
          break;
	case stBlitTest:
	  BlitTest ();
          EnterState (stWaitKey);
          break;
        default:
          break;
      }
      break;
    }
    case stPause:
      if (int (csGetTicks () - timer) > 0)
        LeaveState ();
      else
        csSleep (1);
      break;
    case stWaitKey:
      if (lastkey)
      {
        LeaveState ();
        SwitchBB = false;
      }
      else
      {
        if (SwitchBB)
        {
          myG2D->Print (0);
          csSleep (200);
        }
        else
          csSleep (1);
      }
      break;
  }
}
Пример #11
0
void CollisionManager::Update(bool ShootingState, bool IntakeState, bool DefensiveState, bool TowerShotState)//, bool EndGameState)
{
	//int safezone = 4000;
	ShooterState_Prev = ShooterState_Cur;
	ShooterState_Cur = ShootingState;
	IntakeState_Prev = IntakeState_Cur;
	IntakeState_Cur = IntakeState;
	DefensiveState_Prev = DefensiveState_Cur;
	DefensiveState_Cur = DefensiveState;
	TowerShotState_Prev = TowerShotState_Cur;
	TowerShotState_Cur = TowerShotState;
	//EndGameState_Prev = EndGameState_Cur;
	//EndGameState_Cur = EndGameState;

	if(!ShooterState_Prev && ShooterState_Cur)
	{
		EnterState(RobotMode::Shooting);
	}

	if(!IntakeState_Prev && IntakeState_Cur)
	{
		EnterState(RobotMode::Intake);
	}

	if(!DefensiveState_Prev && DefensiveState_Cur)
	{
		EnterState(RobotMode::Defensive);
	}

	if(!TowerShotState_Prev && TowerShotState_Cur)
	{
		EnterState(RobotMode::TowerShot);
	}
	//if(!EndGameState_Prev && EndGameState_Cur)
	//{
		//EnterState(RobotMode::EndGame);
	//}

	if(transitioning == true)
	{
		if(currentMode == RobotMode::Intake)
		{
			switch(state)
			{
			case 0 :
				//Reset Intske
				IntakeRef->LiftPIDController->Enable();

				IntakeRef->GotoIntake();
				state = 1;
				counter = 0;
				break;
			case 1 :
				//Reset Turret and wait Intake
				if(fabs(IntakeRef->GetLiftEncoder()-Preset_Intake_Intake) <= 20)
				{
					counter++;
				}
				else
				{
					counter = 0;
				}
				if (counter > 100)
				{
					ArmRef->TurretPIDController->Enable();
					state = 2;
					ArmRef->ResetTurret();
				}
				break;
			case 2 :
				if(fabs(ArmRef->GetTurretEncoder()) <= 10)
				{
					ArmRef->ArmPIDController->Enable();
					ArmRef->ResetArm();
					state = 3;

				}
				break;
			case 3:
				if(fabs(ArmRef->GetLifterEncoder() - Preset_Arm_Floor <= 10))
				{
					ArmRef->ArmPIDController->Disable();
					ArmRef->TurretPIDController->Disable();
					IntakeRef->GotoIntake();
					Wait(.25f);
					ArmRef->GoToArm();
					state = 4;
					transitioning = false;
				}
			}
		}
		else if(currentMode == RobotMode::Shooting)
		{
			PresetTimer->Reset();
			PresetTimer->Start();
			switch(state)
			{
				case 0 :
					state = 1;
					IntakeRef->LiftPIDController->Enable();
					//Reset Intake
					ArmRef->ArmPIDController->Enable();
					ArmRef->TurretPIDController->Enable();
					IntakeRef->GotoIntake();
					break;
				case 1 :
					//Reset Turret and wait Intake
					if(fabs(IntakeRef->GetLiftEncoder()-Preset_Intake_Intake) <= 20)
					{
						state = 2;
						ArmRef->ResetTurret();
					}
					break;
				case 2 :
					if(fabs(ArmRef->GetTurretEncoder()) <= 5)
					{
						state = 3;
						ArmRef->GotoShooting();
					}
					break;
				case 3 :
					if(fabs(ArmRef->GetLifterEncoder() - Preset_Arm_Far_Shot) <= 20)
					{
						PresetTimer->Reset();
						PresetTimer->Start();
						state = 4;
					}
					break;
				case 4 :
					if(PresetTimer->Get() > 10)
					{
						state = 5;
						ArmRef->ArmPIDController->Disable();
						//	IntakeRef->LiftPIDController->Disable();
						ArmRef->TurretPIDController->Disable();
						transitioning = false;

					}
					break;
			}
		}
		else if(currentMode == RobotMode::Defensive)
		{
			switch(state)
			{
				case 0 :
					IntakeRef->LiftPIDController->Enable();
					//Reset Intske
					ArmRef->ArmPIDController->Reset();
					ArmRef->ArmPIDController->Enable();
					IntakeRef->GotoIntake();
					state = 1;
					break;
				case 1 :
					//Reset Turret and wait Intake
					if(fabs(IntakeRef->GetLiftEncoder() - Preset_Intake_Intake) <= 20)
					{
						state = 2;
						ArmRef->SetArm(Preset_Arm_Defense);
					}
					break;
				case 2 :
					if(fabs(ArmRef->GetLifterEncoder()-Preset_Arm_Defense) <= 200)
					{
						IntakeRef->GotoDefense();
						ArmRef->ArmPIDController->Disable();
						state = 3;

					}
					break;
				case 3:
					if(fabs(IntakeRef->GetLiftEncoder() - Preset_Intake_Defense) <= 20)
					{
						IntakeRef->LiftPIDController->Disable();
						state = 4;
						transitioning = false;
					}
					break;
			}
		}
		else if(currentMode == RobotMode::TowerShot)
		{
			switch(state)
			{
				case 0 :
					IntakeRef->LiftPIDController->Enable();
					ArmRef->ArmPIDController->Enable();
					//Move Intake to Intake position
					IntakeRef->GotoIntake();
					state = 1;
					break;
				case 1 :
					//Reset Turret
					if(fabs(IntakeRef->GetLiftEncoder()-Preset_Intake_Intake) <= 20)
					{
						state = 2;
						ArmRef->ResetTurret();
						transitioning = 2;
					}
					break;
				case 2 :
					//Move Arm to Tower Shot
					if(fabs(IntakeRef->GetLiftEncoder()-Preset_Intake_Intake) <= 20)
					{
						state = 3;
						ArmRef->GotoTowerShot();
						transitioning = 3;
					}
					break;
				case 3 :
					//Reset PID Controllers
					if(fabs(ArmRef->GetLifterEncoder() - Preset_Arm_Tower_Shot) <= -1870)
					{
						state = 4;
						IntakeRef->LiftPIDController->Disable();
						ArmRef->ArmPIDController->Disable();
						transitioning = false;
					}
					break;
				}
			}
		/*else if(currentMode == RobotMode::EndGame)
			{
				switch(state)
				{
					case 0 :
						//Reset Intske
						IntakeRef->GotoFloor();
						state = 1;
						break;
					case 1 :
						//Reset Turret and wait Intake
						if(fabs(IntakeRef->GetLiftEncoder()) <= 20)
						{
							state = 2;
							ArmRef->SetArm(5000);
						}

						break;
					case 2 :
						if(fabs(ArmRef->GetLifterEncoder()-5000) <= 200)
						{
							IntakeRef->GotoDefense();
							state = 3;
							transitioning = false;
						}
				}


			}
			*/


	}
}
Пример #12
0
			HTTPProxyHandler(HTTPProxyServer * parent, std::shared_ptr<boost::asio::ip::tcp::socket> sock) : 
				I2PServiceHandler(parent), m_sock(sock)
				{ EnterState(GET_METHOD); }