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