451 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			451 lines
		
	
	
		
			15 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  PLC_CERT_TEST_H
							 | 
						||
| 
								 | 
							
								#define  PLC_CERT_TEST_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* pack for the structures in the whole file */
							 | 
						||
| 
								 | 
							
								#pragma pack(push)  /* save the pack status */
							 | 
						||
| 
								 | 
							
								#pragma pack(1)     /* 1 byte align */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* defining some characteristic parameters of the sg cert test command. */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_PORT_NOR                  0x11
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_PORT_EXT                  0x12
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_ID_V                      0x0006
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_HEADER_LEN                4
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_NID                       (0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* not received cert test command, used for g_mt_ctxt->g_mt_mode_sel status */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_NOT_RX                0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test command enter app layer transparent transfer tx mode, in this
							 | 
						||
| 
								 | 
							
								 * mode, will send MSDU to uart.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_APP_T_T             0x01
							 | 
						||
| 
								 | 
							
								/* cert test command enter app layer transparent transfer rx mode, in this
							 | 
						||
| 
								 | 
							
								 * mode, will packing data received from the UART, sent to the PLC network
							 | 
						||
| 
								 | 
							
								 * as a MSDU.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_APP_T_R             0x02
							 | 
						||
| 
								 | 
							
								/* cert test command enter physical layer hplc transparent transfer mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_T               0x03
							 | 
						||
| 
								 | 
							
								/* cert test command for enter physical layer hplc loopback mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_LP              0x04
							 | 
						||
| 
								 | 
							
								/* cert test command for enter MAC layer transparent transfer mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_MAC_T               0x05
							 | 
						||
| 
								 | 
							
								/* cert test command for set frequency band */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_SET_FB                    0x06
							 | 
						||
| 
								 | 
							
								/* cert test command for set tonemask */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_SET_TM                    0x07
							 | 
						||
| 
								 | 
							
								/* rf configuration, including option and channel */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_SET_RF                    0x08
							 | 
						||
| 
								 | 
							
								/* cert test command enter physical layer rf loopback mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_RF_LP           0x09
							 | 
						||
| 
								 | 
							
								/* cert test command enter physical layer rf transparent transfer mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_RF_T            0x0A
							 | 
						||
| 
								 | 
							
								/* physical layer rf and hplc loopback mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP  0x0B
							 | 
						||
| 
								 | 
							
								/* cert test command enter physical layer hplc to rf loopback mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP      0x0C
							 | 
						||
| 
								 | 
							
								/* cert test command enter security test mode */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_ENTER_SEC                 0x0D
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Define security mode test items */
							 | 
						||
| 
								 | 
							
								/* SHA256 algorithm test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SHA256               1
							 | 
						||
| 
								 | 
							
								/* SM3 algorithm test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SM3                  2
							 | 
						||
| 
								 | 
							
								/* elliptic encryption algorithm signature test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_ECC_SIG              3
							 | 
						||
| 
								 | 
							
								/* elliptic encryption algorithm signature verification test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_ECC_SIG_VERIFY       4
							 | 
						||
| 
								 | 
							
								/* SM2 signature test item */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SM2_SIG              5
							 | 
						||
| 
								 | 
							
								/* SM2 signature verification test item */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SM2_SIG_VERIFY       6
							 | 
						||
| 
								 | 
							
								/* AES-CBC encryption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_AES_CBC_ENCRYPT      7
							 | 
						||
| 
								 | 
							
								/* AES-CBC decyption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_AES_CBC_DECRYPT      8
							 | 
						||
| 
								 | 
							
								/* AES-GCM encryption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_AES_GCM_ENCRYPT      9
							 | 
						||
| 
								 | 
							
								/* AES-GCM decryption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_AES_GCM_DECRYPT      10
							 | 
						||
| 
								 | 
							
								/* SM4 encryption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SM4_CBC_ENCRYPT      11
							 | 
						||
| 
								 | 
							
								/* SM4 decryption test */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_SEC_MODE_SM4_CBC_DECRYPT      12
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* tonemask ID defined in cert tests */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_0             0
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_1             1
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_2             2
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_3             3
							 | 
						||
| 
								 | 
							
								/* every band has a tone mask */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_MAX           MAX_SG_BAND_ID
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_TONEMASK_ID_INVAL         0xFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* freq band ID defined in cert tests */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_0                 0
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_1                 1
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_2                 2
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_3                 3
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_MAX               MAX_SG_BAND_ID
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_BAND_ID_INVAL             0xFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test mode duration unit. the unit is 1ms. */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_MODE_DUR_UNIT             (60 * 1000)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* listen for the certification test command till timer expired. this value
							 | 
						||
| 
								 | 
							
								 * defined the timer interval. once timer expired, local device won't handle
							 | 
						||
| 
								 | 
							
								 * certification test command anymore. the unit is 1ms.
							 | 
						||
| 
								 | 
							
								 * note that currently spec said this value should be 30 seconds, while for
							 | 
						||
| 
								 | 
							
								 * cert test case 3.3.1.8, test bed may send out cert test command a little
							 | 
						||
| 
								 | 
							
								 * bit layer. so extend this value a little bit.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define CERT_TEST_CMD_LISTEN_DUR            (50 * 1000)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test {
							 | 
						||
| 
								 | 
							
								    uint8_t     port;
							 | 
						||
| 
								 | 
							
								    uint16_t    id;
							 | 
						||
| 
								 | 
							
								    uint8_t     control;
							 | 
						||
| 
								 | 
							
								    /* protocol version */
							 | 
						||
| 
								 | 
							
								    uint32_t    ver         :6,
							 | 
						||
| 
								 | 
							
								    /* header length */
							 | 
						||
| 
								 | 
							
								                header_len  :6,
							 | 
						||
| 
								 | 
							
								    /* command type for cert_test, see CERT_TEST_CMD_XXXX */
							 | 
						||
| 
								 | 
							
								                cmd_type    :4,
							 | 
						||
| 
								 | 
							
								    /* ignore */
							 | 
						||
| 
								 | 
							
								                resved      :4,
							 | 
						||
| 
								 | 
							
								    /* command parameter, its meaning depends on the type of command */
							 | 
						||
| 
								 | 
							
								                cmd_param   :12;
							 | 
						||
| 
								 | 
							
								    /* payload label */
							 | 
						||
| 
								 | 
							
								    uint8_t     data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test command extended information structure*/
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_ext {
							 | 
						||
| 
								 | 
							
								    /* security mode */
							 | 
						||
| 
								 | 
							
								    uint8_t sec_mode :4,
							 | 
						||
| 
								 | 
							
								    /* rf physical header MCS */
							 | 
						||
| 
								 | 
							
								            phr_mcs  :4;
							 | 
						||
| 
								 | 
							
								    /* rf psdu MCS */
							 | 
						||
| 
								 | 
							
								    uint8_t psdu_mcs :4,
							 | 
						||
| 
								 | 
							
								    /* rf pb size */
							 | 
						||
| 
								 | 
							
								            pb_size  :4;
							 | 
						||
| 
								 | 
							
								} cert_test_ext_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_key {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_key_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_mactag {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_mactag_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_hash {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_hash_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_result {
							 | 
						||
| 
								 | 
							
								    /* data length, fixed is 1 */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* result value, 0 - fail, 1 - success */
							 | 
						||
| 
								 | 
							
								    uint8_t value;
							 | 
						||
| 
								 | 
							
								} cert_test_sec_result_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_iv {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_iv_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_public_key_x {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_public_key_x_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_signature_r {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_signature_r_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_signature_s {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_signature_s_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_random {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_random_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_plaintext {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_plaintext_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cert_test_sec_ciphertext {
							 | 
						||
| 
								 | 
							
								    /* data length */
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								    /* data buffer */
							 | 
						||
| 
								 | 
							
								    uint8_t data[0];
							 | 
						||
| 
								 | 
							
								} cert_test_sec_ciphertext_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief cert_test_is_vaild_sec_mode_test_item() -  check whether it is a valid
							 | 
						||
| 
								 | 
							
								          security mode test item.
							 | 
						||
| 
								 | 
							
								 * @param item: item code.
							 | 
						||
| 
								 | 
							
								 * @retval:  1 - valid, 0 - invalid.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline uint8_t cert_test_is_vaild_sec_mode_test_item(uint8_t item)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (item >= CERT_TEST_SEC_MODE_SHA256 &&
							 | 
						||
| 
								 | 
							
								        item <= CERT_TEST_SEC_MODE_SM4_CBC_DECRYPT) {
							 | 
						||
| 
								 | 
							
								        return 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief cert_test_is_mode_enter_cmd() -  check if need to enter certification
							 | 
						||
| 
								 | 
							
								 *                                         test mode.
							 | 
						||
| 
								 | 
							
								 * @param ct:     pointer to certification test message.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define cert_test_is_mode_enter_cmd(ct) \
							 | 
						||
| 
								 | 
							
								    ((ct)->port == CERT_TEST_PORT_NOR \
							 | 
						||
| 
								 | 
							
								      && (ct)->id == CERT_TEST_ID_V \
							 | 
						||
| 
								 | 
							
								      && ((ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_MAC_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_FB \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_TM \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_RF \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_SEC))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* listen for the certification test command till timer expired. this value
							 | 
						||
| 
								 | 
							
								 * defined the timer interval. once timer expired, local device won't handle
							 | 
						||
| 
								 | 
							
								 * certification test command anymore. the unit is 1ms.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_CMD_LISTEN_DUR        (30 * 1000)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test mode duration, when this time expires, it will return from test
							 | 
						||
| 
								 | 
							
								 * mode to normal mode. uint is 1ms.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_MODE_DUR              (10 * 60 * 1000)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define message port number for spg */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_PORT_NOR              0x11 /* normal */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_PORT_EXT              0x12 /* extend */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* defining some characteristic parameters of the spg cert test command. */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_ID_V                  0x0101
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_FRAME_TYPE            2
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_WORK_ID_V             0xf0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test command ID for enter loopback mode */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_ID_ENTER_LP           0
							 | 
						||
| 
								 | 
							
								/* cert test command ID for enter transparent forwarding mode */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_ID_ENTER_FWD          1
							 | 
						||
| 
								 | 
							
								/* cert test command for set frequency band */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_ID_SET_FB             2
							 | 
						||
| 
								 | 
							
								/* cert test command for dual mode */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_ID_DUAL_MODE          3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* tonemask ID defined in cert tests for spg */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_TONEMASK_ID_0         0
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_TONEMASK_ID_1         1
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_TONEMASK_ID_2         2
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_TONEMASK_ID_MAX       SPG_CERT_TEST_TONEMASK_ID_2
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_TONEMASK_ID_INVAL     0xFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* freq band ID defined in cert tests for spg */
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_BAND_ID_0             0
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_BAND_ID_1             1
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_BAND_ID_2             2
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_BAND_ID_MAX           SPG_CERT_TEST_BAND_ID_2
							 | 
						||
| 
								 | 
							
								#define SPG_CERT_TEST_BAND_ID_INVAL         0xFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test frame header structure for spg */
							 | 
						||
| 
								 | 
							
								typedef struct _spg_cert_test_hdr {
							 | 
						||
| 
								 | 
							
								    /* message port, see SPG_CERT_TEST_PORT_XXX */
							 | 
						||
| 
								 | 
							
								    uint8_t     port;
							 | 
						||
| 
								 | 
							
								    /* message id, it must be SPG_CERT_TEST_ID_V. */
							 | 
						||
| 
								 | 
							
								    uint16_t    id;
							 | 
						||
| 
								 | 
							
								    /* reserved according to spec */
							 | 
						||
| 
								 | 
							
								    uint8_t     rsvd1;
							 | 
						||
| 
								 | 
							
								    /* frame type, it must be SPG_CERT_TEST_FRAME_TYPE. */
							 | 
						||
| 
								 | 
							
								    uint16_t    f_type   :4,
							 | 
						||
| 
								 | 
							
								    /* reserved according to spec */
							 | 
						||
| 
								 | 
							
								                rsvd2    :8,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if have business extension domain, not check */
							 | 
						||
| 
								 | 
							
								                ext      :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if need respond to this message, not check */
							 | 
						||
| 
								 | 
							
								                resp     :1,
							 | 
						||
| 
								 | 
							
								    /* start flag, not check */
							 | 
						||
| 
								 | 
							
								                start    :1,
							 | 
						||
| 
								 | 
							
								    /* direction identifier bit, not check */
							 | 
						||
| 
								 | 
							
								                dir      :1;
							 | 
						||
| 
								 | 
							
								    /* business ID, it must be SPG_CERT_TEST_WORK_ID_V */
							 | 
						||
| 
								 | 
							
								    uint8_t     work_id;
							 | 
						||
| 
								 | 
							
								    /* version num, the current standard is fixed at 1. */
							 | 
						||
| 
								 | 
							
								    uint8_t     ver;
							 | 
						||
| 
								 | 
							
								    /* sequence number */
							 | 
						||
| 
								 | 
							
								    uint16_t    sn;
							 | 
						||
| 
								 | 
							
								    /* payload len */
							 | 
						||
| 
								 | 
							
								    uint16_t    len;
							 | 
						||
| 
								 | 
							
								    /* payload label */
							 | 
						||
| 
								 | 
							
								    uint8_t     data[0];
							 | 
						||
| 
								 | 
							
								} spg_cert_test_hdr_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cert test frame command structure for spg */
							 | 
						||
| 
								 | 
							
								typedef struct _spg_cert_test_cmd {
							 | 
						||
| 
								 | 
							
								    /* test id, see SPG_CERT_TEST_ID_XXX */
							 | 
						||
| 
								 | 
							
								    uint8_t  test_id;
							 | 
						||
| 
								 | 
							
								    /* reserved according to spec */
							 | 
						||
| 
								 | 
							
								    uint8_t  rsvd;
							 | 
						||
| 
								 | 
							
								    /* payload len */
							 | 
						||
| 
								 | 
							
								    uint16_t len;
							 | 
						||
| 
								 | 
							
								    /* payload label */
							 | 
						||
| 
								 | 
							
								    uint8_t  data[0];
							 | 
						||
| 
								 | 
							
								} spg_cert_test_cmd_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* test ID 0 and 1 data field layout */
							 | 
						||
| 
								 | 
							
								typedef struct _spg_cert_test_cmd_01 {
							 | 
						||
| 
								 | 
							
								    /* band id */
							 | 
						||
| 
								 | 
							
								    uint8_t band_id     :4,
							 | 
						||
| 
								 | 
							
								    /* reserved according to spec */
							 | 
						||
| 
								 | 
							
								            rsvd        :4;
							 | 
						||
| 
								 | 
							
								} spg_cert_test_cmd_01_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define dual mode cert test data structure for spg */
							 | 
						||
| 
								 | 
							
								typedef struct _spg_cert_test_dm {
							 | 
						||
| 
								 | 
							
								    /* protocol version */
							 | 
						||
| 
								 | 
							
								    uint32_t    ver         :6,
							 | 
						||
| 
								 | 
							
								    /* header length */
							 | 
						||
| 
								 | 
							
								                header_len  :6,
							 | 
						||
| 
								 | 
							
								    /* command type for spg cert test, which is the same as the state grid,
							 | 
						||
| 
								 | 
							
								     * see CERT_TEST_CMD_XXXX
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                cmd_type    :4,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                rsvd        :4,
							 | 
						||
| 
								 | 
							
								    /* command parameter, its meaning depends on the type of command */
							 | 
						||
| 
								 | 
							
								                cmd_param   :12;
							 | 
						||
| 
								 | 
							
								    /* payload label */
							 | 
						||
| 
								 | 
							
								    uint8_t     data[0];
							 | 
						||
| 
								 | 
							
								} spg_cert_test_dm_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* dual mode cert test command extended information structure*/
							 | 
						||
| 
								 | 
							
								typedef struct _spg_cert_test_dm_ext {
							 | 
						||
| 
								 | 
							
								    /* security mode */
							 | 
						||
| 
								 | 
							
								    uint8_t sec_mode :4,
							 | 
						||
| 
								 | 
							
								    /* rf physical header MCS */
							 | 
						||
| 
								 | 
							
								            phr_mcs  :4;
							 | 
						||
| 
								 | 
							
								    /* rf psdu MCS */
							 | 
						||
| 
								 | 
							
								    uint8_t psdu_mcs :4,
							 | 
						||
| 
								 | 
							
								    /* rf pb size */
							 | 
						||
| 
								 | 
							
								            pb_size  :4;
							 | 
						||
| 
								 | 
							
								} spg_cert_test_dm_ext_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)  /* restore the pack status */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief mac_cert_test_band_cfg_ex() - converting cert test ID to cert mode
							 | 
						||
| 
								 | 
							
								 *                                      code for spg.
							 | 
						||
| 
								 | 
							
								 * @param test_id: - test id, see SPG_CERT_TEST_ID_XXX
							 | 
						||
| 
								 | 
							
								 * @retval:   - cert test mode code, see CERT_TEST_CMD_XXX.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								static inline uint8_t spg_cert_test_id_to_mode(uint8_t test_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t mode = 0;
							 | 
						||
| 
								 | 
							
								    if (test_id == SPG_CERT_TEST_ID_ENTER_LP) {
							 | 
						||
| 
								 | 
							
								        mode = CERT_TEST_CMD_ENTER_PHY_LP;
							 | 
						||
| 
								 | 
							
								    } else if (test_id == SPG_CERT_TEST_ID_ENTER_FWD) {
							 | 
						||
| 
								 | 
							
								        mode = CERT_TEST_CMD_ENTER_MAC_T;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return mode;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								* @brief cert_test_is_mode_enter_cmd_spg() - check if need to enter
							 | 
						||
| 
								 | 
							
								*                                            certification test mode.
							 | 
						||
| 
								 | 
							
								* @param ct:    point to the command ID of certification test.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#define cert_test_is_mode_enter_cmd_spg(ct) \
							 | 
						||
| 
								 | 
							
								    ((ct)->test_id == SPG_CERT_TEST_ID_ENTER_FWD \
							 | 
						||
| 
								 | 
							
								    || (ct)->test_id == SPG_CERT_TEST_ID_ENTER_LP)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief cert_test_is_mode_enter_cmd_ext() -  check if need to enter
							 | 
						||
| 
								 | 
							
								 *                                             certification test mode.
							 | 
						||
| 
								 | 
							
								 * @param ct:     pointer to certification test message.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define cert_test_is_mode_enter_cmd_ext_spg(ct) \
							 | 
						||
| 
								 | 
							
								    ((ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_MAC_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_FB \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_TM \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_SET_RF \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_T \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP \
							 | 
						||
| 
								 | 
							
								      || (ct)->cmd_type == CERT_TEST_CMD_ENTER_SEC)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* PLC_CERT_TEST_H */
							 |