462 lines
15 KiB
C
Executable File
462 lines
15 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 MAC_VDEV_H
|
|
#define MAC_VDEV_H
|
|
|
|
#include "beacon.h"
|
|
#include "mac_vdev_api.h"
|
|
#include "plc_utils.h"
|
|
#include "mac_avln.h"
|
|
#include "iot_queue.h"
|
|
#include "command_list.h"
|
|
#include "os_timer_api.h"
|
|
#include "mac_ppm_scan.h"
|
|
#include "mac_mm_sniffer.h"
|
|
#include "mac_rf.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* rate control callback */
|
|
typedef uint32_t(*rate_control_func_t)(\
|
|
void *peer, \
|
|
void *arg);
|
|
|
|
/* NB: not to expose the structs to the upper layer directly */
|
|
typedef struct _mac_vdev {
|
|
vdevid_t vdev_id;
|
|
vdevid_t rf_vdev_id;
|
|
mac_beacon_ctx_t bcn_ctx;
|
|
uint32_t is_up;
|
|
mac_vdev_cfg_t mac_vdev_cfg;
|
|
mac_vdev_start_cfg_t start_cfg;
|
|
mac_avln_t *avln;
|
|
iot_list_head_t *peer_list; // peer list for this vdev
|
|
void *self_peer;
|
|
void *bcast_peer;
|
|
pdevid_t ref_pdev_id;
|
|
tei_t proxy_tei; /* proxy tei for MAC layer MPDU forwarding */
|
|
/* logical phase of the device.
|
|
* sta role device only use phase 1.
|
|
* cco role device may use multiple phases.
|
|
*/
|
|
/* phase 1 */
|
|
uint8_t l_phase1 :2,
|
|
/* phase 2 */
|
|
l_phase2 :2,
|
|
/* phase 3 */
|
|
l_phase3 :2,
|
|
/* flag to mark if vdev stopped */
|
|
stop_flag :1,
|
|
/* nncco time division tx in 3 phase */
|
|
nncco_tx_3phase :1;
|
|
/* scheduler context */
|
|
void *sched_ctx;
|
|
/* current ppm sync target nid */
|
|
uint32_t sync_nid;
|
|
/* current ppm sync target proxy */
|
|
tei_t sync_proxy;
|
|
/* sub peer and proxy cnt */
|
|
uint32_t sub_peer_cnt :14,
|
|
/* black list nid cnt */
|
|
nid_bl_list_cnt :8,
|
|
/* is block dbg pkt tx in rx only scheduler period or not */
|
|
block_dbg_pkt_4_rx_only :1,
|
|
/* is sync_nid inited */
|
|
sync_nid_inited :1,
|
|
/* flag to mark if cco has sta joined network */
|
|
sta_joined :1,
|
|
/* whether bcsma slot exist in current beacon period */
|
|
bcsma_slot_exist :1,
|
|
/* bcsma nonentity cnt */
|
|
bcsma_non_exist_cnt :3,
|
|
/* LID_BCSMA_FB_DETECT exist or no at beacon period */
|
|
fb_lid_exist :1,
|
|
/* flag to mark if suspend sending and receiving */
|
|
tx_rx_suspend :1,
|
|
/* flag to mark if 3ps sta physical phase is opposite */
|
|
opposite_3ps :1;
|
|
/* black list nid array */
|
|
uint32_t nid_bl_list[PLC_BL_NID_LIST_MAX];
|
|
|
|
/* rate control context start
|
|
* TODO: put them into the ctxt */
|
|
void *rate_control_ctxt;
|
|
/* rate control callback */
|
|
rate_control_func_t ra_cb;
|
|
/*fixed rate or not*/
|
|
uint32_t fixed_rate_flag : 1,
|
|
/* rate level show RA_LEVEL_xx */
|
|
rate_level : 2,
|
|
/* nncco time division tx phase */
|
|
nncco_td_tx_phase : 2,
|
|
rev1 : 27;
|
|
|
|
uint32_t high_power_req_reason_bitmap;
|
|
|
|
uint16_t power_cap : 8, //max power enable
|
|
fixed_power_cap_flag : 1, //is power cap set
|
|
high_power_flag : 1, //is high power cur
|
|
high_power_req_ena : 5, //enable or disable auto power control'
|
|
/* flag to mark if PLC high power is currently allowed */
|
|
high_power_plc_allow : 1;
|
|
/* rate control context end */
|
|
|
|
uint32_t last_rx_ntb;
|
|
uint32_t last_tx_ntb;
|
|
#if MAC_STREAM_TIMEOUT_SUPPORT
|
|
timer_id_t stream_timeout_timer;
|
|
#endif
|
|
mac_ppm_ctxt_t mac_ppm;
|
|
/* sync ntb record context */
|
|
mac_ntb_record_ctxt_t sync_ntb_record;
|
|
|
|
#if CERT_WAR_TX_PWR == 1
|
|
uint32_t cert_war_pwr; /* pwr rise or not - 1: rise */
|
|
#endif
|
|
|
|
/* mac rf info */
|
|
mac_rf_t *mac_rf;
|
|
|
|
uint32_t peer_cnt;
|
|
uint32_t stream_cnt;
|
|
uint32_t stream_overflow_cnt;
|
|
uint32_t proxy_peer_cnt;
|
|
uint32_t rx_stream_cnt;
|
|
/* sub peer bitmap only for vdev not reduced valid */
|
|
void *sub_peer_bitmap;
|
|
mac_sec_key_t *sec_key;
|
|
} mac_vdev_t;
|
|
|
|
tei_t vdev_get_tei(mac_vdev_t* vdev);
|
|
|
|
void vdev_set_tei(mac_vdev_t* vdev, tei_t tei);
|
|
|
|
mac_vdev_t *get_vdev_ptr(uint32_t pdev_id, uint32_t vdev_id);
|
|
|
|
/*
|
|
* mac_create_vdev_internal() - create mac layer virtual device. this function
|
|
* is similar to mac_create_vdev but can only be
|
|
* called inside mac context.
|
|
* @pdev_id: phasical mac device on top of which to create the vdev
|
|
* @vdev_id: pointer to receive the created vdev id
|
|
* @cfg: configuration for the created vdev
|
|
*
|
|
* return:
|
|
* 0 -- for success case
|
|
* othersie -- error code
|
|
*/
|
|
uint32_t mac_create_vdev_internal(uint8_t pdev_id, uint8_t *vdev_id,
|
|
mac_vdev_cfg_t *cfg);
|
|
|
|
/*
|
|
* mac_start_vdev_internal() - start mac layer virtual device. this function
|
|
* is similar to mac_start_vdev but can only be
|
|
* called inside mac context.
|
|
* @pdev_id: phasical mac device id
|
|
* @vdev_id: virtual mac device id
|
|
* @cfg: configuration for the start
|
|
*
|
|
* return:
|
|
* 0 -- for success case
|
|
* othersie -- error code
|
|
*/
|
|
uint32_t mac_start_vdev_internal(uint8_t pdev_id, uint8_t vdev_id,
|
|
mac_vdev_start_cfg_t *cfg);
|
|
|
|
/*
|
|
* mac_stop_vdev_internal() - stop mac layer virtual device. this function
|
|
* is similar to mac_stop_vdev but can only be
|
|
* called inside mac context.
|
|
* @pdev_id: phasical mac device id
|
|
* @vdev_id: virtual mac device id
|
|
*
|
|
* return:
|
|
* 0 -- for success case
|
|
* othersie -- error code
|
|
*/
|
|
uint32_t mac_stop_vdev_internal(uint8_t pdev_id, uint8_t vdev_id);
|
|
|
|
/*
|
|
* mac_set_vdev_cfg_internal() - set a vdev's config. this function is
|
|
* similar to mac_set_vdev_cfg but can only be
|
|
* called inside mac context.
|
|
* @pdev_id: which pdev to config
|
|
* @vdev_id: which vdev to config
|
|
* @cfg_struct_ptr: the pointer to the param config structure which can be
|
|
* decoded according to the type.
|
|
*
|
|
* return:
|
|
* 0 -- for success case
|
|
* othersie -- error code
|
|
*/
|
|
uint32_t mac_set_vdev_cfg_internal(pdevid_t pdev_id, vdevid_t vdev_id,
|
|
cfg_data_tlv *cfg_struct_ptr);
|
|
|
|
/*
|
|
* mac_get_vdev_cfg_internal() - get a vdev's config. this function is
|
|
* similar to mac_get_vdev_cfg but can only be
|
|
* called inside mac context.
|
|
* @pdev_id: which pdev to config
|
|
* @vdev_id: which vdev to config
|
|
* @cfg_struct_ptr: the pointer to the param config structure which can be
|
|
* decoded according to the type.
|
|
*
|
|
* return:
|
|
* 0 -- for success case
|
|
* othersie -- error code
|
|
*/
|
|
uint32_t mac_get_vdev_cfg_internal(pdevid_t pdev_id, vdevid_t vdev_id,
|
|
cfg_data_tlv *tlv);
|
|
|
|
/* find vdev according to nid */
|
|
mac_vdev_t *find_vdev_by_nid(pdevid_t pid, nid_t nid);
|
|
|
|
/* associate a vdev and a peer */
|
|
uint32_t vdev_add_peer(mac_vdev_t *vdev, void *peer);
|
|
|
|
uint32_t vdev_del_peer(mac_vdev_t *vdev, void *peer);
|
|
|
|
|
|
uint32_t vdev_del_all_peer(mac_vdev_t *vdev);
|
|
|
|
|
|
/* get vdev's nid */
|
|
uint32_t vdev_get_nid(mac_vdev_t *vdev, nid_t *nid);
|
|
|
|
/* set vdev's nid */
|
|
void vdev_set_nid(mac_vdev_t *vdev, uint32_t nid);
|
|
|
|
/* reset vdev's nid */
|
|
void vdev_reset_nid(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @brief vdev_reset_ppm_sync() - reset vdev ppm sync status
|
|
* @param vdev: mac vdev pointer
|
|
*/
|
|
void vdev_reset_ppm_sync(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @brief vdev_is_bl_nid() - cehck if one nid is blacklisted
|
|
* @param vdev: mac vdev pointer
|
|
* @param nid: nid to be checked
|
|
* @return 1 if the nid is blacklisted. 0 if the nid is not blacklisted.
|
|
*/
|
|
|
|
uint32_t vdev_is_bl_nid(mac_vdev_t *vdev, uint32_t nid);
|
|
|
|
/*
|
|
* @brief vdev_get_sync_nid() - get target nid current vdev is syncing to
|
|
* @param vdev: mac vdev pointer
|
|
* @return network id
|
|
*/
|
|
uint32_t vdev_get_sync_nid(mac_vdev_t *vdev, nid_t *sync_nid);
|
|
|
|
/*
|
|
* @brief vdev_set_sync_nid() - set target nid current vdev is syncing to
|
|
* @param vdev: mac vdev pointer
|
|
*/
|
|
void vdev_set_sync_nid(mac_vdev_t *vdev, uint32_t nid);
|
|
|
|
void vdev_reset_sync_nid(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @brief vdev_get_sync_proxy() - get target proxy current vdev is syncing to
|
|
* @param vdev: mac vdev pointer
|
|
* @return target proxy tei
|
|
*/
|
|
tei_t vdev_get_sync_proxy(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @brief vdev_set_sync_proxy() - set target proxy current vdev is syncing to
|
|
* @param vdev: mac vdev pointer
|
|
*/
|
|
void vdev_set_sync_proxy(mac_vdev_t *vdev, tei_t proxy);
|
|
|
|
/*
|
|
* @brief vdev_reset_proxy_tei() - reset vdev's proxy tei
|
|
*
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return void
|
|
*/
|
|
void vdev_reset_proxy_tei(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @brief vdev_get_proxy_tei() - get vdev's proxy tei
|
|
*
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return tei_t [tei that in the vdev structure]
|
|
*/
|
|
tei_t vdev_get_proxy_tei(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif vdev_set_proxy_tei() - set vdev's proxy tei
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param proxy_tei [the value of tei]
|
|
* @return [none]
|
|
*/
|
|
void vdev_set_proxy_tei(mac_vdev_t *vdev, tei_t proxy_tei);
|
|
|
|
/*
|
|
* @brief vdev_get_logic_phase() - get vdev's phase
|
|
* if STA, the return is the current logic phase.
|
|
* if CCo, it's the phase1's value.
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return phase_t [phase that in the vdev structure]
|
|
*/
|
|
phase_t vdev_get_logic_phase(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif vdev_set_proxy_tei() - set vdev's phase
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param phase [the value of phase, plc protocol, 0:unknown;1:A;2:B;3:C]
|
|
* @return [none]
|
|
*/
|
|
void vdev_set_logic_phase(mac_vdev_t *vdev, phase_t phase);
|
|
|
|
/*
|
|
* @breif vdev_set_ra_cb() - set vdev's ra cb
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param cb [the callback of the rate control function]
|
|
* @return [none]
|
|
*/
|
|
void vdev_set_ra_cb(mac_vdev_t * vdev, rate_control_func_t cb);
|
|
|
|
/*
|
|
* @breif vdev_set_sta_cap_phase() - set sta cap phase pointer of vdev
|
|
* @param uint32_t proto [protocol type]
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param uint8_t phase [phase]
|
|
* @return void
|
|
*/
|
|
void vdev_set_sta_cap_phase(uint32_t proto, mac_vdev_t *vdev, uint8_t phase);
|
|
|
|
/*
|
|
* @breif vdev_get_bc_period_cnt_ptr() - get bc period cnt pointer of vdev
|
|
* @param uint32_t proto [protocol type]
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint8_t * [poiter of beacon period counter]
|
|
*/
|
|
uint32_t *vdev_get_bc_period_cnt_ptr(uint32_t proto, mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif vdev_get_bc_period_cnt() - get beacon period counter
|
|
* @param uint32_t proto [protocol type]
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint32 [beacon period counter]
|
|
*/
|
|
uint32_t vdev_get_bc_period_cnt(uint32_t proto, mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif vdev_set_fixed_rate() - set fixed rate
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param uint8_t flag [true or flase]
|
|
* @return uint32 [0]
|
|
*/
|
|
uint32_t vdev_set_fixed_rate(mac_vdev_t *vdev, uint8_t flag);
|
|
|
|
/*
|
|
* @breif vdev_get_fixed_rate() - set fixed rate
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint8 [is fixed rate or not]
|
|
*/
|
|
uint32_t vdev_get_fixed_rate(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif vdev_set_fixed_rate_level() - set fixed rate level
|
|
* @param mac_vdev_t *vdev - the pointer of the vdev that get from
|
|
* @param uint8_t rate_level - rate level show RA_LEVEL_xx
|
|
* @return uint32 - 0
|
|
*/
|
|
uint32_t vdev_set_fixed_rate_level(mac_vdev_t *vdev, uint8_t rate_level);
|
|
|
|
/*
|
|
* @breif vdev_get_fixed_rate() - set fixed rate
|
|
* @param mac_vdev_t *vdev - the pointer of the vdev that get from
|
|
* @return uint32 - is rate level show RA_LEVEL_xx
|
|
*/
|
|
uint32_t vdev_get_fixed_rate_level(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif mac_vdev_sort_peer_list() - sort peer list
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @param void *peer [the pointer of the peer]
|
|
* @return uint32 [0]
|
|
*/
|
|
uint32_t mac_vdev_sort_peer_list(mac_vdev_t *vdev, void *peer);
|
|
|
|
/*
|
|
* @brief mac_vdev_del_timeout_stream_internal - del timeout stream function
|
|
* @param data msg data vdev of mac
|
|
* @param judge_time whether to judge the time
|
|
* @retrun void
|
|
*/
|
|
void mac_vdev_del_timeout_stream_internal(void *data, uint32_t judge_time);
|
|
|
|
/*
|
|
* @brief mac_vdev_del_overflow_peer() - del overflow peer function
|
|
* @param vdev vdev of mac
|
|
* @retrun void
|
|
*/
|
|
void mac_vdev_del_overflow_peer(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif mac_vdev_del_timeout_stream() - del the oldest peer
|
|
* @param timer_id_t timer_id [timer]
|
|
* @param void *arg [the pointer of the vdev that get from]
|
|
* @return void
|
|
*/
|
|
void mac_vdev_del_timeout_stream(timer_id_t timer_id, void *arg);
|
|
|
|
/*
|
|
* @breif mac_vdev_cfg_get_node_role() - get node_role from mac_vdev_cfg
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint8_t see PLC_DEV_ROLE_xxx
|
|
*/
|
|
uint8_t mac_vdev_cfg_get_node_role(mac_vdev_t *vdev);
|
|
|
|
uint32_t vdev_get_bc_period_ms(mac_vdev_t *vdev, uint32_t proto);
|
|
|
|
/*
|
|
* @breif vdev_set_block_dbg_pkt_4_rx_only() - set block or not for dbg pkt in
|
|
* rx only period
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint8_t ERR_OK
|
|
*/
|
|
uint32_t vdev_set_block_dbg_pkt_4_rx_only(mac_vdev_t *vdev, uint32_t block);
|
|
|
|
/*
|
|
* @breif vdev_get_block_dbg_pkt_4_rx_only() - get block or not for dbg pkt in
|
|
* rx only period
|
|
* @param mac_vdev_t *vdev [the pointer of the vdev that get from]
|
|
* @return uint8_t 0: false; other: true;
|
|
*/
|
|
uint32_t vdev_get_block_dbg_pkt_4_rx_only(mac_vdev_t *vdev);
|
|
|
|
/*
|
|
* @breif mac_vdev_war_rx_abort_init() - int war rx abort context
|
|
*
|
|
* @return none
|
|
*/
|
|
void mac_vdev_war_rx_abort_init(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // !MAC_VDEV_H
|