738 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			738 lines
		
	
	
		
			26 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 MAC_BCM_API_H
							 | 
						||
| 
								 | 
							
								#define MAC_BCM_API_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* common includes */
							 | 
						||
| 
								 | 
							
								#include "iot_utils.h"
							 | 
						||
| 
								 | 
							
								#include "iot_pkt_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_errno.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* plc protocol includes */
							 | 
						||
| 
								 | 
							
								#include "plc_protocol.h"
							 | 
						||
| 
								 | 
							
								#include "plc_utils.h"
							 | 
						||
| 
								 | 
							
								#include "plc_fr.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* beacon update action type */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_ACT_ADD              (1)     /* add content */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_ACT_DEL              (2)     /* delete content */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define the beacon entry section */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_FC_INFO              (0)     /* beacon frame control info */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_FIX_P                (1)     /* fixed beacon payload */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_STA_CAP          (2)     /* sta capability */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_RT_PARAM         (3)     /* route parameter */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_FREQ_CHG         (4)     /* frequency change */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_TIME_SLOT        (5)     /* time slot assignment */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_VENDOR_SPEC      (6)     /* vendor specific */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_METER            (7)     /* meter reading control info */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_FB_DETECT        (8)     /* freq band detection */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_RF_CHANNEL_CHG   (9)     /* rf channel change */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_RF_ROUTE         (10)    /* rf route parameter */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_RF_SIMPLE_PARAM  (11)    /* rf simple param */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_RTC              (12)    /* real time clock */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_HTBUS_FIX_P      (13)    /* HTBUS fixed beacon payload */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_HTBUS_TIME_SLOT  (14)    /* HTBUS time slot assignment */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_HTBUS_USER_DATA  (15)    /* HTBUS user data entry */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_BMI_UNKNOWN          (16)    /* unknown entry */
							 | 
						||
| 
								 | 
							
								/* max beacon entries. always keep it defined as the last one */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_ENTRY_MAX            (MAC_BC_BMI_UNKNOWN + 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define how many bcn entries participate in sorting */
							 | 
						||
| 
								 | 
							
								#define MAC_BCN_SORT_MAX_CNT        (15)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define the rf status of tx beacon. just send tidy beacon */
							 | 
						||
| 
								 | 
							
								#define MAC_RF_SEND_SIMPLE_BCN       (0)
							 | 
						||
| 
								 | 
							
								/* define the rf status of tx beacon. just send standard beacon */
							 | 
						||
| 
								 | 
							
								#define MAC_RF_SEND_STD_BCN          (1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* max beacon vendor app data size */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_APP_DATA_MAX         14
							 | 
						||
| 
								 | 
							
								/* meter reading control entry data size */
							 | 
						||
| 
								 | 
							
								#define MAC_MAX_BC_METER_DATA_SIZE  (0x20)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* min beacon csma slot, unit is 1ms */
							 | 
						||
| 
								 | 
							
								#define MAC_BC_CSMA_SLOT_MIN        (50)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* beacon entry descriptor */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_ent {
							 | 
						||
| 
								 | 
							
								    /* beacon entry type */
							 | 
						||
| 
								 | 
							
								    uint8_t     type;
							 | 
						||
| 
								 | 
							
								    /* beacon entry data */
							 | 
						||
| 
								 | 
							
								    void        *data;
							 | 
						||
| 
								 | 
							
								} mac_bc_ent_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* beacon update descriptor */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_update {
							 | 
						||
| 
								 | 
							
								    /* flag to mark if a beacon tx need to be triggered after beacon updated */
							 | 
						||
| 
								 | 
							
								    uint8_t         tx_req      :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if a new beacon period need to be loaded after beacon
							 | 
						||
| 
								 | 
							
								     * update.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                    new_bp_req  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if phase a is allowed for tx if local device is sta role */
							 | 
						||
| 
								 | 
							
								                    phase_a_tx  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if phase b is allowed for tx if local device is sta role */
							 | 
						||
| 
								 | 
							
								                    phase_b_tx  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if phase c is allowed for tx if local device is sta role */
							 | 
						||
| 
								 | 
							
								                    phase_c_tx  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if use high power */
							 | 
						||
| 
								 | 
							
								                    high_power  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if discovery beacon send with non cco node info */
							 | 
						||
| 
								 | 
							
								                    bc_d_with_non :1;
							 | 
						||
| 
								 | 
							
								    /* entry count */
							 | 
						||
| 
								 | 
							
								    uint8_t         count;
							 | 
						||
| 
								 | 
							
								    /* for CCO role device, this value indicate the number of STA devices in
							 | 
						||
| 
								 | 
							
								     * the network.
							 | 
						||
| 
								 | 
							
								     * for STA role device, this value indicate the number of devices nearby
							 | 
						||
| 
								 | 
							
								     * in the same network.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint16_t        peer_cnt;
							 | 
						||
| 
								 | 
							
								    /* valid bcn entries in entry_sort */
							 | 
						||
| 
								 | 
							
								    uint8_t         entry_sort_cnt;
							 | 
						||
| 
								 | 
							
								    /* bcn entries fill order */
							 | 
						||
| 
								 | 
							
								    uint8_t         entry_sort[MAC_BCN_SORT_MAX_CNT];
							 | 
						||
| 
								 | 
							
								    /* beacon update action */
							 | 
						||
| 
								 | 
							
								    uint8_t         action[MAC_BC_ENTRY_MAX];
							 | 
						||
| 
								 | 
							
								    /* beacon entries to be updated */
							 | 
						||
| 
								 | 
							
								    mac_bc_ent_t    entry[MAC_BC_ENTRY_MAX];
							 | 
						||
| 
								 | 
							
								} mac_bc_update_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* frame control entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_fc {
							 | 
						||
| 
								 | 
							
								    /* network ID */
							 | 
						||
| 
								 | 
							
								    uint32_t        nid     :24,
							 | 
						||
| 
								 | 
							
								    /* rx band ID */
							 | 
						||
| 
								 | 
							
								                    band_id :8;
							 | 
						||
| 
								 | 
							
								    /* ntb delta. remote device network ntb - local device network ntb.
							 | 
						||
| 
								 | 
							
								     * this info is gotten from beacon rx meta infor from mac layer.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    int32_t        delta_ntb;
							 | 
						||
| 
								 | 
							
								    /* snr of the beacon */
							 | 
						||
| 
								 | 
							
								    int8_t          snr;
							 | 
						||
| 
								 | 
							
								    /* rssi of the beacon */
							 | 
						||
| 
								 | 
							
								    int8_t          rssi;
							 | 
						||
| 
								 | 
							
								    /* network type */
							 | 
						||
| 
								 | 
							
								    uint8_t         net_type;
							 | 
						||
| 
								 | 
							
								    /* targeted phase of the beacon */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase    :2,
							 | 
						||
| 
								 | 
							
								    /* flag to indicate is rf package or not */
							 | 
						||
| 
								 | 
							
								                    is_rf    :1,
							 | 
						||
| 
								 | 
							
								    /* version info */
							 | 
						||
| 
								 | 
							
								                    version  :5;
							 | 
						||
| 
								 | 
							
								    /* beacon period count */
							 | 
						||
| 
								 | 
							
								    uint32_t        bp_cnt;
							 | 
						||
| 
								 | 
							
								} mac_bc_fc_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* fixed payload entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_fp {
							 | 
						||
| 
								 | 
							
								    uint8_t         type            : 2,
							 | 
						||
| 
								 | 
							
								                    assoc_done      : 1,
							 | 
						||
| 
								 | 
							
								                    allow_assoc     : 1,
							 | 
						||
| 
								 | 
							
								                    allow_chan_eval : 1,
							 | 
						||
| 
								 | 
							
								                    simple_beacon   : 1,
							 | 
						||
| 
								 | 
							
								                    rf_option       : 2;
							 | 
						||
| 
								 | 
							
								    uint8_t         network_sn;
							 | 
						||
| 
								 | 
							
								    uint8_t         cco_addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    uint32_t        bc_period_cnt;
							 | 
						||
| 
								 | 
							
								    uint32_t        rf_channel      :8,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if enable the authorization process */
							 | 
						||
| 
								 | 
							
								                    auth_enable     :1,
							 | 
						||
| 
								 | 
							
								    /* encryption mode, see ENCRYP_MODE_XXX */
							 | 
						||
| 
								 | 
							
								                    encrypt_mode    :1,
							 | 
						||
| 
								 | 
							
								    /* communication encryption key sequence */
							 | 
						||
| 
								 | 
							
								                    cek_seq         :2,
							 | 
						||
| 
								 | 
							
								    /* encryption_algorithm, see ENCRYPT_ALGO_XXX */
							 | 
						||
| 
								 | 
							
								                    encrypt_algo    :1,
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								                    used_rsvd1      :18,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                    rsvd            :1;
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint32_t        used_rsvd2;
							 | 
						||
| 
								 | 
							
								} mac_bc_fp_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* sta capability entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_sta_cap {
							 | 
						||
| 
								 | 
							
								    /* tei */
							 | 
						||
| 
								 | 
							
								    tei_t           tei;
							 | 
						||
| 
								 | 
							
								    /* proxy tei */
							 | 
						||
| 
								 | 
							
								    tei_t           proxy;
							 | 
						||
| 
								 | 
							
								    /* mac address */
							 | 
						||
| 
								 | 
							
								    uint8_t         addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* minimum traffic success ratio with CCO */
							 | 
						||
| 
								 | 
							
								    uint8_t         min_ul_dl_sr;
							 | 
						||
| 
								 | 
							
								    /* role */
							 | 
						||
| 
								 | 
							
								    uint8_t         role;
							 | 
						||
| 
								 | 
							
								    /* level info */
							 | 
						||
| 
								 | 
							
								    uint8_t         level          : 6,
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								                    used_rsvd      : 2;
							 | 
						||
| 
								 | 
							
								    /* snr of proxy */
							 | 
						||
| 
								 | 
							
								    int8_t          snr;
							 | 
						||
| 
								 | 
							
								    /* phase info */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase          : 3,
							 | 
						||
| 
								 | 
							
								    /* rf hop */
							 | 
						||
| 
								 | 
							
								                    rf_hop         : 4,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if min_ul_dl_sr is invalid */
							 | 
						||
| 
								 | 
							
								                    min_sr_invalid : 1;
							 | 
						||
| 
								 | 
							
								} mac_bc_sta_cap_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* simple param entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_simple_param {
							 | 
						||
| 
								 | 
							
								    /* tei */
							 | 
						||
| 
								 | 
							
								    uint32_t        tei             : 12,
							 | 
						||
| 
								 | 
							
								    /* proxy tei */
							 | 
						||
| 
								 | 
							
								                    pco_tei         : 12,
							 | 
						||
| 
								 | 
							
								    /* role, see PLC_DEV_ROLE_XXX */
							 | 
						||
| 
								 | 
							
								                    role            : 4,
							 | 
						||
| 
								 | 
							
								    /* level */
							 | 
						||
| 
								 | 
							
								                    level           : 4;
							 | 
						||
| 
								 | 
							
								    /* 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,
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								                    used_rsvd       : 2;
							 | 
						||
| 
								 | 
							
								    /* mac addr */
							 | 
						||
| 
								 | 
							
								    uint8_t         addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* csma slot start ntb */
							 | 
						||
| 
								 | 
							
								    uint32_t        csma_start_ntb;
							 | 
						||
| 
								 | 
							
								    /* csma slot duration, unit 1ms */
							 | 
						||
| 
								 | 
							
								    uint16_t        csma_dur;
							 | 
						||
| 
								 | 
							
								} mac_bc_simple_param_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* route parameter entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_rt_param {
							 | 
						||
| 
								 | 
							
								    /* route period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint16_t        rt_period;
							 | 
						||
| 
								 | 
							
								    /* time to next route period. see CVG_RT_RP_MARK_0_DUR for more info */
							 | 
						||
| 
								 | 
							
								    uint16_t        rt_left_period;
							 | 
						||
| 
								 | 
							
								    /* proxy discovery period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint16_t        p_dis_period;
							 | 
						||
| 
								 | 
							
								    /* sta discovery period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint16_t        s_dis_period;
							 | 
						||
| 
								 | 
							
								} mac_bc_rt_param_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_fp_spg {
							 | 
						||
| 
								 | 
							
								    uint8_t         type            : 2,
							 | 
						||
| 
								 | 
							
								                    assoc_done      : 1,
							 | 
						||
| 
								 | 
							
								                    allow_assoc     : 1,
							 | 
						||
| 
								 | 
							
								                    multi_select    : 1, /* diff */
							 | 
						||
| 
								 | 
							
								                    simple_beacon   : 1,
							 | 
						||
| 
								 | 
							
								                    rf_option       : 2;
							 | 
						||
| 
								 | 
							
								    uint8_t         rf_channel;
							 | 
						||
| 
								 | 
							
								    uint8_t         network_sn;
							 | 
						||
| 
								 | 
							
								    uint8_t         short_network_id: 4,
							 | 
						||
| 
								 | 
							
								                    allow_chan_eval : 1,
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								                    used_rsvd1      : 2,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                    rsvd            : 1;
							 | 
						||
| 
								 | 
							
								    uint8_t         cco_addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint16_t        used_rsvd2;
							 | 
						||
| 
								 | 
							
								} mac_bc_fp_spg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_sta_cap_spg {
							 | 
						||
| 
								 | 
							
								    /* tei */
							 | 
						||
| 
								 | 
							
								    tei_t           tei;
							 | 
						||
| 
								 | 
							
								    /* proxy tei */
							 | 
						||
| 
								 | 
							
								    tei_t           proxy;
							 | 
						||
| 
								 | 
							
								    /* mac address */
							 | 
						||
| 
								 | 
							
								    uint8_t         addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* minimum traffic success ratio with CCO */
							 | 
						||
| 
								 | 
							
								    uint8_t         min_ul_dl_sr;
							 | 
						||
| 
								 | 
							
								    /* role */
							 | 
						||
| 
								 | 
							
								    uint8_t         role;
							 | 
						||
| 
								 | 
							
								    /* level info */
							 | 
						||
| 
								 | 
							
								    uint8_t         level;
							 | 
						||
| 
								 | 
							
								    /* phase info */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase   : 3,
							 | 
						||
| 
								 | 
							
								    /* rf hop */
							 | 
						||
| 
								 | 
							
								                    rf_hop  : 4,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if min_ul_dl_sr is invalid */
							 | 
						||
| 
								 | 
							
								                    min_sr_invalid : 1;
							 | 
						||
| 
								 | 
							
								    /* if set, use beacon for channel evaluated */
							 | 
						||
| 
								 | 
							
								    uint8_t         allow_chan_eval;
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint32_t        used_rsvd;
							 | 
						||
| 
								 | 
							
								} mac_bc_sta_cap_spg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* simple param entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_simple_param_spg {
							 | 
						||
| 
								 | 
							
								    /* tei */
							 | 
						||
| 
								 | 
							
								    uint32_t        tei             : 12,
							 | 
						||
| 
								 | 
							
								    /* proxy tei */
							 | 
						||
| 
								 | 
							
								                    pco_tei         : 12,
							 | 
						||
| 
								 | 
							
								    /* role, see PLC_DEV_ROLE_XXX */
							 | 
						||
| 
								 | 
							
								                    role            : 4,
							 | 
						||
| 
								 | 
							
								    /* level */
							 | 
						||
| 
								 | 
							
								                    level           : 4;
							 | 
						||
| 
								 | 
							
								    /* rf hop to cco */
							 | 
						||
| 
								 | 
							
								    uint8_t         rf_hop          : 4,
							 | 
						||
| 
								 | 
							
								    /* hplc frequency band id */
							 | 
						||
| 
								 | 
							
								                    freq_band       : 2,
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								                    used_rsvd       : 2;
							 | 
						||
| 
								 | 
							
								    /* mac addr */
							 | 
						||
| 
								 | 
							
								    uint8_t         addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* csma slot start ntb */
							 | 
						||
| 
								 | 
							
								    uint32_t        csma_start_ntb;
							 | 
						||
| 
								 | 
							
								    /* csma slot duration, unit 1ms */
							 | 
						||
| 
								 | 
							
								    uint16_t        csma_dur;
							 | 
						||
| 
								 | 
							
								} mac_bc_simple_param_spg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_rt_param_spg {
							 | 
						||
| 
								 | 
							
								    /* route period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint16_t        rt_period;
							 | 
						||
| 
								 | 
							
								    /* time to next route period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint16_t        rt_left_period;
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint16_t        used_rsvd1;
							 | 
						||
| 
								 | 
							
								    /* CCO MAC address */
							 | 
						||
| 
								 | 
							
								    uint8_t         cco_addr[IOT_MAC_ADDR_LEN];
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint8_t         used_rsvd2[20];
							 | 
						||
| 
								 | 
							
								} mac_bc_rt_param_spg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* frequency change entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_freq_chg {
							 | 
						||
| 
								 | 
							
								    /* target frequency */
							 | 
						||
| 
								 | 
							
								    uint8_t         targer_freq;
							 | 
						||
| 
								 | 
							
								    /* time left */
							 | 
						||
| 
								 | 
							
								    uint32_t        time_left;
							 | 
						||
| 
								 | 
							
								} mac_bc_freq_chg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* rf channel change entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_rf_channel_chg {
							 | 
						||
| 
								 | 
							
								    /* target rf channel */
							 | 
						||
| 
								 | 
							
								    uint8_t  target_rf_channel;
							 | 
						||
| 
								 | 
							
								    /* target rf option */
							 | 
						||
| 
								 | 
							
								    uint8_t  target_rf_option   :2,
							 | 
						||
| 
								 | 
							
								    /* solve compatibility problems */
							 | 
						||
| 
								 | 
							
								             used_rsvd          :6;
							 | 
						||
| 
								 | 
							
								    /* time left, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint32_t time_left;
							 | 
						||
| 
								 | 
							
								} mac_bc_rf_channel_chg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* rf route param entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_rf_route {
							 | 
						||
| 
								 | 
							
								    /* rf discover list period, unit is 1s */
							 | 
						||
| 
								 | 
							
								    uint8_t rf_dis_period;
							 | 
						||
| 
								 | 
							
								    /* rf traffic success ratio expired period, unit is 1 rf_dis_period */
							 | 
						||
| 
								 | 
							
								    uint8_t rf_age_period;
							 | 
						||
| 
								 | 
							
								} mac_bc_rf_route_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* meter reading control entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_meter {
							 | 
						||
| 
								 | 
							
								    /* data len */
							 | 
						||
| 
								 | 
							
								    uint8_t len;
							 | 
						||
| 
								 | 
							
								    /* data */
							 | 
						||
| 
								 | 
							
								    uint8_t data[MAC_MAX_BC_METER_DATA_SIZE];
							 | 
						||
| 
								 | 
							
								} mac_bc_meter_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* freq band detection entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_fb_detect {
							 | 
						||
| 
								 | 
							
								    /* target frequency band id of detection */
							 | 
						||
| 
								 | 
							
								    uint8_t band_id;
							 | 
						||
| 
								 | 
							
								    /* dedicated csma slot supported link id */
							 | 
						||
| 
								 | 
							
								    uint8_t d_csma_lid;
							 | 
						||
| 
								 | 
							
								} mac_bc_fb_detect_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* rtc entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_rtc {
							 | 
						||
| 
								 | 
							
								    /* 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;
							 | 
						||
| 
								 | 
							
								} mac_bc_rtc_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* beacon tx assignment node info */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_tx_as_node {
							 | 
						||
| 
								 | 
							
								    /* designated TEI to send beacon */
							 | 
						||
| 
								 | 
							
								    uint16_t tei        : 12,
							 | 
						||
| 
								 | 
							
								    /* 0x0 - discovery, 0x1 - proxy */
							 | 
						||
| 
								 | 
							
								             type       : 1,
							 | 
						||
| 
								 | 
							
								    /* tx type flag, see BEACON_TX_XXX */
							 | 
						||
| 
								 | 
							
								             tx_flag    : 3;
							 | 
						||
| 
								 | 
							
								} mac_bc_tx_as_node_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PLC_SUPPORT_CCO_ROLE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if RUN_IN_PSRAM
							 | 
						||
| 
								 | 
							
								/* beacon tx assignment info */
							 | 
						||
| 
								 | 
							
								#define MAC_MAX_BC_TX_PER_BP        (210)
							 | 
						||
| 
								 | 
							
								#else /* RUN_IN_PSRAM */
							 | 
						||
| 
								 | 
							
								#define MAC_MAX_BC_TX_PER_BP        (100)
							 | 
						||
| 
								 | 
							
								#endif /* RUN_IN_PSRAM */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* beacon tx assignment info */
							 | 
						||
| 
								 | 
							
								#define MAC_MAX_BC_TX_PER_BP        (210)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_tx_as {
							 | 
						||
| 
								 | 
							
								    /* proxy and discover beacon count */
							 | 
						||
| 
								 | 
							
								    uint8_t         bc_cnt;
							 | 
						||
| 
								 | 
							
								    /* flag to mark if the per tei info available. according to smart grid
							 | 
						||
| 
								 | 
							
								     * spec, only central and discovery beacon tain per tei info. discovery
							 | 
						||
| 
								 | 
							
								     * beacon don't have such info.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t         tei_valid;
							 | 
						||
| 
								 | 
							
								#if PLC_SUPPORT_CCO_ROLE
							 | 
						||
| 
								 | 
							
								    /* phase of the tei, defination is same as PLC_PHASE_XXX macro */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase[MAC_MAX_BC_TX_PER_BP];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    /* assignment node info */
							 | 
						||
| 
								 | 
							
								    mac_bc_tx_as_node_t sta[MAC_MAX_BC_TX_PER_BP];
							 | 
						||
| 
								 | 
							
								} mac_bc_tx_as_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* csma slot info */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_csma_si {
							 | 
						||
| 
								 | 
							
								    /* csma slot supported phase count */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase_cnt;
							 | 
						||
| 
								 | 
							
								    /* csma phase */
							 | 
						||
| 
								 | 
							
								    uint8_t         phase[PLC_PHASE_CNT];
							 | 
						||
| 
								 | 
							
								    /* to solve compatibility problems */
							 | 
						||
| 
								 | 
							
								    uint8_t         used_rsvd[PLC_PHASE_CNT];
							 | 
						||
| 
								 | 
							
								    /* cmsa slot duration, unit is 1ms*/
							 | 
						||
| 
								 | 
							
								    uint32_t        slot_dur[PLC_PHASE_CNT];
							 | 
						||
| 
								 | 
							
								} mac_bc_cmsa_si_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* time slot assignment entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_time_slot {
							 | 
						||
| 
								 | 
							
								    /* central beacon count */
							 | 
						||
| 
								 | 
							
								    uint8_t             cco_bc_cnt;
							 | 
						||
| 
								 | 
							
								    /* proxy beacon count */
							 | 
						||
| 
								 | 
							
								    uint8_t             proxy_bc_cnt;
							 | 
						||
| 
								 | 
							
								    /* beacon slot duration, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint8_t             bc_slot_dur;
							 | 
						||
| 
								 | 
							
								    /* original csma slot fragment size for beacon send,
							 | 
						||
| 
								 | 
							
								     * unit is 10ms for cco
							 | 
						||
| 
								 | 
							
								     * unit is 1ms or 10ms for sta
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t             org_csma_slot_frag_s;
							 | 
						||
| 
								 | 
							
								    /* csma slot fragment size, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint16_t            csma_slot_frag_s;
							 | 
						||
| 
								 | 
							
								    /* dedicated csma slot supported phase count */
							 | 
						||
| 
								 | 
							
								    uint8_t             d_csma_lid;
							 | 
						||
| 
								 | 
							
								    /* tdma slot duration, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint8_t             tdma_slot_dur;
							 | 
						||
| 
								 | 
							
								    /* tdma slot supported link id */
							 | 
						||
| 
								 | 
							
								    uint8_t             tdma_lid;
							 | 
						||
| 
								 | 
							
								    /* protected region length of future beacon period, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint16_t            protected_region_dur;
							 | 
						||
| 
								 | 
							
								    /* beacon period */
							 | 
						||
| 
								 | 
							
								    uint32_t            bc_period        : 16,
							 | 
						||
| 
								 | 
							
								    /* rf standard beacon slot duration, unit is 1ms */
							 | 
						||
| 
								 | 
							
								                        rf_bc_slot_dur   : 10,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if current time slot is allowed to be reused for following
							 | 
						||
| 
								 | 
							
								     * beacon periods. this flag is only valid for sta role device case.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                        allow_reuse      : 1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if send rf standard beacon if local device is cco role */
							 | 
						||
| 
								 | 
							
								                        rf_std_tx        : 1,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                        rsvd1            : 4;
							 | 
						||
| 
								 | 
							
								    /* beacon period start NTB */
							 | 
						||
| 
								 | 
							
								    uint32_t            bp_start_ntb;
							 | 
						||
| 
								 | 
							
								    union {
							 | 
						||
| 
								 | 
							
								        struct {
							 | 
						||
| 
								 | 
							
								            /* solve compatibility problems for sg time slot entry */
							 | 
						||
| 
								 | 
							
								            uint32_t    sg_used_rsvd1    : 10,
							 | 
						||
| 
								 | 
							
								                        sg_used_rsvd2    : 6,
							 | 
						||
| 
								 | 
							
								            /* reserved for future */
							 | 
						||
| 
								 | 
							
								                        rsvd2            : 16;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        struct {
							 | 
						||
| 
								 | 
							
								            /* solve compatibility problems for spg time slot entry */
							 | 
						||
| 
								 | 
							
								            uint32_t    spg_used_rsvd    : 22,
							 | 
						||
| 
								 | 
							
								            /* reserved for future */
							 | 
						||
| 
								 | 
							
								                        rsvd3            : 10;
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    /* proxy and discover beacons info */
							 | 
						||
| 
								 | 
							
								    mac_bc_tx_as_t      non_cco_bc_info;
							 | 
						||
| 
								 | 
							
								    /* csma time slot info */
							 | 
						||
| 
								 | 
							
								    mac_bc_cmsa_si_t    csma_info;
							 | 
						||
| 
								 | 
							
								    /* dedicated csma time slot info */
							 | 
						||
| 
								 | 
							
								    mac_bc_cmsa_si_t    d_csma_info;
							 | 
						||
| 
								 | 
							
								} mac_bc_time_slot_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* vendor specific entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_vendor_spec {
							 | 
						||
| 
								 | 
							
								    /* allowed to cco traffic success ratio. if sta to cco's traffic success
							 | 
						||
| 
								 | 
							
								     * ratio is equal or higher than this value, than sta is allowed to join
							 | 
						||
| 
								 | 
							
								     * the network.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t         allowed_cco_tf_sr;
							 | 
						||
| 
								 | 
							
								    /* hplc tx power cap. unit is 1 dbuv */
							 | 
						||
| 
								 | 
							
								    uint8_t         power;
							 | 
						||
| 
								 | 
							
								    /* rf tx power cap, unit is 1 dbm */
							 | 
						||
| 
								 | 
							
								    int8_t          rf_power;
							 | 
						||
| 
								 | 
							
								    /* network for debug purpose */
							 | 
						||
| 
								 | 
							
								    uint8_t         cco_debug           :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if debug target mac address is valid */
							 | 
						||
| 
								 | 
							
								                    addr_valid          :1,
							 | 
						||
| 
								 | 
							
								    /* suggested proxy selection duration, each sta should spend at least
							 | 
						||
| 
								 | 
							
								     * the duration for proxy slection. note that this value should not be
							 | 
						||
| 
								 | 
							
								     * changed in the whole network life time. the unit is 1 route period.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                    proxy_select_dur    :3,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if the threshold data info available */
							 | 
						||
| 
								 | 
							
								                    th_data_valid       :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if fixed rate required for this network */
							 | 
						||
| 
								 | 
							
								                    fixed_rate          :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if the application data is valid */
							 | 
						||
| 
								 | 
							
								                    app_data_valid      :1;
							 | 
						||
| 
								 | 
							
								    /* flag to mark if the tsfm is valid */
							 | 
						||
| 
								 | 
							
								    uint8_t         tsfm_valid          :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if tsfm cco direct network detection enable */
							 | 
						||
| 
								 | 
							
								                    tsfm_cco_detect_en  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if PCO should report SNR with it's direct sub STA
							 | 
						||
| 
								 | 
							
								     * periodically.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                    pco_snr_rpt         :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if simple pair passcode is valid */
							 | 
						||
| 
								 | 
							
								                    passcode_valid      :1,
							 | 
						||
| 
								 | 
							
								    /* algorithm to be used for transformer detection */
							 | 
						||
| 
								 | 
							
								                    tsfm_algorithm      :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;
							 | 
						||
| 
								 | 
							
								    /* vendor id of cco */
							 | 
						||
| 
								 | 
							
								    uint16_t        vendor_id;
							 | 
						||
| 
								 | 
							
								    /* app data if any */
							 | 
						||
| 
								 | 
							
								    uint8_t         app_data[MAC_BC_APP_DATA_MAX];
							 | 
						||
| 
								 | 
							
								    /* debug target mac address if any */
							 | 
						||
| 
								 | 
							
								    uint8_t         addr[IOT_MAC_ADDR_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;
							 | 
						||
| 
								 | 
							
								    /* interval that sta should report calculated tsfm detection data to
							 | 
						||
| 
								 | 
							
								     * cco. unit is 1s.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint16_t        rpt_tsfm_dur;
							 | 
						||
| 
								 | 
							
								    /* 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;
							 | 
						||
| 
								 | 
							
								    /* level difference threshold if two networks level has big difference */
							 | 
						||
| 
								 | 
							
								    uint8_t         tsfm_level_big_diff_th;
							 | 
						||
| 
								 | 
							
								    /* 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;
							 | 
						||
| 
								 | 
							
								    /* weight factor of received sof snr for tsfm */
							 | 
						||
| 
								 | 
							
								    uint8_t         tsfm_snr_sof_factor;
							 | 
						||
| 
								 | 
							
								    /* dual mode device tx config, 0 - invalid, 1 - async tx, 2 - sync tx */
							 | 
						||
| 
								 | 
							
								    uint8_t         dm_tx_cfg           :2,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if rf tx power is valid */
							 | 
						||
| 
								 | 
							
								                    rf_power_valid      :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if force link communication */
							 | 
						||
| 
								 | 
							
								                    force_link_valid    :1,
							 | 
						||
| 
								 | 
							
								    /* force link type, 0 - force hplc, 1 - force rf */
							 | 
						||
| 
								 | 
							
								                    force_rf_link       :1,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                    rsvd                :3;
							 | 
						||
| 
								 | 
							
								    /* simple pair passcode */
							 | 
						||
| 
								 | 
							
								    uint16_t        passcode;
							 | 
						||
| 
								 | 
							
								} mac_bc_vendor_spec_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* htbus fixed information descriptor */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_htbus_fp {
							 | 
						||
| 
								 | 
							
								    /* htbus becacon type, see PLC_HTBUS_BC_TYPE_XXX */
							 | 
						||
| 
								 | 
							
								    uint8_t   type;
							 | 
						||
| 
								 | 
							
								    /* reboot counter */
							 | 
						||
| 
								 | 
							
								    uint8_t   reboot_cnt;
							 | 
						||
| 
								 | 
							
								    /* reques period counter */
							 | 
						||
| 
								 | 
							
								    uint16_t  req_period_cnt;
							 | 
						||
| 
								 | 
							
								} mac_bc_htbus_fp_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* habus time slot alloc entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_htbus_time_slot {
							 | 
						||
| 
								 | 
							
								    /* cco slot duration, uint is 1ms */
							 | 
						||
| 
								 | 
							
								    uint8_t     cco_slot;
							 | 
						||
| 
								 | 
							
								    /* sta slot duration, uint is 1ms */
							 | 
						||
| 
								 | 
							
								    uint8_t     sta_slot;
							 | 
						||
| 
								 | 
							
								    /* beacon period start NTB  */
							 | 
						||
| 
								 | 
							
								    uint32_t    start_ntb;
							 | 
						||
| 
								 | 
							
								    /* node tei bitmap with response slot assigned.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t     rsp_bm[iot_ceil(PLC_TEI_MAX_NUM, 8)];
							 | 
						||
| 
								 | 
							
								} mac_bc_htbus_time_slot_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* htbus user data entry */
							 | 
						||
| 
								 | 
							
								typedef struct _mac_bc_htbus_user_data {
							 | 
						||
| 
								 | 
							
								    /* user data length */
							 | 
						||
| 
								 | 
							
								    uint16_t    len;
							 | 
						||
| 
								 | 
							
								    /* pointer user data */
							 | 
						||
| 
								 | 
							
								    uint8_t     *data_ptr;
							 | 
						||
| 
								 | 
							
								} mac_bc_htbus_user_data_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * @brief   update beacon payload to be broadcast by mac
							 | 
						||
| 
								 | 
							
								 * @param vdev_id:  mac vdev id of the device to be updated
							 | 
						||
| 
								 | 
							
								 * @param ent:      beacon entries to be updated
							 | 
						||
| 
								 | 
							
								 * @param tx_cnt:   return beacon tx count of this update
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return:
							 | 
						||
| 
								 | 
							
								 *      0         -- for success case
							 | 
						||
| 
								 | 
							
								 *      othersie  -- error code
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t mac_update_beacon(uint8_t pdev_id, uint8_t vdev_id,
							 | 
						||
| 
								 | 
							
								    mac_bc_update_t *ent, uint8_t *tx_cnt);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * function callback to receive beacons from mac
							 | 
						||
| 
								 | 
							
								 * @arg:        arg parameter registered alone with the callback
							 | 
						||
| 
								 | 
							
								 * @beacon:     iot_pkt containing beacon raw data
							 | 
						||
| 
								 | 
							
								 * @new_bp:     indicate if this beacon is the first beacon of a new beacon
							 | 
						||
| 
								 | 
							
								 *              period
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef void (*mac_bc_rx_func_t)(void *arg, iot_pkt_t *beacon, uint8_t new_bp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (PLC_SUPPORT_CCO_ROLE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * mac_start_beacon() - start sending beacon
							 | 
						||
| 
								 | 
							
								 * @pdev_id:    mac pdev id of the device to start sending beacon
							 | 
						||
| 
								 | 
							
								 * @vdev_id:    mac vdev id of the device to start sending beacon
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * return:
							 | 
						||
| 
								 | 
							
								 *      0         -- for success case
							 | 
						||
| 
								 | 
							
								 *      othersie  -- error code
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t mac_start_beacon(uint8_t pdev_id, uint8_t vdev_id);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * mac_stop_beacon() - stop sending beacon
							 | 
						||
| 
								 | 
							
								 * @pdev_id:    mac pdev id of the device to stop sending beacon
							 | 
						||
| 
								 | 
							
								 * @vdev_id:    mac vdev id of the device to stop sending beacon
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * return:
							 | 
						||
| 
								 | 
							
								 *      0         -- for success case
							 | 
						||
| 
								 | 
							
								 *      othersie  -- error code
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t mac_stop_beacon(uint8_t pdev_id, uint8_t vdev_id);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define mac_start_beacon(pdev_id, vdev_id) IOT_ASSERT(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define mac_stop_beacon(pdev_id, vdev_id) IOT_ASSERT(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* MAC_BCM_API_H */
							 |