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(); } }
/* 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")); }