void CsmaAloha::stateIdle() {
    ack_timer.stop();
    backoff_timer.stop();
    listen_timer.stop();
    resetSession();

    refreshState(CSMA_STATE_IDLE);

    if (print_transitions) printStateInfo();

    if (debug_) cout << NOW << "  CsmaAloha("<< addr << ")::stateIdle() queue size = " << Q.size() << endl;

    if ( !Q.empty() ) {
        refreshReason(CSMA_REASON_LISTEN);
        stateListen();
    }
}
void CsmaAloha::recvFromUpperLayers(Packet* p)
{
    if ( ((has_buffer_queue == true) && (Q.size() < buffer_pkts)) || (has_buffer_queue == false) )
    {
        initPkt(p , CSMA_DATA_PKT);
        Q.push(p);
        incrUpperDataRx();
        waitStartTime();

        if ( curr_state == CSMA_STATE_IDLE )
        {
            refreshReason(CSMA_REASON_DATA_PENDING);
            stateListen();
        }
    }
    else {
        incrDiscardedPktsTx();
        drop(p, 1, CSMA_DROP_REASON_BUFFER_FULL);
    }
}
void CsmaAloha::stateCheckListenExpired() {
    refreshState(CSMA_STATE_CHK_LISTEN_TIMEOUT);

    if (debug_) cout << NOW << "  CsmaAloha("<< addr << ")::stateCheckListenExpired()" << endl;
    if (print_transitions) printStateInfo();
    if ( listen_timer.isActive() ) {
        refreshReason( CSMA_REASON_LISTEN_PENDING );
        refreshState( CSMA_STATE_LISTEN );
    }
    else if ( listen_timer.isExpired() ) {
        refreshReason( CSMA_REASON_LISTEN_TIMEOUT );
        if ( !( prev_state == CSMA_STATE_TX_ACK || prev_state == CSMA_STATE_WRONG_PKT_RX
                || prev_state == CSMA_STATE_ACK_RX || prev_state == CSMA_STATE_DATA_RX ) ) stateTxData();
        else stateListen();
    }
    else {
        cerr << NOW << "  CsmaAloha("<< addr << ")::stateCheckListenExpired() listen_timer logical error, current timer state = "
             << status_info[curr_state] << endl;
        stateIdle();
    }
}
Example #4
0
/* P2P discovery finite state machine */
static void fsm(bcm_p2p_discovery_t *disc, eventT event)
{
	WL_P2PO(("--------------------------------------------------------\n"));
	WL_P2PO(("current state=%s event=%s\n",
		state_str[disc->state], event_str[event]));

	switch (disc->state) {
	case STATE_IDLE:
		state_idle(disc, event);
		break;
	case STATE_SCAN:
		stateScan(disc, event);
		break;
	case STATE_LISTEN:
		stateListen(disc, event);
		break;
	case STATE_SEARCH:
		stateSearch(disc, event);
		break;
	case STATE_EXT_LISTEN_ON:
		stateExtListenOn(disc, event);
		break;
	case STATE_EXT_LISTEN_OFF:
		stateExtListenOff(disc, event);
		break;
	default:
		WL_ERROR(("invalid state %d\n", disc->state));
		break;
	}

	/* transition to next state */
	if (disc->state != disc->nextState) {
		WL_P2PO(("state change %s -> %s\n",
			state_str[disc->state], state_str[disc->nextState]));
		disc->state = disc->nextState;
	}

	WL_P2PO(("--------------------------------------------------------\n"));
}