892 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			892 lines
		
	
	
		
			32 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_BEACON_H
 | 
						|
#define PLC_BEACON_H
 | 
						|
 | 
						|
///This file define data struct share between CVG and MAC
 | 
						|
 | 
						|
/* os shim includes */
 | 
						|
#include "os_types_api.h"
 | 
						|
 | 
						|
#include "plc_fr.h"
 | 
						|
#include "plc_mpdu_header.h"
 | 
						|
#include "plc_protocol.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/* This file contains the beacon structure definition
 | 
						|
* and function to get/set the related field for packed
 | 
						|
* structure
 | 
						|
*/
 | 
						|
 | 
						|
/* pack for the structures in the whole file */
 | 
						|
#pragma pack(push)  /* save the pack status */
 | 
						|
#pragma pack(1)     /* 1 byte align */
 | 
						|
 | 
						|
/* define the target band ID0 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_0           0
 | 
						|
 | 
						|
/* define the target band ID1 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_1           1
 | 
						|
 | 
						|
/* define the target band ID2 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_2           2
 | 
						|
 | 
						|
/* define the target band ID3 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_3           3
 | 
						|
 | 
						|
/* define the target band ID4 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_4           4
 | 
						|
 | 
						|
/* define the target band ID8 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_8           8
 | 
						|
 | 
						|
/* define the target band ID9 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_9           9
 | 
						|
 | 
						|
/* define the target band ID10 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_10          10
 | 
						|
 | 
						|
/* define the target band ID11 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_11          11
 | 
						|
 | 
						|
/* define the target band ID12 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_12          12
 | 
						|
 | 
						|
/* define the target band ID13 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_13          13
 | 
						|
 | 
						|
/* define the target band ID14 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_14          14
 | 
						|
 | 
						|
/* define the target band ID15 in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_15          15
 | 
						|
 | 
						|
/* define the target multi band in the frequency change entry */
 | 
						|
#define BEACON_FREQ_BAND_ID_MULTI_1_2   (128)
 | 
						|
 | 
						|
#define BEACON_FREQ_BAND_ID_MAX         BEACON_FREQ_BAND_ID_MULTI_1_2
 | 
						|
#define BEACON_FREQ_BAND_ID_INVALID     0xFF
 | 
						|
 | 
						|
/* define the beacon send type */
 | 
						|
/* sent only hplc beacon */
 | 
						|
#define BEACON_TX_ONLY_HPLC             0
 | 
						|
/* send only rf standard beacon */
 | 
						|
#define BEACON_TX_ONLY_RF               1
 | 
						|
/* send hplc beacon, and send rf standard beacon at the end of the hplc slot */
 | 
						|
#define BEACON_TX_HPLC_RF               2
 | 
						|
/* send hplc beacon, and send rf simple beacon at the end of the hplc slot */
 | 
						|
#define BEACON_TX_HPLC_SIMPLE_RF        3
 | 
						|
/* send hplc beacon, and send rf simple beacon in csma slot */
 | 
						|
#define BEACON_TX_HPLC_CSMA_SIMPLE_RF   4
 | 
						|
/* send hplc beacon, and send rf standard beacon synchronously */
 | 
						|
#define BEACON_TX_HPLC_RF_SYNC          5
 | 
						|
/* send hplc beacon, and send rf simple beacon synchronously */
 | 
						|
#define BEACON_TX_HPLC_SIMPLE_RF_SYNC   6
 | 
						|
 | 
						|
//TODO:the protocol has not yet defined the channel number
 | 
						|
/* define the target rf channel ID, min */
 | 
						|
#define RF_CHANNEL_ID_1                 1
 | 
						|
/* default channel id */
 | 
						|
#define RF_CHANNEL_ID_16                16
 | 
						|
 | 
						|
/* invalid channel id */
 | 
						|
#define RF_CHANNEL_ID_INVALID           0
 | 
						|
 | 
						|
/* define encryption compatible mode */
 | 
						|
#define ENCRYPT_MODE_COMPAT             0
 | 
						|
/* define encryption forced mode */
 | 
						|
#define ENCRYPT_MODE_FORCE              1
 | 
						|
 | 
						|
/* define national encryption algorithm */
 | 
						|
#define ENCRYPT_ALGO_NATION             0
 | 
						|
/* define international encryption algorithm */
 | 
						|
#define ENCRYPT_ALGO_INTERNATION        1
 | 
						|
 | 
						|
/* define international encryption algorithm type */
 | 
						|
#define ECDHE_ECDSA_WITH_AES_128_CBC    0
 | 
						|
#define ECDHE_ECDSA_WITH_AES_128_GCM    1
 | 
						|
 | 
						|
/* define national encryption algorithm type */
 | 
						|
#define ECDHE_ECDSA_WITH_SM4_CBC_SM3    0
 | 
						|
 | 
						|
typedef enum _beacon_entry_type_id {
 | 
						|
    MAC_BCN_TYPE_ID_STA_CAP = 0x00,
 | 
						|
    MAC_BCN_TYPE_ID_RT_PARAM = 0x01,
 | 
						|
    MAC_BCN_TYPE_ID_FREQ_CHQ = 0x02,
 | 
						|
    MAC_BCN_TYPE_ID_RF_ROUTE = 0x03,
 | 
						|
    MAC_BCN_TYPE_ID_RF_CHANNEL_CHQ = 0x04,
 | 
						|
    MAC_BCN_TYPE_ID_RF_SIMPLE_PARAM = 0x05,
 | 
						|
    MAC_BCN_TYPE_ID_RTC = 0x06,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_SPEC = 0xB1,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_ROAM = 0xB2,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_DATA = 0xB3,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_DEBUG = 0xB4,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_TSFM = 0xB5,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_SECURITY = 0xB6,
 | 
						|
    MAC_BCN_TYPE_ID_VENDOR_RF = 0xB7,
 | 
						|
    MAC_BCN_TYPE_ID_UNKNOWN = 0xBF,
 | 
						|
    MAC_BCN_TYPE_ID_TIME_SLOT = 0xC0
 | 
						|
} beacon_entry_type_id_t;
 | 
						|
 | 
						|
/* header type + header len */
 | 
						|
#define get_bcn_entry_hdr_len(bcn_tid) \
 | 
						|
    ((bcn_tid >= MAC_BCN_TYPE_ID_TIME_SLOT)?3:2)
 | 
						|
 | 
						|
/*
 | 
						|
* beacon frame payload common fixed structure
 | 
						|
*/
 | 
						|
typedef struct _beacon_payload_fixed_header {
 | 
						|
    uint8_t beacon_type     : 3,        // byte 0 [0, 2]
 | 
						|
        sg_forming_complete : 1,        // byte 0 [3]
 | 
						|
        simple_beacon       : 1,        // byte 0 [4]
 | 
						|
        auth_enable         : 1,        // byte 0 [5]
 | 
						|
        allow_assoc         : 1,        // byte 0 [6]
 | 
						|
        allow_chan_eval     : 1;        // byte 0 [7]
 | 
						|
    uint8_t sg_forming_cnt;             // byte 1
 | 
						|
    uint8_t cco_mac_addr[6];            // byte 2-7
 | 
						|
    uint32_t beacon_seq_num;            // byte 8-11
 | 
						|
} beacon_payload_fixed_header_t;
 | 
						|
 | 
						|
/* standard beacon frame payload structure */
 | 
						|
typedef struct _beacon_payload_std_header {
 | 
						|
    beacon_payload_fixed_header_t fixed_hdr;
 | 
						|
    uint32_t rf_channel     : 8,
 | 
						|
             rf_option      : 2,
 | 
						|
             encrypt_mode   : 1,
 | 
						|
             cek_seq        : 2,
 | 
						|
             encrypt_algo   : 1,
 | 
						|
             rsvd1          : 18;
 | 
						|
    uint32_t rsvd2;
 | 
						|
    uint8_t beacon_entry_num;
 | 
						|
    /* sizeof(struct _beacon_entry_sta_cap) */
 | 
						|
    /* sizeof(struct _beacon_entry_route) */
 | 
						|
    /* 0 or 1 x sizeof(struct _beacon_entry_freq_change) */
 | 
						|
    /* sizeof(struct _beacon_entry_time_slot_alloc) */
 | 
						|
    /* sizeof(payload ICV) */
 | 
						|
} beacon_payload_std_header_t;
 | 
						|
 | 
						|
/* simple beacon frame payload structure */
 | 
						|
typedef struct _beacon_payload_simple_header {
 | 
						|
    beacon_payload_fixed_header_t fixed_hdr;
 | 
						|
    uint8_t beacon_entry_num;
 | 
						|
    /* sizeof(struct _beacon_entry_simple_param) */
 | 
						|
    /* sizeof(payload ICV) */
 | 
						|
} beacon_payload_simple_header_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_sta_cap {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x00 */
 | 
						|
    uint32_t beacon_entry_len   : 8,
 | 
						|
        tei                     : 12,
 | 
						|
        pco_tei                 : 12;
 | 
						|
    uint8_t reach_rate_to_cco;
 | 
						|
    uint8_t src_mac_addr[6];
 | 
						|
    uint8_t node_role           : 4,
 | 
						|
        node_level              : 4;
 | 
						|
    int8_t  snr_to_pco;
 | 
						|
    uint8_t phase               : 2,
 | 
						|
    /* rf hop to cco */
 | 
						|
            rf_hop              : 4,
 | 
						|
    /* reserved for future */
 | 
						|
            rsvd                : 2;
 | 
						|
} beacon_entry_sta_cap_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_route {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x01 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint16_t routing_update_intval;     /* unit second */
 | 
						|
    uint16_t next_update_countdown;     /* unit second */
 | 
						|
    uint16_t pco_discover_list_intval;  /* unit second */
 | 
						|
    uint16_t sta_discover_list_intval;  /* unit second */
 | 
						|
} beacon_entry_route_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_freq_change {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x02 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint8_t target_freq;                /* target freq, chan 0 or 1 */
 | 
						|
    uint32_t change_countdown;          /* unit ms */
 | 
						|
} beacon_entry_freq_change_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_rf_route {
 | 
						|
    /* 0x03 */
 | 
						|
    uint8_t beacon_entry_type;
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* rf discover list period, unit 1s */
 | 
						|
    uint8_t rf_dis_period;
 | 
						|
    /* rf traffic success ratio expired period, unit is 1 rf_dis_period */
 | 
						|
    uint8_t rf_age_period;
 | 
						|
} beacon_entry_rf_route_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_rf_channel_change {
 | 
						|
    /* 0x04 */
 | 
						|
    uint8_t  beacon_entry_type;
 | 
						|
    uint8_t  beacon_entry_len;
 | 
						|
    /* target rf channel */
 | 
						|
    uint8_t  target_rf;
 | 
						|
    /* unit is 1ms */
 | 
						|
    uint32_t time_left;
 | 
						|
    /* target rf option */
 | 
						|
    uint8_t  target_option          :2,
 | 
						|
    /* reserved for future */
 | 
						|
             rsvd                   :6;
 | 
						|
} beacon_entry_rf_channel_chg_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_rtc {
 | 
						|
    /* entry type is 0x06 */
 | 
						|
    uint8_t beacon_entry_type;
 | 
						|
    /* entry len is 0x0A */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* stand for the delta between cco rtc and the base timer
 | 
						|
     * 2000.1.1 00:00:00, unit is 1s
 | 
						|
     */
 | 
						|
    uint32_t cco_date;
 | 
						|
    /* cco ntb of corresponding date  */
 | 
						|
    uint32_t cco_ntb;
 | 
						|
} beacon_entry_rtc_t;
 | 
						|
 | 
						|
/* vendor specific entry. this is a vendor specific beacon entry
 | 
						|
 * and is not defined in the CPLC spec. note that if any beacon entry
 | 
						|
 * are being used, beacon_entry_vendor_spec_t must exist and be the front
 | 
						|
 * of other vendor entries.
 | 
						|
 */
 | 
						|
typedef struct _beacon_entry_vendor_spec {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb1 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* flag to mark if this network is for debug purpose */
 | 
						|
    uint8_t     cco_debug           :1,
 | 
						|
    /* proxy selection duration required to join the ntwork. unit is 1 route
 | 
						|
     * period.
 | 
						|
     */
 | 
						|
                proxy_select_dur    :3,
 | 
						|
    /* flag to mark if fix rate should be used in the whole network */
 | 
						|
                fixed_rate          :1,
 | 
						|
    /* flag to mark if PCO should report SNR with it's direct sub STA
 | 
						|
     * periodically.
 | 
						|
     */
 | 
						|
                pco_snr_rpt         :1,
 | 
						|
    /* dual mode device tx config, 0 - invalid, 1 - async tx, 2 - sync tx */
 | 
						|
                dm_tx_cfg           :2;
 | 
						|
    uint8_t     allowed_cco_tf_sr;
 | 
						|
    uint16_t    vendor_id;
 | 
						|
    uint8_t     power;
 | 
						|
} beacon_entry_vendor_spec_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_roam {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb2 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* define the rank from which the cco/pco role candidate start to take
 | 
						|
     * higher priority, this value must be equal or smaller than
 | 
						|
     * CANDIDATE_PROXY_COUNT.
 | 
						|
     */
 | 
						|
    uint8_t     sta_proxy_weight_rank   :4,
 | 
						|
    /* for (level - base_level) <= level_score_high_th, level_score_l
 | 
						|
     * will take effect. Otherwise, level_score_h will take effect. The
 | 
						|
     * purpose is to try to minimize the topo tree depth while giving enough
 | 
						|
     * flexibility for candidate pco selection.
 | 
						|
     */
 | 
						|
                level_score_h_th        :4;
 | 
						|
    /* define sta proxy traffic success ratio threshold */
 | 
						|
    uint8_t     sta_proxy_good_tf_sr_th;
 | 
						|
    /* define proxy roaming gap. if the new proxy is better enough than current
 | 
						|
     * proxy, then roaming to the new proxy.
 | 
						|
     * new_proxy_score > (cur_proxy_score + roaming_gap)
 | 
						|
     * the smaller the gap, the easier to roaming to a better proxy.
 | 
						|
     * if traffic success ratio with proxy lower than sta_proxy_good_tf_sr_th,
 | 
						|
     * local device will start to use sta_roaming_gap_l while selecting
 | 
						|
     * candidate pco. otherwise, sta_roaming_gap_h will be used.
 | 
						|
     */
 | 
						|
    uint8_t     sta_roaming_gap_h;
 | 
						|
    uint8_t     sta_roaming_gap_l;
 | 
						|
    /* define cco phase traffic success ratio threshold */
 | 
						|
    uint8_t     cco_phase_check_tf_sr_th;
 | 
						|
    /* define level 1 device switch phase gap. if the new phase is better enough
 | 
						|
     * than current phase, then switch to the new phase.
 | 
						|
     * new_phase_score > (cur_phase_score + phase_gap)
 | 
						|
     * the smaller the gap, the easier to switch the phase.
 | 
						|
     * if traffic success ratio with cco higher than cco_phase_check_tf_sr_th,
 | 
						|
     * local device will start to use cco_phase_gap_other while selecting
 | 
						|
     * logical phase. if traffic success ratio with cco lower than
 | 
						|
     * sta_proxy_good_tf_sr_th, use cco_phase_gap_own_l, otherwise
 | 
						|
     * cco_phase_gap_own_h will be used.
 | 
						|
     */
 | 
						|
    uint8_t     cco_phase_gap_own_h;
 | 
						|
    uint8_t     cco_phase_gap_own_l;
 | 
						|
    uint8_t     cco_phase_gap_other;
 | 
						|
    /* define 1 level corresponding to how many score while calculating path
 | 
						|
     * score.
 | 
						|
     */
 | 
						|
    uint8_t     level_score_h;
 | 
						|
    uint8_t     level_score_l;
 | 
						|
    /* see CVG_RT_STA_CCO_GOOD_XXX */
 | 
						|
    uint8_t     cco_good_tf_sr_th;
 | 
						|
    uint8_t     cco_good_tx_sr_th;
 | 
						|
    uint8_t     cco_good_rx_sr_th;
 | 
						|
    /* see CVG_RT_STA_PCO_GOOD_XXX */
 | 
						|
    uint8_t     pco_good_tf_sr_th;
 | 
						|
    uint8_t     pco_good_tx_sr_th;
 | 
						|
    uint8_t     pco_good_rx_sr_th;
 | 
						|
    /* see CVG_RT_STA_CLAMBER_TF_SR_TH */
 | 
						|
    uint8_t     clamber_tf_sr_th;
 | 
						|
    /* see CVG_RT_STA_CLAMBER_TARGET_TF_SR_TH */
 | 
						|
    uint8_t     clamber_target_tf_sr_th;
 | 
						|
    /* see CVG_RT_STA_PROXY_TF_SR_RANK */
 | 
						|
    uint8_t     proxy_tf_sr_rank;
 | 
						|
    /* see CVG_RT_STA_ROAM_LEARNING_CNT */
 | 
						|
    uint8_t     roam_learn_cnt;
 | 
						|
} beacon_entry_vendor_roam_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_data {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb3 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* vendor app data */
 | 
						|
    uint8_t     data[14];
 | 
						|
} beacon_entry_vendor_data_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_debug {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb4 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* target sta mac address */
 | 
						|
    uint8_t     addr[6];
 | 
						|
} beacon_entry_vendor_debug_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_tsfm {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb5 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* interval that  sta should report calculated tsfm detection data to
 | 
						|
     * cco. unit is 1s.
 | 
						|
     */
 | 
						|
    uint16_t    rpt_tsfm_dur;
 | 
						|
    /* algorithm to be used for transformer detection */
 | 
						|
    uint16_t    tsfm_algorithm          :4,
 | 
						|
    /* flag to mark if tsfm cco direct network detection enable */
 | 
						|
                tsfm_cco_detect_en      :1,
 | 
						|
    /* reserved for future */
 | 
						|
                rsvd                    :7,
 | 
						|
    /* level difference threshold if two networks level has big difference */
 | 
						|
                tsfm_level_big_diff_th  :4;
 | 
						|
    /* lowest valid snr threshold for tsfm, unit is 1 db */
 | 
						|
    int8_t      tsfm_low_snr_th;
 | 
						|
    /* percentage of highest snr statistics collected to be used for tsfm */
 | 
						|
    uint8_t     tsfm_snr_stat_high_th;
 | 
						|
    /* interval that sta should do tsfm detection check to unit is 1s. */
 | 
						|
    uint16_t    check_tsfm_dur;
 | 
						|
    /* snr difference threshold if two networks level is same, unit is 1 db */
 | 
						|
    uint8_t     tsfm_snr_diff_th1;
 | 
						|
    /* snr difference threshold if two networks level is same, unit is 1 db */
 | 
						|
    uint8_t     tsfm_snr_diff_th2;
 | 
						|
    /* cco lowest valid snr threshold for tsfm, unit is 1 db */
 | 
						|
    int8_t      tsfm_cco_low_snr_th;
 | 
						|
    /* penalty value if no cco snr was received in this statistical period,
 | 
						|
     * unit is 1 db.
 | 
						|
     */
 | 
						|
    uint8_t     tsfm_cco_snr_penal;
 | 
						|
    /* cco difference threshold if two networks level is same, unit is 1 db */
 | 
						|
    uint8_t     tsfm_cco_diff_th1;
 | 
						|
    /* cco difference threshold if two networks level is same, unit is 1 times
 | 
						|
     */
 | 
						|
    uint8_t     tsfm_cco_diff_th2;
 | 
						|
    /* zc ntb delta threshold for tsfm, unit is 100 ntb */
 | 
						|
    uint8_t     tsfm_zc_diff_th1;
 | 
						|
    /* zc ntb delta variance threshold for tsfm, unit is 1 times */
 | 
						|
    uint8_t     tsfm_zc_diff_th2;
 | 
						|
    /* zc period delta variance threshold for tsfm, unit is 1 times */
 | 
						|
    uint8_t     tsfm_zc_diff_th3;
 | 
						|
    /* zc ntb delta threshold for tsfm, unit is 1 times or 100 ntb */
 | 
						|
    uint8_t     tsfm_zc_diff_th4;
 | 
						|
    /* weight factor of received beacon snr for tsfm */
 | 
						|
    uint8_t     tsfm_snr_bc_factor    :4,
 | 
						|
    /* weight factor of received sof snr for tsfm */
 | 
						|
                tsfm_snr_sof_factor   :4;
 | 
						|
} beacon_entry_vendor_tsfm_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_security {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb6 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* simple pair passcode */
 | 
						|
    uint16_t    passcode;
 | 
						|
    /* reserved for future */
 | 
						|
    uint16_t    rsvd;
 | 
						|
} beacon_entry_vendor_security_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_vendor_rf {
 | 
						|
    uint8_t     beacon_entry_type;      /* 0xb7 */
 | 
						|
    uint8_t     beacon_entry_len;
 | 
						|
    /* rf tx power cap, unit is 1dbm */
 | 
						|
    int8_t      rf_power;
 | 
						|
    /* flag to mark if force link communication */
 | 
						|
    uint8_t     force_link_valid    : 1,
 | 
						|
    /* link type, 1 - force rf, 0 - force hplc */
 | 
						|
                force_rf_link       : 1,
 | 
						|
    /* flag to mark if rf power is valid */
 | 
						|
                rf_power_valid      : 1,
 | 
						|
    /* reserved for future */
 | 
						|
                rsvd1               : 5;
 | 
						|
    /* reserved for future */
 | 
						|
    uint8_t     rsvd[2];
 | 
						|
} beacon_entry_vendor_rf_t;
 | 
						|
 | 
						|
typedef struct _beacon_entry_time_slot_alloc {
 | 
						|
    uint8_t beacon_entry_type;          /* 0xc0 */
 | 
						|
    uint16_t beacon_entry_len;
 | 
						|
    uint8_t total_slot_non_cco_beacon;
 | 
						|
    uint16_t total_slot_cco_beacon  : 4,
 | 
						|
        csma_phase_num              : 2,
 | 
						|
        rsvd1                       : 10;
 | 
						|
    uint8_t total_slot_pco_beacon;
 | 
						|
    uint8_t beacon_slot_period;         /* unit ms */
 | 
						|
    uint8_t csma_slot_period;           /* unit 10ms */
 | 
						|
    uint8_t bind_csma_phase_num;        /* 1-3 */
 | 
						|
    uint8_t bind_csma_lid;
 | 
						|
    uint8_t tdma_period;                /* unit ms */
 | 
						|
    uint8_t tdma_lid;
 | 
						|
    uint32_t cur_beacon_timestamp;      /* NTB */
 | 
						|
    uint32_t beacon_period;             /* unit ms */
 | 
						|
    uint16_t rf_bc_slot_period      : 10,/* unit ms */
 | 
						|
             rsvd2                  : 6;
 | 
						|
    /* N x sizeof(struct _sub_beacon_entry_non_cco_beacon) */
 | 
						|
    /* (1,2,3) x sizeof(struct _sub_beacon_entry_csma_slot) */
 | 
						|
    /* (1,2,3) x sizeof(struct _sub_beacon_entry_bind_csma_slot) */
 | 
						|
    /* 1 x sizeof(beacon_payload_icv_t) */
 | 
						|
} beacon_entry_time_slot_alloc_t;
 | 
						|
 | 
						|
typedef struct _sub_beacon_entry_non_cco_beacon {
 | 
						|
    uint16_t tei_to_send    : 12, /* designated TEI to send beacon */
 | 
						|
        beacon_type         : 1,  /* 0x0 - discovery, 0x1 - proxy */
 | 
						|
        tx_flag             : 3;  /* tx type flag, see BEACON_TX_XXX */
 | 
						|
} sub_beacon_entry_non_cco_beacon_t;
 | 
						|
 | 
						|
typedef struct _sub_beacon_entry_csma_slot {
 | 
						|
    uint32_t csma_period    : 24, /* unit ms */
 | 
						|
        phase               : 2, /* corresponding phase */
 | 
						|
        resv                : 6;
 | 
						|
} sub_beacon_entry_csma_slot_t;
 | 
						|
 | 
						|
typedef struct _sub_beacon_entry_bind_csma_slot {
 | 
						|
    uint32_t bind_csma_period   : 24, /* unit ms */
 | 
						|
        phase                   : 2, /* corresponding phase */
 | 
						|
        resv                    : 6;
 | 
						|
} sub_beacon_entry_bind_csma_slot_t;
 | 
						|
 | 
						|
/* simple param entry */
 | 
						|
typedef struct _beacon_entry_simple_param {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x05 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* tei */
 | 
						|
    uint32_t tei                : 12,
 | 
						|
    /* proxy tei */
 | 
						|
             pco_tei            : 12,
 | 
						|
    /* role */
 | 
						|
             role               : 4,
 | 
						|
    /* level */
 | 
						|
             level              : 4;
 | 
						|
    /* mac addr */
 | 
						|
    uint8_t  src_mac_addr[6];
 | 
						|
    /* rf hop to cco */
 | 
						|
    uint8_t  rf_hop             : 4,
 | 
						|
    /* encryption mode, see ENCRYPTION_MODE_XXX */
 | 
						|
             encrypt_mode       : 1,
 | 
						|
    /* encryption_algorithm, see ENCRYPTION_ALGORITHM_XXX */
 | 
						|
             encrypt_algo       : 1,
 | 
						|
             rsvd               : 2;
 | 
						|
    /* csma slot start ntb */
 | 
						|
    uint32_t csma_start_ntb;
 | 
						|
    /* csma slot duration, unit 1ms */
 | 
						|
    uint16_t csma_dur;
 | 
						|
} beacon_entry_simple_param_t;
 | 
						|
 | 
						|
typedef struct _beacon_payload_icv {
 | 
						|
    uint32_t icv;
 | 
						|
} beacon_payload_icv_t;
 | 
						|
 | 
						|
#if (SUPPORT_IEEE_1901)
 | 
						|
/* pb136 allowed beacon payload size */
 | 
						|
#define PLC_PB136_BC_PAYLOAD_SIZE       128
 | 
						|
/* pb520 allowed beacon payload size */
 | 
						|
#define PLC_PB520_BC_PAYLOAD_SIZE       512
 | 
						|
#else /* (SUPPORT_IEEE_1901) */
 | 
						|
/* pb136 allowed beacon payload size */
 | 
						|
#define PLC_PB136_BC_PAYLOAD_SIZE       129
 | 
						|
/* pb520 allowed beacon payload size */
 | 
						|
#define PLC_PB520_BC_PAYLOAD_SIZE       513
 | 
						|
#endif /* (SUPPORT_IEEE_1901) */
 | 
						|
 | 
						|
/* maximum allowed beacon payload size */
 | 
						|
#define PLC_MAX_BC_PAYLOAD_SIZE         PLC_PB520_BC_PAYLOAD_SIZE
 | 
						|
 | 
						|
/* maximum allowed beacon payload size for non cco beacon slot */
 | 
						|
#define PLC_MAX_BC_NON_CCO_SLOT_SIZE(_bc_pld_size_, _bcsma_valid_) \
 | 
						|
    ((_bc_pld_size_) \
 | 
						|
    - sizeof(beacon_payload_std_header_t) \
 | 
						|
    - sizeof(beacon_entry_sta_cap_t) \
 | 
						|
    - sizeof(beacon_entry_route_t) \
 | 
						|
    - sizeof(beacon_entry_time_slot_alloc_t) \
 | 
						|
    - (PLC_PHASE_CNT * sizeof(sub_beacon_entry_csma_slot_t)) \
 | 
						|
    - ((_bcsma_valid_) ? \
 | 
						|
    (PLC_PHASE_CNT * sizeof(sub_beacon_entry_bind_csma_slot_t)) : 0) \
 | 
						|
    - (HPLC_RF_SUPPORT ? sizeof(beacon_entry_rf_route_t) : 0))
 | 
						|
 | 
						|
/* define calculation method of beacon payload size */
 | 
						|
#define PLC_BC_PLD_SIZE(_phase_cnt_, _non_cco_slot_cnt_, _bcsma_valid_, \
 | 
						|
    _vendor_spec_valid_)   \
 | 
						|
    (sizeof(beacon_payload_std_header_t) \
 | 
						|
    + sizeof(beacon_entry_sta_cap_t) \
 | 
						|
    + sizeof(beacon_entry_route_t) \
 | 
						|
    + sizeof(beacon_entry_time_slot_alloc_t) \
 | 
						|
    + ((_phase_cnt_) * sizeof(sub_beacon_entry_csma_slot_t)) \
 | 
						|
    + ((_bcsma_valid_) ? \
 | 
						|
    ((_phase_cnt_) * sizeof(sub_beacon_entry_bind_csma_slot_t)) : 0) \
 | 
						|
    + ((_non_cco_slot_cnt_) * sizeof(sub_beacon_entry_non_cco_beacon_t)) \
 | 
						|
    + (HPLC_RF_SUPPORT ? sizeof(beacon_entry_rf_route_t) : 0) \
 | 
						|
    + ((_vendor_spec_valid_) ? sizeof(beacon_entry_vendor_spec_t) : 0))
 | 
						|
 | 
						|
/* SPG define start */
 | 
						|
 | 
						|
/*
 | 
						|
 * beacon frame payload structure
 | 
						|
 */
 | 
						|
typedef struct _spg_beacon_payload_fixed_header {
 | 
						|
    uint8_t beacon_type         : 3,
 | 
						|
        spg_forming_complete    : 1,
 | 
						|
        simple_beacon           : 1,
 | 
						|
        multi_select_func_swt   : 1,
 | 
						|
        allow_assoc             : 1, /* con_start_flag */
 | 
						|
        allow_chan_eval         : 1; /* valid when simple_beacon == 1 */
 | 
						|
    uint8_t spg_forming_sn;
 | 
						|
} spg_beacon_payload_fixed_header_t;
 | 
						|
 | 
						|
/* standard beacon frame payload structure */
 | 
						|
typedef struct _spg_beacon_payload_std_header {
 | 
						|
    spg_beacon_payload_fixed_header_t fixed_hdr;
 | 
						|
    uint32_t short_network_id   : 4,
 | 
						|
        rf_option               : 2,
 | 
						|
        rsvd1                   : 2,
 | 
						|
        rf_channel              : 8,
 | 
						|
        rsvd2                   : 16;
 | 
						|
    uint8_t beacon_entry_num;
 | 
						|
} spg_beacon_payload_std_header_t;
 | 
						|
 | 
						|
/* simple beacon frame payload structure */
 | 
						|
typedef struct _spg_beacon_payload_simple_header {
 | 
						|
    spg_beacon_payload_fixed_header_t fixed_hdr;
 | 
						|
    uint8_t cco_mac_addr[6];
 | 
						|
    uint32_t beacon_seq_num;
 | 
						|
    uint8_t beacon_entry_num;
 | 
						|
    /* sizeof(struct _spg_beacon_entry_simple_param) */
 | 
						|
    /* sizeof(payload ICV) */
 | 
						|
} spg_beacon_payload_simple_header_t;
 | 
						|
 | 
						|
/** SPG beacon entry type                 | length of beacon entry(byte(s))
 | 
						|
*
 | 
						|
*   0x00:invalible value                  |
 | 
						|
*   0x01:station capability               |     1
 | 
						|
*   0x02:time slot allocation             |     2
 | 
						|
*   0x03:resv                             |
 | 
						|
*   0x04:resv                             |
 | 
						|
*   0x05:resv                             |
 | 
						|
*   0x06:route parameter entry type       |     1
 | 
						|
*   0x07:freuency change entry type       |     1
 | 
						|
*   0x08:occupy                           |     2
 | 
						|
*   0x09:used for meter reading
 | 
						|
*   0x0A~0xFF:resv                        |
 | 
						|
*
 | 
						|
*/
 | 
						|
typedef enum _spg_beacon_entry_type_id {
 | 
						|
    SPG_MAC_BCN_TYPE_ID_STA_CAP     = 0x01,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_TIME_SLOT   = 0x02,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_RT_PARAM    = 0x06,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_FREQ_CHQ    = 0x07,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_OCCUPY      = 0x08,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_METER       = 0x09,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_FB_DETECT   = 0x0a,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_RTC         = 0x0b,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_RF_ROUTE    = 0x0c,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_RF_CHANNEL_CHQ = 0x0d,
 | 
						|
    SPG_MAC_BCN_TYPE_ID_RF_SIMPLE_PARAM = 0x0e,
 | 
						|
} spg_beacon_entry_type_id_t;
 | 
						|
 | 
						|
/* get entry_header len + length_field len , entry_header always 1byte */
 | 
						|
/* length_field len reference _spg_beacon_entry_type_id */
 | 
						|
#define get_bcn_entry_hdr_len_spg(bcn_tid) \
 | 
						|
    (((bcn_tid == SPG_MAC_BCN_TYPE_ID_TIME_SLOT) || \
 | 
						|
    (bcn_tid == SPG_MAC_BCN_TYPE_ID_OCCUPY))?3:2)
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_sta_cap {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x01 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint8_t node_level      : 6,
 | 
						|
        phase               : 2;
 | 
						|
    uint16_t tei            : 12,
 | 
						|
        node_role           : 4;
 | 
						|
    uint8_t bcn_used_flag;
 | 
						|
    uint8_t src_mac_addr[6];
 | 
						|
    uint16_t pco_tei        : 12,
 | 
						|
        rf_hop              : 4;
 | 
						|
    uint32_t reach_rate_to_cco;
 | 
						|
    uint32_t rsvd;
 | 
						|
} spg_beacon_entry_sta_cap_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_route {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x06 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint16_t routing_update_intval;     /* unit second */
 | 
						|
    uint16_t rsvd1;
 | 
						|
    uint16_t next_update_countdown;     /* unit second */
 | 
						|
    uint8_t rsvd2[20];
 | 
						|
    uint8_t cco_mac_addr[6];
 | 
						|
} spg_beacon_entry_route_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_freq_change {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x07 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint8_t target_freq;
 | 
						|
    uint32_t change_countdown;          /* unit ms */
 | 
						|
} spg_beacon_entry_freq_change_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_time_slot_alloc {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x02 */
 | 
						|
    uint16_t beacon_entry_len;
 | 
						|
    uint8_t total_slot_non_cco_beacon;
 | 
						|
    uint8_t total_slot_cco_beacon;
 | 
						|
    uint8_t csma_phase_num;             /* 0~3 */
 | 
						|
    uint8_t total_slot_pco_beacon;
 | 
						|
    uint16_t beacon_slot_period;        /* unit: 100us */
 | 
						|
    uint8_t csma_slot_period;           /* unit: 1ms or 10ms */
 | 
						|
    uint8_t bind_csma_phase_num;        /* 0~3 */
 | 
						|
    uint8_t bind_csma_lid;
 | 
						|
    uint16_t tdma_period;               /* unit: 100us */
 | 
						|
    uint8_t tdma_lid;
 | 
						|
    uint32_t cur_beacon_timestamp;      /* NTB */
 | 
						|
    uint32_t beacon_period;             /* unit: 100us */
 | 
						|
    uint32_t rf_bc_slot_period    : 10, /* unit ms */
 | 
						|
             rsvd                 : 22;
 | 
						|
} spg_beacon_entry_time_slot_alloc_t;
 | 
						|
 | 
						|
typedef struct _spg_sub_beacon_entry_non_cco_beacon {
 | 
						|
    uint16_t tei_to_send    : 12,
 | 
						|
        beacon_type         : 1,
 | 
						|
        tx_flag             : 3;  /* tx type flag, see BEACON_TX_XXX */
 | 
						|
} spg_sub_beacon_entry_non_cco_beacon_t;
 | 
						|
 | 
						|
typedef struct _spg_sub_beacon_entry_csma_slot {
 | 
						|
    uint32_t csma_period    : 24,       /* unit:100us */
 | 
						|
        phase               : 8;
 | 
						|
} spg_sub_beacon_entry_csma_slot_t;
 | 
						|
 | 
						|
typedef struct _spg_sub_beacon_entry_bind_csma_slot {
 | 
						|
    uint32_t bind_csma_period   : 24,   /* unit:100us */
 | 
						|
        phase                   : 8;
 | 
						|
} spg_sub_beacon_entry_bind_csma_slot_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_payload_icv {
 | 
						|
    uint32_t icv;
 | 
						|
} spg_beacon_payload_icv_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_meter {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x09 */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    uint8_t data[0];
 | 
						|
} spg_beacon_entry_meter_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_fb_detect {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x0a */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* target frequency band id of detection */
 | 
						|
    uint8_t band_id;
 | 
						|
    /* dedicated csma slot supported link id */
 | 
						|
    uint8_t d_csma_lid;
 | 
						|
} spg_beacon_entry_fb_detect_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_rtc {
 | 
						|
    uint8_t  beacon_entry_type;          /* 0x0b */
 | 
						|
    uint8_t  beacon_entry_len;           /* 0x0a */
 | 
						|
    /* stand for the delta between cco rtc and the base timer 2000.1.1 00:00:00,
 | 
						|
     * unit is 1s
 | 
						|
     */
 | 
						|
    uint32_t cco_date;
 | 
						|
    /* cco ntb of corresponding date, unit is 1NTB */
 | 
						|
    uint32_t cco_ntb;
 | 
						|
} spg_beacon_entry_rtc_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_rf_route {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x0c */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* rf discover list period, unit 1s */
 | 
						|
    uint8_t rf_dis_period;
 | 
						|
    /* rf traffic success ratio aging period, unit is 1 rf_dis_period */
 | 
						|
    uint8_t rf_age_period;
 | 
						|
} spg_beacon_entry_rf_route_t;
 | 
						|
 | 
						|
typedef struct _spg_beacon_entry_rf_channel_change {
 | 
						|
    uint8_t  beacon_entry_type;         /* 0x0d */
 | 
						|
    uint8_t  beacon_entry_len;
 | 
						|
    /* target rf channel */
 | 
						|
    uint8_t  target_rf;
 | 
						|
    /* target rf option */
 | 
						|
    uint8_t  target_option          :2,
 | 
						|
    /* reserved for future */
 | 
						|
             rsvd                   :6;
 | 
						|
    /* unit is 1ms */
 | 
						|
    uint32_t time_left;
 | 
						|
} spg_beacon_entry_rf_channel_chg_t;
 | 
						|
 | 
						|
/* simple param entry */
 | 
						|
typedef struct _spg_beacon_entry_simple_param {
 | 
						|
    uint8_t beacon_entry_type;          /* 0x0e */
 | 
						|
    uint8_t beacon_entry_len;
 | 
						|
    /* tei */
 | 
						|
    uint32_t tei                : 12,
 | 
						|
    /* proxy tei */
 | 
						|
             pco_tei            : 12,
 | 
						|
    /* role */
 | 
						|
             role               : 4,
 | 
						|
    /* level */
 | 
						|
             level              : 4;
 | 
						|
    /* mac addr */
 | 
						|
    uint8_t  src_mac_addr[6];
 | 
						|
    /* rf hop to cco */
 | 
						|
    uint8_t  rf_hop             : 4,
 | 
						|
    /* hplc frequency band, see BEACON_FREQ_BAND_ID_XXX */
 | 
						|
             freq_band          : 2,
 | 
						|
             rsvd               : 2;
 | 
						|
    /* csma slot start ntb */
 | 
						|
    uint32_t csma_start_ntb;
 | 
						|
    /* csma slot duration, unit 1ms */
 | 
						|
    uint16_t csma_dur;
 | 
						|
} spg_beacon_entry_simple_param_t;
 | 
						|
 | 
						|
/* pb136 allowed beacon payload size */
 | 
						|
#define SPG_PLC_PB136_BC_PAYLOAD_SIZE       128
 | 
						|
/* pb520 allowed beacon payload size */
 | 
						|
#define SPG_PLC_PB520_BC_PAYLOAD_SIZE       512
 | 
						|
 | 
						|
/* maximum allowed beacon payload size */
 | 
						|
#define SPG_PLC_MAX_BC_PAYLOAD_SIZE         SPG_PLC_PB520_BC_PAYLOAD_SIZE
 | 
						|
 | 
						|
/* maximum allowed beacon payload size for non cco beacon slot */
 | 
						|
#define SPG_PLC_MAX_BC_NON_CCO_SLOT_SIZE \
 | 
						|
    (SPG_PLC_MAX_BC_PAYLOAD_SIZE \
 | 
						|
    - sizeof(spg_beacon_payload_std_header_t) \
 | 
						|
    - sizeof(spg_beacon_entry_sta_cap_t) \
 | 
						|
    - sizeof(spg_beacon_entry_route_t) \
 | 
						|
    - sizeof(spg_beacon_entry_time_slot_alloc_t) \
 | 
						|
    - (PLC_PHASE_CNT * sizeof(spg_sub_beacon_entry_csma_slot_t)) \
 | 
						|
    - (PLC_PHASE_CNT * sizeof(spg_sub_beacon_entry_bind_csma_slot_t)) \
 | 
						|
    - (HPLC_RF_SUPPORT ? sizeof(beacon_entry_rf_route_t) : 0))
 | 
						|
 | 
						|
/* define calculation method of beacon payload size */
 | 
						|
#define SPG_PLC_BC_PLD_SIZE(_phase_cnt_, _non_cco_slot_cnt_, _bcsma_valid_, \
 | 
						|
    _vendor_spec_valid_)   \
 | 
						|
    (sizeof(spg_beacon_payload_std_header_t) \
 | 
						|
    + sizeof(spg_beacon_entry_sta_cap_t) \
 | 
						|
    + sizeof(spg_beacon_entry_route_t) \
 | 
						|
    + sizeof(spg_beacon_entry_time_slot_alloc_t) \
 | 
						|
    + ((_phase_cnt_) * sizeof(spg_sub_beacon_entry_csma_slot_t)) \
 | 
						|
    + ((_bcsma_valid_) ? \
 | 
						|
    ((_phase_cnt_) * sizeof(spg_sub_beacon_entry_bind_csma_slot_t)) : 0) \
 | 
						|
    + ((_non_cco_slot_cnt_) * sizeof(spg_sub_beacon_entry_non_cco_beacon_t)) \
 | 
						|
    + ((_vendor_spec_valid_) ? sizeof(beacon_entry_vendor_spec_t) : 0))
 | 
						|
 | 
						|
/* SPG define end */
 | 
						|
 | 
						|
/* GREEN PHY define start */
 | 
						|
typedef PREPACK struct _hp_bcn_bmi_entry_hdr {
 | 
						|
    uint8_t behdr;
 | 
						|
    uint8_t belen;
 | 
						|
} POSTPACK hp_bcn_bmi_entry_hdr;
 | 
						|
 | 
						|
/* none persist sch - start */
 | 
						|
typedef PREPACK struct _hp_bcn_bmi_np_sch_hdr {
 | 
						|
    uint8_t ns  : 6,
 | 
						|
        rsvd    : 2;
 | 
						|
} POSTPACK hp_bcn_bmi_np_sch_entry;
 | 
						|
 | 
						|
typedef PREPACK struct _hp_bcn_bmi_np_sch_sai_wo_st {
 | 
						|
    uint8_t stpf    : 1,
 | 
						|
        glid        : 7;
 | 
						|
    uint16_t et     : 12,
 | 
						|
        rsvd        : 4;
 | 
						|
} POSTPACK hp_bcn_bmi_np_sch_sai_wo_st;
 | 
						|
 | 
						|
typedef PREPACK struct _hp_bcn_bmi_np_sch_sai_w_st {
 | 
						|
    uint32_t stpf   : 1,
 | 
						|
        glid        : 7,
 | 
						|
        st          : 12,
 | 
						|
        et          : 12;
 | 
						|
} POSTPACK hp_bcn_bmi_np_sch_sai_w_st;
 | 
						|
/* none persist sch - end */
 | 
						|
 | 
						|
typedef PREPACK struct _hp_beacon_payload_fixed_header {
 | 
						|
    uint64_t nid    : 54,
 | 
						|
        hm          : 2,
 | 
						|
        stei        : 8;
 | 
						|
    uint64_t bt     : 3,
 | 
						|
        ncnr        : 1,
 | 
						|
        npsm        : 1,
 | 
						|
        numslots    : 3,
 | 
						|
        slotusage   : 8,
 | 
						|
        slotid      : 3,
 | 
						|
        aclss       : 3,
 | 
						|
        hoip        : 1,
 | 
						|
        rtsbf       : 1,
 | 
						|
        nm          : 2,
 | 
						|
        ccocap      : 2,
 | 
						|
        rsf         : 1,
 | 
						|
        plevel      : 3;
 | 
						|
    union {
 | 
						|
        /* BMI */
 | 
						|
        struct {
 | 
						|
            uint8_t nbe;
 | 
						|
            /* size of hp_bcn_bmi_entry_hdr */
 | 
						|
            /* size of entry content */
 | 
						|
            /* ... */
 | 
						|
            /* size of hp_bcn_bmi_entry_hdr */
 | 
						|
            /* size of entry content */
 | 
						|
            /* size of hp_bcn_bmi_entry_hdr */
 | 
						|
            /* size of entry content */
 | 
						|
        } bmi_hdr;
 | 
						|
        /* OPAD PAD */
 | 
						|
        uint32_t opad[30];
 | 
						|
    } bmi;
 | 
						|
    uint32_t bpcs;
 | 
						|
} POSTPACK hp_beacon_payload_fixed_header;
 | 
						|
/* GREEM PHY define end */
 | 
						|
 | 
						|
/* ieee1901 define start */
 | 
						|
 | 
						|
typedef struct _i1901_beacon_payload_icv {
 | 
						|
    uint32_t icv;
 | 
						|
} i1901_beacon_payload_icv_t;
 | 
						|
 | 
						|
/* ieee1901 define end */
 | 
						|
 | 
						|
#if SUPPORT_GREEN_PHY == 0 \
 | 
						|
 && SUPPORT_SMART_GRID == 0 \
 | 
						|
 && SUPPORT_SOUTHERN_POWER_GRID == 0
 | 
						|
#error("no PLC network type defined.")
 | 
						|
#endif
 | 
						|
 | 
						|
#pragma pack(pop)   // restore the pack status
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* PLC_BEACON_H */
 |