103 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.3 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_cli_ping.h"
 | |
| #include "iot_cli_host_interface.h"
 | |
| #include "iot_cli_plc_module.h"
 | |
| #include "iot_io_api.h"
 | |
| #include "iot_cli_plc_tx_rx.h"
 | |
| 
 | |
| extern iot_plc_host_config_t *host_config;
 | |
| extern iot_cli_host_info_t *host_info;
 | |
| 
 | |
| #if PLC_SUPPORT_CCO_ROLE
 | |
| cli_ping_info ping_info = {0};
 | |
| 
 | |
| static uint32_t cli_ping_calculate_duration(
 | |
|     uint32_t start_time, uint32_t ack_time)
 | |
| {
 | |
|     if (ack_time >= start_time) {
 | |
|         return ack_time - start_time;
 | |
|     } else {
 | |
|         return (uint32_t)0xFFFFFFFF - start_time + ack_time;
 | |
|     }
 | |
| }
 | |
| #endif
 | |
| 
 | |
| void cli_ping_handler(uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)src_mac;
 | |
|     cli_host_ping_param *param = NULL;
 | |
|     iot_pkt_t *data_pkt = NULL;
 | |
|     uint32_t data_len = 0;
 | |
|     uint32_t msgid = CLI_MSGID_PING_ACK;
 | |
| 
 | |
|     param = (cli_host_ping_param *)buffer;
 | |
| 
 | |
|     if ((!param) || (bufferlen < sizeof(*param))) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (CLI_PING_MAX_SIZE < param->data_size) {
 | |
|         param->data_size = CLI_PING_MAX_SIZE;
 | |
|     }
 | |
| 
 | |
|     data_len = sizeof(*param) + param->data_size;
 | |
| #if PLC_SUPPORT_CCO_ROLE
 | |
|     if (IOT_PLC_DEV_ROLE_CCO == host_config->dev_role) {
 | |
|         msgid = CLI_MSGID_PING;
 | |
|         ping_info.start_time = os_boot_time32();
 | |
|         iot_mac_addr_cpy(ping_info.dst, param->dst);
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     data_pkt = iot_cli_create_pkt_plc(IOT_PLC_MSG_TYPE_UNICAST,
 | |
|         IOT_PLC_LOCAL_RETRY_CNT, CLI_MODULEID_HOSTINTERFACE,
 | |
|         msgid, src_mac, param->dst, param->dst, data_len);
 | |
| 
 | |
|     if (data_pkt != NULL) {
 | |
|         cli_host_ping_param *param_for_dst = (cli_host_ping_param *)
 | |
|             iot_pkt_block_ptr(data_pkt, IOT_PKT_BLOCK_TAIL);
 | |
|         param_for_dst->data_size = param->data_size;
 | |
|         iot_mac_addr_cpy(param_for_dst->dst, host_config->mac_addr);
 | |
|         iot_pkt_put(data_pkt, data_len);
 | |
| 
 | |
|         iot_plc_send_msdu(host_config->app_handle, data_pkt);
 | |
|     }
 | |
| }
 | |
| 
 | |
| #if PLC_SUPPORT_CCO_ROLE
 | |
| void cli_ping_ack_handler(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     cli_host_ping_param *param =
 | |
|         (cli_host_ping_param *)buffer;
 | |
| 
 | |
|     if ((!param) || (bufferlen < sizeof(*param))) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (iot_mac_addr_cmp(ping_info.dst, param->dst)) {
 | |
|         cli_host_ping_ack ping_ack;
 | |
|         iot_mac_addr_cpy(ping_ack.dst, param->dst);
 | |
|         ping_ack.ack_duration =
 | |
|             cli_ping_calculate_duration(ping_info.start_time, os_boot_time32());
 | |
|         iot_cli_send_to_host(
 | |
|             CLI_MSGID_PING_ACK, (uint8_t *)&ping_ack, sizeof(ping_ack), src_mac);
 | |
|     }
 | |
| }
 | |
| #endif |