539 lines
15 KiB
C
539 lines
15 KiB
C
|
|
/*! \file defs_NB_IoT.h
|
|
* \brief MAC layer structures
|
|
* \author NTUST BMW Lab./
|
|
* \date 2017
|
|
* \email:
|
|
* \version 1.0
|
|
*
|
|
*/
|
|
#ifndef __LAYER2_MAC_DEFS_NB_IOT_H__
|
|
#define __LAYER2_MAC_DEFS_NB_IOT_H__
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "common/platform_constants.h"
|
|
#include "COMMON/mac_rrc_primitives.h"
|
|
#include "PHY/LTE_TRANSPORT/defs_NB_IoT.h"
|
|
//#include "PHY/defs.h"
|
|
#include "PHY/defs_L1_NB_IoT.h"
|
|
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
|
|
#include "config_NB_IoT.h"
|
|
// MAC definition
|
|
#define MAX_FRAME 0xfffff
|
|
#define NUM_FRAME 0x100000
|
|
#define MAX_SUBFRAME 10485760
|
|
|
|
#define MAX(a, b) (((a)>(b))?(a):(b))
|
|
|
|
// RA-RNTI: 1+SFN_id>>2
|
|
#define RA_RNTI_LOW 0x0001 // SFN_id = 0
|
|
#define RA_RNTI_HIGH 0x0100 // SFN_id = 1023
|
|
#define C_RNTI_LOW 0x0101
|
|
#define C_RNTI_HIGH
|
|
|
|
// ULSCH LCHAN IDs
|
|
/*!\brief LCID of extended power headroom for ULSCH */
|
|
#define EXTENDED_POWER_HEADROOM 25
|
|
/*!\brief LCID of power headroom for ULSCH */
|
|
#define POWER_HEADROOM 26
|
|
/*!\brief LCID of CRNTI for ULSCH */
|
|
#define CRNTI 27
|
|
/*!\brief LCID of truncated BSR for ULSCH */
|
|
#define TRUNCATED_BSR 28
|
|
/*!\brief LCID of short BSR for ULSCH */
|
|
#define SHORT_BSR 29
|
|
/*!\brief LCID of long BSR for ULSCH */
|
|
#define LONG_BSR 30
|
|
/*! \brief Values of CCCH LCID for DLSCH */
|
|
#define CCCH_LCHANID 0
|
|
/*!\brief Values of BCCH logical channel */
|
|
#define BCCH 3 // SI
|
|
/*!\brief Values of PCCH logical channel */
|
|
#define PCCH 4 // Paging
|
|
/*!\brief Value of CCCH / SRB0 logical channel */
|
|
#define CCCH 0 // srb0
|
|
/*!\brief DCCH / SRB1 logical channel */
|
|
#define DCCH 1 // srb1
|
|
/*!\brief DCCH1 / SRB2 logical channel */
|
|
#define DCCH1 2 // srb2
|
|
/*!\brief DTCH DRB1 logical channel */
|
|
#define DTCH 3 // LCID
|
|
/*!\brief MCCH logical channel */
|
|
//#define MCCH 4
|
|
//#define MCCH 62
|
|
#define MCCH 11
|
|
/*!\brief MTCH logical channel */
|
|
#define MTCH 1
|
|
// DLSCH LCHAN ID
|
|
/*!\brief LCID of UE contention resolution identity for DLSCH*/
|
|
#define UE_CONT_RES 28
|
|
/*!\brief LCID of timing advance for DLSCH */
|
|
#define TIMING_ADV_CMD 29
|
|
/*!\brief LCID of discontinous reception mode for DLSCH */
|
|
#define DRX_CMD 30
|
|
/*!\brief LCID of padding LCID for DLSCH */
|
|
#define SHORT_PADDING 31
|
|
|
|
|
|
typedef enum tone_type_e
|
|
{
|
|
sixtone = 0,
|
|
threetone,
|
|
singletone1,
|
|
singletone2,
|
|
singletone3
|
|
}tone_type_t;
|
|
|
|
typedef enum channel_NB_IoT_e
|
|
{
|
|
NPDCCH = 0,
|
|
NPUSCH,
|
|
NPDSCH
|
|
}channel_NB_IoT_t;
|
|
|
|
typedef enum{
|
|
UL = 0,
|
|
DL
|
|
}message_direction_t;
|
|
|
|
#define MAX_MAX_MOBILES_PER_ENB_NB_IoT 20
|
|
#define SCH_PAYLOAD_SIZE_MAX_NB_IoT 320
|
|
#define MAX_NUMBER_OF_SIBs_NB_IoT 16
|
|
|
|
/*!\brief Values of BCCH0 logical channel for MIB*/
|
|
#define BCCH0_NB_IoT 11 // MIB-NB_IoT
|
|
/*!\brief Values of BCCH1 logical channel for SIBs */
|
|
#define BCCH1_NB_IoT 12 // SI-SIB-NB_IoTs
|
|
/*!\brief Values of PCCH logical channel */
|
|
#define PCCH_NB_IoT 13 // Paging XXX not used for the moment
|
|
#define MCCH_NB_IoT 14
|
|
/*!\brief Value of CCCH / SRB0 logical channel */
|
|
#define CCCH_NB_IoT 0 // srb0 ---> XXX exactly the same as in LTE (commented for compilation purposes)
|
|
/*!\brief DCCH0 / SRB1bis logical channel */
|
|
#define DCCH0_NB_IoT 3 // srb1bis
|
|
/*!\brief DCCH1 / SRB1 logical channel */
|
|
#define DCCH1_NB_IoT 1 // srb1 //XXX we redefine it for the SRB1
|
|
/*!\brief DTCH0 DRB0 logical channel */
|
|
#define DTCH0_NB_IoT 4 // DRB0
|
|
/*!\brief DTCH1 DRB1 logical channel */
|
|
#define DTCH1_NB_IoT 5 // DRB1
|
|
/*Index of UE contention resoulution logical channel*/
|
|
#define UE_CONTENTION_RESOLUTION 28
|
|
/*Index of TIMING_ADVANCE logical channel*/
|
|
#define TIMING_ADVANCE 29
|
|
/*Index of DRX_COMMAND logical channel*/
|
|
#define DRX_COMMAND 30
|
|
/*Index of PADDING logical channel*/
|
|
#define PADDING 31
|
|
|
|
|
|
/// NPRACH-ParametersList-NB_IoT-r13 from 36.331 RRC spec defined in PHY
|
|
/*typedef struct NPRACH_Parameters_NB_IoT{
|
|
|
|
/// the period time for nprach
|
|
int nprach_Periodicity;
|
|
/// for the start time for the NPRACH resource from 40ms-2560ms
|
|
int nprach_StartTime;
|
|
/// for the subcarrier of set to the NPRACH preamble from n0 - n34
|
|
int nprach_SubcarrierOffset;
|
|
///number of subcarriers in a NPRACH resource allowed values (n12,n24,n36,n48)
|
|
int nprach_NumSubcarriers;
|
|
/// where is the region that in NPRACH resource to indicate if this UE support MSG3 for multi-tone or not. from 0 - 1
|
|
int nprach_SubcarrierMSG3_RangeStart;
|
|
/// The max preamble transmission attempt for the CE level from 1 - 128
|
|
int maxNumPreambleAttemptCE;
|
|
/// Number of NPRACH repetitions per attempt for each NPRACH resource
|
|
int numRepetitionsPerPreambleAttempt;
|
|
/// The number of the repetition for DCI use in RAR/MSG3/MSG4 from 1 - 2048 (Rmax)
|
|
int npdcch_NumRepetitions_RA;
|
|
/// Starting subframe for NPDCCH Common searching space for (RAR/MSG3/MSG4)
|
|
int npdcch_StartSF_CSS_RA;
|
|
/// Fractional period offset of starting subframe for NPDCCH common search space
|
|
int npdcch_Offset_RA;
|
|
|
|
} nprach_parameters_NB_IoT_t;*/
|
|
|
|
/*! \brief Downlink SCH PDU Structure */
|
|
typedef struct {
|
|
uint8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT];
|
|
uint32_t pdu_size;
|
|
} __attribute__ ((__packed__)) DLSCH_PDU_NB_IoT;
|
|
|
|
/*! \brief eNB template for UE context information */
|
|
typedef struct {
|
|
// C-RNTI of UE
|
|
rnti_t rnti;
|
|
// UE CE level
|
|
int CE_level;
|
|
// Direction of transmission(DL:0\UL:1\NONE:-1)
|
|
int32_t direction;
|
|
// DCI Reptition
|
|
uint32_t R_dci;
|
|
// MAX repetition
|
|
uint32_t R_max;
|
|
|
|
// HARQ round
|
|
uint32_t HARQ_round;
|
|
/*Downlink information*/
|
|
|
|
/// DLSCH pdu
|
|
DLSCH_PDU_NB_IoT DLSCH_pdu;
|
|
// PDU size
|
|
uint32_t DLSCH_pdu_size;
|
|
// Data Reptition
|
|
uint32_t R_dl;
|
|
// MCS index
|
|
uint32_t I_mcs_dl;
|
|
// total downlink buffer DCCH0_NB_IoT
|
|
uint32_t dl_buffer_DCCH0_NB_IoT;
|
|
// NDI
|
|
int oldNDI_DL;
|
|
//HARQ ACK/NACK repetition
|
|
uint32_t R_harq;
|
|
|
|
/*Uplink information*/
|
|
int oldNDI_UL;
|
|
// Uplink data repeat, now just follow the rach repeat number
|
|
uint32_t R_ul;
|
|
// PHR value (0-3)
|
|
uint32_t PHR;
|
|
// The uplink data size from BSR or DVI
|
|
uint32_t ul_total_buffer;
|
|
// Determine if this UE support multi-tone transmission or not
|
|
int multi_tone;
|
|
// Next UE_template ID
|
|
int next;
|
|
// Previous UE_template ID
|
|
int prev;
|
|
// MSG4 complete
|
|
int RRC_connected;
|
|
// UE active flag
|
|
int active;
|
|
|
|
} UE_TEMPLATE_NB_IoT;
|
|
|
|
/*36331 NPDCCH-ConfigDedicated-NB_IoT*/
|
|
typedef struct{
|
|
//npdcch-NumRepetitions-r13
|
|
uint32_t R_max;
|
|
//npdcch-StartSF-USS-r13
|
|
double G;
|
|
//npdcch-Offset-USS-r13
|
|
double a_offset;
|
|
//NPDCCH period
|
|
uint32_t T;
|
|
//Starting subfrane of Search Space which is mod T
|
|
uint32_t ss_start_uss;
|
|
}NPDCCH_config_dedicated_NB_IoT_t;
|
|
|
|
|
|
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/
|
|
typedef struct {
|
|
|
|
/// DCI template and MAC connection parameters for UEs
|
|
UE_TEMPLATE_NB_IoT UE_template_NB_IoT[MAX_MAX_MOBILES_PER_ENB_NB_IoT];
|
|
|
|
/// NPDCCH Period and searching space info
|
|
NPDCCH_config_dedicated_NB_IoT_t NPDCCH_config_dedicated;
|
|
//int next[MAX_MAX_MOBILES_PER_ENB_NB_IoT];
|
|
// -1:No UE in list
|
|
int head;
|
|
// -1:No UE in list
|
|
int tail;
|
|
int num_UEs;
|
|
|
|
} UE_list_NB_IoT_t;
|
|
|
|
|
|
typedef struct{
|
|
|
|
// flag to indicate scheduing MIB-NB_IoT
|
|
uint8_t flag_MIB;
|
|
// flag to indicate scheduling SIB1-NB_IoT
|
|
uint8_t flag_SIB1;
|
|
// flag to indicate scheduling SIBs-NB_IoT
|
|
uint8_t flag_SIBs[MAX_NUMBER_OF_SIBs_NB_IoT];
|
|
// flag to indicate scheduling type2 NPDCCH CSS with different CE level
|
|
uint8_t flag_type2_css[3];
|
|
// flag to indicate scheduling type1 NPDCCH CSS with different CE level
|
|
uint8_t flag_type1_css[3];
|
|
// flag to indicate scheduling NPDCCH USS with UE list
|
|
uint8_t flag_uss[MAX_MAX_MOBILES_PER_ENB_NB_IoT];
|
|
// flag to indicate scheduling sib1/MIB
|
|
uint8_t flag_fix_scheduling;
|
|
// number of the type2 css to schedule in this period
|
|
uint8_t num_type2_css_run;
|
|
// number of the type1 css to schedule in this period
|
|
uint8_t num_type1_css_run;
|
|
// number of the uss to schedule in this period
|
|
uint8_t num_uss_run;
|
|
|
|
}scheduling_flag_t;
|
|
|
|
typedef struct available_resource_UL_s{
|
|
|
|
///Resource start subframe
|
|
uint32_t start_subframe;
|
|
///Resource end subframe
|
|
uint32_t end_subframe;
|
|
// pointer to next node
|
|
struct available_resource_UL_s *next, *prev;
|
|
|
|
}available_resource_UL_t;
|
|
|
|
typedef struct available_resource_DL_s{
|
|
uint32_t start_subframe;
|
|
uint32_t end_subframe;
|
|
|
|
struct available_resource_DL_s *next, *prev;
|
|
}available_resource_DL_t;
|
|
|
|
/*Structure used for scheduling*/
|
|
typedef struct{
|
|
//resource position info.
|
|
uint32_t sf_end,sf_start;
|
|
//resource position info. separate by HyperSF, Frame, Subframe
|
|
uint32_t start_h, end_h;
|
|
uint32_t start_f, end_f;
|
|
uint32_t start_sf, end_sf;
|
|
//whcih available resource node is used
|
|
available_resource_DL_t *node;
|
|
}sched_temp_DL_NB_IoT_t;
|
|
|
|
/*!\brief MAC subheader short with 7bit Length field */
|
|
typedef struct {
|
|
uint8_t LCID:5; // octet 1 LSB
|
|
uint8_t E:1;
|
|
uint8_t F2:1;
|
|
uint8_t R:1; // octet 1 MSB
|
|
uint8_t L:7; // octet 2 LSB
|
|
uint8_t F:1; // octet 2 MSB
|
|
} __attribute__((__packed__))SCH_SUBHEADER_SHORT_NB_IoT;
|
|
typedef struct {
|
|
uint8_t LCID:5; // octet 1 LSB
|
|
uint8_t E:1;
|
|
uint8_t F2:1;
|
|
uint8_t R:1; // octet 1 MSB
|
|
uint8_t L_MSB:7;
|
|
uint8_t F:1; // octet 2 MSB
|
|
uint8_t L_LSB:8;
|
|
} __attribute__((__packed__))SCH_SUBHEADER_LONG_NB_IoT;
|
|
typedef struct {
|
|
uint8_t LCID:5; // octet 1 LSB
|
|
uint8_t E:1;
|
|
uint8_t F2:1;
|
|
uint8_t R:1; // octet 1 MSB
|
|
uint8_t L_MSB:8; // octet 2 MSB
|
|
uint8_t L_LSB:8;
|
|
} __attribute__((__packed__))SCH_SUBHEADER_LONG_EXTEND_NB_IoT;
|
|
/*!\brief MAC subheader short without length field */
|
|
typedef struct {
|
|
uint8_t LCID:5;
|
|
uint8_t F2:1;
|
|
uint8_t E:1;
|
|
uint8_t R:1;
|
|
} __attribute__((__packed__))SCH_SUBHEADER_FIXED_NB_IoT;
|
|
|
|
|
|
/*! \brief Uplink SCH PDU Structure */
|
|
typedef struct {
|
|
int8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT]; /*!< \brief SACH payload */
|
|
uint16_t Pdu_size;
|
|
} __attribute__ ((__packed__)) ULSCH_PDU_NB_IoT;
|
|
|
|
typedef struct {
|
|
uint8_t PH:6;
|
|
uint8_t R:2;
|
|
} __attribute__((__packed__))POWER_HEADROOM_CMD_NB_IoT;
|
|
|
|
typedef struct {
|
|
uint8_t RAPID:6;
|
|
uint8_t T:1;
|
|
uint8_t E:1;
|
|
} __attribute__((__packed__))RA_HEADER_RAPID_NB_IoT;
|
|
|
|
/*Structure used for UL scheduling*/
|
|
typedef struct{
|
|
//resource position info.
|
|
uint32_t sf_end, sf_start;
|
|
//resource position info. separate by HyperSF, Frame, Subframe
|
|
//uint32_t start_h, end_h;
|
|
//uint32_t start_f, end_f;
|
|
//uint32_t start_sf, end_sf;
|
|
// information for allocating the resource
|
|
int tone;
|
|
int scheduling_delay;
|
|
int subcarrier_indication;
|
|
int ACK_NACK_resource_field;
|
|
available_resource_UL_t *node;
|
|
}sched_temp_UL_NB_IoT_t;
|
|
|
|
typedef struct Available_available_resource_DL{
|
|
|
|
///Available Resoruce for sixtone
|
|
available_resource_UL_t *sixtone_Head;//, *sixtone_npusch_frame;
|
|
uint32_t sixtone_end_subframe;
|
|
///Available Resoruce for threetone
|
|
available_resource_UL_t *threetone_Head;//, *threetone_npusch_frame;
|
|
uint32_t threetone_end_subframe;
|
|
///Available Resoruce for singletone1
|
|
available_resource_UL_t *singletone1_Head;//, *singletone1_npusch_frame;
|
|
uint32_t singletone1_end_subframe;
|
|
///Available Resoruce for singletone2
|
|
available_resource_UL_t *singletone2_Head;//, *singletone2_npusch_frame;
|
|
uint32_t singletone2_end_subframe;
|
|
///Available Resoruce for singletone3
|
|
available_resource_UL_t *singletone3_Head;//, *singletone3_npusch_frame;
|
|
uint32_t singletone3_end_subframe;
|
|
|
|
}available_resource_tones_UL_t;
|
|
|
|
typedef struct schedule_result{
|
|
// The subframe read by output handler
|
|
uint32_t output_subframe;
|
|
// SDU length
|
|
uint32_t sdu_length;
|
|
// MAC PDU
|
|
uint8_t *DLSCH_pdu;
|
|
// The data direction indicated by this DCI
|
|
uint8_t direction;
|
|
// pointer to DCI
|
|
void *DCI_pdu;
|
|
// when all the procedure related to this DCI, enable this flag
|
|
bool DCI_release;
|
|
// Indicate the channel which to transmit
|
|
channel_NB_IoT_t channel;
|
|
// rnti
|
|
rnti_t rnti;
|
|
// 0 = TC-RNTI , 1 = RA-RNTI, 2 = P-RNTI, 3 = others
|
|
uint8_t rnti_type;
|
|
// 0 = data, 1 = ACK/NACK
|
|
uint8_t npusch_format;
|
|
//HARQ ACK/NACK repetition
|
|
uint32_t R_harq;
|
|
// pointer to next node
|
|
struct schedule_result *next;
|
|
|
|
uint32_t end_subframe;
|
|
|
|
uint8_t *rar_buffer;
|
|
|
|
}schedule_result_t;
|
|
|
|
/*Flag structure used for trigger each scheduler*/
|
|
typedef struct{
|
|
scheduling_flag_t scheduling_flag;
|
|
//sched_temp_DL_NB_IoT_t sched_result_DL;
|
|
//resource grid for Uplink
|
|
available_resource_tones_UL_t *UL_resource;
|
|
//scheduling result read by output handler
|
|
schedule_result_t *schedule_result_list_UL;
|
|
schedule_result_t *schedule_result_list_DL;
|
|
}SCHEDULE_NB_IoT_t;
|
|
|
|
typedef struct{
|
|
uint32_t num_dlsf_per_period;
|
|
uint16_t *sf_to_dlsf_table;
|
|
uint16_t *dlsf_to_sf_table;
|
|
}DLSF_INFO_t;
|
|
|
|
typedef enum ce_level_e{
|
|
ce0=0,
|
|
ce1,
|
|
ce2,
|
|
ce_level_total
|
|
}ce_level_t;
|
|
|
|
|
|
|
|
/*! \brief eNB template for the Random access information */
|
|
typedef struct RA_TEMPLATE_NB_IoT_s{
|
|
|
|
bool active;
|
|
uint32_t msg3_retransmit_count;
|
|
uint32_t msg4_retransmit_count;
|
|
uint16_t ta;
|
|
uint8_t preamble_index;
|
|
ce_level_t ce_level;
|
|
rnti_t ue_rnti;
|
|
rnti_t ra_rnti;
|
|
struct RA_TEMPLATE_NB_IoT_s *next, *prev;
|
|
bool wait_msg4_ack;
|
|
bool wait_msg3_ack;
|
|
uint8_t rar_buffer[7];
|
|
|
|
} RA_TEMPLATE_NB_IoT;
|
|
|
|
typedef struct RA_template_list_s{
|
|
RA_TEMPLATE_NB_IoT *head;
|
|
RA_TEMPLATE_NB_IoT *tail;
|
|
}RA_template_list_t;
|
|
|
|
|
|
/*! \brief top level eNB MAC structure */
|
|
typedef struct eNB_MAC_INST_NB_IoT_s {
|
|
/// Ethernet parameters for northbound midhaul interface
|
|
eth_params_t eth_params_n;
|
|
/// Ethernet parameters for fronthaul interface
|
|
eth_params_t eth_params_s;
|
|
|
|
uint8_t Mod_id;
|
|
// System
|
|
uint32_t hyper_system_frame;
|
|
uint32_t system_frame;
|
|
uint32_t sub_frame;
|
|
|
|
uint32_t current_subframe;
|
|
/// Pointer to IF module instance for PHY
|
|
IF_Module_t *if_inst;
|
|
// RA
|
|
RA_template_list_t RA_msg2_list;
|
|
RA_template_list_t RA_msg3_list;
|
|
RA_template_list_t RA_msg4_list;
|
|
|
|
RA_TEMPLATE_NB_IoT RA_template[MAX_MAX_MOBILES_PER_ENB_NB_IoT];
|
|
|
|
//int32_t last_tx_subframe;
|
|
|
|
// for tool
|
|
int32_t sib1_flag[64];
|
|
int32_t sib1_count[64];
|
|
int32_t sib1_period;
|
|
uint16_t dlsf_table[64];
|
|
int32_t sibs_table[256];
|
|
|
|
// channel config
|
|
|
|
//USS list
|
|
//Number of USS period is used
|
|
int num_uss_list;
|
|
UE_list_NB_IoT_t *UE_list_spec;
|
|
|
|
scheduling_flag_t scheduling_flag;
|
|
|
|
uint32_t schedule_subframe_DL;
|
|
uint32_t schedule_subframe_UL;
|
|
|
|
rrc_config_NB_IoT_t rrc_config;
|
|
|
|
nfapi_config_request_t config;
|
|
|
|
IF_Module_NB_IoT_t *if_inst_NB_IoT;
|
|
} eNB_MAC_INST_NB_IoT;
|
|
|
|
// actually not here, but for now put it here
|
|
typedef struct {
|
|
uint32_t bytes_in_buffer; /*!< \brief Bytes buffered in RLC protocol instance. */
|
|
uint32_t pdus_in_buffer; /*!< \brief Number of PDUs buffered in RLC protocol instance (OBSOLETE). */
|
|
uint32_t head_sdu_creation_time; /*!< \brief Head SDU creation time. */
|
|
uint32_t head_sdu_remaining_size_to_send; /*!< \brief remaining size of sdu: could be the total size or the remaining size of already segmented sdu */
|
|
bool head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
|
|
} mac_rlc_status_resp_NB_IoT_t;
|
|
|
|
// global variables
|
|
|
|
|
|
|
|
#endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */
|