Commit 0422bf8b authored by matzakos's avatar matzakos

Definition of the UE MAC interface: IF_Module_UE.h, IF_Module_UE.c,...

Definition of the UE MAC interface: IF_Module_UE.h, IF_Module_UE.c, UE_MAC_interface.h and the supporting functions.
parent ad98f5aa
...@@ -356,6 +356,8 @@ void phy_cleanup(void); ...@@ -356,6 +356,8 @@ void phy_cleanup(void);
void phy_config_request(PHY_Config_t *phy_config); void phy_config_request(PHY_Config_t *phy_config);
void phy_config_request_ue(UE_PHY_Config_t* UE_config_INFO);
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf); int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms); void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
......
...@@ -59,7 +59,6 @@ int l1_north_init_eNB() { ...@@ -59,7 +59,6 @@ int l1_north_init_eNB() {
} }
void phy_config_request(PHY_Config_t *phy_config) { void phy_config_request(PHY_Config_t *phy_config) {
uint8_t Mod_id = phy_config->Mod_id; uint8_t Mod_id = phy_config->Mod_id;
...@@ -255,6 +254,18 @@ void phy_config_request(PHY_Config_t *phy_config) { ...@@ -255,6 +254,18 @@ void phy_config_request(PHY_Config_t *phy_config) {
LOG_I(PHY,"eNB %d/%d configured\n",Mod_id,CC_id); LOG_I(PHY,"eNB %d/%d configured\n",Mod_id,CC_id);
} }
/* Panos: New function of the UE MAC interface: This function
should copy the values assigned to the interface parameters
(within MAC/config.c) to the PHY frame configuration. It should be called at the end of
config::rrc_mac_config_request_ue()*/
void phy_config_request_ue (UE_PHY_Config_t* UE_config_INFO)
{
}
void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, void phy_config_sib1_ue(uint8_t Mod_id,int CC_id,
uint8_t eNB_id, uint8_t eNB_id,
TDD_Config_t *tdd_Config, TDD_Config_t *tdd_Config,
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#include "msc.h" #include "msc.h"
#include "openair2/PHY_INTERFACE/IF_Module.h" #include "openair2/PHY_INTERFACE/IF_Module.h"
#include "openair2/PHY_INTERFACE/IF_Module_UE.h"
//#include <complex.h> //#include <complex.h>
#include "assertions.h" #include "assertions.h"
......
...@@ -503,6 +503,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id ...@@ -503,6 +503,7 @@ void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id
{ {
int Mod_id = ue->Mod_id; int Mod_id = ue->Mod_id;
int CC_id = ue->CC_id; int CC_id = ue->CC_id;
// Panos: Substitute call to ue_get_SR() with the filled ue_SR_config->SR_payload (0, or 1).
SR_payload = ue_get_SR(Mod_id, SR_payload = ue_get_SR(Mod_id,
CC_id, CC_id,
frame_tx, frame_tx,
...@@ -1338,6 +1339,8 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ...@@ -1338,6 +1339,8 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
// ask L2 for RACH transport // ask L2 for RACH transport
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
LOG_D(PHY,"Getting PRACH resources\n"); LOG_D(PHY,"Getting PRACH resources\n");
// Panos: Substitute the call to ue_get_rach with ue->prach_resources[eNB_id] = ue_rach_config, assuming that
// ue_get_rach() will have been called from the MAC layer.
ue->prach_resources[eNB_id] = ue_get_rach(ue->Mod_id, ue->prach_resources[eNB_id] = ue_get_rach(ue->Mod_id,
ue->CC_id, ue->CC_id,
frame_tx, frame_tx,
...@@ -1416,6 +1419,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin ...@@ -1416,6 +1419,7 @@ void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
} }
if (ue->mac_enabled==1){ if (ue->mac_enabled==1){
// Panos: Substitute with fill_Tx_indication(ue->Mod_id, ue->CC_id, frame_tx, eNB_id, UE_MAC_Tx_IND_Msg1_TYPE)
Msg1_transmitted(ue->Mod_id, Msg1_transmitted(ue->Mod_id,
ue->CC_id, ue->CC_id,
frame_tx, frame_tx,
...@@ -1684,6 +1688,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB ...@@ -1684,6 +1688,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
if (ue->mac_enabled == 1) { if (ue->mac_enabled == 1) {
// signal MAC that Msg3 was sent // signal MAC that Msg3 was sent
// Substitute call to this function by call to fill_Tx_indication (UE_MAC_Tx_IND_Msg3_TYPE)
Msg3_transmitted(Mod_id, Msg3_transmitted(Mod_id,
CC_id, CC_id,
frame_tx, frame_tx,
...@@ -1699,6 +1704,10 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB ...@@ -1699,6 +1704,10 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB
if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) { if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) {
//if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
access_mode=SCHEDULED_ACCESS; access_mode=SCHEDULED_ACCESS;
// Panos: Remove the call to ue_get_sdu here and use
// the corresponding Tx.request PDU, instead of ulsch_input_buffer, below.
ue_get_sdu(Mod_id, ue_get_sdu(Mod_id,
CC_id, CC_id,
frame_tx, frame_tx,
...@@ -2536,6 +2545,8 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin ...@@ -2536,6 +2545,8 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
frame_tx += pbch_phase; frame_tx += pbch_phase;
if (ue->mac_enabled==1) { if (ue->mac_enabled==1) {
// Panos:Substitute this call with fill_bch_indication(sync=1)
dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id, dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id,
ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0);
} }
...@@ -2617,7 +2628,11 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin ...@@ -2617,7 +2628,11 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
ue->pbch_vars[eNB_id]->pdu_errors_conseq++; ue->pbch_vars[eNB_id]->pdu_errors_conseq++;
ue->pbch_vars[eNB_id]->pdu_errors++; ue->pbch_vars[eNB_id]->pdu_errors++;
if (ue->mac_enabled == 1) rrc_out_of_sync_ind(ue->Mod_id,frame_rx,eNB_id); if (ue->mac_enabled == 1) {
// Panos: Substitute call to rrc_out_of_sync_ind() with fill_bch_incication(sync=0).
rrc_out_of_sync_ind(ue->Mod_id,frame_rx,eNB_id);
}
else AssertFatal(ue->pbch_vars[eNB_id]->pdu_errors_conseq<100, else AssertFatal(ue->pbch_vars[eNB_id]->pdu_errors_conseq<100,
"More that 100 consecutive PBCH errors! Exiting!\n"); "More that 100 consecutive PBCH errors! Exiting!\n");
} }
...@@ -2637,6 +2652,55 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin ...@@ -2637,6 +2652,55 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT);
} }
// Panos: New function supporting the MAC interface
void fill_bch_indication(module_id_t module_idP,
frame_t frameP,
unsigned char eNB_index,
uint8_t first_sync,
uint8_t sync)
{
}
// Panos: New function supporting the MAC interface
void fill_dlsch_indication(module_id_t module_idP,
uint8_t CC_id,
frame_t frameP,
sub_frame_t subframeP,
uint8_t* sdu,
uint16_t sdu_len,
uint8_t eNB_index)
{
}
// Panos: New function supporting the MAC interface
void fill_dlsch_rar_indication(module_id_t module_idP,
int CC_id,
frame_t frameP,
rnti_t ra_rnti,
uint8_t* dlsch_buffer,
rnti_t* t_crnti,
uint8_t preamble_index,
uint8_t* selected_rar_buffer)
{
}
// PANOS: New function supporting the MAC interface
void fill_Tx_indication(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id, uint8_t Tx_ind_type)
{
switch (Tx_ind_type)
{
case UE_MAC_Tx_IND_Msg1_TYPE:
break;
case UE_MAC_Tx_IND_Msg3_TYPE:
break;
}
}
int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t abstraction_flag) int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t abstraction_flag)
{ {
...@@ -3217,6 +3281,7 @@ void process_rar(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, runmode_t mo ...@@ -3217,6 +3281,7 @@ void process_rar(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, runmode_t mo
subframe_rx, subframe_rx,
ue->prach_resources[eNB_id]->ra_PreambleIndex); ue->prach_resources[eNB_id]->ra_PreambleIndex);
// Panos: Substitute call to ue_process_rar() with call to fill_dlsch_rar_indication()
timing_advance = ue_process_rar(ue->Mod_id, timing_advance = ue_process_rar(ue->Mod_id,
ue->CC_id, ue->CC_id,
frame_rx, frame_rx,
...@@ -3507,6 +3572,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, ...@@ -3507,6 +3572,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
if (ue->mac_enabled == 1) { if (ue->mac_enabled == 1) {
switch (pdsch) { switch (pdsch) {
case PDSCH: case PDSCH:
// Panos: Substitute call to ue_send_sdu() with call to fill_dlsch_indication()
ue_send_sdu(ue->Mod_id, ue_send_sdu(ue->Mod_id,
CC_id, CC_id,
frame_rx, frame_rx,
...@@ -3516,6 +3582,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, ...@@ -3516,6 +3582,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
eNB_id); eNB_id);
break; break;
case SI_PDSCH: case SI_PDSCH:
// Panos: Substitute call with call to fill_dlsch_indication()
ue_decode_si(ue->Mod_id, ue_decode_si(ue->Mod_id,
CC_id, CC_id,
frame_rx, frame_rx,
...@@ -3524,7 +3591,8 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, ...@@ -3524,7 +3591,8 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
break; break;
case P_PDSCH: case P_PDSCH:
ue_decode_p(ue->Mod_id, // Panos: Substitute call with call to fill_dlsch_indication()
ue_decode_p(ue->Mod_id,
CC_id, CC_id,
frame_rx, frame_rx,
eNB_id, eNB_id,
...@@ -3532,6 +3600,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue, ...@@ -3532,6 +3600,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
break; break;
case RA_PDSCH: case RA_PDSCH:
// Panos: Substitute with call to fill_dlsch_rar_indication()
process_rar(ue,proc,eNB_id,mode,abstraction_flag); process_rar(ue,proc,eNB_id,mode,abstraction_flag);
break; break;
case PDSCH1: case PDSCH1:
......
...@@ -264,6 +264,7 @@ void config_sib1(int Mod_idP, ...@@ -264,6 +264,7 @@ void config_sib1(int Mod_idP,
} }
int power_off_dB[6] = {78,118,140,170,188,200}; int power_off_dB[6] = {78,118,140,170,188,200};
void config_sib2(int Mod_idP, void config_sib2(int Mod_idP,
...@@ -414,6 +415,10 @@ void config_sib2(int Mod_idP, ...@@ -414,6 +415,10 @@ void config_sib2(int Mod_idP,
} }
void config_dedicated(int Mod_idP, void config_dedicated(int Mod_idP,
int CC_idP, int CC_idP,
uint16_t rnti, uint16_t rnti,
...@@ -671,6 +676,47 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, ...@@ -671,6 +676,47 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP,
return(0); return(0);
} }
// P: New function supporting the MAC interface
void config_sib1_ue()
{
}
// P: New function supporting the MAC interface
void config_sib2_ue()
{
}
// P: New function supporting the MAC interface
void config_meas_ue()
{
}
// P: New function supporting the MAC interface
// to substitute call to phy_config_afterHO_ue().
void config_afterHO_ue()
{
}
// P: New function supporting the MAC interface
void config_sib13_ue()
{
}
// P: New function supporting the MAC interface
void config_dedicated_ue()
{
}
int int
rrc_mac_config_req_ue( rrc_mac_config_req_ue(
module_id_t Mod_idP, module_id_t Mod_idP,
...@@ -1021,6 +1067,9 @@ rrc_mac_config_req_ue( ...@@ -1021,6 +1067,9 @@ rrc_mac_config_req_ue(
#endif #endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);
// Panos: Call to the phy_config_request_ue() function of the interface to copy the UE_PHY_Config_t interface
// configuration to the PHY common and dedicated configuration originating from RRC.
return(0); return(0);
} }
...@@ -1781,6 +1781,8 @@ for (lcid=DCCH; (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == FALSE) ; lcid ...@@ -1781,6 +1781,8 @@ for (lcid=DCCH; (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == FALSE) ; lcid
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT);
stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
// Panos: Tx_request should be filled from the ulsch_buffer here.
if (opt_enabled) { if (opt_enabled) {
trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0); trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0);
LOG_D(OPT,"[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d\n", LOG_D(OPT,"[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d\n",
......
#include "openair1/PHY/defs.h"
#include "openair2/PHY_INTERFACE/IF_Module_UE.h"
#include "openair2/PHY_INTERFACE/UE_MAC_interface.h"
#include "openair1/PHY/extern.h"
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/proto.h"
#include "common/ran_context.h"
void handle_bch(UE_DL_IND_t *UE_DL_INFO)
{
}
void handle_dlsch(UE_DL_IND_t *UE_DL_INFO)
{
int i;
UE_MAC_dlsch_indication_pdu_t *dlsch_pdu_ind;
for (i=0; i<UE_DL_INFO->UE_DLSCH_ind.number_of_pdus; i++)
{
dlsch_pdu_ind = UE_DL_INFO->UE_DLSCH_ind.dlsch_ind_list[i];
switch (dlsch_pdu_ind->pdu_type) {
case UE_MAC_DL_IND_PDSCH_PDU_TYPE:
// Call ue_send_sdu()
break;
case UE_MAC_DL_IND_SI_PDSCH_PDU_TYPE:
// Call ue_decode_si()
break;
case UE_MAC_DL_IND_P_PDSCH_PDU_TYPE:
// Call ue_decode_p()
break;
case UE_MAC_DL_IND_DLSCH_RAR_PDU_TYPE:
// Call ue_process_rar()
break;
}
}
}
void UE_DL_indication(UE_DL_IND_t *UE_DL_INFO)
{
/*Call handle functions to forward PDUs or control indications to the upper layers.
handle_bch(UE_DL_INFO);
handle_dlsch (UE_DL_INFO);
*/
}
/* Indicate the Txon of Msg1 or Msg3 to the MAC layer of the transmitter side and trigger associated
* MAC layer operations */
void UE_Tx_indication(UE_Tx_IND_t *UE_Tx_INFO)
{
switch (UE_Tx_INFO->ind_type) {
case UE_MAC_Tx_IND_Msg1_TYPE:
//Call Msg1_transmitted()
break;
case UE_MAC_Tx_IND_Msg3_TYPE:
//Call Msg3_transmitted()
break;
}
}
/*This is the interface module between PHY
*Provided the FAPI style interface structures for P7.
*
*
*
*//*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file openair2/PHY_INTERFACE/IF_Module.h
* \brief data structures for PHY/MAC interface modules
* \author EURECOM/NTUST
* \date 2017
* \version 0.1
* \company Eurecom
* \email: raymond.knopp@eurecom.fr
* \note
* \warning
*/
#ifndef __IF_MODULE_UE__H__
#define __IF_MODULE_UE__H__
#include <stdint.h>
#include "openair1/PHY/LTE_TRANSPORT/defs.h"
#include "UE_MAC_interface.h"
#define MAX_NUM_DL_PDU 100
#define MAX_NUM_UL_PDU 100
#define MAX_NUM_HI_DCI0_PDU 100
#define MAX_NUM_TX_REQUEST_PDU 100
#define MAX_NUM_HARQ_IND 100
#define MAX_NUM_CRC_IND 100
#define MAX_NUM_SR_IND 100
#define MAX_NUM_CQI_IND 100
#define MAX_NUM_RACH_IND 100
#define MAX_NUM_SRS_IND 100
typedef struct{
/// Module ID
module_id_t module_id;
/// CC ID
int CC_id;
// / frame
frame_t frame;
/// subframe
sub_frame_t subframe;
/// harq ACKs indication list
//UE_MAC_hi_indication_body_t UE_hi_ind;
/// crc indication list
//UE_MAC_crc_indication_body_t UE_crc_ind;
/// RX BCH indication
UE_MAC_BCH_indication_body_t UE_BCH_ind;
/// RX DLSCH indication
UE_MAC_DLSCH_indication_body_t UE_DLSCH_ind;
} UE_DL_IND_t;
typedef struct{
/// Module ID
module_id_t module_id;
/// CC ID
int CC_id;
/// frame
frame_t frame;
/// subframe
sub_frame_t subframe;
/// Txon Indication type (Msg1 or Msg3)
uint8_t ind_type;
}UE_Tx_IND_t;
typedef struct{
/// Module ID
module_id_t module_id;
/// CC ID
int CC_id;
/// frame
frame_t frame;
/// subframe
sub_frame_t subframe;
/// Sidelink Control Information indication
ue_sci_indication_body_t UE_SCI_ind;
/// RX SLSCH indication
ue_SLSCH_indication_body_t UE_SLSCH_ind;
/// RX SLDCH indication
ue_SLDCH_indication_body_t UE_SLDCH_ind;
/// RX SLBCH indication
ue_SLBCH_indication_body_t UE_SLBCH_ind;
} UE_SL_IND_t;
// Downlink subframe P7
typedef struct{
/// Module ID
module_id_t module_id;
/// CC ID
uint8_t CC_id;
/// frame
frame_t frame;
/// subframe
sub_frame_t subframe;
/// MAC IFace UL Config Request
UE_MAC_ul_config_request_t *UE_UL_req;
/// MAC IFace SL Transmission Config Request
UE_MAC_sl_config_request_Tx_t *SL_Tx_req;
/// MAC IFace SL Reception Config Request
UE_MAC_sl_config_request_Rx_t *SL_Rx_req;
/// Pointers to UL SDUs
UE_MAC_tx_request_t *UE_TX_req;
/// Pointers to SL SDUs
UE_MAC_sl_tx_request_t *TX_SL_req;
}UE_Sched_Rsp_t;
typedef struct {
uint8_t Mod_id;
int CC_id;
UE_PHY_config_common_request_t *cfg_common;
UE_PHY_config_dedicated_request_t *cfg_dedicated;
}UE_PHY_Config_t;
typedef struct IF_Module_UE_s{
//define the function pointer
void (*UE_DL_indication)(UE_DL_IND_t *UE_DL_INFO);
void (*UE_SL_indication)(UE_SL_IND_t *UE_SL_INFO);
void (*UE_Tx1_indication)(UE_Tx_IND_t *UE_Tx_INFO);
void (*UE_sched_response)(UE_Sched_Rsp_t *UE_Sched_INFO);
void (*UE_config_req)(UE_PHY_Config_t* UE_config_INFO);
//P: Perhaps an additional separate function for dedicated PHY configuration is needed.
uint32_t CC_mask;
uint16_t current_frame;
uint8_t current_subframe;
pthread_mutex_t if_mutex;
}IF_Module_UE_t;
IF_Module_UE_t *IF_Module_UE_init(int Mod_id);
void IF_Module_UE_kill(int Mod_id);
void UE_DL_indication(UE_DL_IND_t *UE_DL_INFO);
void UE_Tx_indication(UE_Tx_IND_t *UE_Tx_INFO);
/*Interface for Downlink, transmitting the DLSCH SDU, DCI SDU*/
void UE_schedule_response(UE_Sched_Rsp_t *UE_Sched_INFO);
#endif
/*This is the interface module between PHY
*Provided the FAPI style interface structures for P7.
*
*
*
*//*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file openair2/PHY_INTERFACE/IF_Module.h
* \brief data structures for PHY/MAC interface modules
* \author EURECOM/NTUST
* \date 2017
* \version 0.1
* \company Eurecom
* \email: raymond.knopp@eurecom.fr
* \note
* \warning
*/
#ifndef __UE_MAC_INTERFACE__H__
#define __UE_MAC_INTERFACE__H__
#include "nfapi_interface.h"
#include "openair1/PHY/impl_defs_lte.h"
#include "targets/COMMON/openairinterface5g_limits.h"
#define MAX_NUM_DL_PDU 100
#define MAX_NUM_UL_PDU 100
#define MAX_NUM_HI_DCI0_PDU 100
#define MAX_NUM_TX_REQUEST_PDU 100
#define MAX_NUM_HARQ_IND 100
#define MAX_NUM_CRC_IND 100
#define MAX_NUM_SR_IND 100
#define MAX_NUM_CQI_IND 100
#define MAX_NUM_RACH_IND 100
#define MAX_NUM_SRS_IND 100
// UE_MAC enums
typedef enum {
UE_MAC_DL_IND_PDSCH_PDU_TYPE =0,
UE_MAC_DL_IND_SI_PDSCH_PDU_TYPE,
UE_MAC_DL_IND_P_PDSCH_PDU_TYPE,
UE_MAC_DL_IND_DLSCH_RAR_PDU_TYPE
} UE_MAC_dl_ind_pdu_type_e;
// UE_MAC enums
typedef enum {
UE_MAC_Tx_IND_Msg1_TYPE =0,
UE_MAC_Tx_IND_Msg3_TYPE
} UE_MAC_Tx_ind_type_e;
// *** UE_UL_Config.request related structures
typedef struct{
//module_id_t module_idP;
//int CC_id;
//frame_t frameP;
uint8_t eNB_id;
//uint16_t rnti;
//sub_frame_t subframe_tx;
uint32_t SR_payload; //0 or 1
}UE_MAC_ul_config_SR;
typedef struct{
//module_id_t module_idP;
//int CC_id;
//frame_t frameP;
uint8_t eNB_indexP;
//sub_frame_t subframeP;
uint8_t ra_RACH_MaskIndex;
int8_t ra_PREAMBLE_RECEIVED_TARGET_POWER;
uint8_t ra_TDD_map_index;
uint16_t ra_RNTI;
uint8_t *Msg3;
}UE_MAC_ul_config_rach;
typedef struct {
union {
UE_MAC_ul_config_rach ue_rach_config;
//UE_MAC_ul_config_ULSCH ue_ULSCH_pdu;
UE_MAC_ul_config_SR ue_SR_config;
};
} UE_MAC_ul_config_request_list;
typedef struct {
nfapi_tl_t tl;
uint16_t length_list;
UE_MAC_ul_config_request_list* ue_ul_config_list;
} UE_MAC_ul_config_request_body_t;
typedef struct {
//nfapi_p7_message_header_t header;
uint16_t sfn_sf;
UE_MAC_ul_config_request_body_t ue_ul_config_request_body; //nfapi_dl_config_request_body_t
} UE_MAC_ul_config_request_t;
// *** UE_Tx.request related structures
typedef struct {
uint16_t pdu_length;
uint16_t pdu_index;
uint8_t num_segments;
struct {
uint32_t segment_length;
uint8_t* segment_data;
} segments[NFAPI_TX_MAX_SEGMENTS];
} UE_MAC_tx_request_pdu_t;
typedef struct {
nfapi_tl_t tl;
uint16_t number_of_pdus;
UE_MAC_tx_request_pdu_t* ue_tx_pdu_list;
} UE_MAC_tx_request_body_t;
typedef struct {
//nfapi_p7_message_header_t header;
uint16_t sfn_sf;
UE_MAC_tx_request_body_t ue_tx_request_body;
} UE_MAC_tx_request_t;
typedef struct{
}UE_MAC_sl_config_request_Tx_t;
typedef struct{
}UE_MAC_sl_config_request_Rx_t;
typedef struct{
}UE_MAC_sl_tx_request_t;
// *** UE_DL.indication related structures
typedef struct{
unsigned char eNB_index;
uint8_t first_sync; //boolean 0 or 1
uint8_t sync; // boolean 0 or 1 to indicate whether rrc_out_of_sync_ind() or dl_phy_sync_success()
// should be called from the handler function of the interface respectively.
}UE_MAC_bch_indication_pdu_t;
typedef struct{
nfapi_tl_t tl;
UE_MAC_bch_indication_pdu_t* bch_ind_list;
}UE_MAC_BCH_indication_body_t;
// Panos: Corresponding to inputs of MAC functions: ue_send_sdu(), ue_decode_si(), ue_decode_p().
typedef struct{
uint8_t* data;
uint16_t data_len;
}UE_MAC_dlsch_pdu;
// Panos: Corresponding to inputs of MAC function: process_rar().
typedef struct{
rnti_t ra_rnti;
uint8_t* rar_input_buffer; // Originating from PHY
rnti_t* t_crnti;
uint8_t preamble_index;
uint8_t* rar_output_buffer; //should be returned to PHY: dlsch0->harq_processes[0]->b
}UE_MAC_dlsch_rar_pdu;
typedef struct{
uint8_t pdu_type;
uint8_t eNB_index;
union{
UE_MAC_dlsch_pdu dlsch_pdu_ind;
UE_MAC_dlsch_rar_pdu dlsch_rar_pdu_ind;
};
}UE_MAC_dlsch_indication_pdu_t;
typedef struct{
nfapi_tl_t tl;
uint16_t number_of_pdus;
UE_MAC_dlsch_indication_pdu_t* dlsch_ind_list;
}UE_MAC_DLSCH_indication_body_t;
// *** UE_SL.indication related structures
typedef struct{
}ue_sci_indication_body_t;
typedef struct{
}ue_SLSCH_indication_body_t;
typedef struct{
}ue_SLDCH_indication_body_t;
typedef struct{
}ue_SLBCH_indication_body_t;
// *** UE_Config_common.request related structures
typedef struct {
uint8_t subframeAssignment;
uint8_t specialSubframePatterns;
}UE_PHY_tdd_frame_structure_t;
typedef struct {
uint16_t rootSequenceIndex;
uint8_t prach_Config_enabled;
uint8_t prach_ConfigIndex;
uint8_t highSpeedFlag;
uint8_t zeroCorrelationZoneConfig;
uint8_t prach_FreqOffset;
}UE_PHY_prach_config_t;
typedef struct {
uint8_t deltaPUCCH_Shift;
uint8_t nRB_CQI;
uint8_t nCS_AN;
uint16_t n1PUCCH_AN;
}UE_PHY_pucch_config_t;
typedef struct {
int8_t referenceSignalPower;
uint8_t p_b;
}UE_PHY_pdcch_config_t;
typedef struct {
uint8_t n_SB;
PUSCH_HOPPING_t hoppingMode;
uint8_t pusch_HoppingOffset;
uint8_t enable64QAM;
uint8_t groupHoppingEnabled;
uint8_t groupAssignmentPUSCH;
uint8_t sequenceHoppingEnabled;
uint8_t cyclicShift;
}UE_PHY_pusch_config_t;
typedef struct{
uint8_t enabled_flag;
uint8_t srs_BandwidthConfig;
uint8_t srs_SubframeConfig;
uint8_t ackNackSRS_SimultaneousTransmission;
uint8_t srs_MaxUpPts;
}UE_PHY_SRS_config_t;
typedef struct{
int8_t p0_NominalPUSCH;
PUSCH_alpha_t alpha;
int8_t p0_NominalPUCCH;
int8_t deltaPreambleMsg3;
long deltaF_PUCCH_Format1;
long deltaF_PUCCH_Format1b;
long deltaF_PUCCH_Format2;
long deltaF_PUCCH_Format2a;
long deltaF_PUCCH_Format2b;
}UE_PHY_UL_power_control_config_t;
typedef struct{
uint8_t maxHARQ_Msg3Tx;
}UE_PHY_HARQ_Msg3_config_t;
typedef struct{
uint8_t nb_antennas_tx;
}UE_PHY_antenna_config_t;
typedef struct{
PHICH_RESOURCE_t phich_resource;
PHICH_DURATION_t phich_duration;
}UE_PHY_phich_config_t;
typedef struct {
UE_PHY_tdd_frame_structure_t ue_tdd_frame_structure_config;
UE_PHY_prach_config_t ue_prach_config;
UE_PHY_pucch_config_t ue_pucch_config;
UE_PHY_pdcch_config_t ue_pdcch_config;
UE_PHY_pusch_config_t ue_pdsch_config;
UE_PHY_SRS_config_t ue_srs_config;
UE_PHY_UL_power_control_config_t ue_ul_pow_cntl_config;
UE_PHY_HARQ_Msg3_config_t ue_harq_msg3_config;
/* Where can we find the types and values of the configuration for the PCH?
UE_MAC_pusch_config_t ue_pch_config
radioResourceConfigCommon->pcch_Config.defaultPagingCycle, radioResourceConfigCommon->pcch_Config.nB*/
UE_PHY_antenna_config_t ue_ant_config;
UE_PHY_phich_config_t ue_phich_config;
/* MBSFN?*/
}UE_PHY_config_common_request_t;
// *** UE_Config_dedicated. request related structures
typedef struct{
PA_t p_a;
}UE_PHY_pdsch_config_dedicated_t;
typedef struct{
uint8_t ackNackRepetition;
ANFBmode_t tdd_AckNackFeedbackMode;
//ACKNAKREP_t repetitionFactor;
//uint16_t n1PUCCH_AN_Rep;
}UE_PHY_pucch_config_dedicated_t;
typedef struct{
uint16_t betaOffset_ACK_Index;
uint16_t betaOffset_RI_Index;
uint16_t betaOffset_CQI_Index;
}UE_PHY_pusch_config_dedicated_t;
typedef struct{
int8_t p0_UE_PUSCH;
uint8_t deltaMCS_Enabled;
uint8_t accumulationEnabled;
int8_t p0_UE_PUCCH;
int8_t pSRS_Offset;
uint8_t filterCoefficient;
}UE_PHY_ul_power_control_config_dedicated_t;
typedef struct{
uint16_t sr_PUCCH_ResourceIndex;
uint8_t sr_ConfigIndex;
DSR_TRANSMAX_t dsr_TransMax;
}UE_PHY_SR_config_dedicated_t;
typedef struct{
uint8_t srsConfigDedicatedSetup;
uint8_t duration;
uint8_t cyclicShift;
uint8_t freqDomainPosition;
uint8_t srs_Bandwidth;
uint16_t srs_ConfigIndex;
uint8_t srs_HoppingBandwidth;
uint8_t transmissionComb;
//uint8_t srsCellSubframe;
//uint8_t srsUeSubframe;
}UE_PHY_srs_ul_config_dedicated_t;
typedef struct{
CQI_REPORTMODEAPERIODIC cqi_ReportModeAperiodic;
CQI_REPORTPERIODIC CQI_ReportPeriodic;
//int8_t nomPDSCH_RS_EPRE_Offset;
}UE_PHY_cqi_report_config_dedicated_t;
typedef struct{
uint8_t transmission_mode [NUMBER_OF_CONNECTED_eNB_MAX];
UE_PHY_pdsch_config_dedicated_t ue_pdsch_config;
UE_PHY_pucch_config_dedicated_t ue_pucch_config;
UE_PHY_pusch_config_dedicated_t ue_pusch_config;
UE_PHY_ul_power_control_config_dedicated_t ue_ul_pow_cntrl_config;
UE_PHY_SR_config_dedicated_t ue_SR_config;
UE_PHY_srs_ul_config_dedicated_t ue_srs_ul_config;
UE_PHY_cqi_report_config_dedicated_t ue_cqi_report_config;
}UE_PHY_config_dedicated_request_t;
#endif
/*
typedef struct {
nfapi_p4_p5_message_header_t header;
uint8_t num_tlv;
nfapi_subframe_config_t subframe_config;
nfapi_rf_config_t rf_config;
nfapi_phich_config_t phich_config;
nfapi_sch_config_t sch_config;
nfapi_prach_config_t prach_config;
nfapi_pusch_config_t pusch_config;
nfapi_pucch_config_t pucch_config;
nfapi_srs_config_t srs_config;
nfapi_uplink_reference_signal_config_t uplink_reference_signal_config;
nfapi_laa_config_t laa_config;
nfapi_emtc_config_t emtc_config;
nfapi_tdd_frame_structure_t tdd_frame_structure_config;
nfapi_l23_config_t l23_config;
nfapi_nb_iot_config_t nb_iot_config;
// addition nfapi tlvs as per table 2-16 in idle or configure
nfapi_nfapi_t nfapi_config;
nfapi_vendor_extension_tlv_t vendor_extension;
} nfapi_config_request_t;
typedef struct {
nfapi_tl_t tl;
uint8_t dci_format;
uint8_t cce_index;
uint8_t aggregation_level;
uint16_t rnti;
uint8_t resource_block_start;
uint8_t number_of_resource_block;
uint8_t mcs_1;
uint8_t cyclic_shift_2_for_drms;
uint8_t frequency_hopping_enabled_flag;
uint8_t frequency_hopping_bits;
uint8_t new_data_indication_1;
uint8_t ue_tx_antenna_seleciton;
uint8_t tpc;
uint8_t cqi_csi_request;
uint8_t ul_index;
uint8_t dl_assignment_index;
uint32_t tpc_bitmap;
uint16_t transmission_power;
} nfapi_hi_dci0_dci_pdu_rel8_t;
*/
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