222 lines
7.2 KiB
C
222 lines
7.2 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 BEACON_H
|
||
|
#define BEACON_H
|
||
|
|
||
|
/* os shim includes */
|
||
|
#include "os_types_api.h"
|
||
|
|
||
|
#include "mac_bcm_api.h"
|
||
|
#include "plc_fr.h"
|
||
|
#include "iot_pkt_api.h"
|
||
|
#include "os_lock.h"
|
||
|
#include "iot_errno.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
typedef struct _mac_beacon_cco_ctx_t {
|
||
|
uint8_t started;
|
||
|
/* current beacon period start ntb 64bit version */
|
||
|
uint64_t curr_start_ntb64;
|
||
|
/* next beacon period start ntb 64bit version */
|
||
|
uint64_t next_start_ntb64;
|
||
|
/* current beacon period count */
|
||
|
uint32_t curr_bp_cnt;
|
||
|
} mac_beacon_cco_ctx_t;
|
||
|
|
||
|
typedef struct _mac_beacon_sta_ctx_t {
|
||
|
/* flag to mark if sta role device ntb sync up with preferred cco before
|
||
|
* joining the network is done.
|
||
|
*/
|
||
|
uint8_t ntb_sync_done :1,
|
||
|
/* flag to mark if sw ntb sync enabled for each beacon period */
|
||
|
force_sw_sync :1,
|
||
|
/* flag to mark if reuse previous beacon period time slot allowed */
|
||
|
allow_reuse_ts :1,
|
||
|
/* flag phase a tx enable */
|
||
|
phase_a_tx :1,
|
||
|
/* flag phase b tx enable */
|
||
|
phase_b_tx :1,
|
||
|
/* flag phase c tx enable */
|
||
|
phase_c_tx :1,
|
||
|
/* flag to mark if discovery beacon send with non cco node info */
|
||
|
bc_d_with_non :1,
|
||
|
/* reserved for future */
|
||
|
rsvd :1;
|
||
|
} mac_beacon_sta_ctx_t;
|
||
|
|
||
|
typedef struct _sg_mac_bc_info {
|
||
|
mac_bc_fp_t payload_header;
|
||
|
mac_bc_sta_cap_t sta_cap;
|
||
|
mac_bc_rt_param_t route_param;
|
||
|
mac_bc_simple_param_t simple_param;
|
||
|
} sg_mac_bc_info_t;
|
||
|
|
||
|
typedef struct _spg_mac_bc_info {
|
||
|
mac_bc_fp_spg_t payload_header;
|
||
|
mac_bc_sta_cap_spg_t sta_cap;
|
||
|
mac_bc_rt_param_spg_t route_param;
|
||
|
mac_bc_simple_param_spg_t simple_param;
|
||
|
} spg_mac_bc_info_t;
|
||
|
|
||
|
|
||
|
typedef struct _mac_beacon_ctx_t {
|
||
|
uint8_t inited;
|
||
|
uint8_t nid_inited;
|
||
|
/* valid bcn entries in entry_sort */
|
||
|
uint8_t entry_sort_cnt;
|
||
|
void *ref_vdev_ptr;
|
||
|
/* beacon packet buffer */
|
||
|
iot_pkt_t* mac_beacon_buffer[PLC_PHASE_CNT];
|
||
|
/* enable only when rf is supported */
|
||
|
iot_pkt_t* mac_bcn_rf_buffer;
|
||
|
iot_pkt_t* unknown_entry;
|
||
|
/* tx desc for the beacon */
|
||
|
void *bcn_mpdu_start_desc;
|
||
|
mac_bc_fc_t fc;
|
||
|
mac_bc_freq_chg_t freq_chg;
|
||
|
mac_bc_rf_channel_chg_t rf_chg;
|
||
|
mac_bc_rf_route_t rf_route;
|
||
|
mac_bc_time_slot_t time_slot;
|
||
|
mac_bc_meter_t meter;
|
||
|
mac_bc_fb_detect_t fb_detect;
|
||
|
mac_bc_rtc_t rtc;
|
||
|
mac_bc_vendor_spec_t vendor;
|
||
|
#if IOT_HTBUS_EN
|
||
|
/* htbus beacon info descriptor */
|
||
|
mac_bc_htbus_time_slot_t ts_htbus;
|
||
|
mac_bc_htbus_user_data_t ud_htbus;
|
||
|
mac_bc_htbus_fp_t fp_htbus;
|
||
|
#endif /* IOT_HTBUS_EN */
|
||
|
union {
|
||
|
sg_mac_bc_info_t sg_uniq_bc_str;
|
||
|
spg_mac_bc_info_t spg_uniq_bc_str;
|
||
|
};
|
||
|
/* which component should be contained in the next beacon send */
|
||
|
uint8_t beacon_component_enable[MAC_BC_ENTRY_MAX];
|
||
|
#ifdef PLC_SUPPORT_CCO_ROLE
|
||
|
/* cco role only context */
|
||
|
mac_beacon_cco_ctx_t cco;
|
||
|
#endif /* PLC_SUPPORT_CCO_ROLE */
|
||
|
mac_beacon_sta_ctx_t sta;
|
||
|
/* the flag for detect beacon */
|
||
|
uint32_t is_tx_detect;
|
||
|
/* bcn entries fill order */
|
||
|
uint8_t entry_sort[MAC_BCN_SORT_MAX_CNT];
|
||
|
} mac_beacon_ctx_t;
|
||
|
|
||
|
/* init the beacon struct */
|
||
|
uint32_t mac_beacon_init(mac_beacon_ctx_t *mac_beacon, void* vdev_ptr);
|
||
|
|
||
|
/* @brief beacon payload to send, it would add some FC or PB info into the
|
||
|
* iot_pkt_t and to form an Beacon MPDU.
|
||
|
* @param proto: proto.
|
||
|
* @param proto_bandid: proto bandid.
|
||
|
* @param mac_beacon: beacon context pointer, from which beacon to fill
|
||
|
* @param bcn_buf: the buf of beacon to fill
|
||
|
*
|
||
|
* @return
|
||
|
* number of beacon sent in this request
|
||
|
*/
|
||
|
uint8_t mac_beacon_tx(uint32_t proto, uint32_t proto_bandid,
|
||
|
mac_beacon_ctx_t *mac_beacon, iot_pkt_t* bcn_buf);
|
||
|
|
||
|
/* reset the beacon ctx */
|
||
|
uint32_t mac_beacon_reset(mac_beacon_ctx_t *mac_beacon);
|
||
|
|
||
|
/*
|
||
|
* mac_beacon_rx() - mac layer beacon rx callback
|
||
|
* @proto: current protocol type. see PLC_PROTO_TYPE_XXX
|
||
|
* @vdev_ptr: mac vdev context for the rx
|
||
|
* @buf: pointer to buffer of the rx-ed beacon
|
||
|
*
|
||
|
* return:
|
||
|
* ERR_OK -- for success case
|
||
|
* ERR_INVAL -- error
|
||
|
*/
|
||
|
uint32_t mac_beacon_rx(uint8_t proto, void* vdev_ptr, iot_pkt_t* buf);
|
||
|
|
||
|
/*
|
||
|
* @brief update beacon payload to be broadcast by mac.
|
||
|
* this function is similar to mac_update_beacon
|
||
|
* but can only be called inside mac context.
|
||
|
* @param pdev_id: mac pdev id of the device to be updated
|
||
|
* @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_internal(uint8_t pdev_id, uint8_t vdev_id,
|
||
|
mac_bc_update_t *ent, uint8_t *tx_cnt);
|
||
|
|
||
|
#if (PLC_SUPPORT_CCO_ROLE)
|
||
|
|
||
|
/*
|
||
|
* mac_start_beacon_internal() - start sending beacon. this function is similar
|
||
|
* to mac_start_beacon but can only be called
|
||
|
* inside mac context.
|
||
|
* @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_internal(uint8_t pdev_id, uint8_t vdev_id);
|
||
|
|
||
|
/*
|
||
|
* mac_stop_beacon_internal() - stop sending beacon. this function is similar
|
||
|
* to mac_stop_beacon but can only be called
|
||
|
* inside mac context.
|
||
|
* @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_internal(uint8_t pdev_id, uint8_t vdev_id);
|
||
|
|
||
|
#else /* PLC_SUPPORT_CCO_ROLE */
|
||
|
|
||
|
#define mac_start_beacon_internal(pdev_id, vdev_id) IOT_ASSERT(0)
|
||
|
|
||
|
#define mac_stop_beacon_internal(pdev_id, vdev_id) IOT_ASSERT(0)
|
||
|
|
||
|
#endif /* PLC_SUPPORT_CCO_ROLE */
|
||
|
|
||
|
/**
|
||
|
* @brief calculate beacon the biggest csma phase duration
|
||
|
* @param bcn_ctx: beacon ctxt
|
||
|
* @param biggest_phase:
|
||
|
* 0: ALL, 1:A, 2:B, 3: C
|
||
|
* @return: ERR_OK for success; ERR_INVAL for param error
|
||
|
*/
|
||
|
uint32_t mac_beacon_cal_biggest_csma_phase(mac_beacon_ctx_t *bcn_ctx,
|
||
|
uint8_t *biggest_phase);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif // !BEACON_H
|
||
|
|