613 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			613 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| 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_MME_ASSOC_H
 | |
| #define PLC_MME_ASSOC_H
 | |
| 
 | |
| /* os shim includes */
 | |
| #include "os_types_api.h"
 | |
| 
 | |
| /* plc includes */
 | |
| #include "plc_fr.h"
 | |
| #include "plc_mme.h"
 | |
| #include "plc_mme_auth.h"
 | |
| #include "plc_utils.h"
 | |
| #include "plc_protocol.h"
 | |
| 
 | |
| /* common includes */
 | |
| #include "iot_utils_api.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 */
 | |
| 
 | |
| /* route information */
 | |
| typedef struct _route_info {
 | |
|     /* directly connected STA count */
 | |
|     uint16_t        dc_sta_cnt;
 | |
|     /* directly connected proxy count */
 | |
|     uint16_t        dc_proxy_cnt;
 | |
|     /* size of the route table */
 | |
|     uint16_t        route_table_size;
 | |
|     uint16_t        reserved;
 | |
|     /* variable length route table */
 | |
|     uint8_t         rt_table[0];
 | |
| } route_info_t;
 | |
| 
 | |
| typedef struct _sta_info {
 | |
|     /* mac address of the STA */
 | |
|     uint8_t     mac_addr[IOT_MAC_ADDR_LEN];
 | |
|     /* TEI assigned to the STA */
 | |
|     uint16_t    tei     :12,
 | |
|                 rsvd    :2,
 | |
|     /* assigned sta logical phase */
 | |
|                 l_phase :2;
 | |
| } sta_info_t;
 | |
| 
 | |
| /* Associate result codes */
 | |
| /* associate / re-associate successfully */
 | |
| #define ASSOC_SUCCESS                   0x00
 | |
| #define RE_ASSOC_SUCCESS                0x0A
 | |
| 
 | |
| /* associate failed codes */
 | |
| #define AF_STA_NOT_IN_WHITELIST         0x01
 | |
| #define AF_STA_IN_BLACKLIST             0x02
 | |
| #define AF_STA_EXCEED_MAX_COUNT         0x03
 | |
| #define AF_WHITELIST_NOT_SET            0x04
 | |
| #define AF_PROXY_EXCEED_MAX_COUNT       0x05
 | |
| #define AF_SUB_STA_EXCEED_MAX_COUNT     0x06
 | |
| 
 | |
| #define AF_DUPLICATE_MAC                0x08
 | |
| #define AF_TOPO_LEVEL_EXCEED_MAX_COUNT  0x09
 | |
| #define AF_SUB_STA_AS_PROXY             0x0B
 | |
| #define AF_LOOP_EXIST_IN_TOPO           0x0C
 | |
| #define AF_UNKNOWN_CCO_ERROR            0x0D
 | |
| #define AF_PROXY_EXCEED_MAX_COUNT_RF    0x0E
 | |
| 
 | |
| /* IEEE1901 associate result codes */
 | |
| /* associate, re-associate successfully */
 | |
| #define I1901_ASSOC_SUCCESS                   0x00
 | |
| #define I1901_RE_ASSOC_SUCCESS                0x08
 | |
| /* associate failed codes */
 | |
| #define I1901_AF_STA_NOT_IN_WHITELIST         0x01
 | |
| #define I1901_AF_STA_EXCEED_MAX_COUNT         0x02
 | |
| #define I1901_AF_WHITELIST_NOT_SET            0x03
 | |
| #define I1901_AF_PROXY_EXCEED_MAX_COUNT       0x04
 | |
| #define I1901_AF_SUB_STA_EXCEED_MAX_COUNT     0x05
 | |
| #define I1901_AF_DUPLICATE_MAC                0x06
 | |
| #define I1901_AF_TOPO_LEVEL_EXCEED_MAX_COUNT  0x07
 | |
| #define I1901_AF_SUB_STA_AS_PROXY             0x09
 | |
| #define I1901_AF_LOOP_EXIST_IN_TOPO           0x0A
 | |
| #define I1901_AF_UNKNOWN_CCO_ERROR            0x0B
 | |
| 
 | |
| /* max STA count of gather assoc request */
 | |
| #define GATHER_ASSOC_REQ_CNT_MAX        16
 | |
| 
 | |
| /* boot version definition */
 | |
| /* normal boot up */
 | |
| #define SYSTEM_BOOT_REASON_NORMAL       0x00
 | |
| /* power down reboot */
 | |
| #define SYSTEM_BOOT_REASON_CUT_POWER    0x01
 | |
| /* watch dog reboot */
 | |
| #define SYSTEM_BOOT_REASON_WATCH_DOG    0x02
 | |
| /* abnormal pointer exception reboot */
 | |
| #define SYSTEM_BOOT_REASON_POINTER_ERR  0x03
 | |
| 
 | |
| #define CHIP_ID_SERIAL_NUM_LEN          5
 | |
| #define CHIP_ID_CRC_LEN                 8
 | |
| 
 | |
| /* vendor specific info in assoc request, must be 18 bytes length */
 | |
| typedef struct _mme_vendor_info {
 | |
|     /* build version info */
 | |
|     uint32_t    build_ver;
 | |
|     /* zero-cross ntb */
 | |
|     uint32_t    zc_ntb;
 | |
|     union {
 | |
|         /* vendor info param, the same as the following field */
 | |
|         uint32_t    info_param;
 | |
|         struct {
 | |
|             /* flag to mark if tsfm info is valid */
 | |
|             uint32_t    tsfm_valid           :1,
 | |
|             /* last network selection start reason */
 | |
|                         start_reason         :6,
 | |
|             /* firmware version type, 0 - release, 1 - debug */
 | |
|                         ver_type             :1,
 | |
|             /* layout definition */
 | |
|                         mtd_type             :4,
 | |
|             /* flag to mark if psram enabled */
 | |
|                         psram_enable         :1,
 | |
|             /* flag to mark if zc edge is falling */
 | |
|                         zc_edge_is_falling   :1,
 | |
|             /* flag to mark if support large number of directly
 | |
|              * connected sub-sta
 | |
|              */
 | |
|                         sub_sta_large        :1,
 | |
|             /* reserved for future */
 | |
|                         rsvd                 :1,
 | |
|             /* mark to make sure CCO and STA are belong to same vendor */
 | |
|                         vendor_mark          :16;
 | |
|         };
 | |
|     };
 | |
|     union {
 | |
|         /* tsfm address info */
 | |
|         uint8_t     tsfm_addr[IOT_MAC_ADDR_LEN];
 | |
|         /* CRC MME */
 | |
|         struct {
 | |
|             /* reserved for future */
 | |
|             uint8_t     rsvd2[4];
 | |
|             /* crc16 */
 | |
|             uint16_t    crc16;
 | |
|         };
 | |
|     };
 | |
| } mme_vendor_info_t;
 | |
| 
 | |
| typedef struct _mme_ver_info {
 | |
|     /* see SYSTEM_BOOT_REASON_XXX */
 | |
|     uint8_t     boot_reason;
 | |
|     /* boot version */
 | |
|     uint8_t     boot_ver;
 | |
|     /* software version */
 | |
|     uint16_t    sw_ver;
 | |
|     /* software build time */
 | |
|     uint16_t    build_time_y    :7,
 | |
|                 build_time_m    :4,
 | |
|                 build_time_d    :5;
 | |
|     /* module vendor ID */
 | |
|     uint16_t    vendor_id;
 | |
|     /* chip ID */
 | |
|     uint16_t    chip_id;
 | |
| } mme_ver_info_t;
 | |
| 
 | |
| /* chip id information */
 | |
| typedef struct _mme_chip_id_t {
 | |
|     uint8_t     check_code[CHIP_ID_CRC_LEN];
 | |
|     uint8_t     dev_code[CHIP_ID_SERIAL_NUM_LEN];
 | |
|     uint16_t    chip_mode;
 | |
|     uint16_t    vendor;
 | |
|     /* device bandwidth type, see PLC_DEV_BAND_TYPE_XXX */
 | |
|     uint8_t     dev_type;
 | |
|     uint8_t     hd4_3;
 | |
|     uint8_t     hd4_2;
 | |
|     uint8_t     hd4_1;/* fixed value: 0x01C1FB */
 | |
|     uint8_t     hd3;  /* fixed value: 0x9C */
 | |
|     uint8_t     hd2;  /* fixed value: 0x02 */
 | |
|     uint8_t     hd1;  /* fixed value: 0x01 */
 | |
| } mme_chip_id_t;
 | |
| 
 | |
| /* Associate Request MME */
 | |
| typedef struct _mme_assoc_req {
 | |
|     /* mac address of the station that initiated the assoc request */
 | |
|     uint8_t             mac[IOT_MAC_ADDR_LEN];
 | |
|     /* candidate proxy list */
 | |
|     pco_link_info_t     proxy[CANDIDATE_PROXY_COUNT];
 | |
|     /* estimated power line phase */
 | |
|     uint8_t             phase_1     :2;
 | |
|     uint8_t             phase_2     :2;
 | |
|     uint8_t             phase_3     :2;
 | |
|     uint8_t             reserved_1  :2;
 | |
|     /* device type. see PLC_DEV_TYPE_XXX */
 | |
|     uint8_t             device_type;
 | |
|     /* mac address type. see PLC_MAC_ADDR_TYPE_XXX */
 | |
|     uint8_t             mac_addr_type;
 | |
|     /* device communication type, see PLC_DEV_COMM_TYPE_XXX */
 | |
|     uint8_t             comm_type   :2,
 | |
|                         reserved_2  :6;
 | |
|     /* station association random number */
 | |
|     uint32_t            random;
 | |
|     /* vendor specific info */
 | |
|     mme_vendor_info_t   vendor_info;
 | |
|     /* version info */
 | |
|     mme_ver_info_t      ver_info;
 | |
|     /* hardware reset count */
 | |
|     uint16_t            hard_reset_cnt;
 | |
|     /* software reset count */
 | |
|     uint16_t            soft_reset_cnt;
 | |
|     /* proxy type. must be 0 */
 | |
|     uint8_t             proxy_type;
 | |
|     /* this 2 bytes reserved in spec, extend it for private spec.
 | |
|      * simple pair passcode value. Only same passcode CCO and STA can be
 | |
|      * associated.
 | |
|      */
 | |
|     uint16_t            passcode;
 | |
|     /* reserved for future */
 | |
|     uint8_t             reserved_3;
 | |
|     /* peer to peer sequence number */
 | |
|     uint32_t            p2p_sn;
 | |
| #if (!SUPPORT_IEEE_1901)
 | |
|     /* management id to identify each chip */
 | |
|     mme_chip_id_t       manage_id;
 | |
|     /* following mme_assoc_req_ext_t if the state grid encryption
 | |
|      * authentication is supported
 | |
|      */
 | |
| #endif
 | |
| } mme_assoc_req_t;
 | |
| 
 | |
| /* Associate Request EXT MME */
 | |
| typedef struct _mme_assoc_req_ext {
 | |
|     /* station mac address encrypted with cmk, and IV vector is the first 12
 | |
|      * bytes in mme_assoc_req_t
 | |
|      */
 | |
|     uint8_t             cmk_mac[MME_ENCRYPT_CMK_LEN];
 | |
| } mme_assoc_req_ext_t;
 | |
| 
 | |
| /* sub direct sta structure */
 | |
| typedef struct _sub_d_sta_t {
 | |
|     /* tei of sta */
 | |
|     uint16_t    tei         :12,
 | |
|     /* link type between station and proxy, see PLC_LINK_TYPE_XXX */
 | |
|                 link        :1,
 | |
|     /* reserved for future */
 | |
|                 rsvd        :3;
 | |
| } sub_d_sta_t;
 | |
| 
 | |
| /* proxy information */
 | |
| typedef struct _proxy_info {
 | |
|     /* tei of directly connected proxy */
 | |
|     uint16_t    dc_proxy    :12,
 | |
|     /* link type between station and proxy, see PLC_LINK_TYPE_XXX */
 | |
|                 link        :1,
 | |
|                 rsvd        :3;
 | |
|     /* count of sub STA under this proxy */
 | |
|     uint16_t    sub_sta_cnt;
 | |
|     /* TEIs of sub STAs under this proxy */
 | |
|     tei_t       sub_sta_tei[0];
 | |
| } proxy_info_t;
 | |
| 
 | |
| /* Associate Confirm MME */
 | |
| typedef struct _mme_assoc_cnf {
 | |
|     /* mac address of the station that this assoc conf for */
 | |
|     uint8_t         mac[IOT_MAC_ADDR_LEN];
 | |
|     /* mac address of CCo */
 | |
|     uint8_t         cco_mac[IOT_MAC_ADDR_LEN];
 | |
|     /* result of the associate request */
 | |
|     uint8_t         result;
 | |
|     /* level info */
 | |
|     uint8_t         sta_level;
 | |
|     /* TEI assigned to the requesting STA */
 | |
|     uint16_t        sta_tei     :12,
 | |
|     /* link type between station and proxy, see PLC_LINK_TYPE_XXX */
 | |
|                     link        :1,
 | |
|     /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | |
|                     freq_band   :2,
 | |
|                     rsvd1       :1;
 | |
|     /* TEI of the appointed the PCO */
 | |
|     uint16_t        proxy_tei   :12,
 | |
|                     rsvd2       :4;
 | |
|     /* packet count fragmented into */
 | |
|     uint8_t         packet_cnt;
 | |
|     /* packet sequence number */
 | |
|     uint8_t         packet_sn;
 | |
|     /* random number as the one in assoc request */
 | |
|     uint32_t        random;
 | |
|     /* time interval for next assoc request. unit is 1ms */
 | |
|     uint32_t        re_assoc_time;
 | |
|     /* same as the p2p_sn in assoc request */
 | |
|     uint32_t        p2p_sn;
 | |
|     /* path number for route entry update */
 | |
|     uint32_t        path_number;
 | |
|     union {
 | |
|         struct {
 | |
|             /* reserve for future */
 | |
|             uint8_t         rsvd3;
 | |
|             /* join check code */
 | |
|             uint16_t        join_check_code;
 | |
|             /* reserve for future */
 | |
|             uint8_t         rsvd4;
 | |
|         };
 | |
|         struct {
 | |
|             /* this 4 bytes reserved in spec, extend it for private spec */
 | |
|             uint16_t        rsvd5       :12,
 | |
|             /* assigned sta logical phase */
 | |
|                             l_phase     :2,
 | |
|             /* flag to mark if pco change nack supported.
 | |
|              * see PLC_SUPPORT_PROXY_CHG_NACK for more info.
 | |
|              */
 | |
|                             pco_chg_nack:1,
 | |
|             /* flag to mark if the sta is in white list */
 | |
|                             in_wl       :1;
 | |
|             union {
 | |
|                 /* mark to make sure CCO and STA are belong to same vendor */
 | |
|                 uint16_t    vendor_mark;
 | |
|                 /* crc16 for CRC MME */
 | |
|                 uint16_t    crc16;
 | |
|             };
 | |
|         };
 | |
|     };
 | |
|     /* route info */
 | |
|     route_info_t    route_info;
 | |
|     /* following mme_assoc_cnf_ext_t if the state grid encryption
 | |
|      * authentication is supported
 | |
|      */
 | |
| } mme_assoc_cnf_t;
 | |
| 
 | |
| /* Associate Confirm EXT MME */
 | |
| typedef struct _mme_assoc_cnf_ext {
 | |
|     /* communication encryption key encrypted with cmk, and IV vector is
 | |
|      * the first 12 bytes in mme_assoc_cnf_t or mme_assoc_gather_ind_t
 | |
|      */
 | |
|     uint8_t         cek[MME_ENCRYPT_CEK_LEN];
 | |
|     /* communication encryption key sequence */
 | |
|     uint8_t         cek_seq             :2,
 | |
|     /* reserved for future */
 | |
|                     rsvd                :6;
 | |
|     /* cek remaining valid time, unit is 10s */
 | |
|     uint16_t        cek_left_dur;
 | |
| } mme_assoc_cnf_ext_t;
 | |
| 
 | |
| /* Associate Gather Indicate MME */
 | |
| typedef struct _mme_assoc_gather_ind {
 | |
|     /* result of the assoc request. must be 0 */
 | |
|     uint8_t     result;
 | |
|     /* level info */
 | |
|     uint8_t     sta_level;
 | |
|     /* mac address of CCo */
 | |
|     uint8_t     cco_mac[IOT_MAC_ADDR_LEN];
 | |
|     /* TEI of the appointed PCO */
 | |
|     uint16_t    proxy           :12,
 | |
|     /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | |
|                 freq_band       :2,
 | |
|                 rsvd1           :2;
 | |
|     /* this 1 byte is reserved in spec, extend it for private spec */
 | |
|     /* flag to mark if pco change nack supported.
 | |
|      * see PLC_SUPPORT_PROXY_CHG_NACK for more info.
 | |
|      */
 | |
|     uint8_t     pco_chg_nack    :1,
 | |
|                 rsvd2           :7;
 | |
|     /* STA count in gather indication packet */
 | |
|     uint8_t     sta_cnt;
 | |
|     union {
 | |
|         struct {
 | |
|             /* reserve for future */
 | |
|             uint8_t         rsvd3;
 | |
|             /* join check code */
 | |
|             uint16_t        join_check_code;
 | |
|             /* reserve for future */
 | |
|             uint8_t         rsvd4;
 | |
|         };
 | |
|         struct {
 | |
|             /* this 4 bytes reserved in spec, extend it for private spec */
 | |
|             /* in white list flag bitmap for each sta in the sta_info */
 | |
|             uint8_t         in_wl_bm[2];
 | |
|             union {
 | |
|                 /* mark to make sure CCO and STA are belong to same vendor */
 | |
|                 uint16_t    vendor_mark;
 | |
|                 /* crc16 for CRC MME */
 | |
|                 uint16_t    crc16;
 | |
|             };
 | |
|         };
 | |
|     };
 | |
|     /* station info */
 | |
|     sta_info_t  sta_info[0];
 | |
|     /* following mme_assoc_cnf_ext_t if the state grid encryption
 | |
|      * authentication is supported
 | |
|      */
 | |
| } mme_assoc_gather_ind_t;
 | |
| 
 | |
| /*  Associate Request MME */
 | |
| typedef struct _spg_mme_assoc_req {
 | |
|     /* station mac address */
 | |
|     uint8_t     mac[IOT_MAC_ADDR_LEN];
 | |
|     /* candidate proxy list */
 | |
|     tei_t       proxy[CANDIDATE_PROXY_COUNT];
 | |
|     /* estimated power line phase */
 | |
|     uint8_t     phase_1;
 | |
|     uint8_t     phase_2;
 | |
|     uint8_t     phase_3;
 | |
|     /* device type, see PLC_DEV_TYPE_XXXX */
 | |
|     uint8_t     device_type;
 | |
|     /* this 2 bytes reserved in spec, extend it for private spec.
 | |
|      * simple pair passcode value. Only same passcode CCO and STA can be
 | |
|      * associated.
 | |
|      */
 | |
|     uint16_t    passcode;
 | |
|     /* mac address_type, see PLC_MAC_ADDR_TYPE_XXXX */
 | |
|     uint8_t     mac_addr_type;
 | |
|     /* device communication type, see PLC_DEV_COMM_TYPE_XXX */
 | |
|     uint8_t     comm_type      : 2,
 | |
|     /* candidate proxy 0 link type */
 | |
|                 cand_pco_link0 : 1,
 | |
|     /* candidate proxy 1 link type  */
 | |
|                 cand_pco_link1 : 1,
 | |
|     /* candidate proxy 2 link type  */
 | |
|                 cand_pco_link2 : 1,
 | |
|     /* candidate proxy 3 link type  */
 | |
|                 cand_pco_link3 : 1,
 | |
|     /* candidate proxy 4 link type  */
 | |
|                 cand_pco_link4 : 1,
 | |
|     /* reserved for future */
 | |
|                 reserved_1     : 1;
 | |
|     /* random number retrieved when first power on */
 | |
|     uint32_t    random;
 | |
|     /* vendor specific info */
 | |
|     mme_vendor_info_t vendor_info;
 | |
|     /* version info */
 | |
|     mme_ver_info_t  ver_info;
 | |
|     /* hardware reset count */
 | |
|     uint16_t    hard_reset_cnt;
 | |
|     /* software reset count */
 | |
|     uint16_t    soft_reset_cnt;
 | |
|     /* proxy type. must be 2 */
 | |
|     uint8_t     proxy_type;
 | |
|     /* network sequence number */
 | |
|     uint8_t     network_sn;
 | |
|     /* reserved according to spec */
 | |
|     uint8_t     reserved_2 : 1,
 | |
|     /* mme version */
 | |
|                 mm_ver     : 4,
 | |
|     /* reserved according to spec */
 | |
|                 reserved_3 : 3;
 | |
|     /* sta working freq band identification, 0 - support band 0/1, 1 - support
 | |
|      * band 0/1/2.
 | |
|      */
 | |
|     uint8_t     fb_ident   : 2,
 | |
|     /* reserved according to spec */
 | |
|                 reserved_4 : 6;
 | |
|     /* peer to peer sequence number */
 | |
|     uint32_t    p2p_sn;
 | |
| } spg_mme_assoc_req_t;
 | |
| 
 | |
| /* Associate Confirm MME */
 | |
| typedef struct _spg_mme_assoc_cnf {
 | |
|     /* mac address of the station that this assoc conf for */
 | |
|     uint8_t         mac[IOT_MAC_ADDR_LEN];
 | |
|     /* result of the associate request */
 | |
|     uint8_t         result;
 | |
|     /* STA level */
 | |
|     uint8_t         sta_level;
 | |
|      /* TEI assigned to the requesting STA */
 | |
|     tei_t           sta_tei;
 | |
|     /* TEI of the appointed the PCO */
 | |
|     tei_t           proxy_tei;
 | |
|     /* packet count fragmented into */
 | |
|     uint8_t         packet_cnt;
 | |
|     /* packet sequence number */
 | |
|     uint8_t         packet_sn;
 | |
|     /* last packet fragmented flag */
 | |
|     uint8_t         last_packet_flag;
 | |
|     /* link type between station and proxy, see PLC_LINK_TYPE_XXX */
 | |
|     uint8_t         link        :1,
 | |
|     /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | |
|                     freq_band   :2,
 | |
|     /* reserved for future */
 | |
|                     rsvd1       :5;
 | |
|     /* random number as the one in assoc request */
 | |
|     uint32_t        random;
 | |
|     /* time interval for next assoc request. unit is 1ms */
 | |
|     uint32_t        re_assoc_time;
 | |
|     /* same as the p2p_sn in assoc request */
 | |
|     uint32_t        p2p_sn;
 | |
|     /* path number for route entry update */
 | |
|     uint32_t        path_number;
 | |
|     /* network sequence number */
 | |
|     uint8_t         network_sn;
 | |
|     /* mme version */
 | |
|     uint8_t         mm_ver  :4,
 | |
|     /* flag to mark if assoc index message should be sent on detection band,
 | |
|      * 0 - working band, 1 - detection band
 | |
|      */
 | |
|                     fb_detect_flag :1,
 | |
|                     resv3   :1,
 | |
|     /* flag to mark if pco change nack supported.
 | |
|      * see PLC_SUPPORT_PROXY_CHG_NACK for more info.
 | |
|      */
 | |
|                     pco_chg_nack:1,
 | |
|     /* flag to mark if the sta is in white list */
 | |
|                     in_wl   :1;
 | |
|     /* this 2 bytes reserved in spec, extend it for private spec */
 | |
|     /* mark to make sure CCO and STA are belong to same vendor */
 | |
|     uint16_t        vendor_mark;
 | |
|     /* route info */
 | |
|     route_info_t    route_info;
 | |
| } spg_mme_assoc_cnf_t;
 | |
| 
 | |
| /* Associate Indicate MME */
 | |
| typedef struct _spg_mme_assoc_ind {
 | |
|     /* result of the associate request */
 | |
|     uint8_t         result;
 | |
|     /* STA level */
 | |
|     uint8_t         sta_level;
 | |
|     /* mac address of the station that this assoc indicate for */
 | |
|     uint8_t         sta_mac[IOT_MAC_ADDR_LEN];
 | |
|     /* mac address of CCo */
 | |
|     uint8_t         cco_mac[IOT_MAC_ADDR_LEN];
 | |
|     /* TEI assigned to the requesting STA */
 | |
|     tei_t           sta;
 | |
|     /* TEI of the appointed the PCO */
 | |
|     tei_t           proxy;
 | |
|     /* link type between station and proxy, see PLC_LINK_TYPE_XXX */
 | |
|     uint8_t         link        :1,
 | |
|     /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | |
|                     freq_band   :2,
 | |
|     /* reserved for future */
 | |
|                     rsvd1       :5;
 | |
|     uint8_t         rsvd2[2];
 | |
|     /* packet sequence number */
 | |
|     uint8_t         packet_sn;
 | |
|     /* packet count fragmented into */
 | |
|     uint8_t         packet_cnt;
 | |
|     /* last packet fragmented flag */
 | |
|     uint8_t         last_packet_flag;
 | |
|     /* random number as the one in assoc request */
 | |
|     uint32_t        random;
 | |
|     uint8_t         rsvd3[17];
 | |
|     /* network sequence number */
 | |
|     uint8_t         network_sn;
 | |
|     uint16_t        rsvd4;
 | |
|     /* time interval for next assoc request. unit is 1ms */
 | |
|     uint32_t        re_assoc_time;
 | |
|     /* same as the p2p_sn in assoc request */
 | |
|     uint32_t        p2p_sn;
 | |
|     uint32_t        rsvd5[1];
 | |
|     /* this 4 bytes reserved in spec, extend it for private spec */
 | |
|     uint32_t        rsvd6       :14,
 | |
|     /* flag to mark if pco change nack supported.
 | |
|      * see PLC_SUPPORT_PROXY_CHG_NACK for more info.
 | |
|      */
 | |
|                     pco_chg_nack :1,
 | |
|     /* flag to mark if the sta is in white list */
 | |
|                     in_wl       :1,
 | |
|     /* mark to make sure CCO and STA are belong to same vendor */
 | |
|                     vendor_mark :16;
 | |
|     /* route info */
 | |
|     route_info_t    route_info;
 | |
| } spg_mme_assoc_ind_t;
 | |
| 
 | |
| /* Associate Gather Indicate MME */
 | |
| typedef struct _spg_mme_assoc_gather_ind {
 | |
|     /* result of the assoc request, set to 0. */
 | |
|     uint8_t     result;
 | |
|     /* sta level */
 | |
|     uint8_t     sta_level;
 | |
|     /* mac address of CCo */
 | |
|     uint8_t     cco_mac[IOT_MAC_ADDR_LEN];
 | |
|     /* TEI of the STA assigned as the PCO */
 | |
|     tei_t       proxy;
 | |
|     /* network sequence number */
 | |
|     uint8_t     network_sn;
 | |
|     /* STA count in gather indication packet */
 | |
|     uint8_t     sta_cnt;
 | |
|     /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | |
|     uint8_t     freq_band       :2,
 | |
|     /* reserved for future */
 | |
|                 rsvd1           :6;
 | |
|     /* reserved according to spec */
 | |
|     uint8_t     rsvd2[10];
 | |
|     /* flag to mark if pco change nack supported.
 | |
|      * see PLC_SUPPORT_PROXY_CHG_NACK for more info.
 | |
|      */
 | |
|     uint8_t     pco_chg_nack    :1,
 | |
|                 rsvd3           :7;
 | |
|     /* this 4 bytes reserved in spec, extend it for private spec */
 | |
|     /* in white list flag bitmap for each sta in the sta_info */
 | |
|     uint8_t     in_wl_bm[2];
 | |
|     /* mark to make sure CCO and STA are belong to same vendor */
 | |
|     uint16_t    vendor_mark;
 | |
|     /* station info list */
 | |
|     sta_info_t  sta_info[0];
 | |
| } spg_mme_assoc_gather_ind_t;
 | |
| 
 | |
| #pragma pack(pop)   // restore the pack status
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* PLC_MME_ASSOC_H */
 |