/**************************************************************************** Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT be copied by any method or incorporated into another program without the express written consent of Aerospace C.Power. This Information or any portion thereof remains the property of Aerospace C.Power. The Information contained herein is believed to be accurate and Aerospace C.Power assumes no responsibility or liability for its use in any way and conveys no license or title under any patent or copyright and makes no representation or warranty that this Information is free from patent or copyright infringement. ****************************************************************************/ #ifndef PLC_MPDU_HEADER_H #define PLC_MPDU_HEADER_H ///This file define data struct share between CVG and MAC /* os shim includes */ #include "os_types_api.h" #include "plc_fr.h" #include "iot_utils_api.h" #ifdef __cplusplus extern "C" { #endif /* This file contains the beacon structure definition * and function to get/set the related field for packed * structure */ /* pack for the structures in the whole file */ #pragma pack(push) // save the pack status #pragma pack(1) // 1 byte align #define DBG_PKT_VERSION (0xf) enum FC_DELIM_TYPE { FC_DELIM_BEACON = 0, DT_AV_BEACON = 0, FC_DELIM_SOF = 1, DT_AV_SOF = 1, FC_DELIM_SACK = 2, DT_AV_SACK = 2, FC_DELIM_NNCCO = 3, DT_AV_RTS_CTS = 3, FC_DELIM_SOUND = 4, DT_AV_SOUND = 4, //self defined type for dtest I1901_RTS_CTS = 4, DT_AV_RSOF = 5, /* custom delimiter type for RF test */ FC_DELIM_RF_TEST = 7, }; /* define RF test type */ typedef enum { /* tx calibration */ RF_TEST_TYPE_TX_CALI = 0, } RF_TEST_TYPE_T; /* define RF test tx calibration register type */ typedef enum { RF_TEST_TX_CALI_REG_IQ_MAG = 0, RF_TEST_TX_CALI_REG_IQ_PHASE = 1, RF_TEST_TX_CALI_REG_IQ_DC = 2, } RF_TEST_TX_CALI_REG_T; #define PLC_MPDU_FC_LEN 16 #define PLC_MPDU_FCCS_LEN 3 #define SG_STANDARD_VERSION 0 /* MPDU Frame control */ typedef PREPACK struct _frame_control { union{ struct{ uint32_t delimiter_type : 3, //Normal mode network_type : 5, nid : 24; }; struct{ uint32_t delimiter_type_v3 : 3, //encryption mode aes_key_sel : 5, nid_v3 : 24; }; }; union { struct { uint32_t time_stamp : 32; /* NTB */ uint16_t src_tei : 12, tmi : 4; uint16_t sym_num : 9, phase_num : 2, resv : 5; uint32_t resv2 : 4, version : 4, fccs : 24; } bcn; struct { uint32_t src_tei : 12, dst_tei : 12, lid : 8; uint16_t frame_len : 12, /* unit 10us */ pb_num : 4; uint16_t sym_num : 9, bcast : 1, retry : 1, encry : 1, tmi : 4; union{ struct{ uint32_t tmi_ext : 4, //Normal mode version : 4, fccs : 24; }; struct{ uint32_t tmi_ext_v3 : 4, //encryption mode decrypt_mode : 2, aes_key_table_sel : 2, fccs_v3 : 24; }; }; } sof; struct { /* TODO */ uint32_t rx_result : 4, rx_status : 4, stei : 12, dtei : 12; uint32_t rx_pb : 3, resv0 : 5, snr : 8, load : 8, resv1 : 8; uint32_t ext_deli : 4, version : 4, fccs : 24; } sack; /* neighbor network CCo communication */ struct { /* TODO */ uint32_t duration : 16, sbandoffset : 16; uint32_t receive_nid : 24, self_rf_channel : 8; uint32_t self_rf_option : 2, resv1 : 2, version : 4, fccs:24; } nn_cco; /* neighbor network CCO communication between MAC and ISR. for * neighbor network negotiation frame tx, we have to make * make sure the sbandoffset and duration as accurate as possible. * We use this format to transfer useful info from MAC SW to ISR so * that ISR can fill in accurate info right before each TX. Right * before each TX, MAC HW will trigger interrupt and ISR will fill in * right info before BB send it out. * Note that for simulator case, we use nn_cco_sw for communication * among CCO to make it simple. */ struct { /* lower 32bit start ntb of the protected region */ uint32_t start_ntb_l32; /* watched neighbor network id */ uint64_t receive_nid : 24, /* duration of the protected region */ duration : 16, /* higher 24bit start ntb of the protected region, we ignore the * highest 8bit as 60 years are long enough. */ start_ntb_h24 : 24; } nn_cco_sw; struct { uint32_t time_stamp : 32; /* NTB */ uint16_t stei : 12, rsv0 : 4; uint16_t rsv1 : 8, rsv2 : 8; uint32_t ext_type : 4, version : 4, fccs : 24; } sync; struct { uint8_t mac_addr[IOT_MAC_ADDR_LEN]; uint16_t stei : 12, rsv4 : 4; uint32_t ext_type : 4, version : 4, fccs : 24; } search; struct { uint32_t time_stamp : 32; /* NTB */ uint16_t src_tei : 12, mcs : 4; uint16_t pb_sz_idx : 4, /* pb size index */ resv0 : 12; uint32_t resv1 : 4, version : 4, fccs : 24; } rf_bcn; struct { uint32_t src_tei : 12, dst_tei : 12, lid : 8; uint16_t frame_len : 12, /* unit 100us */ pb_sz_idx : 4; uint16_t resv0 : 9, bcast : 1, retry : 1, encry : 1, mcs : 4; uint32_t resv1 : 4, version : 4, fccs : 24; } rf_sof; struct { uint32_t rx_result : 4, resv0 : 4, stei : 12, dtei : 12; uint32_t resv1 : 8, snr : 8, load : 8, resv2 : 8; uint32_t ext_deli : 4, version : 4, fccs : 24; } rf_sack; /* Rf test tx calibration fc variable region */ struct { /* dvice id magic number */ uint16_t dev_id_magic; /* tx calibration register combination magic number */ uint32_t reg_magic; /* rf tx calibration register type, see RF_TEST_TX_CALI_REG_XXX */ uint16_t reg_type :3, /* rserved for future use */ rsvd :13; /* test type, see RF_TEST_TYPE_XXX */ uint32_t test_type :4, /* protocol Version */ version :4, /* check code */ fccs :24; } rf_test_tx_cali; } vf; } POSTPACK frame_control_t; #define SPG_STANDARD_VERSION 1 typedef PREPACK struct _spg_frame_control { uint8_t delimiter_type : 3, access_ind : 1, snid : 4; union { struct { uint32_t time_stamp : 32; uint32_t bcn_period_cnt : 32; uint16_t src_tei : 12, tmi : 4; uint16_t sym_num : 9, resv1 : 1, phase_num : 2, version : 4; uint8_t fccs[3]; } bcn; struct { uint32_t src_tei : 12, dst_tei : 12, lid : 8; union{ struct{ uint16_t resv1 : 16; //Normal mode }; struct{ uint16_t aes_key_sel : 5, //encryption mode aes_key_table_sel : 2, resv1_v3 : 9; }; }; uint8_t pb_num : 4, tmi : 4; uint32_t frm_len : 12, resv2 : 9, tei_filter_flag : 1, retry : 1, sym_num : 9; union{ struct{ uint32_t tmi_ext : 4, //Normal mode version : 4, fccs : 24; }; struct{ uint32_t tmi_ext_v3 : 4, //encryption mode decrypt_mode : 4, fccs_v3 : 24; }; }; } sof; struct { uint8_t rx_result : 4, rx_status : 4; uint16_t dtei : 12, rx_pb : 4; uint32_t resv1 : 32; uint32_t resv2 : 32; uint32_t ext_deli : 4, version : 4, fccs : 24; } sack; struct { uint16_t neighbor_network : 16; uint32_t self_rf_channel : 8, resv0 : 10, conti_time : 14; uint8_t resv1 : 1, bwth_end_flag : 1, self_rf_option : 2, resv4 : 4; uint16_t bwth_end_shift : 16; uint16_t bwth_start_shift : 16; uint32_t resv : 4, version : 4, fccs : 24; } nn_cco; /* neighbor network CCO communication between MAC and ISR. for * neighbor network negotiation frame tx, we have to make * make sure the sbandoffset and duration as accurate as possible. * We use this format to transfer useful info from MAC SW to ISR so * that ISR can fill in accurate info right before each TX. Right * before each TX, MAC HW will trigger interrupt and ISR will fill in * right info before BB send it out. * Note that for simulator case, we use nn_cco_sw for cummunication * among CCO to make it simple. */ struct { /* lower 32bit start ntb of the protected region */ uint32_t start_ntb_l32; /* watched neighbor network id */ uint32_t neighbor_network : 16, /* duration of the protected region */ duration : 14, resv4 : 2; /* higher 24bit start ntb of the protected region, we ignore the * highest 8bit as 60 years are long enough. */ uint32_t start_ntb_h24 : 24, resv0: 8; uint16_t last_offsetl; uint8_t last_offseth; /* last_offset 24bit*/ } nn_cco_sw; struct { uint32_t time_stamp; /* NTB */ uint16_t stei : 12, rsv0 : 4; uint32_t rsv1; uint8_t sn; uint32_t ext_type : 4, version : 4, fccs : 24; } sync; struct { uint8_t mac_addr[IOT_MAC_ADDR_LEN]; uint16_t stei : 12, rsv0 : 4; uint16_t rsv1; uint8_t sn; uint32_t ext_type : 4, version : 4, fccs : 24; } search; struct { uint32_t time_stamp; uint32_t bcn_period_cnt; uint16_t src_tei : 12, mcs : 4; uint16_t pb_sz_idx : 4, resv0 : 8, version : 4; uint8_t fccs[3]; } rf_bcn; struct { uint32_t src_tei : 12, dst_tei : 12, lid : 8; uint16_t frame_len : 12, /* unit 100us */ pb_sz_idx : 4; uint8_t mcs : 4, tei_filter_flag : 1, retry : 1, resv0 : 2; uint32_t resv1; uint32_t resv2 : 4, version : 4, fccs : 24; } rf_sof; struct { uint32_t rx_result : 4, resv0 : 4, dtei : 12, resv1 : 12; uint32_t resv2; uint32_t resv3 : 24, ext_deli : 4, version : 4; uint8_t fccs[3]; } rf_sack; /* Rf test tx calibration fc variable region */ struct { /* dvice id magic number */ uint16_t dev_id_magic; /* tx calibration register combination magic number */ uint32_t reg_magic; /* rf tx calibration register type, see RF_TEST_TX_CALI_REG_XXX */ uint16_t reg_type :3, /* rserved for future use */ resv0 :13; uint32_t resv1 :24, /* test type, see RF_TEST_TYPE_XXX */ test_type :4, /* protocol Version */ version :4; /* check code */ uint8_t fccs[3]; } rf_test_tx_cali; } vf; } POSTPACK spg_frame_control_t; typedef PREPACK struct _hp10_frame_control { uint32_t cc : 1, dt : 3, vf : 13, fccs : 8, resv : 7; } POSTPACK hp10_frame_control; #define HPAV_MPDU_FC_LEN 16 #define HPAV_MPDU_FCCS_LEN 3 typedef PREPACK struct _hpav_frame_control { uint8_t delimiter_type : 3, access : 1, snid : 4; union { struct { uint32_t bts; uint32_t bto0 : 16, bto1 : 16; uint32_t bto2 : 16, bto3 : 16; } bcn; /* sof */ struct { uint16_t src_tei : 8, dst_tei : 8; uint8_t lid; uint32_t cfs : 1, bdf : 1, hp10df : 1, hp11df : 1, eks : 4, pbb : 8, ble : 8, pbsz : 1, numsym : 2, tmi_av : 5; uint32_t fl_av : 12, mpdu_cnt : 2, burst_cnt : 2, bbf : 1, mrtfl : 4, dcppcf : 1, mcf : 1, mnbf : 1, rsr : 1, clst : 1, mfs_cmd_mgmt : 3, mfs_cmd_data : 3; uint8_t mfs_rsp_mgmt : 2, mfs_rsp_data : 2, bm_sacki : 4; } sof; /* sack */ struct { uint16_t dst_tei : 8, cfs : 1, bdf : 1, svn : 1, rrtf : 1, mfs_rsp_data : 2, mfs_rsp_mgmt : 2; uint8_t sackt3 : 2, sackt2: 2, sackt1: 2, sackt0: 2; uint8_t sackd_bitpad_var[8]; uint8_t rx_winsz : 4, rrtl : 4; } sack; /* rts cts */ struct { uint16_t src_tei : 8, dst_tei : 8; uint8_t lid; uint32_t cfs : 1, bdf : 1, hp10df : 1, hp11df : 1, rtsf : 1, igf : 1, mnbf : 1, mcf : 1, dur : 14, rsvd0 : 10; uint8_t rsvd1[5]; } rtscts; /* sound */ struct { uint32_t stei : 8, dtei : 8, lid : 8, cfs : 1, pbsz : 1, bdf : 1, saf : 1, scf : 1, req_tm : 3; uint16_t fl_av : 12, mpducnt : 2, rsvd0 : 2; uint8_t ppb; uint8_t src; uint32_t resvd; } sound; /* rsof */ struct { uint16_t dst_tei : 8, cfs : 1, bdf : 1, svn : 1, rrtf : 1, mfs_rsp_data : 2, mfs_rsp_mgmt : 2; uint8_t sackd_bitpad_var[6]; uint8_t rx_winsz : 4, rrtl : 4; uint16_t rsof_fl_av : 10, tmi_av : 5, pbsz : 1; uint8_t num_sym : 2, mfs_cmd_data : 3, mfs_cmd_mgmt : 3; }rsof; } vf_av; struct { uint8_t fccs_av0; uint8_t fccs_av1; uint8_t fccs_av2; } fccs_av; } POSTPACK hpav_frame_control; typedef PREPACK struct _i1901_frame_control { uint32_t delimiter_type : 3, network_type : 5, nid : 24; union { struct { uint32_t time_stamp; /* NTB */ uint16_t stei : 12, tmi : 4; uint16_t phase_num : 2, pss : 4, resv : 10; uint32_t resv1 : 4, version : 4, fccs : 24; } bcn; struct { uint32_t stei : 12, dtei : 12, lid : 8; uint16_t frame_len : 12, /* unit 10us */ pb_num : 4; uint16_t bcast : 1, retry : 1, encry : 2, tmi : 4, tmi_ext : 1, pss :4, resv : 3; uint32_t resv1 : 4, version : 4, fccs : 24; } sof; struct { uint32_t result : 4, stei : 12, dtei : 12, rx_pb : 3, resv : 1; uint32_t snr : 8, load : 8, resv1 : 16; uint32_t ext_deli : 4, version : 4, fccs : 24; } sack; struct { uint32_t duration : 16, sbandoffset : 16; uint32_t receive_nid : 24, resv : 8; uint32_t resv1 : 4, version : 4, fccs : 24; } nn_cco; struct { uint32_t stei : 12, dtei : 12, lid : 8; uint32_t mnbf : 1, rtsf : 1, encry : 2, dur : 12, resv : 16; uint32_t resv1 : 4, version : 4, fccs : 24; } rts_cts; } vf; } POSTPACK i1901_frame_control_t; #pragma pack(pop) // restore the pack status #ifdef __cplusplus } #endif #endif /* PLC_MPDU_HEADER_H */