257 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			257 lines
		
	
	
		
			7.9 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								#ifndef IOT_PROTO_GE_H
							 | 
						||
| 
								 | 
							
								#define IOT_PROTO_GE_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* common includes */
							 | 
						||
| 
								 | 
							
								#include "iot_utils_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* preamble code of gree frame */
							 | 
						||
| 
								 | 
							
								#define GE_FRM_PREAMBLE_CODE                            (0xAAAA)
							 | 
						||
| 
								 | 
							
								/* tail code of gree frame */
							 | 
						||
| 
								 | 
							
								#define GE_FRM_TAIL_CODE                                (0xFF)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define GE_FRM_MIN_LEN                                  (10)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define GE_FRM_PRE_LEN                                  (2)
							 | 
						||
| 
								 | 
							
								#define GE_FRM_SEQ_LEN                                  (1)
							 | 
						||
| 
								 | 
							
								#define GE_FRM_CHECKSUM_LEN                             (2)
							 | 
						||
| 
								 | 
							
								#define GE_FRM_TAIL_LEN                                 (1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* the position of data length field in a intact frame
							 | 
						||
| 
								 | 
							
								 * offset start with 0
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define GE_FRM_DATA_CNT_FIELD_POS                       (2)
							 | 
						||
| 
								 | 
							
								#define GE_FRM_NORMAL_SEQ_POS                           (7)
							 | 
						||
| 
								 | 
							
								/* the position of check sum field in a intact frame
							 | 
						||
| 
								 | 
							
								 * offset start with data cnt
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define GE_FRM_CHECK_SUM_FIELD_POS                      (7)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define GE_FRM_PLD_MIN_LEN                              (0x0)
							 | 
						||
| 
								 | 
							
								#define GE_FRM_PLD_MAX_LEN                              (0x80)
							 | 
						||
| 
								 | 
							
								/** check gree frame command */
							 | 
						||
| 
								 | 
							
								#define GE_CHECK_FRM_CMD(control)      (control >= GE_FRM_PLD_MIN_LEN && \
							 | 
						||
| 
								 | 
							
								                                        control <= GE_FRM_PLD_MAX_LEN)
							 | 
						||
| 
								 | 
							
								/* the real data length */
							 | 
						||
| 
								 | 
							
								#define ACQUIRE_DATA_LEN(data_len)     (data_len - GE_FRM_PLD_MIN_LEN)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/************************************extended fn define***********************/
							 | 
						||
| 
								 | 
							
								/* fill gree extended fn frame */
							 | 
						||
| 
								 | 
							
								#define EXT_FN_FRM_PREPARE(cmd, ext_fn, sub_fn)  do { \
							 | 
						||
| 
								 | 
							
								    cmd->hdr.hdr.preamble = GE_FRM_PREAMBLE_CODE; \
							 | 
						||
| 
								 | 
							
								    cmd->hdr.hdr.data_len = sizeof(*cmd) - \
							 | 
						||
| 
								 | 
							
								        GE_FRM_MIN_LEN + GE_FRM_PLD_MIN_LEN; \
							 | 
						||
| 
								 | 
							
								    cmd->hdr.hdr.fn       = ext_fn; \
							 | 
						||
| 
								 | 
							
								    cmd->hdr.subfn        = sub_fn; \
							 | 
						||
| 
								 | 
							
								    cmd->tail.tail        = GE_FRM_TAIL_CODE; \
							 | 
						||
| 
								 | 
							
								}while(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								enum proto_cmd_cnf_reason_e {
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_OK,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_STA_LEAVE_ERR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_WL_LOST_FRM,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_WL_SEQ_MISSMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_WL_CLR_NOTSUPPORT,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_PAIR_TBL_LOST_FRM,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_PAIR_TBL_SEQ_MISSMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_PAIR_TBL_CLR_NOTSUPPORT,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NID_DUP,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_TIME_OUT,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_MAC_MISSMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_PWD_MISSMATCH, //11
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_JOINED,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NO_AUTHORITY,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_LEN_MISSMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NID_MISSMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_CCO_GROUPNETING,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_CCO_GROUPNETING_IDLE,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_ERR_DEVTYPE,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_MAC_ADDR_ZERO,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NO_MAC_SETTED, //20
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_DUP_SETTING,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_ROLE_MISMATCH,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_CMD_DIR_ERR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NOT_READY,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_ALLOC_MEM_ERR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NO_NB_NW_FOUND,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_MONITOR_EXCESS,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_PARAME_ERR,
							 | 
						||
| 
								 | 
							
								    /* out of range */
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_BAUD_IDX_OOR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_SWITCH_UART_MODE_ERR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_SET_HOST_PORT_ERR,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NOT_SUPPORT,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_NO_IP4_SETTED,
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_IP4_IS_INVALID,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    PROTO_REASON_MAX,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** fn code enum */
							 | 
						||
| 
								 | 
							
								typedef enum _proto_fn_code_e
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* have to stay at the front */
							 | 
						||
| 
								 | 
							
								    PROTO_FNCODE_MIN                        = 0x00,
							 | 
						||
| 
								 | 
							
								    /** general query cmd fn */
							 | 
						||
| 
								 | 
							
								    PROTO_GE_PLC_QUERY_CMD                  = 0xFC,
							 | 
						||
| 
								 | 
							
								    /** general response cmd fn */
							 | 
						||
| 
								 | 
							
								    PROTO_GE_PLC_RESP_CMD                   = 0xFD,
							 | 
						||
| 
								 | 
							
								    /** general set cmd fn */
							 | 
						||
| 
								 | 
							
								    PROTO_GE_PLC_SET_CMD                    = 0xFE,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    PROTO_FNCODE_MAX                        = 0xFF,
							 | 
						||
| 
								 | 
							
								}proto_fn_code_e;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* fn = PROTO_GE_PLC_SET_CMD */
							 | 
						||
| 
								 | 
							
								enum proto_set_subfn_e {
							 | 
						||
| 
								 | 
							
								    /* cmd confirm cmd from outair to monitor */
							 | 
						||
| 
								 | 
							
								    PROTO_CMD_CFM_CMD                       = 0x14,
							 | 
						||
| 
								 | 
							
								    /* set work band */
							 | 
						||
| 
								 | 
							
								    PROTO_WORK_BAND_SET_CMD                 = 0x1C,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* fn = PROTO_GE_PLC_RESP_CMD */
							 | 
						||
| 
								 | 
							
								enum proto_query_subfn_e {
							 | 
						||
| 
								 | 
							
								    /* MCU query work band */
							 | 
						||
| 
								 | 
							
								    PROTO_WORK_BAND_QUERY_CMD               = 0x16,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* fn = PROTO_GE_PLC_RESP_CMD */
							 | 
						||
| 
								 | 
							
								enum proto_query_response_subfn_e {
							 | 
						||
| 
								 | 
							
								    /* work band response to MCU */
							 | 
						||
| 
								 | 
							
								    PROTO_WORK_BAND_RESP_CMD                = 0x16,
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* data or cmd tansmit direction */
							 | 
						||
| 
								 | 
							
								typedef enum _transmit_direction_e {
							 | 
						||
| 
								 | 
							
								    /* cmd - (mcu->)protocol->plctxrx  */
							 | 
						||
| 
								 | 
							
								    CMD_LOCAL_DOWN_LINK,
							 | 
						||
| 
								 | 
							
								    /* cmd - plctxrx->protocol(->mcu)  */
							 | 
						||
| 
								 | 
							
								    CMD_LOCAL_UP_LINK,
							 | 
						||
| 
								 | 
							
								} transmit_direction_e;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef uint8_t transmit_direction_e_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(push)  // save the pack status
							 | 
						||
| 
								 | 
							
								#pragma pack(1)     // 1 byte align
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* msdu header at begging of msdu payload. */
							 | 
						||
| 
								 | 
							
								typedef struct _msdu_pkt_hdr {
							 | 
						||
| 
								 | 
							
								    /* 0 means, this is msdu.
							 | 
						||
| 
								 | 
							
								     * non-zero means, remote peer msdu received confirmation seq.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint16_t recvconf_seq;
							 | 
						||
| 
								 | 
							
								    /* msdu sent seq */
							 | 
						||
| 
								 | 
							
								    uint16_t msdusend_seq;
							 | 
						||
| 
								 | 
							
								    /* the total cnt of sta that will receive the pkt */
							 | 
						||
| 
								 | 
							
								    uint8_t  dest_cnt;
							 | 
						||
| 
								 | 
							
								    /* indicating if confirmation is necessary for receivers*/
							 | 
						||
| 
								 | 
							
								    uint8_t need_ack        : 1,
							 | 
						||
| 
								 | 
							
								            aes_encrypt     : 1,
							 | 
						||
| 
								 | 
							
								            aes_padding     : 4,
							 | 
						||
| 
								 | 
							
								            resv            : 2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* identify msdu pkt comes from proto or at moudle */
							 | 
						||
| 
								 | 
							
								    uint8_t src_module;
							 | 
						||
| 
								 | 
							
								    /* below mac are for cco forward msdu from sta to sta */
							 | 
						||
| 
								 | 
							
								    /* src mac */
							 | 
						||
| 
								 | 
							
								    uint8_t src_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* dst mac */
							 | 
						||
| 
								 | 
							
								    uint8_t dst_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* org_mac */
							 | 
						||
| 
								 | 
							
								    uint8_t org_mac[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								} msdu_pkt_hdr_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* gree protocol frame header */
							 | 
						||
| 
								 | 
							
								typedef struct _ge_frm_hdr_t {
							 | 
						||
| 
								 | 
							
								    /* preable code 0xAAAA */
							 | 
						||
| 
								 | 
							
								    uint16_t preamble;
							 | 
						||
| 
								 | 
							
								    /* data length range:[0x80,0x88] */
							 | 
						||
| 
								 | 
							
								    uint8_t  data_len;
							 | 
						||
| 
								 | 
							
								    /* function code */
							 | 
						||
| 
								 | 
							
								    uint8_t  fn;
							 | 
						||
| 
								 | 
							
								}  ge_frm_hdr_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* gree protocol frame header */
							 | 
						||
| 
								 | 
							
								typedef struct _ge_extend_fn_hdr_t {
							 | 
						||
| 
								 | 
							
								    ge_frm_hdr_t  hdr;
							 | 
						||
| 
								 | 
							
								    /* sub function code */
							 | 
						||
| 
								 | 
							
								    uint8_t  subfn;
							 | 
						||
| 
								 | 
							
								}  ge_extend_fn_hdr_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _ge_frm_tail_t {
							 | 
						||
| 
								 | 
							
								    /* crc16 for gree frame */
							 | 
						||
| 
								 | 
							
								    uint16_t  check_sum;
							 | 
						||
| 
								 | 
							
								    /* tail(0xFF)code of gree frame */
							 | 
						||
| 
								 | 
							
								    uint8_t  tail;
							 | 
						||
| 
								 | 
							
								}  ge_frm_tail_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* subfn = PROTO_CMD_CFM_CMD */
							 | 
						||
| 
								 | 
							
								typedef struct _ge_frame_cmd_cfm_set_subfn20_t {
							 | 
						||
| 
								 | 
							
								    ge_extend_fn_hdr_t hdr;
							 | 
						||
| 
								 | 
							
								    uint8_t            cmd;
							 | 
						||
| 
								 | 
							
								    uint8_t            resv1;
							 | 
						||
| 
								 | 
							
								    uint8_t            seq;
							 | 
						||
| 
								 | 
							
								    uint8_t            result;
							 | 
						||
| 
								 | 
							
								    uint8_t            reason;
							 | 
						||
| 
								 | 
							
								    ge_frm_tail_t      tail;
							 | 
						||
| 
								 | 
							
								} ge_frame_cmd_cfm_set_subfn20_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* subfn = PROTO_WORK_BAND_RESP_CMD */
							 | 
						||
| 
								 | 
							
								typedef struct _ge_frame_work_band_resp_subfn22_t {
							 | 
						||
| 
								 | 
							
								    ge_extend_fn_hdr_t hdr;
							 | 
						||
| 
								 | 
							
								    uint8_t            resv0;
							 | 
						||
| 
								 | 
							
								    uint8_t            resv1;
							 | 
						||
| 
								 | 
							
								    uint8_t            seq;
							 | 
						||
| 
								 | 
							
								    /* work band */
							 | 
						||
| 
								 | 
							
								    uint8_t            band;
							 | 
						||
| 
								 | 
							
								    ge_frm_tail_t      tail;
							 | 
						||
| 
								 | 
							
								} ge_frame_work_band_resp_subfn22_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief ge_frm_checksum_calc - calculate frame check sum
							 | 
						||
| 
								 | 
							
								 * @param data:          data to check
							 | 
						||
| 
								 | 
							
								 * @param data:          data len
							 | 
						||
| 
								 | 
							
								 * @retval:              verification data for gree frame
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint16_t ge_frm_checksum_calc(uint8_t *data, uint16_t len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_proto_ge_resp_cfm_frame(uint32_t resp, uint32_t dir, uint32_t cmd,
							 | 
						||
| 
								 | 
							
								    uint8_t seq);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_proto_ge_set_work_band_handler(uint8_t *data, uint8_t len,
							 | 
						||
| 
								 | 
							
								    transmit_direction_e_t dir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_proto_ge_query_work_band_handler(uint8_t *data, uint8_t len,
							 | 
						||
| 
								 | 
							
								    transmit_direction_e_t dir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_proto_ge_parse_handle(uint8_t *buffer, uint32_t buffer_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_sniffer_fix_send_ge_data(uint8_t *data, uint16_t len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* IOT_PROTO_GE_H */
							 |