/* Cut cwnd and enter fast recovery mode upon triple dupack */
void
TcpNewReno::DupAck (const TcpHeader& t, uint32_t count)
{
  NS_LOG_FUNCTION (this << count);
  if (count == m_retxThresh && !m_inFastRec)
    { // triple duplicate ack triggers fast retransmit (RFC2582 sec.3 bullet #1)
      m_ssThresh = std::max (2 * m_segmentSize, BytesInFlight () / 2);
      m_cWnd = m_ssThresh + 3 * m_segmentSize;
      m_recover = m_highTxMark;
      m_inFastRec = true;
      NS_LOG_INFO ("Triple dupack. Enter fast recovery mode. Reset cwnd to " << m_cWnd <<
                   ", ssthresh to " << m_ssThresh << " at fast recovery seqnum " << m_recover);
      DoRetransmit ();
    }
  else if (m_inFastRec)
    { // Increase cwnd for every additional dupack (RFC2582, sec.3 bullet #3)
      m_cWnd += m_segmentSize;
      NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd);
      SendPendingData (m_connected);
    }
  else if (!m_inFastRec && m_limitedTx && m_txBuffer.SizeFromSequence (m_nextTxSequence) > 0)
    { // RFC3042 Limited transmit: Send a new packet for each duplicated ACK before fast retransmit
      NS_LOG_INFO ("Limited transmit");
      uint32_t sz = SendDataPacket (m_nextTxSequence, m_segmentSize, true);
      m_nextTxSequence += sz;                    // Advance next tx sequence
    };
}
Beispiel #2
0
UINT32 cmd_process_monitor(unsigned int argc, unsigned char *argv[])
{
	UINT32 data[6 * 2];
	UINT32 i, j = 0x00000003;
	UINT32 ptm = osal_get_tick();

	MEMSET(data, 0, sizeof(data));
	pan_display(g_pan_dev, "Pdon", 4); // done, all ok!

	for(i = 0; i<6; i++)
	{
		UINT32 pm_finish = 0;
		UINT32 pm2_finish = 0;
		*((volatile UINT32 *)0xb8000300) = (j|i<<16);
		while(1)
		{
			pm_finish = *((volatile UINT32 *)0xb8000304);
			pm2_finish = *((volatile UINT32 *)0xb800030c);
			if(1==(pm_finish&0x1)&&1==(pm2_finish&0x1))
				break;
//			if((osal_get_tick()-ptm) > 2000)
				break;
			osal_task_sleep(1);
		}
		data[2  * i] = pm_finish>>16;
		data[2  * i + 1] = pm2_finish>>16;
		//libc_printf("PM_COUNT:  \t=\t 0x%04x,  \tPM_SEL =  \t%d\n", pm_finish>>16, i);
		//libc_printf("PM_COUNT2: \t=\t 0x%04x,  \tPM_SEL2 =  \t%d\n", pm2_finish>>16, i);
		*((volatile UINT32 *)0xb8000300) = 0;
	}
	
	SendDataPacket(0, (unsigned char *)data, sizeof(data));	
	return 0;
}
void ProtocolTest1()
{
#if defined(IS_ROUTER)
#if PROFILE_TEST_SERVICE == true
    double executionTime;
    Uint32 startTime;
#endif
    struct Packet newPacket;
    Uint16 x[100], i, j;

    for(i = 0; i < 100; i++)
        x[i] = i;

    TSK_sleep(3000);

    if(gpioDataRegisters.GPBDAT.bit.SWITCH1)
    {
        for(i = 0; i < 100; i++)
        {
            for(j = 0; j < 50; j++)
            {
                InitializePacket(&newPacket, PACKET_ID_UNDEFINED);

                // Create the data transfer packet
                newPacket.a.communicationType = COMM_TYPE_UNICAST;
                newPacket.transmissionInfo.destination = ROOT_ADDRESS;
                newPacket.b.command = COMMAND_DATA_TRANSFER;
                newPacket.b.packetSequenceStep = SEQUENCE_DATA_TRANSFER_REQUEST_TRANSFER;

                // Set the data
                newPacket.dataBuffer = x;
                newPacket.dataBufferInfo.dataBufferLength = 100;

#if PROFILE_TEST_SERVICE == true
                startTime = timer0Registers.TIM.all;
#endif
                SendDataPacket(&newPacket);
                while(globals.statistics.packet.numDataTransfersSucceeded + globals.statistics.packet.numDataTransfersExpired +
                        globals.statistics.packet.numDataTransfersFailed < globals.statistics.packet.numDataTransfersSetup);

#if PROFILE_TEST_SERVICE == true
                executionTime = TimeDifference(startTime, timer0Registers.TIM.all);
                globals.statistics.profiling.avgTestServiceTime =
                    (globals.statistics.profiling.avgTestServiceTime * globals.statistics.profiling.numTestServiceSamples) + executionTime;
                globals.statistics.profiling.numTestServiceSamples++;
                globals.statistics.profiling.avgTestServiceTime /= globals.statistics.profiling.numTestServiceSamples;
                if(executionTime < globals.statistics.profiling.minTestServiceTime)
                    globals.statistics.profiling.minTestServiceTime = executionTime;
                else if(executionTime > globals.statistics.profiling.maxTestServiceTime)
                    globals.statistics.profiling.maxTestServiceTime = executionTime;
#endif
            }
            SetSevenSegmentDisplay(i);
        }
    }
#endif
}
Beispiel #4
0
int	SendNullPacket (SourceVChan_type* srcVChan, char** errorMsg)
{
	DataPacket_type*	nullPacket = NULL;
	
	return SendDataPacket(srcVChan, &nullPacket, FALSE, errorMsg);
}
void ProtocolTest3()
{
#if PROFILE_TEST_SERVICE == true
    double executionTime;
    Uint32 startTime;
#endif
    struct Packet newPacket;
    Uns interruptStatus;
    Uint16 x[100], i, j, destination;
    double executionTime = 0;
    double avgTime[9] = {0,0,0,0,0,0,0,0,0};
    double minTime[9] = {DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX,DBL_MAX};
    double maxTime[9] = {DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN,DBL_MIN};
    Uint32 startTime = 0;
    Uint32 numSamples;

    SEM_pend(&TestServiceSem,SYS_FOREVER);

    for(i = 0; i < 100; i++)
        x[i] = i;

    if(globals.protocol.address == 1)
    {
        globals.processing.sevenSegmentUpperDigit = SEVENSEG_1DASH;

        destination = (gpioDataRegisters.GPBDAT.bit.SWITCH1 << 3) + (gpioDataRegisters.GPBDAT.bit.SWITCH2 << 2) +
                      (gpioDataRegisters.GPADAT.bit.SWITCH3 << 1) + (gpioDataRegisters.GPADAT.bit.SWITCH4);

        interruptStatus = HWI_disable();
        numSamples = 0;
        for(j = 0; j < 100; j++)
        {
            startTime = timer0Registers.TIM.all;
            GenerateRoutingPath(globals.protocol.address, 1, &newPacket);
            executionTime = TimeDifference(startTime, timer0Registers.TIM.all);
            avgTime[1] = (avgTime[1] * numSamples) + executionTime;
            numSamples++;
            avgTime[1] /= numSamples;
            if(executionTime < minTime[1])
                minTime[1] = executionTime;
            else if(executionTime > maxTime[1])
                maxTime[1] = executionTime;
        }
        for(i = 3; i <= 8; i++)
        {
            numSamples = 0;
            for(j = 0; j < 100; j++)
            {
                startTime = timer0Registers.TIM.all;
                GenerateRoutingPath(globals.protocol.address, i, &newPacket);
                executionTime = TimeDifference(startTime, timer0Registers.TIM.all);
                avgTime[i] = (avgTime[i] * numSamples) + executionTime;
                numSamples++;
                avgTime[i] /= numSamples;
                if(executionTime < minTime[i])
                    minTime[i] = executionTime;
                else if(executionTime > maxTime[i])
                    maxTime[i] = executionTime;
            }
        }
        HWI_restore(interruptStatus);
        asm(" NOP");

        for(i = 0; i < 100; i++)
        {
            for(j = 0; j < 50; j++)
            {
                InitializePacket(&newPacket, PACKET_ID_UNDEFINED);

                // Create the data transfer packet
                newPacket.a.communicationType = COMM_TYPE_UNICAST;
                newPacket.transmissionInfo.destination = 7;
                newPacket.b.command = COMMAND_DATA_TRANSFER;
                newPacket.b.packetSequenceStep = SEQUENCE_DATA_TRANSFER_REQUEST_TRANSFER;

                // Set the data
                newPacket.dataBuffer = x;
                newPacket.dataBufferInfo.dataBufferLength = 10;

                SendDataPacket(&newPacket);

                InitializePacket(&newPacket, PACKET_ID_UNDEFINED);

                // Create the data transfer packet
                newPacket.a.communicationType = COMM_TYPE_UNICAST;
                newPacket.transmissionInfo.destination = 8;
                newPacket.b.command = COMMAND_DATA_TRANSFER;
                newPacket.b.packetSequenceStep = SEQUENCE_DATA_TRANSFER_REQUEST_TRANSFER;

                // Set the data
                newPacket.dataBuffer = x;
                newPacket.dataBufferInfo.dataBufferLength = 10;

                SendDataPacket(&newPacket);

                while(globals.statistics.packet.numDataTransfersSucceeded + globals.statistics.packet.numDataTransfersExpired +
                        globals.statistics.packet.numDataTransfersFailed < globals.statistics.packet.numDataTransfersSetup);

            }
            if(globals.processing.sevenSegmentUpperDigit == SEVENSEG_2DASH)
                globals.processing.sevenSegmentUpperDigit = SEVENSEG_1DASH;
            else
                globals.processing.sevenSegmentUpperDigit = SEVENSEG_2DASH;
        }
        globals.processing.sevenSegmentUpperDigit = SEVENSEG_3DASH;
    }
}
Beispiel #6
0
/**@brief Application main function.
 */
int main(void)
{
		/*
		beginning of Initializing services for the Nordic Board	
		
		
		*/
    uint32_t err_code;
    bool erase_bonds;
		//print start string to terminal
    uint8_t  start_string[] = START_STRING;
    printf("%s",start_string);
    // Initialize timer.
    APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);
		nrf_drv_gpiote_init();
    uart_init();
    //buttons_leds_init(&erase_bonds);
    ble_stack_init();
        
    gap_params_init();
    services_init();
    advertising_init();
    conn_params_init();

    err_code = ble_advertising_start(BLE_ADV_MODE_FAST);

    APP_ERROR_CHECK(err_code);
		
      //More SPI Additions
         nrf_drv_spi_config_t const config =
    {
        #if (SPI0_ENABLED == 1)
            .sck_pin  = SPIM0_SCK_PIN,
            .mosi_pin = SPIM0_MOSI_PIN,
            .miso_pin = SPIM0_MISO_PIN,
            .ss_pin   = SPIM0_SS_PIN,
        #elif (SPI1_ENABLED == 1)
            .sck_pin  = SPIM1_SCK_PIN,
            .mosi_pin = SPIM1_MOSI_PIN,
            .miso_pin = SPIM1_MISO_PIN,
            .ss_pin   = SPIM1_SS_PIN,
        #elif (SPI2_ENABLED == 1)
            .sck_pin  = SPIM2_SCK_PIN,
            .mosi_pin = SPIM2_MOSI_PIN,
            .miso_pin = SPIM2_MISO_PIN,
            .ss_pin   = SPIM2_SS_PIN,
        #endif
        .irq_priority = APP_IRQ_PRIORITY_LOW,
        .orc          = 0xCC,
        .frequency    = NRF_DRV_SPI_FREQ_1M,
        .mode         = NRF_DRV_SPI_MODE_0,
        .bit_order    = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST,
    };
    ret_code_t err_code1 = nrf_drv_spi_init(&m_spi_master, &config, spi_master_event_handler);
    APP_ERROR_CHECK(err_code1);
		
		/*
		
		End of Initializing services for the Nordic Board	
		
		Beginning of CC1101 initializing.
		
		*/

    CC1101_Init();
		
		
		// Enter main loop.
		for (;;)
    {	
			//
			//for setting in receive mode
			//
			RecvDataPacket();
			SEGGER_RTT_WriteString(0,"RX data:");
			for(uint32_t i = 0; i<8;i++){
				SEGGER_RTT_printf(0,"%x",m_rx_data[i]);
			}
			SEGGER_RTT_WriteString(0,"\n");
            
			//
			//for sending data that was recieved from the BTLE event			
			//
       if(m_transfer_completed & newData)
       {
				m_transfer_completed = false;
        newData = false;
				SendDataPacket(txt_data, strlen((char *) txt_data) + 1);//Additional byte (5+1) is header byte
        nrf_delay_ms(1);
                    
       }
                
    }
}
void CC1101_Init(void){
	
	//sequence of SS pin on/off to indicate we are going to reset the system
	
	nrf_gpio_pin_clear(SPIM0_SS_PIN);
	nrf_delay_ms(1);
	nrf_gpio_pin_set(SPIM0_SS_PIN);
	nrf_delay_ms(1);
	nrf_gpio_pin_clear(SPIM0_SS_PIN);
	
	//strobe CC1101 reset
	uint8_t SRES = 0x30;
	SpiStrobe(SRES);	
	nrf_delay_ms(5);
	
	//calibrate CC1101
	CC1101_Calibrate();
	nrf_delay_ms(1);
	
}