613 lines
21 KiB
C
613 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.
|
||
|
|
||
|
****************************************************************************/
|
||
|
|
||
|
#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 */
|