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 */
 |