Commit e7cfe377 authored by Cedric Roux's avatar Cedric Roux

integration fix: fix file format (dos2unix)

End of line character has to be unix-style, not dos-style.
parent 92bb82eb
/*! \file defs_NB_IoT.c /*! \file defs_NB_IoT.c
* \brief MAC layer structures * \brief MAC layer structures
* \author NTUST BMW Lab./ * \author NTUST BMW Lab./
* \date 2017 * \date 2017
* \email: * \email:
* \version 1.0 * \version 1.0
* *
*/ */
#ifndef __LAYER2_MAC_DEFS_NB_IOT_H__ #ifndef __LAYER2_MAC_DEFS_NB_IOT_H__
#define __LAYER2_MAC_DEFS_NB_IOT_H__ #define __LAYER2_MAC_DEFS_NB_IOT_H__
#ifdef USER_MODE #ifdef USER_MODE
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#endif #endif
//#include "COMMON/openair_defs.h" //#include "COMMON/openair_defs.h"
#include "COMMON/platform_constants.h" #include "COMMON/platform_constants.h"
#include "COMMON/mac_rrc_primitives.h" #include "COMMON/mac_rrc_primitives.h"
#include "PHY/LTE_TRANSPORT/defs_NB_IoT.h" #include "PHY/LTE_TRANSPORT/defs_NB_IoT.h"
//#include "PHY/defs.h" //#include "PHY/defs.h"
#include "PHY/defs_L1_NB_IoT.h" #include "PHY/defs_L1_NB_IoT.h"
#include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h" #include "openair2/PHY_INTERFACE/IF_Module_NB_IoT.h"
#include "config_NB_IoT.h" #include "config_NB_IoT.h"
// MAC definition // MAC definition
#define MAX_FRAME 0xfffff #define MAX_FRAME 0xfffff
#define NUM_FRAME 0x100000 #define NUM_FRAME 0x100000
#define MAX_SUBFRAME 10485760 #define MAX_SUBFRAME 10485760
#define MAX(a, b) (((a)>(b))?(a):(b)) #define MAX(a, b) (((a)>(b))?(a):(b))
// RA-RNTI: 1+SFN_id>>2 // RA-RNTI: 1+SFN_id>>2
#define RA_RNTI_LOW 0x0001 // SFN_id = 0 #define RA_RNTI_LOW 0x0001 // SFN_id = 0
#define RA_RNTI_HIGH 0x0100 // SFN_id = 1023 #define RA_RNTI_HIGH 0x0100 // SFN_id = 1023
#define C_RNTI_LOW 0x0101 #define C_RNTI_LOW 0x0101
#define C_RNTI_HIGH #define C_RNTI_HIGH
// ULSCH LCHAN IDs // ULSCH LCHAN IDs
/*!\brief LCID of extended power headroom for ULSCH */ /*!\brief LCID of extended power headroom for ULSCH */
#define EXTENDED_POWER_HEADROOM 25 #define EXTENDED_POWER_HEADROOM 25
/*!\brief LCID of power headroom for ULSCH */ /*!\brief LCID of power headroom for ULSCH */
#define POWER_HEADROOM 26 #define POWER_HEADROOM 26
/*!\brief LCID of CRNTI for ULSCH */ /*!\brief LCID of CRNTI for ULSCH */
#define CRNTI 27 #define CRNTI 27
/*!\brief LCID of truncated BSR for ULSCH */ /*!\brief LCID of truncated BSR for ULSCH */
#define TRUNCATED_BSR 28 #define TRUNCATED_BSR 28
/*!\brief LCID of short BSR for ULSCH */ /*!\brief LCID of short BSR for ULSCH */
#define SHORT_BSR 29 #define SHORT_BSR 29
/*!\brief LCID of long BSR for ULSCH */ /*!\brief LCID of long BSR for ULSCH */
#define LONG_BSR 30 #define LONG_BSR 30
/*! \brief Values of CCCH LCID for DLSCH */ /*! \brief Values of CCCH LCID for DLSCH */
#define CCCH_LCHANID 0 #define CCCH_LCHANID 0
/*!\brief Values of BCCH logical channel */ /*!\brief Values of BCCH logical channel */
#define BCCH 3 // SI #define BCCH 3 // SI
/*!\brief Values of PCCH logical channel */ /*!\brief Values of PCCH logical channel */
#define PCCH 4 // Paging #define PCCH 4 // Paging
/*!\brief Value of CCCH / SRB0 logical channel */ /*!\brief Value of CCCH / SRB0 logical channel */
#define CCCH 0 // srb0 #define CCCH 0 // srb0
/*!\brief DCCH / SRB1 logical channel */ /*!\brief DCCH / SRB1 logical channel */
#define DCCH 1 // srb1 #define DCCH 1 // srb1
/*!\brief DCCH1 / SRB2 logical channel */ /*!\brief DCCH1 / SRB2 logical channel */
#define DCCH1 2 // srb2 #define DCCH1 2 // srb2
/*!\brief DTCH DRB1 logical channel */ /*!\brief DTCH DRB1 logical channel */
#define DTCH 3 // LCID #define DTCH 3 // LCID
/*!\brief MCCH logical channel */ /*!\brief MCCH logical channel */
#define MCCH 4 #define MCCH 4
/*!\brief MTCH logical channel */ /*!\brief MTCH logical channel */
#define MTCH 1 #define MTCH 1
// DLSCH LCHAN ID // DLSCH LCHAN ID
/*!\brief LCID of UE contention resolution identity for DLSCH*/ /*!\brief LCID of UE contention resolution identity for DLSCH*/
#define UE_CONT_RES 28 #define UE_CONT_RES 28
/*!\brief LCID of timing advance for DLSCH */ /*!\brief LCID of timing advance for DLSCH */
#define TIMING_ADV_CMD 29 #define TIMING_ADV_CMD 29
/*!\brief LCID of discontinous reception mode for DLSCH */ /*!\brief LCID of discontinous reception mode for DLSCH */
#define DRX_CMD 30 #define DRX_CMD 30
/*!\brief LCID of padding LCID for DLSCH */ /*!\brief LCID of padding LCID for DLSCH */
#define SHORT_PADDING 31 #define SHORT_PADDING 31
typedef enum tone_type_e typedef enum tone_type_e
{ {
sixtone = 0, sixtone = 0,
threetone, threetone,
singletone1, singletone1,
singletone2, singletone2,
singletone3 singletone3
}tone_type_t; }tone_type_t;
typedef enum channel_NB_IoT_e typedef enum channel_NB_IoT_e
{ {
NPDCCH = 0, NPDCCH = 0,
NPUSCH, NPUSCH,
NPDSCH NPDSCH
}channel_NB_IoT_t; }channel_NB_IoT_t;
typedef enum{ typedef enum{
UL = 0, UL = 0,
DL DL
}message_direction_t; }message_direction_t;
#define MAX_NUMBER_OF_UE_MAX_NB_IoT 20 #define MAX_NUMBER_OF_UE_MAX_NB_IoT 20
#define SCH_PAYLOAD_SIZE_MAX_NB_IoT 320 #define SCH_PAYLOAD_SIZE_MAX_NB_IoT 320
#define MAX_NUMBER_OF_SIBs_NB_IoT 16 #define MAX_NUMBER_OF_SIBs_NB_IoT 16
/*!\brief Values of BCCH0 logical channel for MIB*/ /*!\brief Values of BCCH0 logical channel for MIB*/
#define BCCH0_NB_IoT 11 // MIB-NB_IoT #define BCCH0_NB_IoT 11 // MIB-NB_IoT
/*!\brief Values of BCCH1 logical channel for SIBs */ /*!\brief Values of BCCH1 logical channel for SIBs */
#define BCCH1_NB_IoT 12 // SI-SIB-NB_IoTs #define BCCH1_NB_IoT 12 // SI-SIB-NB_IoTs
/*!\brief Values of PCCH logical channel */ /*!\brief Values of PCCH logical channel */
#define PCCH_NB_IoT 13 // Paging XXX not used for the moment #define PCCH_NB_IoT 13 // Paging XXX not used for the moment
#define MCCH_NB_IoT 14 #define MCCH_NB_IoT 14
/*!\brief Value of CCCH / SRB0 logical channel */ /*!\brief Value of CCCH / SRB0 logical channel */
#define CCCH_NB_IoT 0 // srb0 ---> XXX exactly the same as in LTE (commented for compilation purposes) #define CCCH_NB_IoT 0 // srb0 ---> XXX exactly the same as in LTE (commented for compilation purposes)
/*!\brief DCCH0 / SRB1bis logical channel */ /*!\brief DCCH0 / SRB1bis logical channel */
#define DCCH0_NB_IoT 3 // srb1bis #define DCCH0_NB_IoT 3 // srb1bis
/*!\brief DCCH1 / SRB1 logical channel */ /*!\brief DCCH1 / SRB1 logical channel */
#define DCCH1_NB_IoT 1 // srb1 //XXX we redefine it for the SRB1 #define DCCH1_NB_IoT 1 // srb1 //XXX we redefine it for the SRB1
/*!\brief DTCH0 DRB0 logical channel */ /*!\brief DTCH0 DRB0 logical channel */
#define DTCH0_NB_IoT 4 // DRB0 #define DTCH0_NB_IoT 4 // DRB0
/*!\brief DTCH1 DRB1 logical channel */ /*!\brief DTCH1 DRB1 logical channel */
#define DTCH1_NB_IoT 5 // DRB1 #define DTCH1_NB_IoT 5 // DRB1
/*Index of UE contention resoulution logical channel*/ /*Index of UE contention resoulution logical channel*/
#define UE_CONTENTION_RESOLUTION 28 #define UE_CONTENTION_RESOLUTION 28
/*Index of TIMING_ADVANCE logical channel*/ /*Index of TIMING_ADVANCE logical channel*/
#define TIMING_ADVANCE 29 #define TIMING_ADVANCE 29
/*Index of DRX_COMMAND logical channel*/ /*Index of DRX_COMMAND logical channel*/
#define DRX_COMMAND 30 #define DRX_COMMAND 30
/*Index of PADDING logical channel*/ /*Index of PADDING logical channel*/
#define PADDING 31 #define PADDING 31
/// NPRACH-ParametersList-NB_IoT-r13 from 36.331 RRC spec defined in PHY /// NPRACH-ParametersList-NB_IoT-r13 from 36.331 RRC spec defined in PHY
/*typedef struct NPRACH_Parameters_NB_IoT{ /*typedef struct NPRACH_Parameters_NB_IoT{
/// the period time for nprach /// the period time for nprach
int nprach_Periodicity; int nprach_Periodicity;
/// for the start time for the NPRACH resource from 40ms-2560ms /// for the start time for the NPRACH resource from 40ms-2560ms
int nprach_StartTime; int nprach_StartTime;
/// for the subcarrier of set to the NPRACH preamble from n0 - n34 /// for the subcarrier of set to the NPRACH preamble from n0 - n34
int nprach_SubcarrierOffset; int nprach_SubcarrierOffset;
///number of subcarriers in a NPRACH resource allowed values (n12,n24,n36,n48) ///number of subcarriers in a NPRACH resource allowed values (n12,n24,n36,n48)
int nprach_NumSubcarriers; 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 /// 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; int nprach_SubcarrierMSG3_RangeStart;
/// The max preamble transmission attempt for the CE level from 1 - 128 /// The max preamble transmission attempt for the CE level from 1 - 128
int maxNumPreambleAttemptCE; int maxNumPreambleAttemptCE;
/// Number of NPRACH repetitions per attempt for each NPRACH resource /// Number of NPRACH repetitions per attempt for each NPRACH resource
int numRepetitionsPerPreambleAttempt; int numRepetitionsPerPreambleAttempt;
/// The number of the repetition for DCI use in RAR/MSG3/MSG4 from 1 - 2048 (Rmax) /// The number of the repetition for DCI use in RAR/MSG3/MSG4 from 1 - 2048 (Rmax)
int npdcch_NumRepetitions_RA; int npdcch_NumRepetitions_RA;
/// Starting subframe for NPDCCH Common searching space for (RAR/MSG3/MSG4) /// Starting subframe for NPDCCH Common searching space for (RAR/MSG3/MSG4)
int npdcch_StartSF_CSS_RA; int npdcch_StartSF_CSS_RA;
/// Fractional period offset of starting subframe for NPDCCH common search space /// Fractional period offset of starting subframe for NPDCCH common search space
int npdcch_Offset_RA; int npdcch_Offset_RA;
} nprach_parameters_NB_IoT_t;*/ } nprach_parameters_NB_IoT_t;*/
/*! \brief Downlink SCH PDU Structure */ /*! \brief Downlink SCH PDU Structure */
typedef struct { typedef struct {
uint8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT]; uint8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT];
uint32_t pdu_size; uint32_t pdu_size;
} __attribute__ ((__packed__)) DLSCH_PDU_NB_IoT; } __attribute__ ((__packed__)) DLSCH_PDU_NB_IoT;
/*! \brief eNB template for UE context information */ /*! \brief eNB template for UE context information */
typedef struct { typedef struct {
// C-RNTI of UE // C-RNTI of UE
rnti_t rnti; rnti_t rnti;
// UE CE level // UE CE level
int CE_level; int CE_level;
// Direction of transmission(DL:0\UL:1\NONE:-1) // Direction of transmission(DL:0\UL:1\NONE:-1)
int32_t direction; int32_t direction;
// DCI Reptition // DCI Reptition
uint32_t R_dci; uint32_t R_dci;
// MAX repetition // MAX repetition
uint32_t R_max; uint32_t R_max;
// HARQ round // HARQ round
uint32_t HARQ_round; uint32_t HARQ_round;
/*Downlink information*/ /*Downlink information*/
/// DLSCH pdu /// DLSCH pdu
DLSCH_PDU_NB_IoT DLSCH_pdu; DLSCH_PDU_NB_IoT DLSCH_pdu;
// PDU size // PDU size
uint32_t DLSCH_pdu_size; uint32_t DLSCH_pdu_size;
// Data Reptition // Data Reptition
uint32_t R_dl; uint32_t R_dl;
// MCS index // MCS index
uint32_t I_mcs_dl; uint32_t I_mcs_dl;
// total downlink buffer DCCH0_NB_IoT // total downlink buffer DCCH0_NB_IoT
uint32_t dl_buffer_DCCH0_NB_IoT; uint32_t dl_buffer_DCCH0_NB_IoT;
// NDI // NDI
int oldNDI_DL; int oldNDI_DL;
//HARQ ACK/NACK repetition //HARQ ACK/NACK repetition
uint32_t R_harq; uint32_t R_harq;
/*Uplink information*/ /*Uplink information*/
int oldNDI_UL; int oldNDI_UL;
// Uplink data repeat, now just follow the rach repeat number // Uplink data repeat, now just follow the rach repeat number
uint32_t R_ul; uint32_t R_ul;
// PHR value (0-3) // PHR value (0-3)
uint32_t PHR; uint32_t PHR;
// The uplink data size from BSR or DVI // The uplink data size from BSR or DVI
uint32_t ul_total_buffer; uint32_t ul_total_buffer;
// Determine if this UE support multi-tone transmission or not // Determine if this UE support multi-tone transmission or not
int multi_tone; int multi_tone;
// Next UE_template ID // Next UE_template ID
int next; int next;
// Previous UE_template ID // Previous UE_template ID
int prev; int prev;
// MSG4 complete // MSG4 complete
int RRC_connected; int RRC_connected;
// UE active flag // UE active flag
int active; int active;
} UE_TEMPLATE_NB_IoT; } UE_TEMPLATE_NB_IoT;
/*36331 NPDCCH-ConfigDedicated-NB_IoT*/ /*36331 NPDCCH-ConfigDedicated-NB_IoT*/
typedef struct{ typedef struct{
//npdcch-NumRepetitions-r13 //npdcch-NumRepetitions-r13
uint32_t R_max; uint32_t R_max;
//npdcch-StartSF-USS-r13 //npdcch-StartSF-USS-r13
double G; double G;
//npdcch-Offset-USS-r13 //npdcch-Offset-USS-r13
double a_offset; double a_offset;
//NPDCCH period //NPDCCH period
uint32_t T; uint32_t T;
//Starting subfrane of Search Space which is mod T //Starting subfrane of Search Space which is mod T
uint32_t ss_start_uss; uint32_t ss_start_uss;
}NPDCCH_config_dedicated_NB_IoT_t; }NPDCCH_config_dedicated_NB_IoT_t;
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/ /*! \brief UE list used by eNB to order UEs/CC for scheduling*/
typedef struct { typedef struct {
/// DCI template and MAC connection parameters for UEs /// DCI template and MAC connection parameters for UEs
UE_TEMPLATE_NB_IoT UE_template_NB_IoT[MAX_NUMBER_OF_UE_MAX_NB_IoT]; UE_TEMPLATE_NB_IoT UE_template_NB_IoT[MAX_NUMBER_OF_UE_MAX_NB_IoT];
/// NPDCCH Period and searching space info /// NPDCCH Period and searching space info
NPDCCH_config_dedicated_NB_IoT_t NPDCCH_config_dedicated; NPDCCH_config_dedicated_NB_IoT_t NPDCCH_config_dedicated;
//int next[MAX_NUMBER_OF_UE_MAX_NB_IoT]; //int next[MAX_NUMBER_OF_UE_MAX_NB_IoT];
// -1:No UE in list // -1:No UE in list
int head; int head;
// -1:No UE in list // -1:No UE in list
int tail; int tail;
int num_UEs; int num_UEs;
//boolean_t active[MAX_NUMBER_OF_UE_MAX_NB_IoT]; //boolean_t active[MAX_NUMBER_OF_UE_MAX_NB_IoT];
} UE_list_NB_IoT_t; } UE_list_NB_IoT_t;
typedef struct{ typedef struct{
// flag to indicate scheduing MIB-NB_IoT // flag to indicate scheduing MIB-NB_IoT
uint8_t flag_MIB; uint8_t flag_MIB;
// flag to indicate scheduling SIB1-NB_IoT // flag to indicate scheduling SIB1-NB_IoT
uint8_t flag_SIB1; uint8_t flag_SIB1;
// flag to indicate scheduling SIBs-NB_IoT // flag to indicate scheduling SIBs-NB_IoT
uint8_t flag_SIBs[MAX_NUMBER_OF_SIBs_NB_IoT]; uint8_t flag_SIBs[MAX_NUMBER_OF_SIBs_NB_IoT];
// flag to indicate scheduling type2 NPDCCH CSS with different CE level // flag to indicate scheduling type2 NPDCCH CSS with different CE level
uint8_t flag_type2_css[3]; uint8_t flag_type2_css[3];
// flag to indicate scheduling type1 NPDCCH CSS with different CE level // flag to indicate scheduling type1 NPDCCH CSS with different CE level
uint8_t flag_type1_css[3]; uint8_t flag_type1_css[3];
// flag to indicate scheduling NPDCCH USS with UE list // flag to indicate scheduling NPDCCH USS with UE list
uint8_t flag_uss[MAX_NUMBER_OF_UE_MAX_NB_IoT]; uint8_t flag_uss[MAX_NUMBER_OF_UE_MAX_NB_IoT];
// flag to indicate scheduling sib1/MIB // flag to indicate scheduling sib1/MIB
uint8_t flag_fix_scheduling; uint8_t flag_fix_scheduling;
// number of the type2 css to schedule in this period // number of the type2 css to schedule in this period
uint8_t num_type2_css_run; uint8_t num_type2_css_run;
// number of the type1 css to schedule in this period // number of the type1 css to schedule in this period
uint8_t num_type1_css_run; uint8_t num_type1_css_run;
// number of the uss to schedule in this period // number of the uss to schedule in this period
uint8_t num_uss_run; uint8_t num_uss_run;
}scheduling_flag_t; }scheduling_flag_t;
typedef struct available_resource_UL_s{ typedef struct available_resource_UL_s{
///Resource start subframe ///Resource start subframe
uint32_t start_subframe; uint32_t start_subframe;
///Resource end subframe ///Resource end subframe
uint32_t end_subframe; uint32_t end_subframe;
// pointer to next node // pointer to next node
struct available_resource_UL_s *next, *prev; struct available_resource_UL_s *next, *prev;
}available_resource_UL_t; }available_resource_UL_t;
typedef struct available_resource_DL_s{ typedef struct available_resource_DL_s{
uint32_t start_subframe; uint32_t start_subframe;
uint32_t end_subframe; uint32_t end_subframe;
struct available_resource_DL_s *next, *prev; struct available_resource_DL_s *next, *prev;
}available_resource_DL_t; }available_resource_DL_t;
/*Structure used for scheduling*/ /*Structure used for scheduling*/
typedef struct{ typedef struct{
//resource position info. //resource position info.
uint32_t sf_end,sf_start; uint32_t sf_end,sf_start;
//resource position info. separate by HyperSF, Frame, Subframe //resource position info. separate by HyperSF, Frame, Subframe
uint32_t start_h, end_h; uint32_t start_h, end_h;
uint32_t start_f, end_f; uint32_t start_f, end_f;
uint32_t start_sf, end_sf; uint32_t start_sf, end_sf;
//whcih available resource node is used //whcih available resource node is used
available_resource_DL_t *node; available_resource_DL_t *node;
}sched_temp_DL_NB_IoT_t; }sched_temp_DL_NB_IoT_t;
/*!\brief MAC subheader short with 7bit Length field */ /*!\brief MAC subheader short with 7bit Length field */
typedef struct { typedef struct {
uint8_t LCID:5; // octet 1 LSB uint8_t LCID:5; // octet 1 LSB
uint8_t E:1; uint8_t E:1;
uint8_t F2:1; uint8_t F2:1;
uint8_t R:1; // octet 1 MSB uint8_t R:1; // octet 1 MSB
uint8_t L:7; // octet 2 LSB uint8_t L:7; // octet 2 LSB
uint8_t F:1; // octet 2 MSB uint8_t F:1; // octet 2 MSB
} __attribute__((__packed__))SCH_SUBHEADER_SHORT_NB_IoT; } __attribute__((__packed__))SCH_SUBHEADER_SHORT_NB_IoT;
typedef struct { typedef struct {
uint8_t LCID:5; // octet 1 LSB uint8_t LCID:5; // octet 1 LSB
uint8_t E:1; uint8_t E:1;
uint8_t F2:1; uint8_t F2:1;
uint8_t R:1; // octet 1 MSB uint8_t R:1; // octet 1 MSB
uint8_t L_MSB:7; uint8_t L_MSB:7;
uint8_t F:1; // octet 2 MSB uint8_t F:1; // octet 2 MSB
uint8_t L_LSB:8; uint8_t L_LSB:8;
} __attribute__((__packed__))SCH_SUBHEADER_LONG_NB_IoT; } __attribute__((__packed__))SCH_SUBHEADER_LONG_NB_IoT;
typedef struct { typedef struct {
uint8_t LCID:5; // octet 1 LSB uint8_t LCID:5; // octet 1 LSB
uint8_t E:1; uint8_t E:1;
uint8_t F2:1; uint8_t F2:1;
uint8_t R:1; // octet 1 MSB uint8_t R:1; // octet 1 MSB
uint8_t L_MSB:8; // octet 2 MSB uint8_t L_MSB:8; // octet 2 MSB
uint8_t L_LSB:8; uint8_t L_LSB:8;
} __attribute__((__packed__))SCH_SUBHEADER_LONG_EXTEND_NB_IoT; } __attribute__((__packed__))SCH_SUBHEADER_LONG_EXTEND_NB_IoT;
/*!\brief MAC subheader short without length field */ /*!\brief MAC subheader short without length field */
typedef struct { typedef struct {
uint8_t LCID:5; uint8_t LCID:5;
uint8_t F2:1; uint8_t F2:1;
uint8_t E:1; uint8_t E:1;
uint8_t R:1; uint8_t R:1;
} __attribute__((__packed__))SCH_SUBHEADER_FIXED_NB_IoT; } __attribute__((__packed__))SCH_SUBHEADER_FIXED_NB_IoT;
/*! \brief Uplink SCH PDU Structure */ /*! \brief Uplink SCH PDU Structure */
typedef struct { typedef struct {
int8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT]; /*!< \brief SACH payload */ int8_t payload[SCH_PAYLOAD_SIZE_MAX_NB_IoT]; /*!< \brief SACH payload */
uint16_t Pdu_size; uint16_t Pdu_size;
} __attribute__ ((__packed__)) ULSCH_PDU_NB_IoT; } __attribute__ ((__packed__)) ULSCH_PDU_NB_IoT;
typedef struct { typedef struct {
uint8_t PH:6; uint8_t PH:6;
uint8_t R:2; uint8_t R:2;
} __attribute__((__packed__))POWER_HEADROOM_CMD_NB_IoT; } __attribute__((__packed__))POWER_HEADROOM_CMD_NB_IoT;
typedef struct { typedef struct {
uint8_t RAPID:6; uint8_t RAPID:6;
uint8_t T:1; uint8_t T:1;
uint8_t E:1; uint8_t E:1;
} __attribute__((__packed__))RA_HEADER_RAPID_NB_IoT; } __attribute__((__packed__))RA_HEADER_RAPID_NB_IoT;
/*Structure used for UL scheduling*/ /*Structure used for UL scheduling*/
typedef struct{ typedef struct{
//resource position info. //resource position info.
uint32_t sf_end, sf_start; uint32_t sf_end, sf_start;
//resource position info. separate by HyperSF, Frame, Subframe //resource position info. separate by HyperSF, Frame, Subframe
//uint32_t start_h, end_h; //uint32_t start_h, end_h;
//uint32_t start_f, end_f; //uint32_t start_f, end_f;
//uint32_t start_sf, end_sf; //uint32_t start_sf, end_sf;
// information for allocating the resource // information for allocating the resource
int tone; int tone;
int scheduling_delay; int scheduling_delay;
int subcarrier_indication; int subcarrier_indication;
int ACK_NACK_resource_field; int ACK_NACK_resource_field;
available_resource_UL_t *node; available_resource_UL_t *node;
}sched_temp_UL_NB_IoT_t; }sched_temp_UL_NB_IoT_t;
typedef struct Available_available_resource_DL{ typedef struct Available_available_resource_DL{
///Available Resoruce for sixtone ///Available Resoruce for sixtone
available_resource_UL_t *sixtone_Head;//, *sixtone_npusch_frame; available_resource_UL_t *sixtone_Head;//, *sixtone_npusch_frame;
uint32_t sixtone_end_subframe; uint32_t sixtone_end_subframe;
///Available Resoruce for threetone ///Available Resoruce for threetone
available_resource_UL_t *threetone_Head;//, *threetone_npusch_frame; available_resource_UL_t *threetone_Head;//, *threetone_npusch_frame;
uint32_t threetone_end_subframe; uint32_t threetone_end_subframe;
///Available Resoruce for singletone1 ///Available Resoruce for singletone1
available_resource_UL_t *singletone1_Head;//, *singletone1_npusch_frame; available_resource_UL_t *singletone1_Head;//, *singletone1_npusch_frame;
uint32_t singletone1_end_subframe; uint32_t singletone1_end_subframe;
///Available Resoruce for singletone2 ///Available Resoruce for singletone2
available_resource_UL_t *singletone2_Head;//, *singletone2_npusch_frame; available_resource_UL_t *singletone2_Head;//, *singletone2_npusch_frame;
uint32_t singletone2_end_subframe; uint32_t singletone2_end_subframe;
///Available Resoruce for singletone3 ///Available Resoruce for singletone3
available_resource_UL_t *singletone3_Head;//, *singletone3_npusch_frame; available_resource_UL_t *singletone3_Head;//, *singletone3_npusch_frame;
uint32_t singletone3_end_subframe; uint32_t singletone3_end_subframe;
}available_resource_tones_UL_t; }available_resource_tones_UL_t;
typedef struct schedule_result{ typedef struct schedule_result{
// The subframe read by output handler // The subframe read by output handler
uint32_t output_subframe; uint32_t output_subframe;
// SDU length // SDU length
uint32_t sdu_length; uint32_t sdu_length;
// MAC PDU // MAC PDU
uint8_t *DLSCH_pdu; uint8_t *DLSCH_pdu;
// The data direction indicated by this DCI // The data direction indicated by this DCI
uint8_t direction; uint8_t direction;
// pointer to DCI // pointer to DCI
void *DCI_pdu; void *DCI_pdu;
// when all the procedure related to this DCI, enable this flag // when all the procedure related to this DCI, enable this flag
boolean_t DCI_release; boolean_t DCI_release;
// Indicate the channel which to transmit // Indicate the channel which to transmit
channel_NB_IoT_t channel; channel_NB_IoT_t channel;
// rnti // rnti
rnti_t rnti; rnti_t rnti;
// 0 = TC-RNTI , 1 = RA-RNTI, 2 = P-RNTI, 3 = others // 0 = TC-RNTI , 1 = RA-RNTI, 2 = P-RNTI, 3 = others
uint8_t rnti_type; uint8_t rnti_type;
// 0 = data, 1 = ACK/NACK // 0 = data, 1 = ACK/NACK
uint8_t npusch_format; uint8_t npusch_format;
//HARQ ACK/NACK repetition //HARQ ACK/NACK repetition
uint32_t R_harq; uint32_t R_harq;
// pointer to next node // pointer to next node
struct schedule_result *next; struct schedule_result *next;
uint32_t end_subframe; uint32_t end_subframe;
uint8_t *rar_buffer; uint8_t *rar_buffer;
}schedule_result_t; }schedule_result_t;
/*Flag structure used for trigger each scheduler*/ /*Flag structure used for trigger each scheduler*/
typedef struct{ typedef struct{
scheduling_flag_t scheduling_flag; scheduling_flag_t scheduling_flag;
//sched_temp_DL_NB_IoT_t sched_result_DL; //sched_temp_DL_NB_IoT_t sched_result_DL;
//resource grid for Uplink //resource grid for Uplink
available_resource_tones_UL_t *UL_resource; available_resource_tones_UL_t *UL_resource;
//scheduling result read by output handler //scheduling result read by output handler
schedule_result_t *schedule_result_list_UL; schedule_result_t *schedule_result_list_UL;
schedule_result_t *schedule_result_list_DL; schedule_result_t *schedule_result_list_DL;
}SCHEDULE_NB_IoT_t; }SCHEDULE_NB_IoT_t;
typedef struct{ typedef struct{
uint32_t num_dlsf_per_period; uint32_t num_dlsf_per_period;
uint16_t *sf_to_dlsf_table; uint16_t *sf_to_dlsf_table;
uint16_t *dlsf_to_sf_table; uint16_t *dlsf_to_sf_table;
}DLSF_INFO_t; }DLSF_INFO_t;
typedef enum ce_level_e{ typedef enum ce_level_e{
ce0=0, ce0=0,
ce1, ce1,
ce2, ce2,
ce_level_total ce_level_total
}ce_level_t; }ce_level_t;
/*! \brief eNB template for the Random access information */ /*! \brief eNB template for the Random access information */
typedef struct RA_TEMPLATE_NB_IoT_s{ typedef struct RA_TEMPLATE_NB_IoT_s{
boolean_t active; boolean_t active;
uint32_t msg3_retransmit_count; uint32_t msg3_retransmit_count;
uint32_t msg4_retransmit_count; uint32_t msg4_retransmit_count;
uint16_t ta; uint16_t ta;
uint8_t preamble_index; uint8_t preamble_index;
ce_level_t ce_level; ce_level_t ce_level;
rnti_t ue_rnti; rnti_t ue_rnti;
rnti_t ra_rnti; rnti_t ra_rnti;
struct RA_TEMPLATE_NB_IoT_s *next, *prev; struct RA_TEMPLATE_NB_IoT_s *next, *prev;
boolean_t wait_msg4_ack; boolean_t wait_msg4_ack;
boolean_t wait_msg3_ack; boolean_t wait_msg3_ack;
uint8_t rar_buffer[7]; uint8_t rar_buffer[7];
} RA_TEMPLATE_NB_IoT; } RA_TEMPLATE_NB_IoT;
typedef struct RA_template_list_s{ typedef struct RA_template_list_s{
RA_TEMPLATE_NB_IoT *head; RA_TEMPLATE_NB_IoT *head;
RA_TEMPLATE_NB_IoT *tail; RA_TEMPLATE_NB_IoT *tail;
}RA_template_list_t; }RA_template_list_t;
/*! \brief top level eNB MAC structure */ /*! \brief top level eNB MAC structure */
typedef struct eNB_MAC_INST_NB_IoT_s { typedef struct eNB_MAC_INST_NB_IoT_s {
/// Ethernet parameters for northbound midhaul interface /// Ethernet parameters for northbound midhaul interface
eth_params_t eth_params_n; eth_params_t eth_params_n;
/// Ethernet parameters for fronthaul interface /// Ethernet parameters for fronthaul interface
eth_params_t eth_params_s; eth_params_t eth_params_s;
uint8_t Mod_id; uint8_t Mod_id;
// System // System
uint32_t hyper_system_frame; uint32_t hyper_system_frame;
uint32_t system_frame; uint32_t system_frame;
uint32_t sub_frame; uint32_t sub_frame;
uint32_t current_subframe; uint32_t current_subframe;
/// Pointer to IF module instance for PHY /// Pointer to IF module instance for PHY
IF_Module_t *if_inst; IF_Module_t *if_inst;
// RA // RA
RA_template_list_t RA_msg2_list; RA_template_list_t RA_msg2_list;
RA_template_list_t RA_msg3_list; RA_template_list_t RA_msg3_list;
RA_template_list_t RA_msg4_list; RA_template_list_t RA_msg4_list;
RA_TEMPLATE_NB_IoT RA_template[MAX_NUMBER_OF_UE_MAX_NB_IoT]; RA_TEMPLATE_NB_IoT RA_template[MAX_NUMBER_OF_UE_MAX_NB_IoT];
//int32_t last_tx_subframe; //int32_t last_tx_subframe;
// for tool // for tool
int32_t sib1_flag[64]; int32_t sib1_flag[64];
int32_t sib1_count[64]; int32_t sib1_count[64];
int32_t sib1_period; int32_t sib1_period;
uint16_t dlsf_table[64]; uint16_t dlsf_table[64];
int32_t sibs_table[256]; int32_t sibs_table[256];
// channel config // channel config
//USS list //USS list
//Number of USS period is used //Number of USS period is used
int num_uss_list; int num_uss_list;
UE_list_NB_IoT_t *UE_list_spec; UE_list_NB_IoT_t *UE_list_spec;
scheduling_flag_t scheduling_flag; scheduling_flag_t scheduling_flag;
uint32_t schedule_subframe_DL; uint32_t schedule_subframe_DL;
uint32_t schedule_subframe_UL; uint32_t schedule_subframe_UL;
rrc_config_NB_IoT_t rrc_config; rrc_config_NB_IoT_t rrc_config;
nfapi_config_request_t config; nfapi_config_request_t config;
IF_Module_NB_IoT_t *if_inst_NB_IoT; IF_Module_NB_IoT_t *if_inst_NB_IoT;
} eNB_MAC_INST_NB_IoT; } eNB_MAC_INST_NB_IoT;
// actually not here, but for now put it here // actually not here, but for now put it here
typedef struct { typedef struct {
uint32_t bytes_in_buffer; /*!< \brief Bytes buffered in RLC protocol instance. */ 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 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_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 */ 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 */
boolean_t head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */ boolean_t head_sdu_is_segmented; /*!< \brief 0 if head SDU has not been segmented, 1 if already segmented */
} mac_rlc_status_resp_NB_IoT_t; } mac_rlc_status_resp_NB_IoT_t;
// global variables // global variables
nprach_parameters_NB_IoT_t nprach_list[3]; nprach_parameters_NB_IoT_t nprach_list[3];
//DLSF Table //DLSF Table
DLSF_INFO_t DLSF_information; DLSF_INFO_t DLSF_information;
#endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */ #endif /*__LAYER2_MAC_DEFS_NB_IoT_H__ */
This source diff could not be displayed because it is too large. You can view the blob instead.
/* /*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under * The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file * the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. * except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.openairinterface.org/?page_id=698 * http://www.openairinterface.org/?page_id=698
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file asn1_msg.h /*! \file asn1_msg.h
* \brief primitives to build the asn1 messages * \brief primitives to build the asn1 messages
* \author Raymond Knopp, Navid Nikaein and Michele Paffetti * \author Raymond Knopp, Navid Nikaein and Michele Paffetti
* \date 2011, 2017 * \date 2011, 2017
* \version 1.0 * \version 1.0
* \company Eurecom * \company Eurecom
* \email: raymond.knopp@eurecom.fr ,navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it * \email: raymond.knopp@eurecom.fr ,navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it
*/ */
#ifdef USER_MODE #ifdef USER_MODE
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h> /* for atoi(3) */ #include <stdlib.h> /* for atoi(3) */
#include <unistd.h> /* for getopt(3) */ #include <unistd.h> /* for getopt(3) */
#include <string.h> /* for strerror(3) */ #include <string.h> /* for strerror(3) */
#include <sysexits.h> /* for EX_* exit codes */ #include <sysexits.h> /* for EX_* exit codes */
#include <errno.h> /* for errno */ #include <errno.h> /* for errno */
#else #else
#include <linux/module.h> /* Needed by all modules */ #include <linux/module.h> /* Needed by all modules */
#endif #endif
#include <asn_application.h> #include <asn_application.h>
#include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */ #include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */
#include "RRC/LITE/defs_NB_IoT.h" #include "RRC/LITE/defs_NB_IoT.h"
/* /*
* The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC)
* output into the chosen string buffer. * output into the chosen string buffer.
* RETURN VALUES: * RETURN VALUES:
* 0: The structure is printed. * 0: The structure is printed.
* -1: Problem printing the structure. * -1: Problem printing the structure.
* WARNING: No sensible error value is returned. * WARNING: No sensible error value is returned.
*/ */
/** /**
\brief Generate configuration for SIB1 (eNB). \brief Generate configuration for SIB1 (eNB).
@param carrier pointer to Carrier information @param carrier pointer to Carrier information
@param N_RB_DL Number of downlink PRBs @param N_RB_DL Number of downlink PRBs
@param frame radio frame number @param frame radio frame number
@return size of encoded bit stream in bytes*/ @return size of encoded bit stream in bytes*/
uint8_t do_MIB_NB_IoT( uint8_t do_MIB_NB_IoT(
rrc_eNB_carrier_data_NB_IoT_t *carrier, rrc_eNB_carrier_data_NB_IoT_t *carrier,
uint32_t N_RB_DL, uint32_t N_RB_DL,
uint32_t frame, uint32_t frame,
uint32_t hyper_frame); uint32_t hyper_frame);
/** /**
\brief Generate a default configuration for SIB1-NB (eNB). \brief Generate a default configuration for SIB1-NB (eNB).
@param Mod_id Instance of eNB @param Mod_id Instance of eNB
@param CC_id Component carrier to configure @param CC_id Component carrier to configure
@param carrier pointer to Carrier information @param carrier pointer to Carrier information
@param configuration Pointer Configuration Request structure @param configuration Pointer Configuration Request structure
@return size of encoded bit stream in bytes*/ @return size of encoded bit stream in bytes*/
uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, uint8_t do_SIB1_NB_IoT(uint8_t Mod_id,
int CC_id, int CC_id,
rrc_eNB_carrier_data_NB_IoT_t *carrier, rrc_eNB_carrier_data_NB_IoT_t *carrier,
NbIoTRrcConfigurationReq *configuration, NbIoTRrcConfigurationReq *configuration,
uint32_t frame uint32_t frame
); );
/** /**
\brief Generate a default configuration for SIB2/SIB3-NB in one System Information PDU (eNB). \brief Generate a default configuration for SIB2/SIB3-NB in one System Information PDU (eNB).
@param Mod_id Index of eNB (used to derive some parameters) @param Mod_id Index of eNB (used to derive some parameters)
@param buffer Pointer to PER-encoded ASN.1 description of SI-NB PDU @param buffer Pointer to PER-encoded ASN.1 description of SI-NB PDU
@param systemInformation_NB_IoT Pointer to asn1c C representation of SI-NB PDU @param systemInformation_NB_IoT Pointer to asn1c C representation of SI-NB PDU
@param sib2_NB Pointer (returned) to sib2_NB component withing SI-NB PDU @param sib2_NB Pointer (returned) to sib2_NB component withing SI-NB PDU
@param sib3_NB Pointer (returned) to sib3_NB component withing SI-NB PDU @param sib3_NB Pointer (returned) to sib3_NB component withing SI-NB PDU
@return size of encoded bit stream in bytes*/ @return size of encoded bit stream in bytes*/
uint8_t do_SIB23_NB_IoT(uint8_t Mod_id, uint8_t do_SIB23_NB_IoT(uint8_t Mod_id,
int CC_id, int CC_id,
rrc_eNB_carrier_data_NB_IoT_t *carrier, rrc_eNB_carrier_data_NB_IoT_t *carrier,
NbIoTRrcConfigurationReq *configuration NbIoTRrcConfigurationReq *configuration
); );
/**(UE-SIDE) /**(UE-SIDE)
\brief Generate an RRCConnectionRequest-NB UL-CCCH-Message (UE) based on random string or S-TMSI. This \brief Generate an RRCConnectionRequest-NB UL-CCCH-Message (UE) based on random string or S-TMSI. This
routine only generates an mo-data establishment cause. routine only generates an mo-data establishment cause.
@param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU
@param rv 5 byte random string or S-TMSI @param rv 5 byte random string or S-TMSI
@param Mod_id @param Mod_id
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t do_RRCConnectionRequest_NB_IoT(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv); uint8_t do_RRCConnectionRequest_NB_IoT(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv);
/**(UE -SIDE) /**(UE -SIDE)
\brief Generate an RRCConnectionSetupComplete-NB UL-DCCH-Message (UE) \brief Generate an RRCConnectionSetupComplete-NB UL-DCCH-Message (UE)
@param Mod_id @param Mod_id
@param Transaction_id @param Transaction_id
@param dedicatedInfoNASLength @param dedicatedInfoNASLength
@param dedicatedInfoNAS @param dedicatedInfoNAS
@param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t do_RRCConnectionSetupComplete_NB_IoT(uint8_t Mod_id, uint8_t* buffer, const uint8_t Transaction_id, const int dedicatedInfoNASLength, uint8_t do_RRCConnectionSetupComplete_NB_IoT(uint8_t Mod_id, uint8_t* buffer, const uint8_t Transaction_id, const int dedicatedInfoNASLength,
const char* dedicatedInfoNAS); const char* dedicatedInfoNAS);
/** (UE-SIDE) /** (UE-SIDE)
\brief Generate an RRCConnectionReconfigurationComplete-NB UL-DCCH-Message (UE) \brief Generate an RRCConnectionReconfigurationComplete-NB UL-DCCH-Message (UE)
@param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of UL-DCCH-Message PDU
@param ctxt_pP @param ctxt_pP
@param Transaction_id @param Transaction_id
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t do_RRCConnectionReconfigurationComplete_NB_IoT( uint8_t do_RRCConnectionReconfigurationComplete_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
uint8_t* buffer, uint8_t* buffer,
const uint8_t Transaction_id const uint8_t Transaction_id
); );
/** /**
\brief Generate an RRCConnectionSetup-NB DL-CCCH-Message (eNB). This routine configures SRB_ToAddMod (SRB1/SRB1bis-NB) and \brief Generate an RRCConnectionSetup-NB DL-CCCH-Message (eNB). This routine configures SRB_ToAddMod (SRB1/SRB1bis-NB) and
PhysicalConfigDedicated-NB IEs. PhysicalConfigDedicated-NB IEs.
@param ctxt_pP Running context @param ctxt_pP Running context
@param ue_context_pP UE context @param ue_context_pP UE context
@param CC_id Component Carrier ID @param CC_id Component Carrier ID
@param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU
@param transmission_mode Transmission mode for UE (1-9) @param transmission_mode Transmission mode for UE (1-9)
@param UE_id UE index for this message @param UE_id UE index for this message
@param Transaction_id Transaction_ID for this message @param Transaction_id Transaction_ID for this message
@param SRB_configList Pointer (returned) to SRB1_config/SRB1bis_config(later) IEs for this UE @param SRB_configList Pointer (returned) to SRB1_config/SRB1bis_config(later) IEs for this UE
@param physicalConfigDedicated_NB Pointer (returned) to PhysicalConfigDedicated-NB IE for this UE @param physicalConfigDedicated_NB Pointer (returned) to PhysicalConfigDedicated-NB IE for this UE
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t do_RRCConnectionSetup_NB_IoT( uint8_t do_RRCConnectionSetup_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP,
int CC_id, int CC_id,
uint8_t* const buffer, //carrier[CC_id].Srb0.Tx_buffer.Payload uint8_t* const buffer, //carrier[CC_id].Srb0.Tx_buffer.Payload
const uint8_t Transaction_id, const uint8_t Transaction_id,
const NB_IoT_DL_FRAME_PARMS* const frame_parms, //to be changed but not deleted const NB_IoT_DL_FRAME_PARMS* const frame_parms, //to be changed but not deleted
SRB_ToAddModList_NB_r13_t** SRB_configList_NB_IoT, //in order to be configured--> stanno puntando alla SRB_configlist dell ue_context SRB_ToAddModList_NB_r13_t** SRB_configList_NB_IoT, //in order to be configured--> stanno puntando alla SRB_configlist dell ue_context
struct PhysicalConfigDedicated_NB_r13** physicalConfigDedicated_NB_IoT //in order to be configured--> stanno puntando alla physicalConfigDedicated dell ue_context struct PhysicalConfigDedicated_NB_r13** physicalConfigDedicated_NB_IoT //in order to be configured--> stanno puntando alla physicalConfigDedicated dell ue_context
); );
/** /**
* For which SRB is used in NB-IoT?? * For which SRB is used in NB-IoT??
\brief Generate an RRCConnectionReconfiguration-NB DL-DCCH-Message (eNB). This routine configures SRBToAddMod-NB (SRB1) and one DRBToAddMod-NB \brief Generate an RRCConnectionReconfiguration-NB DL-DCCH-Message (eNB). This routine configures SRBToAddMod-NB (SRB1) and one DRBToAddMod-NB
(DRB3). PhysicalConfigDedicated-NB is not updated. (DRB3). PhysicalConfigDedicated-NB is not updated.
@param ctxt_pP Running context @param ctxt_pP Running context
@param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU
@param Transaction_id Transaction_ID for this message @param Transaction_id Transaction_ID for this message
@param SRB_list_NB Pointer to SRB List to be added/modified (NULL if no additions/modifications) @param SRB_list_NB Pointer to SRB List to be added/modified (NULL if no additions/modifications)
@param DRB_list_NB Pointer to DRB List to be added/modified (NULL if no additions/modifications) @param DRB_list_NB Pointer to DRB List to be added/modified (NULL if no additions/modifications)
@param DRB_list2_NB Pointer to DRB List to be released (NULL if none to be released) @param DRB_list2_NB Pointer to DRB List to be released (NULL if none to be released)
//sps not supported by NB-IoT //sps not supported by NB-IoT
@param physicalConfigDedicated_NB Pointer to PhysicalConfigDedicated-NB to be modified (NULL if no modifications) @param physicalConfigDedicated_NB Pointer to PhysicalConfigDedicated-NB to be modified (NULL if no modifications)
//measurement not supported by NB-IoT //measurement not supported by NB-IoT
@param mac_MainConfig Pointer to Mac_MainConfig(NULL if no modifications) @param mac_MainConfig Pointer to Mac_MainConfig(NULL if no modifications)
//no CBA functionalities //no CBA functionalities
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint16_t uint16_t
do_RRCConnectionReconfiguration_NB_IoT( do_RRCConnectionReconfiguration_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
uint8_t *buffer, uint8_t *buffer,
uint8_t Transaction_id, uint8_t Transaction_id,
SRB_ToAddModList_NB_r13_t *SRB_list_NB_IoT, SRB_ToAddModList_NB_r13_t *SRB_list_NB_IoT,
DRB_ToAddModList_NB_r13_t *DRB_list_NB_IoT, DRB_ToAddModList_NB_r13_t *DRB_list_NB_IoT,
DRB_ToReleaseList_NB_r13_t *DRB_list2_NB_IoT, DRB_ToReleaseList_NB_r13_t *DRB_list2_NB_IoT,
struct PhysicalConfigDedicated_NB_r13 *physicalConfigDedicated, struct PhysicalConfigDedicated_NB_r13 *physicalConfigDedicated,
MAC_MainConfig_t *mac_MainConfig, MAC_MainConfig_t *mac_MainConfig,
struct RRCConnectionReconfiguration_NB_r13_IEs__dedicatedInfoNASList_r13* dedicatedInfoNASList_NB_IoT); struct RRCConnectionReconfiguration_NB_r13_IEs__dedicatedInfoNASList_r13* dedicatedInfoNASList_NB_IoT);
/** /**
* E-UTRAN applies the procedure as follows: when only for NB-IoT SRB1 and SRB1bis is established * E-UTRAN applies the procedure as follows: when only for NB-IoT SRB1 and SRB1bis is established
\brief Generate a SecurityModeCommand \brief Generate a SecurityModeCommand
@param ctxt_pP Running context @param ctxt_pP Running context
@param buffer Pointer to PER-encoded ASN.1 description @param buffer Pointer to PER-encoded ASN.1 description
@param Transaction_id Transaction_ID for this message @param Transaction_id Transaction_ID for this message
@param cipheringAlgorithm @param cipheringAlgorithm
@param integrityProtAlgorithm @param integrityProtAlgorithm
*/ */
uint8_t do_SecurityModeCommand_NB_IoT( uint8_t do_SecurityModeCommand_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
uint8_t* const buffer, uint8_t* const buffer,
const uint8_t Transaction_id, const uint8_t Transaction_id,
const uint8_t cipheringAlgorithm, const uint8_t cipheringAlgorithm,
const uint8_t integrityProtAlgorithm); const uint8_t integrityProtAlgorithm);
/** /**
* E-UTRAN applies the procedure as follows: when only for NB-IoT SRB1 and SRB1bis is established * E-UTRAN applies the procedure as follows: when only for NB-IoT SRB1 and SRB1bis is established
\brief Generate a SecurityModeCommand \brief Generate a SecurityModeCommand
@param ctxt_pP Running context @param ctxt_pP Running context
@param buffer Pointer to PER-encoded ASN.1 description @param buffer Pointer to PER-encoded ASN.1 description
@param Transaction_id Transaction_ID for this message @param Transaction_id Transaction_ID for this message
*/ */
uint8_t do_UECapabilityEnquiry_NB_IoT( uint8_t do_UECapabilityEnquiry_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
uint8_t* const buffer, uint8_t* const buffer,
const uint8_t Transaction_id const uint8_t Transaction_id
); );
/** /**
* There is nothing new in this type of message for NB-IoT (only change in some nomenclature) * There is nothing new in this type of message for NB-IoT (only change in some nomenclature)
\brief Generate an RRCConnectionReestablishmentReject DL-CCCH-Message (eNB). \brief Generate an RRCConnectionReestablishmentReject DL-CCCH-Message (eNB).
@param Mod_id Module ID of eNB @param Mod_id Module ID of eNB
@param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t uint8_t
do_RRCConnectionReestablishmentReject_NB_IoT( do_RRCConnectionReestablishmentReject_NB_IoT(
uint8_t Mod_id, uint8_t Mod_id,
uint8_t* const buffer); uint8_t* const buffer);
/** /**
\brief Generate an RRCConnectionReject-NB DL-CCCH-Message (eNB). \brief Generate an RRCConnectionReject-NB DL-CCCH-Message (eNB).
@param Mod_id Module ID of eNB @param Mod_id Module ID of eNB
@param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t uint8_t
do_RRCConnectionReject_NB_IoT( do_RRCConnectionReject_NB_IoT(
uint8_t Mod_id, uint8_t Mod_id,
uint8_t* const buffer); uint8_t* const buffer);
/** /**
\brief Generate an RRCConnectionRelease-NB DL-DCCH-Message \brief Generate an RRCConnectionRelease-NB DL-DCCH-Message
@param Mod_id Module ID of eNB @param Mod_id Module ID of eNB
@param buffer Pointer to PER-encoded ASN.1 description @param buffer Pointer to PER-encoded ASN.1 description
@param transaction_id Transaction index @param transaction_id Transaction index
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
uint8_t do_RRCConnectionRelease_NB_IoT(uint8_t Mod_id, uint8_t *buffer,int Transaction_id); uint8_t do_RRCConnectionRelease_NB_IoT(uint8_t Mod_id, uint8_t *buffer,int Transaction_id);
uint8_t do_DLInformationTransfer_NB_IoT( uint8_t do_DLInformationTransfer_NB_IoT(
uint8_t Mod_id, uint8_t Mod_id,
uint8_t **buffer, uint8_t **buffer,
uint8_t transaction_id, uint8_t transaction_id,
uint32_t pdu_length, uint32_t pdu_length,
uint8_t *pdu_buffer); uint8_t *pdu_buffer);
//for now not implemented since UE side //for now not implemented since UE side
//uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *pdu_buffer); //uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *pdu_buffer);
//for now not implemented since UE side??? //for now not implemented since UE side???
//OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) //OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname)
/** /**
\brief Generate an RRCConnectionReestablishment-NB DL-CCCH Message \brief Generate an RRCConnectionReestablishment-NB DL-CCCH Message
*@param *@param
* *
*/ */
uint8_t do_RRCConnectionReestablishment_NB_IoT( uint8_t do_RRCConnectionReestablishment_NB_IoT(
uint8_t Mod_id, uint8_t Mod_id,
uint8_t* const buffer, uint8_t* const buffer,
const uint8_t Transaction_id, const uint8_t Transaction_id,
const NB_IoT_DL_FRAME_PARMS* const frame_parms, //to be changed const NB_IoT_DL_FRAME_PARMS* const frame_parms, //to be changed
SRB_ToAddModList_NB_r13_t** SRB_configList_NB_IoT SRB_ToAddModList_NB_r13_t** SRB_configList_NB_IoT
); );
/** /**
\brief Generate an RRCConnectionRelease-NB DL-DCCH-Message (eNB) \brief Generate an RRCConnectionRelease-NB DL-DCCH-Message (eNB)
@param Mod_id Module ID of eNB @param Mod_id Module ID of eNB
@param buffer Pointer to PER-encoded ASN.1 description of DL-DCCH-Message PDU @param buffer Pointer to PER-encoded ASN.1 description of DL-DCCH-Message PDU
@param transaction_id Transaction index @param transaction_id Transaction index
@returns Size of encoded bit stream in bytes*/ @returns Size of encoded bit stream in bytes*/
//uint8_t do_RRCConnectionRelease_NB_IoT(uint8_t Mod_id, uint8_t *buffer,int Transaction_id); //uint8_t do_RRCConnectionRelease_NB_IoT(uint8_t Mod_id, uint8_t *buffer,int Transaction_id);
/* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more /* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under * The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file * the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. * except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.openairinterface.org/?page_id=698 * http://www.openairinterface.org/?page_id=698
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file RRC/LITE/defs_NB_IoT.h /*! \file RRC/LITE/defs_NB_IoT.h
* \brief NB-IoT RRC struct definitions and function prototypes * \brief NB-IoT RRC struct definitions and function prototypes
* \author Navid Nikaein, Raymond Knopp and Michele Paffetti * \author Navid Nikaein, Raymond Knopp and Michele Paffetti
* \date 2010 - 2014, 2017 * \date 2010 - 2014, 2017
* \version 1.0 * \version 1.0
* \company Eurecom * \company Eurecom
* \email: navid.nikaein@eurecom.fr, raymond.knopp@eurecom.fr, michele.paffetti@studio.unibo.it * \email: navid.nikaein@eurecom.fr, raymond.knopp@eurecom.fr, michele.paffetti@studio.unibo.it
*/ */
#ifndef __OPENAIR_RRC_DEFS_NB_IOT_H__ #ifndef __OPENAIR_RRC_DEFS_NB_IOT_H__
#define __OPENAIR_RRC_DEFS_NB_IOT_H__ #define __OPENAIR_RRC_DEFS_NB_IOT_H__
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "collection/tree.h" #include "collection/tree.h"
#include "rrc_types_NB_IoT.h" #include "rrc_types_NB_IoT.h"
#include "COMMON/platform_constants.h" #include "COMMON/platform_constants.h"
#include "COMMON/platform_types.h" #include "COMMON/platform_types.h"
#include "targets/COMMON/openairinterface5g_limits.h" #include "targets/COMMON/openairinterface5g_limits.h"
#include "COMMON/mac_rrc_primitives.h" #include "COMMON/mac_rrc_primitives.h"
//-----NB-IoT #include files------- //-----NB-IoT #include files-------
//#include "SystemInformationBlockType1-NB.h" //#include "SystemInformationBlockType1-NB.h"
//#include "SystemInformation-NB.h" //#include "SystemInformation-NB.h"
#include "RRCConnectionReconfiguration-NB.h" #include "RRCConnectionReconfiguration-NB.h"
#include "RRCConnectionReconfigurationComplete-NB.h" #include "RRCConnectionReconfigurationComplete-NB.h"
#include "RRCConnectionSetup-NB.h" #include "RRCConnectionSetup-NB.h"
#include "RRCConnectionSetupComplete-NB.h" #include "RRCConnectionSetupComplete-NB.h"
#include "RRCConnectionRequest-NB.h" #include "RRCConnectionRequest-NB.h"
#include "RRCConnectionReestablishmentRequest-NB.h" #include "RRCConnectionReestablishmentRequest-NB.h"
#include "BCCH-DL-SCH-Message-NB.h" #include "BCCH-DL-SCH-Message-NB.h"
#include "BCCH-BCH-Message-NB.h" #include "BCCH-BCH-Message-NB.h"
#include "AS-Config-NB.h" #include "AS-Config-NB.h"
#include "AS-Context-NB.h" #include "AS-Context-NB.h"
#include "UE-Capability-NB-r13.h" //equivalent of UE-EUTRA-Capability.h #include "UE-Capability-NB-r13.h" //equivalent of UE-EUTRA-Capability.h
//------------------- //-------------------
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
# include "intertask_interface.h" # include "intertask_interface.h"
#endif #endif
/* TODO: be sure this include is correct. /* TODO: be sure this include is correct.
* It solves a problem of compilation of the RRH GW, * It solves a problem of compilation of the RRH GW,
* issue #186. * issue #186.
*/ */
#if !defined(ENABLE_ITTI) #if !defined(ENABLE_ITTI)
# include "as_message.h" # include "as_message.h"
#endif #endif
#if defined(ENABLE_USE_MME) #if defined(ENABLE_USE_MME)
# include "commonDef.h" # include "commonDef.h"
#endif #endif
#if ENABLE_RAL #if ENABLE_RAL
# include "collection/hashtable/obj_hashtable.h" # include "collection/hashtable/obj_hashtable.h"
#endif #endif
/*I will change the name of the structure for compile purposes--> hope not to undo this process*/ /*I will change the name of the structure for compile purposes--> hope not to undo this process*/
typedef unsigned int uid_NB_IoT_t; typedef unsigned int uid_NB_IoT_t;
#define UID_LINEAR_ALLOCATOR_BITMAP_SIZE_NB_IoT (((NUMBER_OF_UE_MAX_NB_IoT/8)/sizeof(unsigned int)) + 1) #define UID_LINEAR_ALLOCATOR_BITMAP_SIZE_NB_IoT (((NUMBER_OF_UE_MAX_NB_IoT/8)/sizeof(unsigned int)) + 1)
typedef struct uid_linear_allocator_NB_IoT_s { typedef struct uid_linear_allocator_NB_IoT_s {
unsigned int bitmap[UID_LINEAR_ALLOCATOR_BITMAP_SIZE_NB_IoT]; unsigned int bitmap[UID_LINEAR_ALLOCATOR_BITMAP_SIZE_NB_IoT];
} uid_allocator_NB_IoT_t; } uid_allocator_NB_IoT_t;
#define PROTOCOL_RRC_CTXT_UE_FMT PROTOCOL_CTXT_FMT #define PROTOCOL_RRC_CTXT_UE_FMT PROTOCOL_CTXT_FMT
#define PROTOCOL_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp) #define PROTOCOL_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
#define PROTOCOL_RRC_CTXT_FMT PROTOCOL_CTXT_FMT #define PROTOCOL_RRC_CTXT_FMT PROTOCOL_CTXT_FMT
#define PROTOCOL_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp) #define PROTOCOL_RRC_CTXT_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
//left as they are --> used in LAYER2/epenair2_proc.c and UE side //left as they are --> used in LAYER2/epenair2_proc.c and UE side
typedef enum UE_STATE_NB_IoT_e { typedef enum UE_STATE_NB_IoT_e {
RRC_INACTIVE_NB_IoT=0, RRC_INACTIVE_NB_IoT=0,
RRC_IDLE_NB_IoT, RRC_IDLE_NB_IoT,
RRC_SI_RECEIVED_NB_IoT, RRC_SI_RECEIVED_NB_IoT,
RRC_CONNECTED_NB_IoT, RRC_CONNECTED_NB_IoT,
RRC_RECONFIGURED_NB_IoT, RRC_RECONFIGURED_NB_IoT,
RRC_HO_EXECUTION_NB_IoT //maybe not needed? RRC_HO_EXECUTION_NB_IoT //maybe not needed?
} UE_STATE_NB_IoT_t; } UE_STATE_NB_IoT_t;
/** @defgroup _rrc RRC /** @defgroup _rrc RRC
* @ingroup _oai2 * @ingroup _oai2
* @{ * @{
*/ */
typedef struct UE_RRC_INFO_NB_IoT_s { typedef struct UE_RRC_INFO_NB_IoT_s {
UE_STATE_NB_IoT_t State; UE_STATE_NB_IoT_t State;
uint8_t SIB1systemInfoValueTag; uint8_t SIB1systemInfoValueTag;
uint32_t SIStatus; uint32_t SIStatus;
uint32_t SIcnt; uint32_t SIcnt;
#if defined(Rel10) || defined(Rel14) #if defined(Rel10) || defined(Rel14)
uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA
#endif #endif
uint8_t SIwindowsize; //!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40 uint8_t SIwindowsize; //!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40
uint8_t handoverTarget; uint8_t handoverTarget;
//HO_STATE_t ho_state; //HO_STATE_t ho_state;
uint16_t SIperiod; //!< Corresponds to the SIB1 si-Periodicity parameter (multiplied by 10). Possible values are (final): 80,160,320,640,1280,2560,5120 uint16_t SIperiod; //!< Corresponds to the SIB1 si-Periodicity parameter (multiplied by 10). Possible values are (final): 80,160,320,640,1280,2560,5120
unsigned short UE_index; unsigned short UE_index;
uint32_t T300_active; uint32_t T300_active;
uint32_t T300_cnt; uint32_t T300_cnt;
uint32_t T304_active; uint32_t T304_active;
uint32_t T304_cnt; uint32_t T304_cnt;
uint32_t T310_active; uint32_t T310_active;
uint32_t T310_cnt; uint32_t T310_cnt;
uint32_t N310_cnt; uint32_t N310_cnt;
uint32_t N311_cnt; uint32_t N311_cnt;
rnti_t rnti; rnti_t rnti;
} __attribute__ ((__packed__)) UE_RRC_INFO_NB_IoT; } __attribute__ ((__packed__)) UE_RRC_INFO_NB_IoT;
//#define NUM_PRECONFIGURED_LCHAN (NB_CH_CX*2) //BCCH, CCCH //#define NUM_PRECONFIGURED_LCHAN (NB_CH_CX*2) //BCCH, CCCH
#define UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! #define UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!!
#define UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1 #define UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1
// HO_STATE is not supported by NB-IoT // HO_STATE is not supported by NB-IoT
//#define NUMBER_OF_UE_MAX MAX_MOBILES_PER_RG //#define NUMBER_OF_UE_MAX MAX_MOBILES_PER_RG
#define RRM_FREE(p) if ( (p) != NULL) { free(p) ; p=NULL ; } #define RRM_FREE(p) if ( (p) != NULL) { free(p) ; p=NULL ; }
#define RRM_MALLOC(t,n) (t *) malloc16( sizeof(t) * n ) #define RRM_MALLOC(t,n) (t *) malloc16( sizeof(t) * n )
#define RRM_CALLOC(t,n) (t *) malloc16( sizeof(t) * n) #define RRM_CALLOC(t,n) (t *) malloc16( sizeof(t) * n)
#define RRM_CALLOC2(t,s) (t *) malloc16( s ) #define RRM_CALLOC2(t,s) (t *) malloc16( s )
//Measurement Report not supported in NB-IoT //Measurement Report not supported in NB-IoT
#define PAYLOAD_SIZE_MAX 1024 #define PAYLOAD_SIZE_MAX 1024
#define RRC_BUF_SIZE 255 #define RRC_BUF_SIZE 255
#define UNDEF_SECURITY_MODE 0xff #define UNDEF_SECURITY_MODE 0xff
#define NO_SECURITY_MODE 0x20 #define NO_SECURITY_MODE 0x20
/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ /* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */
#define RRC_TRANSACTION_IDENTIFIER_NUMBER 3 #define RRC_TRANSACTION_IDENTIFIER_NUMBER 3
typedef struct UE_S_TMSI_NB_IoT_s { typedef struct UE_S_TMSI_NB_IoT_s {
boolean_t presence; boolean_t presence;
mme_code_t mme_code; mme_code_t mme_code;
m_tmsi_t m_tmsi; m_tmsi_t m_tmsi;
} __attribute__ ((__packed__)) UE_S_TMSI_NB_IoT; } __attribute__ ((__packed__)) UE_S_TMSI_NB_IoT;
typedef enum e_rab_satus_NB_IoT_e { typedef enum e_rab_satus_NB_IoT_e {
E_RAB_STATUS_NEW_NB_IoT, E_RAB_STATUS_NEW_NB_IoT,
E_RAB_STATUS_DONE_NB_IoT, // from the eNB perspective E_RAB_STATUS_DONE_NB_IoT, // from the eNB perspective
E_RAB_STATUS_ESTABLISHED_NB_IoT, // get the reconfigurationcomplete form UE E_RAB_STATUS_ESTABLISHED_NB_IoT, // get the reconfigurationcomplete form UE
E_RAB_STATUS_FAILED_NB_IoT, E_RAB_STATUS_FAILED_NB_IoT,
} e_rab_status_NB_IoT_t; } e_rab_status_NB_IoT_t;
typedef struct e_rab_param_NB_IoT_s { typedef struct e_rab_param_NB_IoT_s {
e_rab_t param; e_rab_t param;
uint8_t status; uint8_t status;
uint8_t xid; // transaction_id uint8_t xid; // transaction_id
} __attribute__ ((__packed__)) e_rab_param_NB_IoT_t; } __attribute__ ((__packed__)) e_rab_param_NB_IoT_t;
//HANDOVER_INFO not implemented in NB-IoT delete //HANDOVER_INFO not implemented in NB-IoT delete
#define RRC_HEADER_SIZE_MAX 64 #define RRC_HEADER_SIZE_MAX 64
#define RRC_BUFFER_SIZE_MAX 1024 #define RRC_BUFFER_SIZE_MAX 1024
typedef struct { typedef struct {
char Payload[RRC_BUFFER_SIZE_MAX]; char Payload[RRC_BUFFER_SIZE_MAX];
char Header[RRC_HEADER_SIZE_MAX]; char Header[RRC_HEADER_SIZE_MAX];
char payload_size; char payload_size;
} RRC_BUFFER_NB_IoT; } RRC_BUFFER_NB_IoT;
#define RRC_BUFFER_SIZE_NB_IoT sizeof(RRC_BUFFER_NB_IoT) #define RRC_BUFFER_SIZE_NB_IoT sizeof(RRC_BUFFER_NB_IoT)
typedef struct RB_INFO_NB_IoT_s { typedef struct RB_INFO_NB_IoT_s {
uint16_t Rb_id; //=Lchan_id uint16_t Rb_id; //=Lchan_id
//LCHAN_DESC Lchan_desc[2]; no more used //LCHAN_DESC Lchan_desc[2]; no more used
//MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT //MAC_MEAS_REQ_ENTRY *Meas_entry; //may not needed for NB-IoT
} RB_INFO_NB_IoT; } RB_INFO_NB_IoT;
typedef struct SRB_INFO_NB_IoT_s { typedef struct SRB_INFO_NB_IoT_s {
uint16_t Srb_id; //=Lchan_id---> useful for distinguish between SRB1 and SRB1bis? uint16_t Srb_id; //=Lchan_id---> useful for distinguish between SRB1 and SRB1bis?
RRC_BUFFER_NB_IoT Rx_buffer; RRC_BUFFER_NB_IoT Rx_buffer;
RRC_BUFFER_NB_IoT Tx_buffer; RRC_BUFFER_NB_IoT Tx_buffer;
//LCHAN_DESC Lchan_desc[2]; no more used //LCHAN_DESC Lchan_desc[2]; no more used
unsigned int Trans_id; unsigned int Trans_id;
uint8_t Active; uint8_t Active;
} SRB_INFO_NB_IoT; } SRB_INFO_NB_IoT;
typedef struct RB_INFO_TABLE_ENTRY_NB_IoT_s { typedef struct RB_INFO_TABLE_ENTRY_NB_IoT_s {
RB_INFO_NB_IoT Rb_info; RB_INFO_NB_IoT Rb_info;
uint8_t Active; uint8_t Active;
uint32_t Next_check_frame; uint32_t Next_check_frame;
uint8_t Status; uint8_t Status;
} RB_INFO_TABLE_ENTRY_NB_IoT; } RB_INFO_TABLE_ENTRY_NB_IoT;
typedef struct SRB_INFO_TABLE_ENTRY_NB_IoT_s { typedef struct SRB_INFO_TABLE_ENTRY_NB_IoT_s {
SRB_INFO_NB_IoT Srb_info; SRB_INFO_NB_IoT Srb_info;
uint8_t Active; uint8_t Active;
uint8_t Status; uint8_t Status;
uint32_t Next_check_frame; uint32_t Next_check_frame;
} SRB_INFO_TABLE_ENTRY_NB_IoT; } SRB_INFO_TABLE_ENTRY_NB_IoT;
//MEAS_REPORT_LIST_s not implemented in NB-IoT but is used at UE side //MEAS_REPORT_LIST_s not implemented in NB-IoT but is used at UE side
//HANDOVER_INFO_UE not implemented in NB-IoT //HANDOVER_INFO_UE not implemented in NB-IoT
typedef struct HANDOVER_INFO_UE_NB_IoT_s { typedef struct HANDOVER_INFO_UE_NB_IoT_s {
PhysCellId_t targetCellId; PhysCellId_t targetCellId;
uint8_t measFlag; uint8_t measFlag;
} HANDOVER_INFO_UE_NB_IoT; } HANDOVER_INFO_UE_NB_IoT;
//NB-IoT eNB_RRC_UE_NB_IoT_s--(used as a context in eNB --> ue_context in rrc_eNB_ue_context)------ //NB-IoT eNB_RRC_UE_NB_IoT_s--(used as a context in eNB --> ue_context in rrc_eNB_ue_context)------
typedef struct eNB_RRC_UE_NB_IoT_s { typedef struct eNB_RRC_UE_NB_IoT_s {
EstablishmentCause_t establishment_cause; EstablishmentCause_t establishment_cause;
uint8_t primaryCC_id; uint8_t primaryCC_id;
//in NB-IoT only SRB0, SRB1 and SRB1bis (until AS security activation) exist //in NB-IoT only SRB0, SRB1 and SRB1bis (until AS security activation) exist
/*MP: Concept behind List and List2 /*MP: Concept behind List and List2
* *
* SRB_configList --> is used for the actual list of SRBs that is managed/that should be send over the RRC message * SRB_configList --> is used for the actual list of SRBs that is managed/that should be send over the RRC message
* SRB_configList2--> refers to all the SRBs configured for that specific transaction identifier * SRB_configList2--> refers to all the SRBs configured for that specific transaction identifier
* this because in a single transaction one or more SRBs could be established * this because in a single transaction one or more SRBs could be established
* and you want to keep memory on what happen for every transaction * and you want to keep memory on what happen for every transaction
* Transaction ID (xid): is used to associate the proper RRC....Complete message received by the UE to the corresponding * Transaction ID (xid): is used to associate the proper RRC....Complete message received by the UE to the corresponding
* message previously sent by the eNB (e.g. RRCConnectionSetup -- RRCConnectionSetupComplete) * message previously sent by the eNB (e.g. RRCConnectionSetup -- RRCConnectionSetupComplete)
* this because it could happen that more messages are transmitted at the same time * this because it could happen that more messages are transmitted at the same time
*/ */
SRB_ToAddModList_NB_r13_t* SRB_configList;//for SRB1 and SRB1bis SRB_ToAddModList_NB_r13_t* SRB_configList;//for SRB1 and SRB1bis
SRB_ToAddModList_NB_r13_t* SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; SRB_ToAddModList_NB_r13_t* SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
DRB_ToAddModList_NB_r13_t* DRB_configList; //for all the DRBs DRB_ToAddModList_NB_r13_t* DRB_configList; //for all the DRBs
DRB_ToAddModList_NB_r13_t* DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; //for the configured DRBs of a xid DRB_ToAddModList_NB_r13_t* DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; //for the configured DRBs of a xid
uint8_t DRB_active[2];//in LTE was 8 --> at most 2 for NB-IoT uint8_t DRB_active[2];//in LTE was 8 --> at most 2 for NB-IoT
struct PhysicalConfigDedicated_NB_r13* physicalConfigDedicated_NB_IoT; struct PhysicalConfigDedicated_NB_r13* physicalConfigDedicated_NB_IoT;
MAC_MainConfig_NB_r13_t* mac_MainConfig_NB_IoT; MAC_MainConfig_NB_r13_t* mac_MainConfig_NB_IoT;
//No SPS(semi-persistent scheduling) in NB-IoT //No SPS(semi-persistent scheduling) in NB-IoT
//No Measurement report in NB-IoT //No Measurement report in NB-IoT
SRB_INFO_NB_IoT SI; SRB_INFO_NB_IoT SI;
SRB_INFO_NB_IoT Srb0; SRB_INFO_NB_IoT Srb0;
SRB_INFO_TABLE_ENTRY_NB_IoT Srb1; SRB_INFO_TABLE_ENTRY_NB_IoT Srb1;
SRB_INFO_TABLE_ENTRY_NB_IoT Srb1bis; SRB_INFO_TABLE_ENTRY_NB_IoT Srb1bis;
#if defined(ENABLE_SECURITY) #if defined(ENABLE_SECURITY)
/* KeNB as derived from KASME received from EPC */ /* KeNB as derived from KASME received from EPC */
uint8_t kenb[32]; uint8_t kenb[32];
#endif #endif
/* Used integrity/ciphering algorithms--> maintained the same for NB-IoT */ /* Used integrity/ciphering algorithms--> maintained the same for NB-IoT */
e_CipheringAlgorithm_r12 ciphering_algorithm; //Specs. TS 36.331 V14.1.0 pag 432 Change position of chipering enumerative w.r.t previous version e_CipheringAlgorithm_r12 ciphering_algorithm; //Specs. TS 36.331 V14.1.0 pag 432 Change position of chipering enumerative w.r.t previous version
e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm; e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;
uint8_t Status; uint8_t Status;
rnti_t rnti; rnti_t rnti;
uint64_t random_ue_identity; uint64_t random_ue_identity;
/* Information from UE RRC ConnectionRequest-NB-r13_IE--> NB-IoT */ /* Information from UE RRC ConnectionRequest-NB-r13_IE--> NB-IoT */
UE_S_TMSI_NB_IoT Initialue_identity_s_TMSI; UE_S_TMSI_NB_IoT Initialue_identity_s_TMSI;
EstablishmentCause_NB_r13_t establishment_cause_NB_IoT; //different set for NB-IoT EstablishmentCause_NB_r13_t establishment_cause_NB_IoT; //different set for NB-IoT
/* Information from UE RRC ConnectionReestablishmentRequest-NB--> NB-IoT */ /* Information from UE RRC ConnectionReestablishmentRequest-NB--> NB-IoT */
ReestablishmentCause_NB_r13_t reestablishment_cause_NB_IoT; //different set for NB_IoT ReestablishmentCause_NB_r13_t reestablishment_cause_NB_IoT; //different set for NB_IoT
/* UE id for initial connection to S1AP */ /* UE id for initial connection to S1AP */
uint16_t ue_initial_id; uint16_t ue_initial_id;
/* Information from S1AP initial_context_setup_req */ /* Information from S1AP initial_context_setup_req */
uint32_t eNB_ue_s1ap_id :24; uint32_t eNB_ue_s1ap_id :24;
security_capabilities_t security_capabilities; security_capabilities_t security_capabilities;
/* Total number of e_rab already setup in the list */ //NAS list? /* Total number of e_rab already setup in the list */ //NAS list?
uint8_t setup_e_rabs; uint8_t setup_e_rabs;
/* Number of e_rab to be setup in the list */ //NAS list? /* Number of e_rab to be setup in the list */ //NAS list?
uint8_t nb_of_e_rabs; uint8_t nb_of_e_rabs;
/* list of e_rab to be setup by RRC layers */ /* list of e_rab to be setup by RRC layers */
e_rab_param_NB_IoT_t e_rab[NB_RB_MAX_NB_IOT];//[S1AP_MAX_E_RAB]; e_rab_param_NB_IoT_t e_rab[NB_RB_MAX_NB_IOT];//[S1AP_MAX_E_RAB];
// LG: For GTPV1 TUNNELS // LG: For GTPV1 TUNNELS
uint32_t enb_gtp_teid[S1AP_MAX_E_RAB]; uint32_t enb_gtp_teid[S1AP_MAX_E_RAB];
transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB]; transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB];
rb_id_t enb_gtp_ebi[S1AP_MAX_E_RAB]; rb_id_t enb_gtp_ebi[S1AP_MAX_E_RAB];
//Which timers are referring to? //Which timers are referring to?
uint32_t ul_failure_timer; uint32_t ul_failure_timer;
uint32_t ue_release_timer; uint32_t ue_release_timer;
//threshold of the release timer--> set in RRCConnectionRelease //threshold of the release timer--> set in RRCConnectionRelease
uint32_t ue_release_timer_thres; uint32_t ue_release_timer_thres;
} eNB_RRC_UE_NB_IoT_t; } eNB_RRC_UE_NB_IoT_t;
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
typedef uid_NB_IoT_t ue_uid_t; typedef uid_NB_IoT_t ue_uid_t;
//generally variable called: ue_context_pP //generally variable called: ue_context_pP
typedef struct rrc_eNB_ue_context_NB_IoT_s { typedef struct rrc_eNB_ue_context_NB_IoT_s {
/* Tree related data */ /* Tree related data */
RB_ENTRY(rrc_eNB_ue_context_NB_IoT_s) entries; RB_ENTRY(rrc_eNB_ue_context_NB_IoT_s) entries;
/* Uniquely identifies the UE between MME and eNB within the eNB. /* Uniquely identifies the UE between MME and eNB within the eNB.
* This id is encoded on 24bits. * This id is encoded on 24bits.
*/ */
rnti_t ue_id_rnti; rnti_t ue_id_rnti;
// another key for protocol layers but should not be used as a key for RB tree // another key for protocol layers but should not be used as a key for RB tree
ue_uid_t local_uid; ue_uid_t local_uid;
/* UE id for initial connection to S1AP */ /* UE id for initial connection to S1AP */
struct eNB_RRC_UE_NB_IoT_s ue_context; //context of ue in the e-nB struct eNB_RRC_UE_NB_IoT_s ue_context; //context of ue in the e-nB
} rrc_eNB_ue_context_NB_IoT_t; } rrc_eNB_ue_context_NB_IoT_t;
//---NB-IoT (completely changed)------------------------------- //---NB-IoT (completely changed)-------------------------------
//called "carrier"--> data from PHY layer //called "carrier"--> data from PHY layer
typedef struct { typedef struct {
// buffer that contains the encoded messages // buffer that contains the encoded messages
uint8_t *MIB_NB_IoT; uint8_t *MIB_NB_IoT;
uint8_t sizeof_MIB_NB_IoT; uint8_t sizeof_MIB_NB_IoT;
uint8_t *SIB1_NB_IoT; uint8_t *SIB1_NB_IoT;
uint8_t sizeof_SIB1_NB_IoT; uint8_t sizeof_SIB1_NB_IoT;
uint8_t *SIB23_NB_IoT; uint8_t *SIB23_NB_IoT;
uint8_t sizeof_SIB23_NB_IoT; uint8_t sizeof_SIB23_NB_IoT;
//not actually implemented in OAI //not actually implemented in OAI
uint8_t *SIB4_NB_IoT; uint8_t *SIB4_NB_IoT;
uint8_t sizeof_SIB4_NB_IoT; uint8_t sizeof_SIB4_NB_IoT;
uint8_t *SIB5_NB_IoT; uint8_t *SIB5_NB_IoT;
uint8_t sizeof_SIB5_NB_IoT; uint8_t sizeof_SIB5_NB_IoT;
uint8_t *SIB14_NB_IoT; uint8_t *SIB14_NB_IoT;
uint8_t sizeof_SIB14_NB_IoT; uint8_t sizeof_SIB14_NB_IoT;
uint8_t *SIB16_NB_IoT; uint8_t *SIB16_NB_IoT;
uint8_t sizeof_SIB16_NB_IoT; uint8_t sizeof_SIB16_NB_IoT;
//TS 36.331 V14.2.1 //TS 36.331 V14.2.1
// uint8_t *SIB15_NB; // uint8_t *SIB15_NB;
// uint8_t sizeof_SIB15_NB; // uint8_t sizeof_SIB15_NB;
// uint8_t *SIB20_NB; // uint8_t *SIB20_NB;
// uint8_t sizeof_SIB20_NB; // uint8_t sizeof_SIB20_NB;
// uint8_t *SIB22_NB; // uint8_t *SIB22_NB;
// uint8_t sizeof_SIB22_NB; // uint8_t sizeof_SIB22_NB;
//implicit parameters needed //implicit parameters needed
int Ncp; //cyclic prefix for DL int Ncp; //cyclic prefix for DL
int Ncp_UL; //cyclic prefix for UL int Ncp_UL; //cyclic prefix for UL
int p_eNB; //number of tx antenna port int p_eNB; //number of tx antenna port
int p_rx_eNB; //number of receiving antenna ports int p_rx_eNB; //number of receiving antenna ports
uint32_t dl_CarrierFreq; //detected by the UE uint32_t dl_CarrierFreq; //detected by the UE
uint32_t ul_CarrierFreq; //detected by the UE uint32_t ul_CarrierFreq; //detected by the UE
uint16_t physCellId; //not stored in the MIB-NB but is getting through NPSS/NSSS uint16_t physCellId; //not stored in the MIB-NB but is getting through NPSS/NSSS
//are the only static one (memory has been already allocated) //are the only static one (memory has been already allocated)
BCCH_BCH_Message_NB_t mib_NB_IoT; BCCH_BCH_Message_NB_t mib_NB_IoT;
BCCH_DL_SCH_Message_NB_t siblock1_NB_IoT; //SIB1-NB BCCH_DL_SCH_Message_NB_t siblock1_NB_IoT; //SIB1-NB
BCCH_DL_SCH_Message_NB_t systemInformation_NB_IoT; //SI BCCH_DL_SCH_Message_NB_t systemInformation_NB_IoT; //SI
SystemInformationBlockType1_NB_t *sib1_NB_IoT; SystemInformationBlockType1_NB_t *sib1_NB_IoT;
SystemInformationBlockType2_NB_r13_t *sib2_NB_IoT; SystemInformationBlockType2_NB_r13_t *sib2_NB_IoT;
SystemInformationBlockType3_NB_r13_t *sib3_NB_IoT; SystemInformationBlockType3_NB_r13_t *sib3_NB_IoT;
//not implemented yet //not implemented yet
SystemInformationBlockType4_NB_r13_t *sib4_NB_IoT; SystemInformationBlockType4_NB_r13_t *sib4_NB_IoT;
SystemInformationBlockType5_NB_r13_t *sib5_NB_IoT; SystemInformationBlockType5_NB_r13_t *sib5_NB_IoT;
SystemInformationBlockType14_NB_r13_t *sib14_NB_IoT; SystemInformationBlockType14_NB_r13_t *sib14_NB_IoT;
SystemInformationBlockType16_NB_r13_t *sib16_NB_IoT; SystemInformationBlockType16_NB_r13_t *sib16_NB_IoT;
SRB_INFO_NB_IoT SI; SRB_INFO_NB_IoT SI;
SRB_INFO_NB_IoT Srb0; SRB_INFO_NB_IoT Srb0;
uint8_t **MCCH_MESSAGE; // probably not needed , but added to remove errors uint8_t **MCCH_MESSAGE; // probably not needed , but added to remove errors
uint8_t sizeof_MCCH_MESSAGE[8];// but added to remove errors uint8_t sizeof_MCCH_MESSAGE[8];// but added to remove errors
SRB_INFO_NB_IoT MCCH_MESS[8];// MAX_MBSFN_AREA SRB_INFO_NB_IoT MCCH_MESS[8];// MAX_MBSFN_AREA
/*future implementation TS 36.331 V14.2.1 /*future implementation TS 36.331 V14.2.1
SystemInformationBlockType15_NB_r14_t *sib15; SystemInformationBlockType15_NB_r14_t *sib15;
SystemInformationBlockType20_NB_r14_t *sib20; SystemInformationBlockType20_NB_r14_t *sib20;
SystemInformationBlockType22_NB_r14_t *sib22; SystemInformationBlockType22_NB_r14_t *sib22;
uint8_t SCPTM_flag; uint8_t SCPTM_flag;
uint8_t sizeof_SC_MCHH_MESS[]; uint8_t sizeof_SC_MCHH_MESS[];
SC_MCCH_Message_NB_t scptm;*/ SC_MCCH_Message_NB_t scptm;*/
} rrc_eNB_carrier_data_NB_IoT_t; } rrc_eNB_carrier_data_NB_IoT_t;
//--------------------------------------------------- //---------------------------------------------------
//---NB-IoT---(completely change)--------------------- //---NB-IoT---(completely change)---------------------
typedef struct eNB_RRC_INST_NB_IoT_s { typedef struct eNB_RRC_INST_NB_IoT_s {
rrc_eNB_carrier_data_NB_IoT_t carrier[MAX_NUM_CCs]; rrc_eNB_carrier_data_NB_IoT_t carrier[MAX_NUM_CCs];
uid_allocator_NB_IoT_t uid_allocator; // for rrc_ue_head uid_allocator_NB_IoT_t uid_allocator; // for rrc_ue_head
RB_HEAD(rrc_ue_tree_NB_IoT_s, rrc_eNB_ue_context_NB_IoT_s) rrc_ue_head; // ue_context tree key search by rnti RB_HEAD(rrc_ue_tree_NB_IoT_s, rrc_eNB_ue_context_NB_IoT_s) rrc_ue_head; // ue_context tree key search by rnti
uint8_t Nb_ue; uint8_t Nb_ue;
hash_table_t *initial_id2_s1ap_ids; // key is content is rrc_ue_s1ap_ids_t hash_table_t *initial_id2_s1ap_ids; // key is content is rrc_ue_s1ap_ids_t
hash_table_t *s1ap_id2_s1ap_ids ; // key is content is rrc_ue_s1ap_ids_t hash_table_t *s1ap_id2_s1ap_ids ; // key is content is rrc_ue_s1ap_ids_t
//RRC configuration //RRC configuration
RrcConfigurationReq configuration; //rrc_messages_types.h RrcConfigurationReq configuration; //rrc_messages_types.h
// other PLMN parameters // other PLMN parameters
/// Mobile country code /// Mobile country code
int mcc; int mcc;
/// Mobile network code /// Mobile network code
int mnc; int mnc;
/// number of mnc digits /// number of mnc digits
int mnc_digit_length; int mnc_digit_length;
// other RAN parameters //FIXME: to be checked--> depends on APP layer // other RAN parameters //FIXME: to be checked--> depends on APP layer
int srb1_timer_poll_retransmit; int srb1_timer_poll_retransmit;
int srb1_max_retx_threshold; int srb1_max_retx_threshold;
int srb1_timer_reordering; int srb1_timer_reordering;
int srb1_timer_status_prohibit; int srb1_timer_status_prohibit;
int srs_enable[MAX_NUM_CCs]; int srs_enable[MAX_NUM_CCs];
} eNB_RRC_INST_NB_IoT; } eNB_RRC_INST_NB_IoT;
#define RRC_HEADER_SIZE_MAX_NB_IoT 64 #define RRC_HEADER_SIZE_MAX_NB_IoT 64
#define MAX_UE_CAPABILITY_SIZE_NB_IoT 255 #define MAX_UE_CAPABILITY_SIZE_NB_IoT 255
//not needed for the moment //not needed for the moment
typedef struct OAI_UECapability_NB_IoT_s { typedef struct OAI_UECapability_NB_IoT_s {
uint8_t sdu[MAX_UE_CAPABILITY_SIZE_NB_IoT]; uint8_t sdu[MAX_UE_CAPABILITY_SIZE_NB_IoT];
uint8_t sdu_size; uint8_t sdu_size;
////NB-IoT------ ////NB-IoT------
UE_Capability_NB_r13_t UE_Capability_NB_IoT; //replace the UE_EUTRA_Capability of LTE UE_Capability_NB_r13_t UE_Capability_NB_IoT; //replace the UE_EUTRA_Capability of LTE
} OAI_UECapability_NB_IoT_t; } OAI_UECapability_NB_IoT_t;
#define RRC_BUFFER_SIZE_MAX_NB_IoT 1024 #define RRC_BUFFER_SIZE_MAX_NB_IoT 1024
typedef struct UE_RRC_INST_NB_IoT_s { typedef struct UE_RRC_INST_NB_IoT_s {
Rrc_State_NB_IoT_t RrcState; Rrc_State_NB_IoT_t RrcState;
Rrc_Sub_State_NB_IoT_t RrcSubState; Rrc_Sub_State_NB_IoT_t RrcSubState;
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
plmn_t plmnID; plmn_t plmnID;
Byte_t rat; Byte_t rat;
as_nas_info_t initialNasMsg; as_nas_info_t initialNasMsg;
# endif # endif
OAI_UECapability_NB_IoT_t *UECap; OAI_UECapability_NB_IoT_t *UECap;
uint8_t *UECapability; uint8_t *UECapability;
uint8_t UECapability_size; uint8_t UECapability_size;
UE_RRC_INFO_NB_IoT Info[NB_SIG_CNX_UE]; UE_RRC_INFO_NB_IoT Info[NB_SIG_CNX_UE];
SRB_INFO_NB_IoT Srb0[NB_SIG_CNX_UE]; SRB_INFO_NB_IoT Srb0[NB_SIG_CNX_UE];
SRB_INFO_TABLE_ENTRY_NB_IoT Srb1[NB_CNX_UE]; SRB_INFO_TABLE_ENTRY_NB_IoT Srb1[NB_CNX_UE];
SRB_INFO_TABLE_ENTRY_NB_IoT Srb2[NB_CNX_UE]; SRB_INFO_TABLE_ENTRY_NB_IoT Srb2[NB_CNX_UE];
HANDOVER_INFO_UE_NB_IoT HandoverInfoUe; HANDOVER_INFO_UE_NB_IoT HandoverInfoUe;
/* /*
uint8_t *SIB1[NB_CNX_UE]; uint8_t *SIB1[NB_CNX_UE];
uint8_t sizeof_SIB1[NB_CNX_UE]; uint8_t sizeof_SIB1[NB_CNX_UE];
uint8_t *SI[NB_CNX_UE]; uint8_t *SI[NB_CNX_UE];
uint8_t sizeof_SI[NB_CNX_UE]; uint8_t sizeof_SI[NB_CNX_UE];
uint8_t SIB1Status[NB_CNX_UE]; uint8_t SIB1Status[NB_CNX_UE];
uint8_t SIStatus[NB_CNX_UE]; uint8_t SIStatus[NB_CNX_UE];
SystemInformationBlockType1_t *sib1[NB_CNX_UE]; SystemInformationBlockType1_t *sib1[NB_CNX_UE];
SystemInformation_t *si[NB_CNX_UE]; //!< Temporary storage for an SI message. Decoding happens in decode_SI(). SystemInformation_t *si[NB_CNX_UE]; //!< Temporary storage for an SI message. Decoding happens in decode_SI().
*/ */
SystemInformationBlockType2_t *sib2[NB_CNX_UE]; SystemInformationBlockType2_t *sib2[NB_CNX_UE];
/* /*
SystemInformationBlockType3_t *sib3[NB_CNX_UE]; SystemInformationBlockType3_t *sib3[NB_CNX_UE];
SystemInformationBlockType4_t *sib4[NB_CNX_UE]; SystemInformationBlockType4_t *sib4[NB_CNX_UE];
SystemInformationBlockType5_t *sib5[NB_CNX_UE]; SystemInformationBlockType5_t *sib5[NB_CNX_UE];
SystemInformationBlockType6_t *sib6[NB_CNX_UE]; SystemInformationBlockType6_t *sib6[NB_CNX_UE];
SystemInformationBlockType7_t *sib7[NB_CNX_UE]; SystemInformationBlockType7_t *sib7[NB_CNX_UE];
SystemInformationBlockType8_t *sib8[NB_CNX_UE]; SystemInformationBlockType8_t *sib8[NB_CNX_UE];
SystemInformationBlockType9_t *sib9[NB_CNX_UE]; SystemInformationBlockType9_t *sib9[NB_CNX_UE];
SystemInformationBlockType10_t *sib10[NB_CNX_UE]; SystemInformationBlockType10_t *sib10[NB_CNX_UE];
SystemInformationBlockType11_t *sib11[NB_CNX_UE]; SystemInformationBlockType11_t *sib11[NB_CNX_UE];
#if defined(Rel10) || defined(Rel14) #if defined(Rel10) || defined(Rel14)
uint8_t MBMS_flag; uint8_t MBMS_flag;
uint8_t *MCCH_MESSAGE[NB_CNX_UE]; uint8_t *MCCH_MESSAGE[NB_CNX_UE];
uint8_t sizeof_MCCH_MESSAGE[NB_CNX_UE]; uint8_t sizeof_MCCH_MESSAGE[NB_CNX_UE];
uint8_t MCCH_MESSAGEStatus[NB_CNX_UE]; uint8_t MCCH_MESSAGEStatus[NB_CNX_UE];
MBSFNAreaConfiguration_r9_t *mcch_message[NB_CNX_UE]; MBSFNAreaConfiguration_r9_t *mcch_message[NB_CNX_UE];
SystemInformationBlockType12_r9_t *sib12[NB_CNX_UE]; SystemInformationBlockType12_r9_t *sib12[NB_CNX_UE];
SystemInformationBlockType13_r9_t *sib13[NB_CNX_UE]; SystemInformationBlockType13_r9_t *sib13[NB_CNX_UE];
#endif #endif
#ifdef CBA #ifdef CBA
uint8_t num_active_cba_groups; uint8_t num_active_cba_groups;
uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
#endif #endif
uint8_t num_srb; uint8_t num_srb;
struct SRB_ToAddMod *SRB1_config[NB_CNX_UE]; struct SRB_ToAddMod *SRB1_config[NB_CNX_UE];
struct SRB_ToAddMod *SRB2_config[NB_CNX_UE]; struct SRB_ToAddMod *SRB2_config[NB_CNX_UE];
struct DRB_ToAddMod *DRB_config[NB_CNX_UE][8]; struct DRB_ToAddMod *DRB_config[NB_CNX_UE][8];
rb_id_t *defaultDRB; // remember the ID of the default DRB rb_id_t *defaultDRB; // remember the ID of the default DRB
MeasObjectToAddMod_t *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ]; MeasObjectToAddMod_t *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ];
struct ReportConfigToAddMod *ReportConfig[NB_CNX_UE][MAX_MEAS_CONFIG]; struct ReportConfigToAddMod *ReportConfig[NB_CNX_UE][MAX_MEAS_CONFIG];
*/ */
struct QuantityConfig *QuantityConfig[NB_CNX_UE]; struct QuantityConfig *QuantityConfig[NB_CNX_UE];
/* /*
struct MeasIdToAddMod *MeasId[NB_CNX_UE][MAX_MEAS_ID]; struct MeasIdToAddMod *MeasId[NB_CNX_UE][MAX_MEAS_ID];
MEAS_REPORT_LIST *measReportList[NB_CNX_UE][MAX_MEAS_ID]; MEAS_REPORT_LIST *measReportList[NB_CNX_UE][MAX_MEAS_ID];
uint32_t measTimer[NB_CNX_UE][MAX_MEAS_ID][6]; // 6 neighboring cells uint32_t measTimer[NB_CNX_UE][MAX_MEAS_ID][6]; // 6 neighboring cells
RSRP_Range_t s_measure; RSRP_Range_t s_measure;
struct MeasConfig__speedStatePars *speedStatePars; struct MeasConfig__speedStatePars *speedStatePars;
struct PhysicalConfigDedicated *physicalConfigDedicated[NB_CNX_UE]; struct PhysicalConfigDedicated *physicalConfigDedicated[NB_CNX_UE];
struct SPS_Config *sps_Config[NB_CNX_UE]; struct SPS_Config *sps_Config[NB_CNX_UE];
MAC_MainConfig_t *mac_MainConfig[NB_CNX_UE]; MAC_MainConfig_t *mac_MainConfig[NB_CNX_UE];
MeasGapConfig_t *measGapConfig[NB_CNX_UE]; MeasGapConfig_t *measGapConfig[NB_CNX_UE];
double filter_coeff_rsrp; // [7] ??? double filter_coeff_rsrp; // [7] ???
double filter_coeff_rsrq; // [7] ??? double filter_coeff_rsrq; // [7] ???
float rsrp_db[7]; float rsrp_db[7];
float rsrq_db[7]; float rsrq_db[7];
float rsrp_db_filtered[7]; float rsrp_db_filtered[7];
float rsrq_db_filtered[7]; float rsrq_db_filtered[7];
#if ENABLE_RAL #if ENABLE_RAL
obj_hash_table_t *ral_meas_thresholds; obj_hash_table_t *ral_meas_thresholds;
ral_transaction_id_t scan_transaction_id; ral_transaction_id_t scan_transaction_id;
#endif #endif
#if defined(ENABLE_SECURITY) #if defined(ENABLE_SECURITY)
// KeNB as computed from parameters within USIM card // // KeNB as computed from parameters within USIM card //
uint8_t kenb[32]; uint8_t kenb[32];
#endif #endif
// Used integrity/ciphering algorithms // // Used integrity/ciphering algorithms //
CipheringAlgorithm_r12_t ciphering_algorithm; CipheringAlgorithm_r12_t ciphering_algorithm;
e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm; e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;
*/ */
} UE_RRC_INST_NB_IoT; } UE_RRC_INST_NB_IoT;
#include "proto_NB_IoT.h" //should be put here otherwise compilation error #include "proto_NB_IoT.h" //should be put here otherwise compilation error
#endif #endif
/** @} */ /** @} */
/* /*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under * The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file * the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. * except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.openairinterface.org/?page_id=698 * http://www.openairinterface.org/?page_id=698
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file vars.h /*! \file vars.h
* \brief rrc external vars * \brief rrc external vars
* \author Navid Nikaein and Raymond Knopp, Michele Paffetti * \author Navid Nikaein and Raymond Knopp, Michele Paffetti
* \date 2011-2017 * \date 2011-2017
* \version 1.0 * \version 1.0
* \company Eurecom * \company Eurecom
* \email: navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it * \email: navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it
*/ */
#ifndef __OPENAIR_RRC_EXTERN_NB_IOT_H__ #ifndef __OPENAIR_RRC_EXTERN_NB_IOT_H__
#define __OPENAIR_RRC_EXTERN_NB_IOT_H__ #define __OPENAIR_RRC_EXTERN_NB_IOT_H__
#include "RRC/LITE/defs_NB_IoT.h" #include "RRC/LITE/defs_NB_IoT.h"
#include "PHY_INTERFACE/IF_Module_NB_IoT.h" #include "PHY_INTERFACE/IF_Module_NB_IoT.h"
#include "LAYER2/RLC/rlc.h" #include "LAYER2/RLC/rlc.h"
#include "LogicalChannelConfig-NB-r13.h" #include "LogicalChannelConfig-NB-r13.h"
#include "LAYER2/MAC/defs_NB_IoT.h" #include "LAYER2/MAC/defs_NB_IoT.h"
#include "common/ran_context.h" #include "common/ran_context.h"
//MP: NOTE:XXX some of the parameters defined in vars_nb_iot are called by the extern.h file so not replicated here //MP: NOTE:XXX some of the parameters defined in vars_nb_iot are called by the extern.h file so not replicated here
extern UE_RRC_INST_NB_IoT *UE_rrc_inst_NB_IoT; extern UE_RRC_INST_NB_IoT *UE_rrc_inst_NB_IoT;
extern eNB_RRC_INST_NB_IoT *eNB_rrc_inst_NB_IoT; extern eNB_RRC_INST_NB_IoT *eNB_rrc_inst_NB_IoT;
extern PHY_Config_NB_IoT_t *config_INFO; extern PHY_Config_NB_IoT_t *config_INFO;
extern rlc_info_t Rlc_info_am_NB_IoT,Rlc_info_am_config_NB_IoT; extern rlc_info_t Rlc_info_am_NB_IoT,Rlc_info_am_config_NB_IoT;
extern uint8_t DRB2LCHAN_NB_IoT[2]; extern uint8_t DRB2LCHAN_NB_IoT[2];
extern LogicalChannelConfig_NB_r13_t SRB1bis_logicalChannelConfig_defaultValue_NB_IoT; extern LogicalChannelConfig_NB_r13_t SRB1bis_logicalChannelConfig_defaultValue_NB_IoT;
extern LogicalChannelConfig_NB_r13_t SRB1_logicalChannelConfig_defaultValue_NB_IoT; extern LogicalChannelConfig_NB_r13_t SRB1_logicalChannelConfig_defaultValue_NB_IoT;
extern uint16_t T300_NB_IoT[8]; extern uint16_t T300_NB_IoT[8];
extern uint16_t T301_NB_IoT[8]; extern uint16_t T301_NB_IoT[8];
extern uint16_t T310_NB_IoT[8]; extern uint16_t T310_NB_IoT[8];
extern uint16_t T311_NB_IoT[8]; extern uint16_t T311_NB_IoT[8];
extern uint16_t N310_NB_IoT[8]; extern uint16_t N310_NB_IoT[8];
extern uint16_t N311_NB_IoT[8]; extern uint16_t N311_NB_IoT[8];
extern uint8_t *get_NB_IoT_MIB(struct eNB_RRC_INST_NB_IoT_s *nb_iot_rrc); extern uint8_t *get_NB_IoT_MIB(struct eNB_RRC_INST_NB_IoT_s *nb_iot_rrc);
#endif #endif
/* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more /* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under * The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file * the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. * except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.openairinterface.org/?page_id=698 * http://www.openairinterface.org/?page_id=698
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance: * For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org * contact@openairinterface.org
*/ */
/*! \file proto_NB_IoT.h /*! \file proto_NB_IoT.h
* \brief RRC functions prototypes for eNB and UE for NB-IoT * \brief RRC functions prototypes for eNB and UE for NB-IoT
* \author Navid Nikaein, Raymond Knopp and Michele Paffetti * \author Navid Nikaein, Raymond Knopp and Michele Paffetti
* \date 2010 - 2014 * \date 2010 - 2014
* \email navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it * \email navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it
* \version 1.0 * \version 1.0
*/ */
/** \addtogroup _rrc /** \addtogroup _rrc
* @{ * @{
*/ */
#include "RRC/LITE/defs_NB_IoT.h" #include "RRC/LITE/defs_NB_IoT.h"
#include "pdcp.h" #include "pdcp.h"
#include "rlc.h" #include "rlc.h"
#include "extern_NB_IoT.h" #include "extern_NB_IoT.h"
#include "LAYER2/MAC/defs_NB_IoT.h" #include "LAYER2/MAC/defs_NB_IoT.h"
/*NOTE: no static function should be declared in this header file (e.g. init_SI_NB)*/ /*NOTE: no static function should be declared in this header file (e.g. init_SI_NB)*/
/*------------------------common_nb_iot.c----------------------------------------*/ /*------------------------common_nb_iot.c----------------------------------------*/
/** \brief configure BCCH & CCCH Logical Channels and associated rrc_buffers, configure associated SRBs /** \brief configure BCCH & CCCH Logical Channels and associated rrc_buffers, configure associated SRBs
*/ */
void openair_rrc_on_NB_IoT(const protocol_ctxt_t* const ctxt_pP); void openair_rrc_on_NB_IoT(const protocol_ctxt_t* const ctxt_pP);
void rrc_config_buffer_NB_IoT(SRB_INFO_NB_IoT *srb_info, uint8_t Lchan_type, uint8_t Role); void rrc_config_buffer_NB_IoT(SRB_INFO_NB_IoT *srb_info, uint8_t Lchan_type, uint8_t Role);
int L3_xface_init_NB_IoT(void); int L3_xface_init_NB_IoT(void);
void openair_rrc_top_init_eNB_NB_IoT(void); void openair_rrc_top_init_eNB_NB_IoT(void);
//void rrc_top_cleanup(void); -->seems not to be used //void rrc_top_cleanup(void); -->seems not to be used
//rrc_t310_expiration-->seems not to be used //rrc_t310_expiration-->seems not to be used
/** \brief Function to update timers every subframe. For UE it updates T300,T304 and T310. /** \brief Function to update timers every subframe. For UE it updates T300,T304 and T310.
@param ctxt_pP running context @param ctxt_pP running context
@param enb_index @param enb_index
@param CC_id @param CC_id
*/ */
RRC_status_t rrc_rx_tx_NB_IoT(protocol_ctxt_t* const ctxt_pP, const uint8_t enb_index, const int CC_id); RRC_status_t rrc_rx_tx_NB_IoT(protocol_ctxt_t* const ctxt_pP, const uint8_t enb_index, const int CC_id);
//long binary_search_int(int elements[], long numElem, int value);--> seems not to be used //long binary_search_int(int elements[], long numElem, int value);--> seems not to be used
//long binary_search_float(float elements[], long numElem, float value);--> used only at UE side //long binary_search_float(float elements[], long numElem, float value);--> used only at UE side
//--------------------------------------- //---------------------------------------
//defined in L2_interface //defined in L2_interface
//called by rx_sdu only in case of CCCH message (e.g RRCConnectionRequest-NB) //called by rx_sdu only in case of CCCH message (e.g RRCConnectionRequest-NB)
int8_t mac_rrc_data_ind_eNB_NB_IoT( int8_t mac_rrc_data_ind_eNB_NB_IoT(
const module_id_t module_idP, const module_id_t module_idP,
const int CC_id, const int CC_id,
const frame_t frameP, const frame_t frameP,
const sub_frame_t sub_frameP, const sub_frame_t sub_frameP,
const rnti_t rntiP, const rnti_t rntiP,
const rb_id_t srb_idP,//could be skipped since always go through the CCCH channel const rb_id_t srb_idP,//could be skipped since always go through the CCCH channel
const uint8_t* sduP, const uint8_t* sduP,
const sdu_size_t sdu_lenP const sdu_size_t sdu_lenP
); );
//------------------------------------------- //-------------------------------------------
//defined in L2_interface //defined in L2_interface
void dump_ue_list_NB_IoT(UE_list_NB_IoT_t *listP, int ul_flag); void dump_ue_list_NB_IoT(UE_list_NB_IoT_t *listP, int ul_flag);
//------------------------------------------- //-------------------------------------------
//defined in L2_interface //defined in L2_interface
void mac_eNB_rrc_ul_failure_NB_IoT( void mac_eNB_rrc_ul_failure_NB_IoT(
const module_id_t mod_idP, const module_id_t mod_idP,
const int CC_idP, const int CC_idP,
const frame_t frameP, const frame_t frameP,
const sub_frame_t subframeP, const sub_frame_t subframeP,
const rnti_t rntiP); const rnti_t rntiP);
//------------------------------------------ //------------------------------------------
//defined in eNB_scheduler_primitives.c //defined in eNB_scheduler_primitives.c
int rrc_mac_remove_ue_NB_IoT( int rrc_mac_remove_ue_NB_IoT(
module_id_t mod_idP, module_id_t mod_idP,
rnti_t rntiP); rnti_t rntiP);
//------------------------------------------ //------------------------------------------
//defined in L2_interface //defined in L2_interface
void mac_eNB_rrc_ul_in_sync_NB_IoT( void mac_eNB_rrc_ul_in_sync_NB_IoT(
const module_id_t mod_idP, const module_id_t mod_idP,
const int CC_idP, const int CC_idP,
const frame_t frameP, const frame_t frameP,
const sub_frame_t subframeP, const sub_frame_t subframeP,
const rnti_t rntiP); const rnti_t rntiP);
//------------------------------------------ //------------------------------------------
//defined in L2_interface //defined in L2_interface
int mac_eNB_get_rrc_status_NB_IoT( int mac_eNB_get_rrc_status_NB_IoT(
const module_id_t Mod_idP, const module_id_t Mod_idP,
const rnti_t rntiP const rnti_t rntiP
); );
//--------------------------- //---------------------------
/*-----------eNB procedures (rrc_eNB_nb_iot.c)---------------*/ /*-----------eNB procedures (rrc_eNB_nb_iot.c)---------------*/
//---Initialization-------------- //---Initialization--------------
void openair_eNB_rrc_on_NB_IoT( void openair_eNB_rrc_on_NB_IoT(
const protocol_ctxt_t* const ctxt_pP const protocol_ctxt_t* const ctxt_pP
); );
void rrc_config_buffer_NB_IoT( void rrc_config_buffer_NB_IoT(
SRB_INFO_NB_IoT* Srb_info, SRB_INFO_NB_IoT* Srb_info,
uint8_t Lchan_type, uint8_t Lchan_type,
uint8_t Role uint8_t Role
); );
char openair_rrc_eNB_configuration_NB_IoT( char openair_rrc_eNB_configuration_NB_IoT(
const module_id_t enb_mod_idP, const module_id_t enb_mod_idP,
NbIoTRrcConfigurationReq* configuration NbIoTRrcConfigurationReq* configuration
); );
//----------------------------- //-----------------------------
/**\brief RRC eNB task. (starting of the RRC state machine) /**\brief RRC eNB task. (starting of the RRC state machine)
\param void *args_p Pointer on arguments to start the task. */ \param void *args_p Pointer on arguments to start the task. */
void *rrc_enb_task_NB_IoT(void *args_p); void *rrc_enb_task_NB_IoT(void *args_p);
/**\brief Entry routine to decode a UL-CCCH-Message-NB. Invokes PER decoder and parses message. /**\brief Entry routine to decode a UL-CCCH-Message-NB. Invokes PER decoder and parses message.
\param ctxt_pP Running context \param ctxt_pP Running context
\param Srb_info Pointer to SRB0 information structure (buffer, etc.)*/ \param Srb_info Pointer to SRB0 information structure (buffer, etc.)*/
int rrc_eNB_decode_ccch_NB_IoT( int rrc_eNB_decode_ccch_NB_IoT(
protocol_ctxt_t* const ctxt_pP, protocol_ctxt_t* const ctxt_pP,
const SRB_INFO_NB_IoT* const Srb_info, const SRB_INFO_NB_IoT* const Srb_info,
const int CC_id const int CC_id
); );
/**\brief Entry routine to decode a UL-DCCH-Message-NB. Invokes PER decoder and parses message. /**\brief Entry routine to decode a UL-DCCH-Message-NB. Invokes PER decoder and parses message.
\param ctxt_pP Context \param ctxt_pP Context
\param Rx_sdu Pointer Received Message \param Rx_sdu Pointer Received Message
\param sdu_size Size of incoming SDU*/ \param sdu_size Size of incoming SDU*/
int rrc_eNB_decode_dcch_NB_IoT( int rrc_eNB_decode_dcch_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
const rb_id_t Srb_id, const rb_id_t Srb_id,
const uint8_t* const Rx_sdu, const uint8_t* const Rx_sdu,
const sdu_size_t sdu_sizeP const sdu_size_t sdu_sizeP
); );
/**\brief Generate RRCConnectionReestablishmentReject-NB /**\brief Generate RRCConnectionReestablishmentReject-NB
\param ctxt_pP Running context \param ctxt_pP Running context
\param ue_context_pP UE context \param ue_context_pP UE context
\param CC_id Component Carrier ID*/ \param CC_id Component Carrier ID*/
void rrc_eNB_generate_RRCConnectionReestablishmentReject_NB_IoT( void rrc_eNB_generate_RRCConnectionReestablishmentReject_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP,
const int CC_id const int CC_id
); );
void rrc_eNB_generate_RRCConnectionReject_NB_IoT( void rrc_eNB_generate_RRCConnectionReject_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP,
const int CC_id const int CC_id
); );
void rrc_eNB_generate_RRCConnectionSetup_NB_IoT( void rrc_eNB_generate_RRCConnectionSetup_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP,
const int CC_id const int CC_id
); );
void rrc_eNB_process_RRCConnectionReconfigurationComplete_NB_IoT( void rrc_eNB_process_RRCConnectionReconfigurationComplete_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* ue_context_pP,
const uint8_t xid //transaction identifier const uint8_t xid //transaction identifier
); );
void //was under ITTI void //was under ITTI
rrc_eNB_reconfigure_DRBs_NB_IoT(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_reconfigure_DRBs_NB_IoT(const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* ue_context_pP); rrc_eNB_ue_context_NB_IoT_t* ue_context_pP);
void //was under ITTI void //was under ITTI
rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_NB_IoT( rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP
// const uint8_t ho_state // const uint8_t ho_state
); );
void rrc_eNB_process_RRCConnectionSetupComplete_NB_IoT( void rrc_eNB_process_RRCConnectionSetupComplete_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* ue_context_pP, rrc_eNB_ue_context_NB_IoT_t* ue_context_pP,
RRCConnectionSetupComplete_NB_r13_IEs_t * rrcConnectionSetupComplete_NB RRCConnectionSetupComplete_NB_r13_IEs_t * rrcConnectionSetupComplete_NB
); );
void rrc_eNB_generate_SecurityModeCommand_NB_IoT( void rrc_eNB_generate_SecurityModeCommand_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP
); );
void rrc_eNB_generate_UECapabilityEnquiry_NB_IoT( void rrc_eNB_generate_UECapabilityEnquiry_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP
); );
void rrc_eNB_generate_defaultRRCConnectionReconfiguration_NB_IoT(const protocol_ctxt_t* const ctxt_pP, void rrc_eNB_generate_defaultRRCConnectionReconfiguration_NB_IoT(const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP rrc_eNB_ue_context_NB_IoT_t* const ue_context_pP
//no HO flag //no HO flag
); );
/// Utilities------------------------------------------------ /// Utilities------------------------------------------------
void rrc_eNB_free_UE_NB_IoT( void rrc_eNB_free_UE_NB_IoT(
const module_id_t enb_mod_idP, const module_id_t enb_mod_idP,
const struct rrc_eNB_ue_context_NB_IoT_s* const ue_context_pP const struct rrc_eNB_ue_context_NB_IoT_s* const ue_context_pP
); );
void rrc_eNB_free_mem_UE_context_NB_IoT( void rrc_eNB_free_mem_UE_context_NB_IoT(
const protocol_ctxt_t* const ctxt_pP, const protocol_ctxt_t* const ctxt_pP,
struct rrc_eNB_ue_context_NB_IoT_s* const ue_context_pP struct rrc_eNB_ue_context_NB_IoT_s* const ue_context_pP
); );
/**\brief Function to get the next transaction identifier. /**\brief Function to get the next transaction identifier.
\param module_idP Instance ID for CH/eNB \param module_idP Instance ID for CH/eNB
\return a transaction identifier*/ \return a transaction identifier*/
uint8_t rrc_eNB_get_next_transaction_identifier_NB_IoT(module_id_t module_idP); uint8_t rrc_eNB_get_next_transaction_identifier_NB_IoT(module_id_t module_idP);
int rrc_init_global_param_NB_IoT(void); int rrc_init_global_param_NB_IoT(void);
//L2_interface.c //L2_interface.c
int8_t mac_rrc_data_req_eNB_NB_IoT( int8_t mac_rrc_data_req_eNB_NB_IoT(
const module_id_t Mod_idP, const module_id_t Mod_idP,
const int CC_id, const int CC_id,
const frame_t frameP, const frame_t frameP,
const frame_t h_frameP, const frame_t h_frameP,
const sub_frame_t subframeP, //need for the case in which both SIB1-NB_IoT and SIB23-NB_IoT will be scheduled in the same frame const sub_frame_t subframeP, //need for the case in which both SIB1-NB_IoT and SIB23-NB_IoT will be scheduled in the same frame
const rb_id_t Srb_id, const rb_id_t Srb_id,
uint8_t* const buffer_pP, uint8_t* const buffer_pP,
uint8_t flag uint8_t flag
); );
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment