Esempio n. 1
0
bool DummyStorageLink::onDown(const api::StorageMessage::SP& cmd)
{
    if (_ignore) {
        return false;
    }
    if (_injected.size() > 0) {
        vespalib::LockGuard guard(_lock);
        sendUp(*_injected.begin());
        _injected.pop_front();
    } else if (_autoReply) {
        if (!cmd->getType().isReply()) {
            std::shared_ptr<api::StorageReply> reply(
                    std::dynamic_pointer_cast<api::StorageCommand>(cmd)
                    ->makeReply().release());
            reply->setResult(api::ReturnCode(
                    api::ReturnCode::OK, "Automatically generated reply"));
            sendUp(reply);
        }
    }
    if (isBottom()) {
        vespalib::MonitorGuard lock(_waitMonitor);
        {
            vespalib::LockGuard guard(_lock);
            _commands.push_back(cmd);
        }
        lock.broadcast();
        return true;
    }
    return StorageLink::onDown(cmd);
}
void CsmaAloha::stateRxData(Packet* data_pkt) {
    refreshState( CSMA_STATE_DATA_RX );

    if (debug_) cout << NOW << "  CsmaAloha("<< addr << ")::stateRxData() in state " << status_info[curr_state] << endl;
    refreshReason( CSMA_REASON_DATA_RX );

    hdr_mac* mach = HDR_MAC(data_pkt);
    int dst_addr = mach->macSA();

    switch( prev_state ) {

    case CSMA_STATE_RX_IDLE: {
        hdr_cmn* ch = hdr_cmn::access(data_pkt);
        ch->size() = ch->size() - HDR_size;
        incrDataPktsRx();
        sendUp(data_pkt);

        if (ack_mode == CSMA_ACK_MODE) stateTxAck(dst_addr);
        else stateIdle();
    }
    break;

    case CSMA_STATE_RX_LISTEN: {
        hdr_cmn* ch = hdr_cmn::access(data_pkt);
        ch->size() = ch->size() - HDR_size;
        incrDataPktsRx();
        sendUp(data_pkt);

        if (ack_mode == CSMA_ACK_MODE) stateTxAck(dst_addr);
        else stateCheckListenExpired();
    }
    break;

    case CSMA_STATE_RX_BACKOFF: {
        hdr_cmn* ch = hdr_cmn::access(data_pkt);
        ch->size() = ch->size() - HDR_size;
        incrDataPktsRx();
        sendUp(data_pkt);
        if (ack_mode == CSMA_ACK_MODE) stateTxAck(dst_addr);
        else stateCheckBackoffExpired();
    }
    break;


    default:

        cerr << NOW << " CsmaAloha("<< addr << ")::stateRxData() logical error, prev state = " << status_info[prev_state]
             << endl;

    }
}
LONGBOW_TEST_CASE(Dictionary, component_Codec_Tlv_Upcall_Read_Control)
{
    TestData *data = longBowTestCase_GetClipBoardData(testCase);

    PARCBuffer *wireFormat = parcBuffer_Wrap(v1_cpi_add_route_crc32c, sizeof(v1_cpi_add_route_crc32c),
                                             0, sizeof(v1_cpi_add_route_crc32c));
    CCNxTlvDictionary *dictionary = ccnxWireFormatMessage_FromControlPacketType(CCNxTlvDictionary_SchemaVersion_V1, wireFormat);
    parcBuffer_Release(&wireFormat);
    
    // We have not set the message type or schema
    TransportMessage *tm = transportMessage_CreateFromDictionary(dictionary);
    transportMessage_SetInfo(tm, data->mock->connection, NULL);
    ccnxTlvDictionary_Release(&dictionary);

    // ------
    // Now do the actual test of sending the transport message up the stack

    TransportMessage *test_tm = sendUp(data, tm);

    // It should now be parsed into an control message
    CCNxTlvDictionary *testdict = transportMessage_GetDictionary(test_tm);
    assertNotNull(testdict, "Failed to get dictionary from the transport message");

    assertTrue(ccnxTlvDictionary_IsControl(testdict), "Dictionary says it is not a Control");
    assertTrue(ccnxTlvDictionary_GetSchemaVersion(testdict) == CCNxTlvDictionary_SchemaVersion_V1,
               "Wrong schema, got %d expected %d",
               ccnxTlvDictionary_GetSchemaVersion(testdict), CCNxTlvDictionary_SchemaVersion_V1);

    transportMessage_Destroy(&tm);
}
void
UwCsmaAloha_Trigger_SINK::stateRxData(Packet *data_pkt)
{
	refreshState(UW_CS_ALOHA_TRIG_SINK_STATE_DATA_RX);
	if (debug_)
		cout << NOW << "  UwCsmaAloha_Trigger_SINK(" << addr
			 << ")::stateRxData() " << endl;
	incrDataPktsRx();
	sendUp(data_pkt);
}
void
UWMllModule::recv(Packet *p, int idSrc)
{
	hdr_cmn *ch = HDR_CMN(p);
	if (ch->direction() == hdr_cmn::UP) {
		sendUp(p);
	} else {
		ch->direction() = hdr_cmn::DOWN;
		sendDown(p);
	}
}
void BlueCoreDeviceController_newStyle::Implementation::checkQueues ()
{
    PDU pdu(null_pdu);
    for ( int i = 0 ; i < PDU::csr_hci_extensions_count ; ++i )
    {
        for ( int j = 0 ; j < 8 && pending[i]->getNextIfAvailable(pdu) ; ++j )
        {
            mConnectionToChip->sendpdu ( pdu );
            if (pdu.channel() == PDU::hciACL)
                aclDataTracker.removeData(pdu);
        }
    }
    // deal with packets coming up...
    for ( int j = 0 ; j < 8 && upstream.get( pdu ) ; ++j )
    {
        PDU::bc_channel ch = pdu.channel();

        switch ( ch )
        {
        case PDU::bccmd:
            pending[PDU::bccmd]->setToken();
            break;
        case PDU::hq :
        {
            if ( HQ_PDU(pdu).get_req_type() == HQPDU_SETREQ )
            {
                HQ_PDU ret ( pdu.clone () );
                ret.set_req_type ( HQPDU_GETRESP );
                pending[PDU::hq]->add(sae(ret,no_call_back));
            }
            break;
        }
        case PDU::hciCommand:
        {
            HCIEventPDU ev ( pdu );
            switch ( ev.get_event_code() )
            {
            case HCI_EV_NUMBER_COMPLETED_PKTS:
            {
                HCI_EV_NUMBER_COMPLETED_PKTS_T_PDU ncp( pdu );
                uint8 count = ncp.get_num_handles();
                for ( uint8 i = 0 ; i < count ; ++i )
                {
                    uint16 handle;
                    uint16 tokens;
                    ncp.get_num_completed_pkts(i,handle,tokens);
                    pending[PDU::hciACL]->incToken(tokens);
                }
            }
                break;
            case HCI_EV_COMMAND_COMPLETE:
            {
                HCICommandCompletePDU cc (pdu);
                pending[PDU::hciCommand]->setToken(cc.get_num_hci_command_pkts() );
                switch(cc.get_op_code())
                {
                case HCI_READ_VOICE_SETTING:
                {
                    HCI_READ_VOICE_SETTING_RET_T_PDU rvs(pdu);
                    if ( rvs.get_status() == HCI_SUCCESS )
                    {
                        bool is_it_16 = (rvs.get_voice_setting()
                                       & HCI_VOICE_SAMP_SIZE_MASK)
                                      == HCI_VOICE_SAMP_SIZE_16BIT;
                        scoBandwidthTracker.set_audio_sample_size ( is_it_16 ? 16 : 8 );
                    }
                }
                    break;
                case HCI_READ_BUFFER_SIZE:
                    if ( !initialised_ACL_flow_control )
                    {
                        HCI_READ_BUFFER_SIZE_RET_T_PDU rbs ( pdu );
                        if ( rbs.get_status() == HCI_SUCCESS )
                        {
                            initialised_ACL_flow_control = true;
                            pending[PDU::hciACL]->setToken ( rbs.get_total_acl_data_pkts() );
                        }
                    }
                    break;
                }
            }
                break;
            case HCI_EV_COMMAND_STATUS:
            {
                HCI_EV_COMMAND_STATUS_T_PDU cc (pdu);
                pending[PDU::hciCommand]->setToken(cc.get_num_hci_command_pkts() );
                if (cc.get_op_code() == HCI_ADD_SCO_CONNECTION
                 && cc.get_status() != HCI_COMMAND_CURRENTLY_PENDING )
                {
                    getTransport()->set_sco_bandwidth(scoBandwidthTracker.decrease());
                }
            }
                break;
            case HCI_EV_CONN_COMPLETE:
            {
                HCI_EV_CONN_COMPLETE_T_PDU cc(pdu);
                if (cc.get_status() == HCI_SUCCESS)
                {
                    if (cc.get_link_type() == HCI_LINK_TYPE_ACL)
                        aclDataTracker.addConnection(cc.get_handle());
                    else
                    {
                        // sco or esco.  This will glitch if we were the initiating end.
                        getTransport()->set_sco_bandwidth(scoBandwidthTracker.consolidate(cc.get_handle()));
                    }
                }
                else
                {
                    if (cc.get_link_type() == HCI_LINK_TYPE_SCO)
                    {
                        getTransport()->set_sco_bandwidth(scoBandwidthTracker.decrease());
                    }
                }
            }
                break;
            case HCI_EV_DISCONNECT_COMPLETE:
            {
                HCI_EV_DISCONNECT_COMPLETE_T_PDU dc(pdu);
                if ( dc.get_status() == HCI_SUCCESS )
                {
                    uint16 h = dc.get_handle();
                    if (aclDataTracker.usingConnection(h))
                        aclDataTracker.removeConnection(h);
                    else
                    {
                        // sco or esco
                        getTransport()->set_sco_bandwidth(scoBandwidthTracker.decrease(h));
                    }
                }
            }
                break;
            case HCI_EV_SYNC_CONN_COMPLETE:
            {
                HCI_EV_SYNC_CONN_COMPLETE_T_PDU scc(pdu);
                if ( scc.get_status() == HCI_SUCCESS )
                {
                    // sco or esco.  This will glitch if we were the initiating end.
                    getTransport()->set_sco_bandwidth(scoBandwidthTracker.consolidate(scc.get_handle()));
                }
                else
                    scoBandwidthTracker.decrease();
            }
                break;
            case HCI_EV_LOOPBACK_COMMAND:
                // we just had a command loop back, so allow us to send another.
                pending[PDU::hciCommand]->setToken(1);
                break;
            default:
                break;
            }
            break;
        }
        default:
            break;
        }

        if ( !pending[ch]->run_callback(pdu) )
            mReceiver.onPDU ( pdu );
        //  some stuff should be passed up... HQ and HCI only?
        if ( mConnectionOnOffer )
        {
            switch ( ch )
            {
            case PDU::hq:
            case PDU::hciCommand:
            case PDU::hciACL:
            case PDU::hciSCO:
                (void)sendUp ( pdu );
                break;
            default:
                // do nothing
                break;
            }
        }
    }
    //  accept requests from higher layers on all channels.
    for ( int k = 0 ; k < 8 && downstream.get( pdu ) ; ++k )
    {
        switch ( pdu.channel() )
        {
        case PDU::hciCommand:
        case PDU::hciACL:
        case PDU::hciSCO:
            (void)send ( sae ( pdu , perm_no_pass ) , true );
            break;
        default:
            (void)send ( sae ( pdu , perm_pass_up ) , true );
            break;
        }
    }
}