626 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			626 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | ||
|  | be copied by any method or incorporated into another program without | ||
|  | the express written consent of Aerospace C.Power. This Information or any portion | ||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | ||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | ||
|  | liability for its use in any way and conveys no license or title under | ||
|  | any patent or copyright and makes no representation or warranty that this | ||
|  | Information is free from patent or copyright infringement. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | 
 | ||
|  | #include "os_utils_api.h"
 | ||
|  | 
 | ||
|  | #include "iot_io.h"
 | ||
|  | 
 | ||
|  | #include "iot_cli_host_interface.h"
 | ||
|  | #include "iot_cli_plc_module.h"
 | ||
|  | #include "iot_cli_rate_test.h"
 | ||
|  | #include "iot_cli_msg.h"
 | ||
|  | #include "iot_cli_plc_tx_rx.h"
 | ||
|  | 
 | ||
|  | #if IOT_CLI_RATE_TEST_EN
 | ||
|  | 
 | ||
|  | iot_plc_host_rate_test_t *rate_test_info = NULL; | ||
|  | extern iot_plc_host_config_t *host_config; | ||
|  | extern iot_cli_host_info_t *host_info; | ||
|  | extern iot_cli_t cli; | ||
|  | 
 | ||
|  | /* timer for rate test timer */ | ||
|  | static void iot_cli_rate_test_timer(timer_id_t timer_id, void *arg) | ||
|  | { | ||
|  |     (void)timer_id; | ||
|  |     (void)arg; | ||
|  | 
 | ||
|  |     iot_task_msg_t *msg; | ||
|  |     msg = iot_cli_create_cli_msg(IOT_CLI_RATE_TEST_TIMER, NULL); | ||
|  | 
 | ||
|  |     if (msg) { | ||
|  |         iot_task_queue_msg(cli.cli_task_h, msg, IOT_CLI_QUEUE_TIMER); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  | static void iot_cli_rate_test_send_start_param() | ||
|  | { | ||
|  |     cli_host_rate_test_param param; | ||
|  | 
 | ||
|  |     param.downlink = rate_test_info->downlink; | ||
|  |     param.msdu_size = rate_test_info->msdu_size; | ||
|  |     param.send_rate = rate_test_info->send_rate; | ||
|  |     param.test_duration = rate_test_info->test_duration; | ||
|  |     param.test_id = rate_test_info->test_id; | ||
|  | 
 | ||
|  |     iot_printf("send rate test start to sta, downlink %d, msdu size %d," | ||
|  |         " rate %d, duration %d\n", param.downlink, param.msdu_size, | ||
|  |         param.send_rate, param.test_duration); | ||
|  | 
 | ||
|  |     iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |         CLI_MSGID_RATE_START, rate_test_info->dst, | ||
|  |         (uint8_t*)¶m, sizeof(cli_host_rate_test_param)); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | static void cli_send_rate_test_packet() | ||
|  | { | ||
|  |     iot_pkt_t *test_pkt = NULL; | ||
|  |     uint32_t data_len = IOT_PLC_RATE_TEST_HEADER_SIZE; | ||
|  | 
 | ||
|  |     IOT_ASSERT(rate_test_info); | ||
|  | 
 | ||
|  |     if (rate_test_info->msdu_size > data_len) { | ||
|  |         data_len = rate_test_info->msdu_size - data_len; | ||
|  |     } else { | ||
|  |         data_len = rate_test_info->msdu_size; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (data_len < sizeof(cli_host_test_rate_packet)) { | ||
|  |         data_len = sizeof(cli_host_test_rate_packet); | ||
|  |     } | ||
|  | 
 | ||
|  |     test_pkt = iot_cli_create_pkt_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |         IOT_PLC_LOCAL_RETRY_CNT, CLI_MODULEID_HOSTINTERFACE, | ||
|  |         CLI_MSGID_RATE_TEST, NULL, rate_test_info->dst, rate_test_info->dst, | ||
|  |         data_len); | ||
|  | 
 | ||
|  |     if (test_pkt != NULL) { | ||
|  |         uint8_t *ptr = iot_pkt_block_ptr(test_pkt, IOT_PKT_BLOCK_TAIL); | ||
|  |         cli_host_test_rate_packet * rate_test_pkt = | ||
|  |             (cli_host_test_rate_packet *)ptr; | ||
|  |         if (rate_test_pkt) { | ||
|  |             rate_test_pkt->packet_idx = rate_test_info->send_packet_idx; | ||
|  |             rate_test_pkt->test_id = rate_test_info->test_id; | ||
|  |             rate_test_pkt->test_duration = rate_test_info->test_duration; | ||
|  |         } | ||
|  | 
 | ||
|  |         iot_printf("send rate test packet, idx %d, test id %d\n", | ||
|  |             rate_test_pkt->packet_idx, rate_test_pkt->test_id); | ||
|  | 
 | ||
|  |         for (uint32_t i = sizeof(cli_host_test_rate_packet); i < data_len; i++) | ||
|  |         { | ||
|  |             ptr[i] = (uint8_t)os_rand(); | ||
|  |         } | ||
|  | 
 | ||
|  |         iot_pkt_put(test_pkt, data_len); | ||
|  |         iot_plc_send_msdu(host_config->app_handle, test_pkt); | ||
|  | 
 | ||
|  |         rate_test_info->send_packet_idx++; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | static void cli_send_rate_test_result( | ||
|  |     uint8_t downlink, uint8_t *mac, uint8_t *dest_mac) | ||
|  | { | ||
|  |     cli_host_test_rate_result result; | ||
|  |     result.test_id = rate_test_info->test_id; | ||
|  |     result.downlink = downlink; | ||
|  |     result.recv_pkts = rate_test_info->recv_packets; | ||
|  |     iot_mac_addr_cpy(result.dst, mac); | ||
|  | 
 | ||
|  |     iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |         CLI_MSGID_RATE_TEST_RESP, dest_mac, | ||
|  |         (uint8_t*)&result, sizeof(cli_host_test_rate_result)); | ||
|  | } | ||
|  | 
 | ||
|  | /* rate test timer handler */ | ||
|  | void iot_cli_rate_test_handle_timer_msg() | ||
|  | { | ||
|  |     switch (rate_test_info->rate_test_state) | ||
|  |     { | ||
|  |     case IOT_PLC_RATE_TEST_SENDER: | ||
|  |         rate_test_info->ticks_count++; | ||
|  |         // sta stop sending timer when no reply for more than 5s
 | ||
|  |         if ((IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) && | ||
|  |             (!rate_test_info->test_duration)) { | ||
|  |             if (0 == | ||
|  |                 (rate_test_info->ticks_count % IOT_PLC_RATE_TEST_MAX_TICKS)) { | ||
|  |                 if (rate_test_info->rate_test_result) { | ||
|  |                     rate_test_info->rate_test_result = 0; | ||
|  |                 } else { | ||
|  |                     iot_printf("sta stop sending rate " | ||
|  |                         "test packets since no reply\n"); | ||
|  |                     if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                         os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |                     } | ||
|  |                 } | ||
|  |                 rate_test_info->ticks_count = 0; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         for (uint16_t i = 0; i < rate_test_info->pakcets_per_second; i++) { | ||
|  |             cli_send_rate_test_packet(); | ||
|  |         } | ||
|  | 
 | ||
|  |         // stop test when duration hit
 | ||
|  |         if (rate_test_info->test_duration) { | ||
|  |             if (0 == (rate_test_info->ticks_count % | ||
|  |                 (rate_test_info->test_duration / IOT_PLC_RATE_TEST_INTERVAL))) { | ||
|  |                 iot_printf("stop sending rate test packet" | ||
|  |                     " since duration expired\n"); | ||
|  |                 if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                     os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         break; | ||
|  |     case IOT_PLC_RATE_TEST_RECVER: | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |         if (IOT_PLC_DEV_ROLE_CCO == host_config->dev_role) { | ||
|  |             if (!rate_test_info->recv_packets) { | ||
|  |                 rate_test_info->ticks_count++; | ||
|  |                 if (0 == | ||
|  |                     (rate_test_info->ticks_count % | ||
|  |                         IOT_PLC_RATE_TEST_MAX_TICKS)) { | ||
|  |                         //send start cmd to sta
 | ||
|  |                     iot_cli_rate_test_send_start_param(); | ||
|  |                     rate_test_info->ticks_count = 0; | ||
|  |                 } | ||
|  |             } else if(rate_test_info->test_duration) { | ||
|  |                 rate_test_info->ticks_count = 0; | ||
|  |                 rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_IN_TEST; | ||
|  |             } | ||
|  |         } | ||
|  | #endif
 | ||
|  |         break; | ||
|  |     case IOT_PLC_RATE_TEST_IN_TEST: | ||
|  |         rate_test_info->ticks_count++; | ||
|  |         if (rate_test_info->ticks_count > | ||
|  |             (rate_test_info->test_duration / IOT_PLC_RATE_TEST_INTERVAL)) { | ||
|  |             if (0 == (rate_test_info->ticks_count % | ||
|  |                 (rate_test_info->test_duration / | ||
|  |                 (IOT_PLC_RATE_TEST_INTERVAL * 5)))) { | ||
|  |                 iot_printf("send rate test result in completed state\n"); | ||
|  |                 if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |                     cli_send_rate_test_result( | ||
|  |                         1, host_config->mac_addr, host_config->cco_mac); | ||
|  |                 } | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |                 else { | ||
|  |                     cli_send_rate_test_result( | ||
|  |                         0, rate_test_info->dst, rate_test_info->dst); | ||
|  |                 } | ||
|  | #endif
 | ||
|  |             } | ||
|  | 
 | ||
|  |             // report at most 10 times then terminate
 | ||
|  |             if (rate_test_info->ticks_count == | ||
|  |                 (rate_test_info->test_duration / | ||
|  |                     IOT_PLC_RATE_TEST_INTERVAL * 3)) { | ||
|  |                 if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                     os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         break; | ||
|  |     case IOT_PLC_RATE_TEST_STOP: | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |         if (IOT_PLC_DEV_ROLE_CCO == host_config->dev_role) { | ||
|  |             rate_test_info->ticks_count++; | ||
|  |             if (0 == | ||
|  |                 (rate_test_info->ticks_count % IOT_PLC_RATE_TEST_STOP_TICKS)) { | ||
|  |                 cli_host_rate_test_stop stop; | ||
|  |                 iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |                     CLI_MSGID_RATE_STOP, rate_test_info->dst, | ||
|  |                     (uint8_t*)&stop, sizeof(cli_host_rate_test_stop)); | ||
|  |             } | ||
|  |         } | ||
|  | #endif
 | ||
|  |         break; | ||
|  |     default: | ||
|  |         break; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void cli_recv_rate_test_packet( | ||
|  |     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)src_mac; | ||
|  |     cli_host_test_rate_packet * rate_test_pkt = NULL; | ||
|  | 
 | ||
|  |     rate_test_pkt = (cli_host_test_rate_packet *)buffer; | ||
|  | 
 | ||
|  |     IOT_ASSERT(rate_test_pkt); | ||
|  |     IOT_ASSERT(bufferlen >= sizeof(*rate_test_pkt)); | ||
|  | 
 | ||
|  |     if ((rate_test_pkt->test_id == rate_test_info->test_id) && | ||
|  |         ((IOT_PLC_RATE_TEST_STOP == rate_test_info->rate_test_state) || | ||
|  |             ((IOT_PLC_RATE_TEST_IN_TEST == rate_test_info->rate_test_state) && | ||
|  |                 (rate_test_info->ticks_count > rate_test_info->test_duration / | ||
|  |                     IOT_PLC_RATE_TEST_INTERVAL)))) { | ||
|  |         iot_printf("rate test drop packet\n"); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (rate_test_info->test_id != rate_test_pkt->test_id) { | ||
|  |         iot_printf("drop old test %d, start new %d\n", | ||
|  |             rate_test_info->test_id, rate_test_pkt->test_id); | ||
|  |         rate_test_info->test_id = rate_test_pkt->test_id; | ||
|  |         rate_test_info->recv_packets = 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     rate_test_info->recv_packets++; | ||
|  | 
 | ||
|  |     iot_printf("recv rate test packet, idx %d, test id %d, recv packets %d\n", | ||
|  |         rate_test_pkt->packet_idx, rate_test_pkt->test_id, | ||
|  |         rate_test_info->recv_packets); | ||
|  | 
 | ||
|  |     if (!rate_test_pkt->test_duration) { | ||
|  |         rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_RECVER; | ||
|  |         rate_test_info->test_duration = rate_test_pkt->test_duration; | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |         if (IOT_PLC_DEV_ROLE_CCO == host_config->dev_role) { | ||
|  |             // for no duration test, stop cco timer for start sta
 | ||
|  |             if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                 os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |             } | ||
|  |         } | ||
|  | #endif
 | ||
|  |     } else if (rate_test_info->recv_packets == 1) { | ||
|  |         rate_test_info->ticks_count = 0; | ||
|  |         rate_test_info->test_duration = rate_test_pkt->test_duration; | ||
|  |         rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_IN_TEST; | ||
|  |         if (!os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |             os_start_timer(rate_test_info->rate_test_timer, | ||
|  |                 IOT_PLC_RATE_TEST_INTERVAL); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //for no duration, report rate test result per 10 recved packets
 | ||
|  |     if ((!rate_test_info->test_duration) && | ||
|  |         (0 == | ||
|  |         (rate_test_info->recv_packets % IOT_PLC_RATE_TEST_RESULT_TICKS))) { | ||
|  |         if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |             //send test result to cco
 | ||
|  |             iot_printf("sta send downlink rate test result , recv rate %d\n", | ||
|  |                 rate_test_info->recv_packets); | ||
|  |             cli_send_rate_test_result( | ||
|  |                 1, host_config->mac_addr, host_config->cco_mac); | ||
|  |         } | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |         else { | ||
|  |             iot_printf("coo send uplink rate test result, recv rate %d\n", | ||
|  |                 rate_test_info->recv_packets); | ||
|  |             cli_send_rate_test_result( | ||
|  |                 0, rate_test_info->dst, rate_test_info->dst); | ||
|  |         } | ||
|  | #endif
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void cli_recv_rate_test_result( | ||
|  |     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)src_mac; | ||
|  |     cli_host_test_rate_result *result = NULL; | ||
|  | 
 | ||
|  |     result = (cli_host_test_rate_result *)buffer; | ||
|  | 
 | ||
|  |     IOT_ASSERT(result); | ||
|  |     IOT_ASSERT(bufferlen >= sizeof(*result)); | ||
|  | 
 | ||
|  |     iot_printf("recv rate test result, test id %d\n", result->test_id); | ||
|  | 
 | ||
|  |     //if plcmgr connect a 3rd STA
 | ||
|  |     if ((!(iot_mac_addr_valid(rate_test_info->launch_mac)) && | ||
|  |         (!iot_mac_addr_valid(rate_test_info->dst)))){ | ||
|  |         iot_cli_send_to_host(CLI_MSGID_RATE_TEST_RESP, | ||
|  |             (uint8_t*)result, sizeof(cli_host_test_rate_result), NULL); | ||
|  |             return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (IOT_PLC_RATE_TEST_STOP == rate_test_info->rate_test_state) { | ||
|  |         iot_printf("rate test stop\n"); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (result->test_id != rate_test_info->test_id) { | ||
|  |         iot_printf("drop test id not match result current id %d, " | ||
|  |             "result id %d\n", rate_test_info->test_id, result->test_id); | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |         rate_test_info->rate_test_result = 1; | ||
|  |         result->downlink = 0; | ||
|  |         iot_printf("sta recv uplink rate test result , result->recv_pkts %d," | ||
|  |             " rate_test_info->send_packet_idx %d\n", | ||
|  |             result->recv_pkts, rate_test_info->send_packet_idx); | ||
|  |         result->recv_pkts = | ||
|  |             result->recv_pkts * 100 / (rate_test_info->send_packet_idx + 1); | ||
|  | 
 | ||
|  |         iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |             CLI_MSGID_RATE_TEST_RESP, rate_test_info->launch_mac, | ||
|  |             (uint8_t*)result, sizeof(cli_host_test_rate_result)); | ||
|  |     } | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |     else { | ||
|  |         if (result->downlink) { | ||
|  |             if ((IOT_PLC_RATE_TEST_RECVER == | ||
|  |                 rate_test_info->rate_test_state) || | ||
|  |                 (IOT_PLC_RATE_TEST_IN_TEST == | ||
|  |                     rate_test_info->rate_test_state)) { | ||
|  |                 iot_printf("drop test result since new test started\n"); | ||
|  |                 return; | ||
|  |             } | ||
|  |             iot_printf("cco recv downlink rate test result" | ||
|  |                 " , result->recv_pkts %d, rate_test_info->send_packet_idx %d\n", | ||
|  |                 result->recv_pkts, rate_test_info->send_packet_idx); | ||
|  |             result->downlink = 1; | ||
|  |             result->recv_pkts = | ||
|  |                 result->recv_pkts * 100 / (rate_test_info->send_packet_idx + 1); | ||
|  |         } else { | ||
|  |             iot_printf("cco forward uplink rate test result" | ||
|  |                 " , test id %d, recv rate %d\n", | ||
|  |                 result->test_id, result->recv_pkts); | ||
|  |         } | ||
|  |         iot_cli_send_to_host(CLI_MSGID_RATE_TEST_RESP, | ||
|  |             (uint8_t*)result, | ||
|  |             sizeof(cli_host_test_rate_result), | ||
|  |             rate_test_info->launch_mac); | ||
|  |     } | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_start(uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)src_mac; | ||
|  |     cli_host_rate_test_param *param = NULL; | ||
|  | 
 | ||
|  |     param = (cli_host_rate_test_param *)buffer; | ||
|  | 
 | ||
|  |     IOT_ASSERT(param); | ||
|  |     IOT_ASSERT(bufferlen >= sizeof(*param)); | ||
|  | 
 | ||
|  |     IOT_ASSERT(rate_test_info); | ||
|  | 
 | ||
|  |     if (rate_test_info->send_packet_idx) { | ||
|  |         iot_printf("rate test started, drop new test\n"); | ||
|  |     } | ||
|  | 
 | ||
|  |     rate_test_info->downlink = param->downlink; | ||
|  |     rate_test_info->msdu_size = param->msdu_size; | ||
|  |     rate_test_info->send_rate = param->send_rate; | ||
|  |     rate_test_info->test_duration = param->test_duration; | ||
|  |     if (src_mac) | ||
|  |         os_mem_cpy(rate_test_info->launch_mac, src_mac, \ | ||
|  |             sizeof(rate_test_info->launch_mac)); | ||
|  |     else | ||
|  |         os_mem_set(rate_test_info->launch_mac, 0, \ | ||
|  |             sizeof(rate_test_info->launch_mac)); | ||
|  |     if (rate_test_info->test_duration && | ||
|  |         (rate_test_info->test_duration < IOT_PLC_RATE_TEST_DEFAULT_DURATION)) { | ||
|  |         rate_test_info->test_duration = IOT_PLC_RATE_TEST_DEFAULT_DURATION; | ||
|  |     } | ||
|  |     rate_test_info->recv_packets = 0; | ||
|  |     rate_test_info->ticks_count = 0; | ||
|  |     rate_test_info->rate_test_result = 0; | ||
|  |     rate_test_info->send_packet_idx = 0; | ||
|  |     if (!rate_test_info->msdu_size) { | ||
|  |         rate_test_info->msdu_size = IOT_PLC_RATE_TEST_DEFAULT_MSDU_SIZE; | ||
|  |     } | ||
|  |     rate_test_info->pakcets_per_second = | ||
|  |         rate_test_info->send_rate / | ||
|  |         rate_test_info->msdu_size / IOT_PLC_RATE_TEST_TICKS_SECOND; | ||
|  |     if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |         iot_mac_addr_cpy(rate_test_info->dst, host_config->cco_mac); | ||
|  |     } else { | ||
|  |         iot_mac_addr_cpy(rate_test_info->dst, param->dst); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (IOT_PLC_DEV_ROLE_CCO == host_config->dev_role) { | ||
|  |         //cco send stop ack to plc mgr
 | ||
|  |         cli_host_rate_test_param_ack start_ack; | ||
|  |         iot_cli_send_to_host(CLI_MSGID_RATE_START_ACK, | ||
|  |             (uint8_t*)&start_ack, | ||
|  |             sizeof(cli_host_rate_test_param_ack), src_mac); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (rate_test_info->downlink) { | ||
|  |         // create new test id
 | ||
|  |         rate_test_info->test_id++; | ||
|  |         iot_printf("sta start uplink rate test start, test id %d\n", | ||
|  |             rate_test_info->test_id); | ||
|  |         // set state to sender and send rate test packet in timer
 | ||
|  |         rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_SENDER; | ||
|  |     } else if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |         // create new test id
 | ||
|  |         rate_test_info->test_id = param->test_id; | ||
|  |         // set state to sender and send rate test packet in timer
 | ||
|  |         iot_printf("sta start upink rate test start, test id %d\n", | ||
|  |             rate_test_info->test_id); | ||
|  |         rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_SENDER; | ||
|  |     } | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |     else { | ||
|  |         rate_test_info->test_id++; | ||
|  |         iot_printf("cco forward rate test start to sta, test id %d\n", | ||
|  |             rate_test_info->test_id); | ||
|  |         param->test_id = rate_test_info->test_id; | ||
|  |         iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |             CLI_MSGID_RATE_START, param->dst, | ||
|  |             (uint8_t*)param, sizeof(cli_host_rate_test_param)); | ||
|  | 
 | ||
|  |         //set state to recver and start sta in timer
 | ||
|  |         rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_RECVER; | ||
|  |     } | ||
|  | #endif
 | ||
|  | 
 | ||
|  |     //start timer for rate test
 | ||
|  |     if (!os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |         os_start_timer(rate_test_info->rate_test_timer, | ||
|  |             IOT_PLC_RATE_TEST_INTERVAL); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_stop(uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)src_mac; | ||
|  |     cli_host_rate_test_stop *stop = NULL; | ||
|  | 
 | ||
|  |     stop = (cli_host_rate_test_stop *)buffer; | ||
|  | 
 | ||
|  |     IOT_ASSERT(stop); | ||
|  |     IOT_ASSERT(bufferlen >= sizeof(*stop)); | ||
|  | 
 | ||
|  |     rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_STOP; | ||
|  | 
 | ||
|  |     if (IOT_PLC_DEV_ROLE_CCO != host_config->dev_role) { | ||
|  |         cli_host_rate_test_stop_ack stop_ack; | ||
|  | 
 | ||
|  |         // sta stop send rate test timer
 | ||
|  |         if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |             os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |         } | ||
|  | 
 | ||
|  |         //sta send stop ack to cco
 | ||
|  |         iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |             CLI_MSGID_RATE_STOP_ACK, host_config->cco_mac, | ||
|  |             (uint8_t*)&stop_ack, sizeof(cli_host_rate_test_stop_ack)); | ||
|  |     } | ||
|  | #if PLC_SUPPORT_CCO_ROLE
 | ||
|  |     else { | ||
|  |         //cco send stop ack to plc mgr
 | ||
|  |         cli_host_rate_test_stop_ack stop_ack; | ||
|  |         iot_cli_send_to_host(CLI_MSGID_RATE_STOP_ACK, | ||
|  |             (uint8_t*)&stop_ack, sizeof(cli_host_rate_test_stop_ack), \ | ||
|  |             rate_test_info->launch_mac); | ||
|  | 
 | ||
|  |         if (rate_test_info->downlink) { | ||
|  |             // cco stop send rate test timer
 | ||
|  |             if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                 os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |             } | ||
|  |         } else { | ||
|  |             //cco forward stop cmd to sta
 | ||
|  |             iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, | ||
|  |                 CLI_MSGID_RATE_STOP, rate_test_info->dst, | ||
|  |                 (uint8_t*)stop, sizeof(cli_host_rate_test_stop)); | ||
|  | 
 | ||
|  |             if (!os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |                 os_start_timer(rate_test_info->rate_test_timer, | ||
|  |                     IOT_PLC_RATE_TEST_INTERVAL); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_stop_ack(uint8_t *buffer, uint32_t bufferlen) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  |     // cco stop stop rate test timer
 | ||
|  |     if (os_is_timer_active(rate_test_info->rate_test_timer)) { | ||
|  |         os_stop_timer(rate_test_info->rate_test_timer); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cli_rate_test_init() | ||
|  | { | ||
|  |     rate_test_info = (iot_plc_host_rate_test_t *)os_mem_malloc(IOT_CLI_MID, | ||
|  |         sizeof(iot_plc_host_rate_test_t)); | ||
|  | 
 | ||
|  |     if (rate_test_info) { | ||
|  |         rate_test_info->rate_test_timer = os_create_timer(IOT_CLI_MID, 1, | ||
|  |             iot_cli_rate_test_timer, NULL); | ||
|  |         rate_test_info->send_packet_idx = 0; | ||
|  |         rate_test_info->recv_packets = 0; | ||
|  |         rate_test_info->test_id = 0; | ||
|  |     } else { | ||
|  |         iot_printf("rate test info alloc failed\n"); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cli_rate_test_deinit() | ||
|  | { | ||
|  |     if (rate_test_info) { | ||
|  |         if (rate_test_info->rate_test_timer) { | ||
|  |             os_delete_timer(rate_test_info->rate_test_timer); | ||
|  |             rate_test_info->rate_test_timer = 0; | ||
|  |             rate_test_info->rate_test_state = IOT_PLC_RATE_TEST_INIT; | ||
|  |         } | ||
|  | 
 | ||
|  |         os_mem_free(rate_test_info); | ||
|  |         rate_test_info = NULL; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #else /* IOT_CLI_RATE_TEST_EN */
 | ||
|  | 
 | ||
|  | void cli_recv_rate_test_packet(uint8_t *buffer, uint32_t bufferlen, | ||
|  |     uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  |     (void)src_mac; | ||
|  | } | ||
|  | 
 | ||
|  | void cli_recv_rate_test_result(uint8_t *buffer, uint32_t bufferlen, | ||
|  |     uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  |     (void)src_mac; | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_start(uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  |     (void)src_mac; | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_stop(uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  |     (void)src_mac; | ||
|  | } | ||
|  | 
 | ||
|  | void cli_rate_test_stop_ack(uint8_t *buffer, uint32_t bufferlen) | ||
|  | { | ||
|  |     (void)buffer; | ||
|  |     (void)bufferlen; | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cli_rate_test_handle_timer_msg() | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cli_rate_test_init() | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void iot_cli_rate_test_deinit() | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* IOT_CLI_RATE_TEST_EN */
 |