Files
kunlun/plc/common/inc/mpdu_header.h
2024-09-28 14:24:04 +08:00

308 lines
9.3 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 MPDU_HEADER_H
#define MPDU_HEADER_H
/* os shim includes */
#include "os_types_api.h"
#include "mac_data_api.h"
#include "iot_pkt_api.h"
#include "hw_war.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
structure for
aquiring different part of FC according to delimiter and proto
*/
typedef struct _rx_fc_msg {
/* plc & rf use */
uint32_t bcast : 1,
/* plc & rf use */
retry : 1,
/* plc only */
tmi : 4,
/* plc only */
tmi_ext : 4,
/* plc only */
numsym : 9,
/* plc only. gp protocol */
rtsf : 1,
/* plc only. gp protocol */
saf : 1,
/* plc only */
phase : 2,
/* plc & rf use */
lid : 8,
/* reserved */
resv0 : 1;
/* plc & rf use */
uint32_t dst_tei : 12,
/* plc & rf use */
src_tei : 12,
/* plc & rf use */
sack_ext_deli : 8;
/* plc & rf use. fc crc */
uint32_t fccs : 24,
/* plc & rf use */
load_in_sack : 8;
/* plc & rf use */
uint32_t time_stamp;
/* plc & rf use */
uint32_t nid : 24,
/* plc only */
bitmap_in_sack : 4,
/* plc & rf use */
result_in_sack : 4;
/* plc & rf use */
int8_t snr_in_sack;
/* plc only */
uint8_t pb_num : 4,
/* plc & rf use */
delimiter : 4;
/* rf only. rf phr pb size index */
uint8_t rf_pb_sz_idx : 4,
/* rf only. rf phr mcs index */
rf_mcs : 4;
/* reserved */
uint8_t resv1;
} rx_fc_msg_t;
typedef struct _nncco_fc_info {
uint32_t nid;
uint32_t delimiter;
uint32_t network_type;
union{
/* nncco */
struct{
/* sg: duration
* nw: continue time
*/
uint32_t duration : 16,
/* sg: next start offset
* nw: next start offset
*/
sbandoffset : 16;
uint32_t receive_nid;
/* sg: none
* nw: last end flag
*/
uint8_t bwth_end_flag : 1,
resv0 : 7;
/* sg: none
* nw: last end offset
*/
uint16_t bwth_end_shift;
/* sg self rf channel */
uint32_t self_rf_channel : 8,
/* sg self rf option */
self_rf_option : 2,
resv1 : 22;
};
/* sw nncco */
struct{
uint32_t start_ntb_l32;
/* sg: receive nid.
* nw: receive bitmap.
*/
uint64_t sw_receive_nid : 24,
sw_duration : 16,
start_ntb_h24 : 24;
uint32_t last_offset;
};
};
}nncco_fc_info_t;
/*
structure for
aquiring different part of FC according to delimiter and proto
*/
typedef struct _tx_fc_msg {
nid_t nid;
uint32_t fccs;
tei_t src_tei;
uint8_t tmi;
uint8_t ext_tmi;
uint8_t network_type;
uint8_t rf_mcs;
uint8_t rf_pb_sz_idx;
uint32_t bcn_period_cnt;
} tx_fc_msg_t;
uint32_t mac_get_rx_delimiter_from_fc(uint32_t proto, void *fc);
uint32_t mac_get_nid_from_fc(uint32_t proto, void *fc);
void mac_get_rx_frm_msg_from_fc(uint32_t proto,
void *fc, rx_fc_msg_t *msg);
void mac_rf_get_rx_frm_msg_from_fc(uint32_t proto,
void *fc, rx_fc_msg_t *msg);
void mac_get_nncco_info_from_fc(void *fc, nncco_fc_info_t *nn_fc_info);
uint32_t mac_nncco_nid_compare(uint32_t nid_in_nncco, uint32_t nid_to_check);
uint32_t mac_debug_nncco_info(void *fc, uint32_t ntb);
void mac_set_bcn_st(void *fc, uint32_t ntb);
void mac_set_sync_st(void *fc, uint32_t ntb);
void mac_get_tx_msg_from_fc(uint32_t proto, uint32_t delimiter, \
void *fc, tx_fc_msg_t *msg);
uint32_t mac_get_delimi_from_fc(uint32_t proto, \
void *fc);
uint8_t mac_get_pb_hdr_crc_len(uint32_t delimiter, uint32_t proto);
uint8_t mac_get_pb_hdr_resv_crc_len(uint32_t delimiter, uint32_t proto);
uint8_t mac_get_pb_pld_crc_len(uint32_t delimiter, uint32_t proto);
uint8_t mac_get_pb_crc_len(uint32_t delimiter, uint32_t proto);
uint8_t mac_get_mpdu_fc_len(uint32_t proto);
uint8_t mac_get_mpdu_fccs_len(uint32_t proto);
uint8_t mac_get_pb_hdr_len(uint32_t delimiter, uint32_t proto);
/**
*@brief mac_get_sof_pb_valid_payload_sz
* get sof pb payload len
*@param proto sof protocol. see plc_protocol.h
*@param pb_size sof pb size
*@return 0: get failed;
* others: sof pb payload length
*/
uint32_t mac_get_sof_pb_valid_payload_sz(uint32_t proto, uint32_t pb_size);
void mac_beacon_rx_fc_info_get(uint8_t proto, mac_rx_info_t *rx_info,
rx_fc_msg_t *msg);
/*
* get/set nncco's protect duration part for different kind of protocol
* @param proto - protocol value
* @param fc - pointer for frame control
* @param dur - value to set, unit ms
*/
uint32_t mac_get_nncco_protect_dur(uint32_t proto, void *fc);
uint32_t mac_get_nncco_protect_region_offset(uint32_t proto, void *fc);
uint32_t mac_get_nncco_received_nid(uint32_t proto, void *fc);
/**
*@brief mac_get_nncco_self_ch_id
* get nncco self rf channel id
*@param proto sof protocol. see PLC_PROTO_TYPE_XXX
*@param fc fc/hdr pointer
*@return nncco fc self rf channel id
*/
uint8_t mac_get_nncco_self_ch_id(uint32_t proto, void *fc);
/**
*@brief mac_get_nncco_self_option
* get nncco self rf option id
*@param proto sof protocol. see PLC_PROTO_TYPE_XXX
*@param fc fc/hdr pointer
*@return nncco fc self rf option id
*/
uint8_t mac_get_nncco_self_option(uint32_t proto, void *fc);
uint32_t mac_is_unicast(uint32_t proto, void *fc, uint8_t is_rf);
uint32_t mac_get_sof_frame_len(uint32_t proto, void *fc);
uint32_t mac_get_sof_pbnum(uint32_t proto, void *fc);
uint32_t mac_mask_input_nid(uint32_t nid);
/**
*@brief mac_get_bcn_st
* get timestamp from fc
*@param proto sof protocol. see plc_protocol.h
*@param fc fc pointer
*@return 0: get failed;
* others: sof pb payload length
*/
uint32_t mac_get_bcn_st(uint32_t proto, void *fc);
/**
*@brief mac_get_fc_dtei fc dtei
*@param proto sof protocol. see plc_protocol.h
*@param fc fc pointer
*@return dtei;
* others: sof pb payload length
*/
uint32_t mac_get_fc_dtei(uint32_t proto, void *fc);
/**
*@brief mac_get_unicast_sack_ts
* get unicast tx sack timestamp
*@return tx sack ntb timestamp
*/
uint32_t mac_get_unicast_sack_ts(void);
/**
*@brief mac_fc_i1901_to_sg convert ieee1901 fc to sg fc
*@param proto current phy protocol type
*@param fc ieee1901 protocol fc
*@return none
*/
void mac_fc_i1901_to_sg(uint32_t proto, void *fc);
/**
*@brief mac_fc_sg_to_i1901 convert sg fc to ieee1901 fc
*@param proto current phy protocol type
*@param fc sg protocol fc
*@return none
*/
void mac_fc_sg_to_i1901(uint32_t proto, void *fc);
#if (ENA_HW_SYNC_PPM_WAR || ENA_SW_SYNC_PPM_WAR)
/**
*@brief mac_get_clear_dbg_pkt_ppm_step
get current packet ppm step and clean
*@param fc fc address
*@return ppm step
*/
int32_t mac_get_clear_dbg_pkt_ppm_step(void *fc);
/**
*@brief mac_modify_dbg_pkt_tx_ppm
fix current packet tx ppm
*@param step ppm shift value
*@return none
*/
void mac_modify_dbg_pkt_tx_ppm(int32_t step);
#else /* (ENA_HW_SYNC_PPM_WAR || ENA_SW_SYNC_PPM_WAR) */
#define mac_get_clear_dbg_pkt_ppm_step(fc) \
(0); \
do { \
(void)(fc); \
} while(0)
#define mac_modify_dbg_pkt_tx_ppm(step) \
do { \
(void)(step); \
} while(0)
#endif /* (ENA_HW_SYNC_PPM_WAR || ENA_SW_SYNC_PPM_WAR) */
#ifdef __cplusplus
}
#endif
#endif