Merge remote-tracking branch 'origin/develop' into tx-proc-optim
Conflicts: common/utils/nr/nr_common.h openair1/PHY/NR_TRANSPORT/pucch_rx.c
This commit is contained in:
@@ -22,9 +22,7 @@
|
||||
#ifndef __MAC_RRC_PRIMITIVES_H__
|
||||
#define __MAC_RRC_PRIMITIVES_H__
|
||||
|
||||
#ifndef OPENAIR2_IN
|
||||
#include "LAYER2/RLC/rlc.h"
|
||||
#endif
|
||||
#include "LAYER2/RLC/rlc.h"
|
||||
#include "COMMON/platform_types.h"
|
||||
#include "COMMON/platform_constants.h"
|
||||
#include "openair2/RRC/LTE/rrc_defs.h"
|
||||
@@ -306,8 +304,6 @@ typedef struct {
|
||||
|
||||
|
||||
|
||||
#ifndef OPENAIR2_IN
|
||||
|
||||
typedef struct { //RRC_INTERFACE_FUNCTIONS
|
||||
unsigned int Frame_index;
|
||||
unsigned short UE_index[NB_MODULES_MAX][NB_SIG_CNX_UE];
|
||||
@@ -375,10 +371,6 @@ typedef struct {
|
||||
} MAC_RLC_XFACE;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//#define IDLE 0
|
||||
#define NEED_RADIO_CONFIG 3
|
||||
#define RADIO_CONFIG_TX 2
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
#else
|
||||
#define MAX_MOBILES_PER_ENB 4
|
||||
#define MAX_MOBILES_PER_ENB_NB_IoT 4
|
||||
#define MAX_MOBILES_PER_GNB 2//16
|
||||
#define MAX_MOBILES_PER_GNB 4//16
|
||||
#define MAX_eNB 2
|
||||
#define MAX_gNB 2
|
||||
#endif
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
/*
|
||||
* 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.1 (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
|
||||
*/
|
||||
|
||||
/*
|
||||
rrm_config_structs.h
|
||||
-------------------
|
||||
AUTHOR : Linus GASSER modified by Lionel GAUTHIER Raymond KNOPP
|
||||
COMPANY : EURECOM
|
||||
EMAIL : linus.gasser@epfl.ch
|
||||
EMAIL : lionel.gauthier@eurecom.fr
|
||||
EMAIL : raymond.knopp@eurecom.fr
|
||||
|
||||
|
||||
|
||||
***************************************************************************/
|
||||
#ifdef OLD_RRC_CELLULAR
|
||||
# ifndef __RRM_CONFIG_STRUCTS_H__
|
||||
# define __RRM_CONFIG_STRUCTS_H__
|
||||
|
||||
# include "platform_types.h"
|
||||
# include "platform_constants.h"
|
||||
# include "rrm_constants.h"
|
||||
# include "rlc.h"
|
||||
|
||||
typedef volatile struct {
|
||||
uint32_t e_r;
|
||||
int timer_poll;
|
||||
int timer_poll_prohibit;
|
||||
int timer_discard;
|
||||
int timer_poll_periodic;
|
||||
int timer_status_prohibit;
|
||||
int timer_status_periodic;
|
||||
int timer_rst;
|
||||
int timer_mrw;
|
||||
int missing_pdu_indicator;
|
||||
uint32_t pdu_size;
|
||||
// int in_sequence_delivery; // not implemented
|
||||
uint8_t max_rst;
|
||||
uint8_t max_dat;
|
||||
uint16_t poll_pdu;
|
||||
uint16_t poll_sdu;
|
||||
uint8_t poll_window;
|
||||
uint32_t tx_window_size;
|
||||
uint32_t rx_window_size;
|
||||
uint8_t max_mrw;
|
||||
uint8_t last_transmission_pdu_poll_trigger;
|
||||
uint8_t last_retransmission_pdu_poll_trigger;
|
||||
enum RLC_SDU_DISCARD_MODE sdu_discard_mode;
|
||||
uint32_t send_mrw;
|
||||
} AM;
|
||||
|
||||
typedef volatile struct {
|
||||
uint32_t e_r;
|
||||
uint32_t timer_discard;
|
||||
uint32_t sdu_discard_mode;
|
||||
uint32_t segmentation_indication;
|
||||
uint32_t delivery_of_erroneous_sdu;
|
||||
} TM;
|
||||
|
||||
typedef volatile struct {
|
||||
uint32_t e_r;
|
||||
uint32_t timer_discard;
|
||||
uint32_t sdu_discard_mode;
|
||||
} UM;
|
||||
|
||||
typedef volatile struct {
|
||||
uint8_t logch_identity;
|
||||
uint8_t mac_logch_priority;
|
||||
} MAP_INFO;
|
||||
|
||||
typedef volatile struct {
|
||||
uint32_t rlc_mode;
|
||||
AM am;
|
||||
TM tm;
|
||||
UM um;
|
||||
} RLC_INFO;
|
||||
|
||||
typedef volatile struct {
|
||||
int header_compression_algorithm;
|
||||
} PDCP_INFO;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef volatile struct {
|
||||
rb_type_t rb_type;
|
||||
RLC_INFO rlc_info;
|
||||
PDCP_INFO pdcp_info;
|
||||
uint16_t rb_id;
|
||||
// Added for OPENAIR MAC
|
||||
//LCHAN_DESC Lchan_desc;
|
||||
|
||||
} RADIOBEARER;
|
||||
|
||||
|
||||
typedef volatile struct {
|
||||
int TIMER300;
|
||||
int TIMER302;
|
||||
int TIMER305;
|
||||
int TIMER307;
|
||||
int TIMER308;
|
||||
int TIMER312;
|
||||
int TIMER313;
|
||||
int TIMER314;
|
||||
int TIMER315;
|
||||
} L3TIMERS_;
|
||||
|
||||
typedef volatile struct {
|
||||
int COUNTERN300;
|
||||
int COUNTERN302;
|
||||
int COUNTERN308;
|
||||
int COUNTERN312;
|
||||
int COUNTERN313;
|
||||
} L3COUNTERS_;
|
||||
|
||||
|
||||
typedef volatile struct {
|
||||
int MaxNumRemote;
|
||||
L3TIMERS_ Timers;
|
||||
L3COUNTERS_ Counters;
|
||||
} L3_;
|
||||
|
||||
|
||||
typedef volatile struct {
|
||||
uint8_t rrm_action; // ACTION_NULL,ADD,REMOVE,MODIFY
|
||||
uint8_t rrm_element; // rb,trch,cctrch
|
||||
uint8_t rrm_element_index; // rb/trch/cctrch index
|
||||
} RRM_COMMAND_MT;
|
||||
|
||||
typedef volatile struct {
|
||||
uint8_t rrm_action; // ACTION_NULL,ADD,REMOVE,MODIFY
|
||||
uint8_t mobile;
|
||||
uint8_t rrm_element; // rb,trch,cctrch
|
||||
uint8_t rrm_element_index; // rb/trch/cctrch index
|
||||
} RRM_COMMAND_RG;
|
||||
|
||||
|
||||
typedef volatile struct {
|
||||
uint8_t nb_commands;
|
||||
RRM_COMMAND_RG rrm_commands[JRRM_MAX_COMMANDS_PER_TRANSACTION];
|
||||
|
||||
|
||||
RADIOBEARER bearer[MAX_RB_RG];
|
||||
L3_ L3;
|
||||
|
||||
} RG_CONFIG;
|
||||
|
||||
typedef volatile struct {
|
||||
uint8_t nb_commands;
|
||||
RRM_COMMAND_MT rrm_commands[JRRM_MAX_COMMANDS_PER_TRANSACTION];
|
||||
|
||||
RADIOBEARER bearer[MAX_RB_MOBILE];
|
||||
L3_ L3;
|
||||
|
||||
} MT_CONFIG;
|
||||
|
||||
# ifdef NODE_RG
|
||||
typedef volatile struct {
|
||||
RG_CONFIG rg_config;
|
||||
MT_CONFIG mt_config[MAX_MOBILES_PER_RG];
|
||||
} RRM_VARS;
|
||||
|
||||
# else
|
||||
/* NODE_RG */
|
||||
typedef volatile struct {
|
||||
MT_CONFIG mt_config[MAX_MANAGED_RG_PER_MOBILE];
|
||||
|
||||
|
||||
|
||||
} RRM_VARS;
|
||||
# endif
|
||||
/* NODE_RG */
|
||||
//typedef MT_CONFIG MAIN_MOBILE ;
|
||||
//typedef RG_CONFIG MAIN_RADIO_GATEWAY;
|
||||
|
||||
# endif
|
||||
#endif
|
||||
@@ -55,7 +55,7 @@
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc"
|
||||
#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd"
|
||||
#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd"
|
||||
#define CONFIG_STRING_MACRLC_ULSCH_MAX_SLOTS_INACTIVITY "ulsch_max_slots_inactivity"
|
||||
#define CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY "ulsch_max_frame_inactivity"
|
||||
#define CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10 "pusch_TargetSNRx10"
|
||||
#define CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10 "pucch_TargetSNRx10"
|
||||
#define CONFIG_STRING_MACRLC_PUCCHFAILURETHRES "pucch_FailureThres"
|
||||
@@ -83,7 +83,7 @@
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_ULSCH_MAX_SLOTS_INACTIVITY, "Maximum number of slots before a UE is scheduled ULSCH due to inactivity", 0, uptr:NULL, defintval:200, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_ULSCH_MAX_FRAME_INACTIVITY, NULL, 0, uptr:NULL, defintval:10, TYPE_UINT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_PUSCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:200, TYPE_INT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_PUCCHTARGETSNRX10, NULL, 0, iptr:NULL, defintval:150, TYPE_INT, 0}, \
|
||||
{CONFIG_STRING_MACRLC_PUCCHFAILURETHRES, NULL, 0, iptr:NULL, defintval:10, TYPE_INT, 0}, \
|
||||
@@ -106,7 +106,7 @@
|
||||
#define MACRLC_REMOTE_S_PORTC_IDX 14
|
||||
#define MACRLC_LOCAL_S_PORTD_IDX 15
|
||||
#define MACRLC_REMOTE_S_PORTD_IDX 16
|
||||
#define MACRLC_ULSCH_MAX_SLOTS_INACTIVITY 17
|
||||
#define MACRLC_ULSCH_MAX_FRAME_INACTIVITY 17
|
||||
#define MACRLC_PUSCHTARGETSNRX10_IDX 18
|
||||
#define MACRLC_PUCCHTARGETSNRX10_IDX 19
|
||||
#define MACRLC_PUCCHFAILURETHRES_IDX 20
|
||||
|
||||
@@ -754,7 +754,7 @@ void RCconfig_nr_macrlc() {
|
||||
}else { // other midhaul
|
||||
AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
|
||||
}
|
||||
RC.nrmac[j]->ulsch_max_slots_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_SLOTS_INACTIVITY].uptr);
|
||||
RC.nrmac[j]->ulsch_max_frame_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_FRAME_INACTIVITY].uptr);
|
||||
RC.nrmac[j]->num_ulprbbl = num_prbbl;
|
||||
LOG_I(NR_MAC,"Blacklisted PRBS %d\n",num_prbbl);
|
||||
memcpy(RC.nrmac[j]->ulprbbl,prbbl,275*sizeof(prbbl[0]));
|
||||
|
||||
@@ -42,10 +42,7 @@
|
||||
#include "ngap_messages_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
|
||||
#ifdef CMAKER
|
||||
#include "rrc_messages_types.h"
|
||||
#endif
|
||||
|
||||
#include "intertask_interface.h"
|
||||
#include "RRC/NR/nr_rrc_defs.h"
|
||||
|
||||
|
||||
@@ -9,11 +9,9 @@
|
||||
*/
|
||||
#ifndef __LAYER2_MAC_DEFS_NB_IOT_H__
|
||||
#define __LAYER2_MAC_DEFS_NB_IOT_H__
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
//#include "COMMON/openair_defs.h"
|
||||
#include "COMMON/platform_constants.h"
|
||||
#include "COMMON/mac_rrc_primitives.h"
|
||||
|
||||
@@ -105,13 +105,11 @@ eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_EN
|
||||
eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_ENB]; // eNBxUE = 8x8
|
||||
|
||||
|
||||
#ifdef OPENAIR2
|
||||
unsigned char NB_eNB_INST = 0;
|
||||
uint16_t NB_UE_INST = 0;
|
||||
uint16_t NB_THREAD_INST = 0;
|
||||
unsigned char NB_RN_INST = 0;
|
||||
unsigned char NB_INST = 0;
|
||||
#endif
|
||||
|
||||
|
||||
DCI0_5MHz_TDD_1_6_t UL_alloc_pdu;
|
||||
|
||||
@@ -77,13 +77,6 @@ static int mbms_mch_i=0;
|
||||
//static int num_msi_per_CSA[28];
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
#ifndef USER_MODE
|
||||
#define msg debug_msg
|
||||
#endif
|
||||
*/
|
||||
|
||||
mapping BSR_names[] = {
|
||||
{"NONE", 0},
|
||||
{"SHORT BSR", 1},
|
||||
@@ -1251,65 +1244,6 @@ int ue_query_mch_fembms(module_id_t module_idP, uint8_t CC_id, uint32_t frameP,
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef OLD
|
||||
// Acount for sf_allocable in CSA
|
||||
int num_sf_alloc = 0;
|
||||
|
||||
for (l = 0; l < 8; l++) {
|
||||
if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l] == NULL)
|
||||
continue;
|
||||
|
||||
if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.present != LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame)
|
||||
continue;
|
||||
|
||||
uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.choice.oneFrame.buf[0];
|
||||
|
||||
|
||||
for (j = 0; j < 6; j++)
|
||||
num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x80 >> j)) == (0x80 >> j));
|
||||
//num_sf_alloc=1;
|
||||
}
|
||||
|
||||
num_sf_alloc = 10;
|
||||
|
||||
num_non_mbsfn_SubframeConfig = (UE_mac_inst[module_idP].non_mbsfn_SubframeConfig->subframeAllocation_r14.buf[0]<<1 | UE_mac_inst[module_idP].non_mbsfn_SubframeConfig->subframeAllocation_r14.buf[0]>>7);
|
||||
int ones=0;
|
||||
for(j=0; j < 16; j++){
|
||||
if(num_non_mbsfn_SubframeConfig & 1)
|
||||
ones++;
|
||||
num_non_mbsfn_SubframeConfig>>=1;
|
||||
}
|
||||
|
||||
for (l = 0; l < 28; l++) {
|
||||
if (UE_mac_inst[module_idP].pmch_stop_mtch[l] >= 1/*num_sf_alloc*/) {
|
||||
if (UE_mac_inst[module_idP].pmch_stop_mtch[l] != 2047) {
|
||||
if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL){
|
||||
mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9;
|
||||
//int common_mbsfn_alloc_offset = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationOffset;
|
||||
long common_mbsfn_period = 1 << UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationPeriod;
|
||||
long commonSF_AllocPeriod = 4 << UE_mac_inst[module_idP].commonSF_AllocPeriod_r9;
|
||||
if(UE_mac_inst[module_idP].common_num_sf_alloc >= UE_mac_inst[module_idP].pmch_stop_mtch[l]){
|
||||
//LOG_E(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);
|
||||
|
||||
mtch_mcs = -1;
|
||||
}/*else
|
||||
OG_W(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);*/
|
||||
LOG_D(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d num_sf_alloc %d commonSF_AllocPeriod %ld, common_mbsfn_period %ld num_non_mbsfn_SubframeConfig %x ones %d\n",UE_mac_inst[module_idP].common_num_sf_alloc,num_sf_alloc, commonSF_AllocPeriod,common_mbsfn_period,num_non_mbsfn_SubframeConfig,ones);
|
||||
UE_mac_inst[module_idP].common_num_sf_alloc++;
|
||||
UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period-(1+ones)*(commonSF_AllocPeriod/4)); //TODO
|
||||
}
|
||||
else
|
||||
mtch_mcs = -1;
|
||||
|
||||
mch_lcid = (uint8_t)l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
// Acount for sf_allocable in Common SF Allocation
|
||||
int num_sf_alloc = 0;
|
||||
@@ -1869,49 +1803,7 @@ int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_
|
||||
//}
|
||||
}
|
||||
|
||||
#ifdef OLD
|
||||
// Acount for sf_allocable in CSA
|
||||
int num_sf_alloc = 0;
|
||||
|
||||
for (l = 0; l < 8; l++) {
|
||||
if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l] == NULL)
|
||||
continue;
|
||||
|
||||
if (UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.present != LTE_MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame)
|
||||
continue;
|
||||
|
||||
uint32_t common_mbsfn_SubframeConfig = UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[l]->subframeAllocation.choice.oneFrame.buf[0];
|
||||
|
||||
for (j = 0; j < 6; j++)
|
||||
num_sf_alloc += ((common_mbsfn_SubframeConfig & (0x80 >> j)) == (0x80 >> j));
|
||||
//num_sf_alloc=1;
|
||||
}
|
||||
|
||||
for (l = 0; l < 28; l++) {
|
||||
if (UE_mac_inst[module_idP].pmch_stop_mtch[l] >= 1/*num_sf_alloc*/) {
|
||||
if (UE_mac_inst[module_idP].pmch_stop_mtch[l] != 2047) {
|
||||
if (UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch] != NULL){
|
||||
mtch_mcs = UE_mac_inst[module_idP].pmch_Config[UE_mac_inst[module_idP].msi_pmch]->dataMCS_r9;
|
||||
long common_mbsfn_period = 1 << UE_mac_inst[module_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[0]->radioframeAllocationPeriod;
|
||||
long commonSF_AllocPeriod = 4 << UE_mac_inst[module_idP].commonSF_AllocPeriod_r9;
|
||||
if(UE_mac_inst[module_idP].common_num_sf_alloc >= UE_mac_inst[module_idP].pmch_stop_mtch[l]){
|
||||
//LOG_E(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);
|
||||
|
||||
mtch_mcs = -1;
|
||||
}/*else
|
||||
LOG_W(MAC,"Attemp to UE_mac_inst[module_idP].common_num_sf_alloc %d\n",UE_mac_inst[module_idP].common_num_sf_alloc);*/
|
||||
UE_mac_inst[module_idP].common_num_sf_alloc++;
|
||||
UE_mac_inst[module_idP].common_num_sf_alloc = UE_mac_inst[module_idP].common_num_sf_alloc % (num_sf_alloc * commonSF_AllocPeriod / common_mbsfn_period);
|
||||
}
|
||||
else
|
||||
mtch_mcs = -1;
|
||||
|
||||
mch_lcid = (uint8_t)l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
// Acount for sf_allocable in Common SF Allocation
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
|
||||
#include "NR_SubcarrierSpacing.h"
|
||||
|
||||
#define NR_SHORT_BSR_TABLE_SIZE 32
|
||||
#define NR_LONG_BSR_TABLE_SIZE 256
|
||||
|
||||
#define TABLE_38213_13_1_NUM_INDEXES 15
|
||||
#define TABLE_38213_13_2_NUM_INDEXES 14
|
||||
#define TABLE_38213_13_3_NUM_INDEXES 9
|
||||
@@ -65,6 +68,11 @@ typedef enum frequency_range_e {
|
||||
FR2
|
||||
} frequency_range_t;
|
||||
|
||||
#define NR_BSR_TRIGGER_NONE (0) /* No BSR Trigger */
|
||||
#define NR_BSR_TRIGGER_REGULAR (1) /* For Regular and ReTxBSR Expiry Triggers */
|
||||
#define NR_BSR_TRIGGER_PERIODIC (2) /* For BSR Periodic Timer Expiry Trigger */
|
||||
#define NR_BSR_TRIGGER_PADDING (4) /* For Padding BSR Trigger */
|
||||
|
||||
// For both DL/UL-SCH
|
||||
// Except:
|
||||
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
|
||||
|
||||
@@ -48,6 +48,33 @@ void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
|
||||
}
|
||||
}
|
||||
|
||||
//38.321 Table 6.1.3.1-1
|
||||
const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE] = {
|
||||
0, 10, 14, 20, 28, 38, 53, 74,
|
||||
102, 142, 198, 276, 384, 535, 745, 1038,
|
||||
1446, 2014, 2806, 3909, 5446, 7587, 10570, 14726,
|
||||
20516, 28581, 39818, 55474, 77284, 107669, 150000, 300000
|
||||
};
|
||||
|
||||
//38.321 Table 6.1.3.1-2
|
||||
const uint32_t NR_LONG_BSR_TABLE[NR_LONG_BSR_TABLE_SIZE] ={
|
||||
0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
|
||||
28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 62, 66, 71,
|
||||
75, 80, 85, 91, 97, 103, 110, 117, 124, 132, 141, 150, 160, 170, 181, 193,
|
||||
205, 218, 233, 248, 264, 281, 299, 318, 339, 361, 384, 409, 436, 464, 494, 526,
|
||||
560, 597, 635, 677, 720, 767, 817, 870, 926, 987, 1051, 1119, 1191, 1269, 1351, 1439,
|
||||
1532, 1631, 1737, 1850, 1970, 2098, 2234, 2379, 2533, 2698, 2873, 3059, 3258, 3469, 3694, 3934,
|
||||
4189, 4461, 4751, 5059, 5387, 5737, 6109, 6506, 6928, 7378, 7857, 8367, 8910, 9488, 10104, 10760,
|
||||
11458, 12202, 12994, 13838, 14736, 15692, 16711, 17795, 18951, 20181, 21491, 22885, 24371, 25953, 27638, 29431,
|
||||
31342, 33376, 35543, 37850, 40307, 42923, 45709, 48676, 51836, 55200, 58784, 62599, 66663, 70990, 75598, 80505,
|
||||
85730, 91295, 97221, 103532, 110252, 117409, 125030, 133146, 141789, 150992, 160793, 171231, 182345, 194182, 206786, 220209,
|
||||
234503, 249725, 265935, 283197, 301579, 321155, 342002, 364202, 387842, 413018, 439827, 468377, 498780, 531156, 565634, 602350,
|
||||
641449, 683087, 727427, 774645, 824928, 878475, 935498, 996222, 1060888, 1129752, 1203085, 1281179, 1364342, 1452903, 1547213, 1647644,
|
||||
1754595, 1868488, 1989774, 2118933, 2256475, 2402946, 2558924, 2725027, 2901912, 3090279, 3290873, 3504487, 3731968, 3974215, 4232186, 4506902,
|
||||
4799451, 5110989, 5442750, 5796046, 6172275, 6572925, 6999582, 7453933, 7937777, 8453028, 9001725, 9586039, 10208280, 10870913, 11576557, 12328006,
|
||||
13128233, 13980403, 14887889, 15854280, 16883401, 17979324, 19146385, 20389201, 21712690, 23122088, 24622972, 26221280, 27923336, 29735875, 31666069, 33721553,
|
||||
35910462, 38241455, 40723756, 43367187, 46182206, 49179951, 52372284, 55771835, 59392055, 63247269, 67352729, 71724679, 76380419, 81338368, 162676736, 4294967295
|
||||
};
|
||||
|
||||
// start symbols for SSB types A,B,C,D,E
|
||||
uint16_t symbol_ssb_AC[8]={2,8,16,22,30,36,44,50};
|
||||
|
||||
@@ -76,6 +76,9 @@ extern boolean_t pre_scd_activeUE[NUMBER_OF_UE_MAX];
|
||||
extern eNB_UE_STATS pre_scd_eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
#endif*/
|
||||
|
||||
extern const uint32_t NR_SHORT_BSR_TABLE[NR_SHORT_BSR_TABLE_SIZE];
|
||||
extern const uint32_t NR_LONG_BSR_TABLE[NR_LONG_BSR_TABLE_SIZE];
|
||||
|
||||
// Type0-PDCCH search space
|
||||
extern const int32_t table_38213_13_1_c1[16];
|
||||
extern const int32_t table_38213_13_1_c2[16];
|
||||
|
||||
Executable → Regular
+26
-3
@@ -573,7 +573,7 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
||||
struct NR_PDCCH_Config__searchSpacesToAddModList *searchSpacesToAddModList = pdcch_Config->choice.setup->searchSpacesToAddModList;
|
||||
AssertFatal(searchSpacesToAddModList != NULL, "searchSpacesToAddModList is null\n");
|
||||
AssertFatal(searchSpacesToAddModList->list.count > 0, "list of UE specifically configured Search Spaces is empty\n");
|
||||
AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS_PER_CORESET, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
|
||||
AssertFatal(searchSpacesToAddModList->list.count < FAPI_NR_MAX_SS, "too many searchpaces per coreset %d\n", searchSpacesToAddModList->list.count);
|
||||
|
||||
struct NR_UplinkConfig__uplinkBWP_ToAddModList *uplinkBWP_ToAddModList = scd->uplinkConfig->uplinkBWP_ToAddModList;
|
||||
if (ul_bwp_id > 0) {
|
||||
@@ -597,7 +597,7 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
||||
AssertFatal(*ss->controlResourceSetId == mac->coreset[dl_bwp_id][coreset_id - 1]->controlResourceSetId, "ss->controlResourceSetId is unknown\n");
|
||||
AssertFatal(ss->monitoringSymbolsWithinSlot != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot is null\n");
|
||||
AssertFatal(ss->monitoringSymbolsWithinSlot->buf != NULL, "NR_SearchSpace->monitoringSymbolsWithinSlot->buf is null\n");
|
||||
mac->SSpace[dl_bwp_id][0][ss_id] = ss;
|
||||
mac->SSpace[dl_bwp_id][ss_id] = ss;
|
||||
}
|
||||
|
||||
// Check available CSSs in the commonSearchSpaceList (list of additional common search spaces)
|
||||
@@ -610,11 +610,23 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
|
||||
AssertFatal(css->searchSpaceType != NULL, "css->searchSpaceType is null\n");
|
||||
AssertFatal(css->monitoringSymbolsWithinSlot != NULL, "css->monitoringSymbolsWithinSlot is null\n");
|
||||
AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
|
||||
mac->SSpace[dl_bwp_id][0][ss_id] = css;
|
||||
mac->SSpace[dl_bwp_id][ss_id] = css;
|
||||
ss_id++;
|
||||
}
|
||||
}
|
||||
|
||||
// todo handle mac_LogicalChannelConfig
|
||||
int nr_rrc_mac_config_req_ue_logicalChannelBearer(
|
||||
module_id_t module_id,
|
||||
int cc_idP,
|
||||
uint8_t gNB_index,
|
||||
long logicalChannelIdentity,
|
||||
boolean_t status){
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
|
||||
mac->logicalChannelBearer_exist[logicalChannelIdentity] = status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nr_rrc_mac_config_req_ue(
|
||||
module_id_t module_id,
|
||||
int cc_idP,
|
||||
@@ -678,6 +690,17 @@ int nr_rrc_mac_config_req_ue(
|
||||
LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
|
||||
mac->cg = cell_group_config;
|
||||
mac->servCellIndex = cell_group_config->spCellConfig->servCellIndex ? *cell_group_config->spCellConfig->servCellIndex : 0;
|
||||
|
||||
mac->scheduling_info.periodicBSR_SF =
|
||||
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||
mac->scheduling_info.retxBSR_SF =
|
||||
MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||
mac->BSR_reporting_active = NR_BSR_TRIGGER_NONE;
|
||||
LOG_D(MAC, "[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n",
|
||||
module_id,
|
||||
mac->scheduling_info.periodicBSR_SF,
|
||||
mac->scheduling_info.retxBSR_SF);
|
||||
|
||||
config_control_ue(mac);
|
||||
//config_common_ue(mac,module_id,cc_idP);
|
||||
/*
|
||||
|
||||
Executable → Regular
+12
-13
@@ -182,9 +182,9 @@ typedef struct {
|
||||
uint16_t All_lcid_buffer_size_lastTTI;
|
||||
/// buffer status for each lcid
|
||||
uint8_t LCID_status[NR_MAX_NUM_LCID];
|
||||
/// SR pending as defined in 36.321
|
||||
/// SR pending as defined in 38.321
|
||||
uint8_t SR_pending;
|
||||
/// SR_COUNTER as defined in 36.321
|
||||
/// SR_COUNTER as defined in 38.321
|
||||
uint16_t SR_COUNTER;
|
||||
/// logical channel group ide for each LCID
|
||||
uint8_t LCGID[NR_MAX_NUM_LCID];
|
||||
@@ -328,15 +328,6 @@ typedef struct {
|
||||
|
||||
} RAR_grant_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
uint8_t phr_reporting;
|
||||
uint16_t truncated_bsr;
|
||||
uint16_t short_bsr;
|
||||
uint16_t long_bsr;
|
||||
|
||||
} NR_UE_MAC_CE_t;
|
||||
|
||||
typedef struct {
|
||||
int n_HARQ_ACK;
|
||||
uint32_t ack_payload;
|
||||
@@ -353,6 +344,7 @@ typedef struct {
|
||||
int8_t delta_pucch;
|
||||
} PUCCH_sched_t;
|
||||
|
||||
|
||||
/*!\brief Top level UE MAC structure */
|
||||
typedef struct {
|
||||
|
||||
@@ -375,7 +367,7 @@ typedef struct {
|
||||
NR_BWP_Downlink_t *DLbwp[MAX_NUM_BWP];
|
||||
NR_BWP_Uplink_t *ULbwp[MAX_NUM_BWP];
|
||||
NR_ControlResourceSet_t *coreset[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP];
|
||||
NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_CORESET_PER_BWP][FAPI_NR_MAX_SS_PER_CORESET];
|
||||
NR_SearchSpace_t *SSpace[MAX_NUM_BWP][FAPI_NR_MAX_SS];
|
||||
|
||||
lte_frame_type_t frame_type;
|
||||
|
||||
@@ -419,8 +411,15 @@ typedef struct {
|
||||
nr_ue_if_module_t *if_module;
|
||||
nr_phy_config_t phy_config;
|
||||
|
||||
/// BSR report flag management
|
||||
uint8_t BSR_reporting_active;
|
||||
|
||||
/// LogicalChannelConfig has bearer.
|
||||
boolean_t logicalChannelBearer_exist[NR_MAX_NUM_LCID];
|
||||
NR_UE_SCHEDULING_INFO scheduling_info;
|
||||
NR_UE_MAC_CE_t nr_ue_mac_ce;
|
||||
|
||||
/// PHR
|
||||
uint8_t PHR_reporting_active;
|
||||
|
||||
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config;
|
||||
NR_SearchSpace_t *search_space_zero;
|
||||
|
||||
Executable → Regular
+73
-3
@@ -40,6 +40,10 @@
|
||||
#define NR_DL_MAX_DAI (4) /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
|
||||
#define NR_DL_MAX_NB_CW (2) /* number of downlink code word */
|
||||
|
||||
/**\brief initialize the field in nr_mac instance
|
||||
\param module_id module id */
|
||||
void nr_ue_init_mac(module_id_t module_idP);
|
||||
|
||||
/**\brief decode mib pdu in NR_UE, from if_module ul_ind with P7 tx_ind message
|
||||
\param module_id module id
|
||||
\param cc_id component carrier id
|
||||
@@ -74,6 +78,20 @@ int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id,
|
||||
uint8_t *pduP,
|
||||
uint32_t pdu_len);
|
||||
|
||||
/**\brief primitive from RRC layer to MAC layer to set if bearer exists for a logical channel. todo handle mac_LogicalChannelConfig
|
||||
\param module_id module id
|
||||
\param cc_id component carrier id
|
||||
\param gNB_index gNB index
|
||||
\param long logicalChannelIdentity
|
||||
\param boolean_t status*/
|
||||
int nr_rrc_mac_config_req_ue_logicalChannelBearer(
|
||||
module_id_t module_id,
|
||||
int cc_idP,
|
||||
uint8_t gNB_index,
|
||||
long logicalChannelIdentity,
|
||||
boolean_t status
|
||||
);
|
||||
|
||||
/**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config)
|
||||
\param module_id module id
|
||||
\param cc_id component carrier id
|
||||
@@ -125,7 +143,53 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
|
||||
int slot,
|
||||
int thread_id);
|
||||
|
||||
int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP);
|
||||
/*! \fn int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
|
||||
\brief Called by PHY to get sdu for PUSCH transmission. It performs the following operations: Checks BSR for DCCH, DCCH1 and DTCH corresponding to previous values computed either in SR or BSR procedures. It gets rlc status indications on DCCH,DCCH1 and DTCH and forms BSR elements and PHR in MAC header. CRNTI element is not supported yet. It computes transport block for up to 3 SDUs and generates header and forms the complete MAC SDU.
|
||||
\param[in] Mod_id Instance id of UE in machine
|
||||
\param[in] frameP subframe number
|
||||
\param[in] slotP slot number
|
||||
*/
|
||||
int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
|
||||
|
||||
/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index)
|
||||
\brief get the rlc stats and update the bsr level for each lcid
|
||||
\param[in] Mod_id instance of the UE
|
||||
\param[in] frameP Frame index
|
||||
\param[in] slot slotP number
|
||||
\param[in] uint8_t gNB_index
|
||||
*/
|
||||
boolean_t nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index);
|
||||
|
||||
/*! \fn nr_locate_BsrIndexByBufferSize (int *table, int size, int value)
|
||||
\brief locate the BSR level in the table as defined in 38.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table.
|
||||
\param[in] *table Pointer to BSR table
|
||||
\param[in] size Size of the table
|
||||
\param[in] value Value of the buffer
|
||||
\return the index in the BSR_LEVEL table
|
||||
*/
|
||||
uint8_t nr_locate_BsrIndexByBufferSize(const uint32_t *table, int size,
|
||||
int value);
|
||||
|
||||
/*! \fn int nr_get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer)
|
||||
\brief get the number of subframe from the periodic BSR timer configured by the higher layers
|
||||
\param[in] periodicBSR_Timer timer for periodic BSR
|
||||
\return the number of subframe
|
||||
*/
|
||||
int nr_get_sf_periodicBSRTimer(uint8_t bucketSize);
|
||||
|
||||
/*! \fn int nr_get_ms_bucketsizeduration(uint8_t bucketSize)
|
||||
\brief get the time in ms form the bucket size duration configured by the higher layer
|
||||
\param[in] bucketSize the bucket size duration
|
||||
\return the time in ms
|
||||
*/
|
||||
int nr_get_ms_bucketsizeduration(uint8_t bucketsizeduration);
|
||||
|
||||
/*! \fn int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer)
|
||||
\brief get the number of subframe form the bucket size duration configured by the higher layer
|
||||
\param[in] retxBSR_Timer timer for regular BSR
|
||||
\return the time in sf
|
||||
*/
|
||||
int nr_get_sf_retxBSRTimer(uint8_t retxBSR_Timer);
|
||||
|
||||
int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind);
|
||||
int nr_ue_process_dci_indication_pdu(module_id_t module_id, int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
|
||||
@@ -170,7 +234,13 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||
int pdu_id);
|
||||
|
||||
int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
||||
NR_UE_MAC_INST_t *mac);
|
||||
NR_UE_MAC_INST_t *mac,
|
||||
uint8_t power_headroom, // todo: NR_POWER_HEADROOM_CMD *power_headroom,
|
||||
uint16_t *crnti,
|
||||
NR_BSR_SHORT *truncated_bsr,
|
||||
NR_BSR_SHORT *short_bsr,
|
||||
NR_BSR_LONG *long_bsr
|
||||
);
|
||||
|
||||
void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
|
||||
|
||||
@@ -330,7 +400,7 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot);
|
||||
If the UE is not in PUSCH mode for a particular eNB index, this is assumed to be an Msg3 and MAC
|
||||
attempts to retrieves the CCCH message from RRC. If the UE is in PUSCH mode for a particular eNB
|
||||
index and PUCCH format 0 (Scheduling Request) is not activated, the MAC may use this resource for
|
||||
andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 36.321)
|
||||
andom-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 38.321)
|
||||
@param mod_id Index of UE instance
|
||||
@param CC_id Component Carrier Index
|
||||
@param frame
|
||||
|
||||
@@ -52,8 +52,9 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
|
||||
//init mac here
|
||||
nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t),NB_NR_UE_MAC_INST);
|
||||
|
||||
for (int j=0;j<NB_NR_UE_MAC_INST;j++)
|
||||
for (int i=0;i<NR_MAX_HARQ_PROCESSES;i++) nr_ue_mac_inst[j].first_ul_tx[i]=1;
|
||||
for (int j=0;j<NB_NR_UE_MAC_INST;j++) {
|
||||
nr_ue_init_mac(j);
|
||||
}
|
||||
|
||||
|
||||
if (rrc_inst && rrc_inst->scell_group_config) {
|
||||
|
||||
@@ -740,7 +740,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
} else {
|
||||
|
||||
size_sdu = nr_write_ce_ulsch_pdu(pdu, mac);
|
||||
size_sdu = nr_write_ce_ulsch_pdu(pdu, mac, 0, &(mac->crnti), NULL, NULL, NULL);
|
||||
pdu += size_sdu;
|
||||
ra->Msg3_size = size_sdu;
|
||||
|
||||
|
||||
@@ -76,7 +76,6 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
|
||||
void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id){
|
||||
|
||||
uint16_t monitoringSymbolsWithinSlot = 0;
|
||||
uint8_t coreset_id = 1;
|
||||
int sps = 0;
|
||||
|
||||
AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n");
|
||||
@@ -97,11 +96,23 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
|
||||
NR_SearchSpace_t *ss;
|
||||
NR_ControlResourceSet_t *coreset;
|
||||
if(ss_id>=0) {
|
||||
ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
|
||||
if (rnti_type == NR_RNTI_TC || rnti_type == NR_RNTI_RA) {
|
||||
ss = mac->ra.ss;
|
||||
AssertFatal(mac->ra.ss->searchSpaceId == ss_id,"Search Space id %d does not correspond to the one in ra->ss %ld for RA procedures\n",
|
||||
ss_id,mac->ra.ss->searchSpaceId);
|
||||
}
|
||||
else
|
||||
ss = mac->SSpace[bwp_id][ss_id];
|
||||
}
|
||||
else
|
||||
ss = mac->search_space_zero;
|
||||
|
||||
uint8_t coreset_id = *ss->controlResourceSetId;
|
||||
|
||||
if(coreset_id>0) {
|
||||
coreset = mac->coreset[bwp_id][coreset_id - 1];
|
||||
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
|
||||
} else {
|
||||
ss = mac->search_space_zero;
|
||||
coreset = mac->coreset0;
|
||||
if(rnti_type == NR_RNTI_SI) {
|
||||
rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1;
|
||||
@@ -255,7 +266,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
||||
RA_config_t *ra = &mac->ra;
|
||||
int ss_id;
|
||||
|
||||
uint8_t bwp_id = (mac->cg) ? mac->DL_BWP_Id : 0, coreset_id = (mac->cg) ? 1 : 0;
|
||||
uint8_t bwp_id = (mac->cg) ? mac->DL_BWP_Id : 0;
|
||||
//NR_ServingCellConfig_t *scd = mac->scg->spCellConfig->spCellConfigDedicated;
|
||||
NR_BWP_DownlinkDedicated_t *bwpd = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Dedicated : mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
|
||||
NR_BWP_DownlinkCommon_t *bwp_Common = (bwp_id>0) ? mac->DLbwp[bwp_id-1]->bwp_Common : &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
|
||||
@@ -264,9 +275,9 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
||||
|
||||
// loop over all available SS for CORESET ID 1
|
||||
if (bwpd) {
|
||||
for (ss_id = 0; ss_id < FAPI_NR_MAX_SS_PER_CORESET && mac->SSpace[bwp_id][coreset_id - 1][ss_id] != NULL; ss_id++){
|
||||
for (ss_id = 0; ss_id < FAPI_NR_MAX_SS && mac->SSpace[bwp_id][ss_id] != NULL; ss_id++){
|
||||
LOG_D(NR_MAC, "[DCI_CONFIG] ss_id %d\n",ss_id);
|
||||
NR_SearchSpace_t *ss = mac->SSpace[bwp_id][coreset_id - 1][ss_id];
|
||||
NR_SearchSpace_t *ss = mac->SSpace[bwp_id][ss_id];
|
||||
fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
||||
NR_SetupRelease_PDCCH_ConfigCommon_t *pdcch_ConfigCommon = bwp_Common->pdcch_ConfigCommon;
|
||||
struct NR_PhysicalCellGroupConfig *phy_cgc = mac->cg->physicalCellGroupConfig;
|
||||
|
||||
@@ -134,6 +134,55 @@ const initial_pucch_resource_t initial_pucch_resource[16] = {
|
||||
};
|
||||
|
||||
|
||||
void nr_ue_init_mac(module_id_t module_idP) {
|
||||
int i;
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
// default values as deined in 38.331 sec 9.2.2
|
||||
LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP);
|
||||
//mac->scheduling_info.macConfig=NULL;
|
||||
mac->scheduling_info.retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf10240;
|
||||
mac->scheduling_info.periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_infinity;
|
||||
// mac->scheduling_info.periodicPHR_Timer = NR_MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
|
||||
// mac->scheduling_info.prohibitPHR_Timer = NR_MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
|
||||
// mac->scheduling_info.PathlossChange_db = NR_MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
|
||||
// mac->PHR_state = NR_MAC_MainConfig__phr_Config_PR_setup;
|
||||
mac->scheduling_info.SR_COUNTER = 0;
|
||||
mac->scheduling_info.sr_ProhibitTimer = 0;
|
||||
mac->scheduling_info.sr_ProhibitTimer_Running = 0;
|
||||
// mac->scheduling_info.maxHARQ_Tx = NR_MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
|
||||
// mac->scheduling_info.ttiBundling = 0;
|
||||
// mac->scheduling_info.extendedBSR_Sizes_r10 = 0;
|
||||
// mac->scheduling_info.extendedPHR_r10 = 0;
|
||||
// mac->scheduling_info.drx_config = NULL;
|
||||
// mac->scheduling_info.phr_config = NULL;
|
||||
// set init value 0xFFFF, make sure periodic timer and retx time counters are NOT active, after bsr transmission set the value configured by the NW.
|
||||
mac->scheduling_info.periodicBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||
mac->scheduling_info.retxBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING;
|
||||
mac->BSR_reporting_active = BSR_TRIGGER_NONE;
|
||||
// mac->scheduling_info.periodicPHR_SF = nr_get_sf_perioidicPHR_Timer(mac->scheduling_info.periodicPHR_Timer);
|
||||
// mac->scheduling_info.prohibitPHR_SF = nr_get_sf_prohibitPHR_Timer(mac->scheduling_info.prohibitPHR_Timer);
|
||||
// mac->scheduling_info.PathlossChange_db = nr_get_db_dl_PathlossChange(mac->scheduling_info.PathlossChange);
|
||||
// mac->PHR_reporting_active = 0;
|
||||
|
||||
for (i = 0; i < NR_MAX_NUM_LCID; i++) {
|
||||
LOG_D(NR_MAC, "[UE%d] Applying default logical channel config for LCGID %d\n",
|
||||
module_idP, i);
|
||||
mac->scheduling_info.Bj[i] = -1;
|
||||
mac->scheduling_info.bucket_size[i] = -1;
|
||||
|
||||
if (i < UL_SCH_LCID_DTCH) { // initialize all control channels lcgid to 0
|
||||
mac->scheduling_info.LCGID[i] = 0;
|
||||
} else { // initialize all the data channels lcgid to 1
|
||||
mac->scheduling_info.LCGID[i] = 1;
|
||||
}
|
||||
|
||||
mac->scheduling_info.LCID_status[i] = LCID_EMPTY;
|
||||
mac->scheduling_info.LCID_buffer_remain[i] = 0;
|
||||
for (int i=0;i<NR_MAX_HARQ_PROCESSES;i++) mac->first_ul_tx[i]=1;
|
||||
}
|
||||
}
|
||||
|
||||
void get_bwp_info(NR_UE_MAC_INST_t *mac,
|
||||
int dl_bwp_id,
|
||||
int ul_bwp_id,
|
||||
@@ -2202,9 +2251,54 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
|
||||
return false;
|
||||
}
|
||||
|
||||
int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){
|
||||
// no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti
|
||||
DevCheck(module_idP < (int) NB_UE_INST, module_idP, NB_NR_UE_MAC_INST, 0);
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
DSR_TRANSMAX_t dsr_TransMax = sr_n64; // todo
|
||||
LOG_D(NR_MAC, "[UE %d] Frame %d slot %d send SR indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n",
|
||||
module_idP, frameP, slot,
|
||||
mac->scheduling_info.SR_COUNTER,
|
||||
(1 << (2 + dsr_TransMax)),
|
||||
mac->scheduling_info.SR_pending); // todo
|
||||
|
||||
int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP){
|
||||
return 0;
|
||||
if ((mac->scheduling_info.SR_pending == 1) &&
|
||||
(mac->scheduling_info.SR_COUNTER < (1 << (2 + dsr_TransMax)))) {
|
||||
LOG_D(NR_MAC, "[UE %d] Frame %d slot %d PHY asks for SR (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d, increment SR_COUNTER\n",
|
||||
module_idP, frameP, slot,
|
||||
mac->scheduling_info.SR_COUNTER,
|
||||
(1 << (2 + dsr_TransMax)),
|
||||
mac->scheduling_info.SR_pending); // todo
|
||||
mac->scheduling_info.SR_COUNTER++;
|
||||
|
||||
// start the sr-prohibittimer : rel 9 and above
|
||||
if (mac->scheduling_info.sr_ProhibitTimer > 0) { // timer configured
|
||||
mac->scheduling_info.sr_ProhibitTimer--;
|
||||
mac->scheduling_info.
|
||||
sr_ProhibitTimer_Running = 1;
|
||||
} else {
|
||||
mac->scheduling_info.
|
||||
sr_ProhibitTimer_Running = 0;
|
||||
}
|
||||
//mac->ul_active =1;
|
||||
return (1); //instruct phy to signal SR
|
||||
} else {
|
||||
// notify RRC to relase PUCCH/SRS
|
||||
// clear any configured dl/ul
|
||||
// initiate RA
|
||||
if (mac->scheduling_info.SR_pending) {
|
||||
// release all pucch resource
|
||||
//mac->physicalConfigDedicated = NULL; // todo
|
||||
//mac->ul_active = 0; // todo
|
||||
mac->BSR_reporting_active =
|
||||
NR_BSR_TRIGGER_NONE;
|
||||
LOG_I(NR_MAC, "[UE %d] Release all SRs \n", module_idP);
|
||||
}
|
||||
|
||||
mac->scheduling_info.SR_pending = 0;
|
||||
mac->scheduling_info.SR_COUNTER = 0;
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3466,13 +3560,17 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
|
||||
* Return: number of written bytes
|
||||
*/
|
||||
int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
||||
NR_UE_MAC_INST_t *mac) {
|
||||
NR_UE_MAC_INST_t *mac,
|
||||
uint8_t power_headroom, // todo: NR_POWER_HEADROOM_CMD *power_headroom,
|
||||
uint16_t *crnti,
|
||||
NR_BSR_SHORT *truncated_bsr,
|
||||
NR_BSR_SHORT *short_bsr,
|
||||
NR_BSR_LONG *long_bsr) {
|
||||
|
||||
int mac_ce_len = 0;
|
||||
uint8_t mac_ce_size = 0;
|
||||
NR_UE_MAC_CE_t *nr_ue_mac_ce = &mac->nr_ue_mac_ce;
|
||||
|
||||
if (nr_ue_mac_ce->phr_reporting && mac->phr_Config != NULL) {
|
||||
uint8_t *pdu = mac_ce;
|
||||
if (power_headroom) {
|
||||
|
||||
// MAC CE fixed subheader
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
|
||||
@@ -3480,21 +3578,22 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
||||
mac_ce++;
|
||||
|
||||
// PHR MAC CE (1 octet)
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = 0;
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = power_headroom;
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R1 = 0;
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0;
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0; // todo
|
||||
((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R2 = 0;
|
||||
|
||||
// update pointer and length
|
||||
mac_ce_size = sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
|
||||
mac_ce += mac_ce_size;
|
||||
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
|
||||
LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : power_headroom pdu %p mac_ce %p b\n",
|
||||
pdu, mac_ce);
|
||||
}
|
||||
|
||||
if (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED) {
|
||||
if (crnti && (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED)) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, mac->crnti);
|
||||
LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, (*crnti));
|
||||
|
||||
// MAC CE fixed subheader
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
|
||||
@@ -3502,7 +3601,7 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
||||
mac_ce++;
|
||||
|
||||
// C-RNTI MAC CE (2 octets)
|
||||
*(uint16_t *) mac_ce = mac->crnti;
|
||||
*(uint16_t *) mac_ce = (*crnti);
|
||||
|
||||
// update pointer and length
|
||||
mac_ce_size = sizeof(uint16_t);
|
||||
@@ -3511,55 +3610,110 @@ int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
|
||||
|
||||
}
|
||||
|
||||
if (nr_ue_mac_ce->truncated_bsr) {
|
||||
if (truncated_bsr) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s: generating short truncated BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->truncated_bsr);
|
||||
|
||||
// MAC CE fixed subheader
|
||||
// MAC CE fixed subheader
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
|
||||
mac_ce++;
|
||||
|
||||
// Short truncated BSR MAC CE (1 octet)
|
||||
((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = 0;
|
||||
((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = 0;
|
||||
((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = truncated_bsr->Buffer_size;
|
||||
((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = truncated_bsr->LcgID;;
|
||||
|
||||
// update pointer and length
|
||||
mac_ce_size = sizeof(NR_BSR_SHORT_TRUNCATED);
|
||||
mac_ce += mac_ce_size;
|
||||
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : truncated_bsr Buffer_size %d LcgID %d pdu %p mac_ce %p\n",
|
||||
truncated_bsr->Buffer_size, truncated_bsr->LcgID, pdu, mac_ce);
|
||||
|
||||
} else if (nr_ue_mac_ce->short_bsr) {
|
||||
} else if (short_bsr) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s: generating short BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->short_bsr);
|
||||
|
||||
// MAC CE fixed subheader
|
||||
// MAC CE fixed subheader
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
|
||||
((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_BSR;
|
||||
mac_ce++;
|
||||
|
||||
// Short truncated BSR MAC CE (1 octet)
|
||||
((NR_BSR_SHORT *) mac_ce)->Buffer_size = nr_ue_mac_ce->short_bsr;
|
||||
((NR_BSR_SHORT *) mac_ce)->LcgID = 0;
|
||||
((NR_BSR_SHORT *) mac_ce)->Buffer_size = short_bsr->Buffer_size;
|
||||
((NR_BSR_SHORT *) mac_ce)->LcgID = short_bsr->LcgID;
|
||||
|
||||
// update pointer and length
|
||||
mac_ce_size = sizeof(NR_BSR_SHORT);
|
||||
mac_ce += mac_ce_size;
|
||||
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
|
||||
LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : short_bsr Buffer_size %d LcgID %d pdu %p mac_ce %p\n",
|
||||
short_bsr->Buffer_size, short_bsr->LcgID, pdu, mac_ce);
|
||||
} else if (long_bsr) {
|
||||
|
||||
} else if (nr_ue_mac_ce->long_bsr) {
|
||||
// MAC CE variable subheader
|
||||
// todo ch 6.1.3.1. TS 38.321
|
||||
// ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
|
||||
// ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
|
||||
// ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = UL_SCH_LCID_L_BSR;
|
||||
// ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = 0;
|
||||
// sh_size = 2;
|
||||
// MAC CE variable subheader
|
||||
// ch 6.1.3.1. TS 38.321
|
||||
((NR_MAC_SUBHEADER_SHORT *) mac_ce)->R = 0;
|
||||
((NR_MAC_SUBHEADER_SHORT *) mac_ce)->F = 0;
|
||||
((NR_MAC_SUBHEADER_SHORT *) mac_ce)->LCID = UL_SCH_LCID_L_BSR;
|
||||
|
||||
// Short truncated BSR MAC CE (1 octet)
|
||||
// ((NR_BSR_LONG *) mac_ce)->Buffer_size0 = short_bsr;
|
||||
// ((NR_BSR_LONG *) mac_ce)->LCGID0 = 0;
|
||||
// mac_ce_size = sizeof(NR_BSR_LONG); // size is variable
|
||||
NR_MAC_SUBHEADER_SHORT *mac_pdu_subheader_ptr = (NR_MAC_SUBHEADER_SHORT *) mac_ce;
|
||||
mac_ce += 2;
|
||||
|
||||
// Could move to nr_get_sdu()
|
||||
uint8_t *Buffer_size_ptr= (uint8_t*) mac_ce + 1;
|
||||
//int NR_BSR_LONG_SIZE = 1;
|
||||
if (long_bsr->Buffer_size0 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID0 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID0 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size0;
|
||||
}
|
||||
if (long_bsr->Buffer_size1 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID1 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID1 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size1;
|
||||
}
|
||||
if (long_bsr->Buffer_size2 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID2 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID2 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size2;
|
||||
}
|
||||
if (long_bsr->Buffer_size3 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID3 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID3 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size3;
|
||||
}
|
||||
if (long_bsr->Buffer_size4 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID4 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID4 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size4;
|
||||
}
|
||||
if (long_bsr->Buffer_size5 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID5 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID5 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size5;
|
||||
}
|
||||
if (long_bsr->Buffer_size6 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID6 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID6 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size6;
|
||||
}
|
||||
if (long_bsr->Buffer_size7 == 0) {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID7 = 0;
|
||||
} else {
|
||||
((NR_BSR_LONG *) mac_ce)->LcgID7 = 1;
|
||||
*Buffer_size_ptr++ = long_bsr->Buffer_size7;
|
||||
}
|
||||
((NR_MAC_SUBHEADER_SHORT *) mac_pdu_subheader_ptr)->L = mac_ce_size = (uint8_t*) Buffer_size_ptr - (uint8_t*) mac_ce;
|
||||
LOG_D(NR_MAC, "[UE] Generating ULSCH PDU : long_bsr size %d Lcgbit 0x%02x Buffer_size %d %d %d %d %d %d %d %d\n", mac_ce_size, *((uint8_t*) mac_ce),
|
||||
((NR_BSR_LONG *) mac_ce)->Buffer_size0, ((NR_BSR_LONG *) mac_ce)->Buffer_size1, ((NR_BSR_LONG *) mac_ce)->Buffer_size2, ((NR_BSR_LONG *) mac_ce)->Buffer_size3,
|
||||
((NR_BSR_LONG *) mac_ce)->Buffer_size4, ((NR_BSR_LONG *) mac_ce)->Buffer_size5, ((NR_BSR_LONG *) mac_ce)->Buffer_size6, ((NR_BSR_LONG *) mac_ce)->Buffer_size7);
|
||||
// update pointer and length
|
||||
mac_ce = Buffer_size_ptr;
|
||||
mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_SHORT);
|
||||
}
|
||||
|
||||
return mac_ce_len;
|
||||
|
||||
@@ -53,6 +53,8 @@
|
||||
|
||||
#include <executables/softmodem-common.h>
|
||||
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||
|
||||
static prach_association_pattern_t prach_assoc_pattern;
|
||||
static ssb_list_info_t ssb_list;
|
||||
|
||||
@@ -164,13 +166,26 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
|
||||
void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
|
||||
|
||||
NR_ServingCellConfigCommon_t *scc = mac->scc;
|
||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup;
|
||||
NR_BWP_UplinkDedicated_t *ubwpd=NULL;
|
||||
|
||||
if (mac->cg &&
|
||||
mac->cg->spCellConfig &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
|
||||
mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
|
||||
ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
|
||||
|
||||
NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[0] ?
|
||||
mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup :
|
||||
(ubwpd?
|
||||
ubwpd->pusch_Config->choice.setup:
|
||||
NULL);
|
||||
|
||||
long transformPrecoder;
|
||||
if (pusch_Config->transformPrecoder)
|
||||
if (pusch_Config && pusch_Config->transformPrecoder)
|
||||
transformPrecoder = *pusch_Config->transformPrecoder;
|
||||
else {
|
||||
if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
|
||||
if(scc && scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
|
||||
transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
|
||||
else
|
||||
transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
|
||||
@@ -904,7 +919,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
|
||||
if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
|
||||
rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
|
||||
config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
|
||||
config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , mac->ra.ss->searchSpaceId);
|
||||
fill_dci_search_candidates(mac->ra.ss, rel15);
|
||||
dl_config->number_pdus = 1;
|
||||
LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
|
||||
@@ -1004,10 +1019,324 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
|
||||
}
|
||||
}
|
||||
|
||||
if (dl_info) {
|
||||
return (CONNECTION_OK);
|
||||
}
|
||||
module_id_t mod_id = ul_info->module_id;
|
||||
frame_t txFrameP = ul_info->frame_tx;
|
||||
slot_t txSlotP = ul_info->slot_tx;
|
||||
|
||||
// Handle the SR/BSR procedures per subframe
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||
uint8_t gNB_indexP=0;
|
||||
|
||||
// Call BSR procedure as described in Section 5.4.5 in 38.321
|
||||
|
||||
// First check ReTxBSR Timer because it is always configured
|
||||
// Decrement ReTxBSR Timer if it is running and not null
|
||||
if ((mac->scheduling_info.retxBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) && (mac->scheduling_info.retxBSR_SF != 0)) {
|
||||
mac->scheduling_info.retxBSR_SF--;
|
||||
}
|
||||
|
||||
// Decrement Periodic Timer if it is running and not null
|
||||
if ((mac->scheduling_info.periodicBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) && (mac->scheduling_info.periodicBSR_SF != 0)) {
|
||||
mac->scheduling_info.periodicBSR_SF--;
|
||||
}
|
||||
|
||||
//Check whether Regular BSR is triggered
|
||||
if (nr_update_bsr(mod_id, txFrameP, txSlotP, gNB_indexP) == TRUE) {
|
||||
// call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures
|
||||
// outlined in Sections 5.4.4 an 5.4.5 of 38.321
|
||||
mac->scheduling_info.SR_pending = 1;
|
||||
// Regular BSR trigger
|
||||
mac->BSR_reporting_active |= NR_BSR_TRIGGER_REGULAR;
|
||||
LOG_D(NR_MAC, "[UE %d][BSR] Regular BSR Triggered Frame %d slot %d SR for PUSCH is pending\n",
|
||||
mod_id, txFrameP, txSlotP);
|
||||
}
|
||||
return UE_CONNECTION_OK;
|
||||
|
||||
}
|
||||
|
||||
boolean_t
|
||||
nr_update_bsr(module_id_t module_idP, frame_t frameP, slot_t slotP, uint8_t gNB_index) {
|
||||
mac_rlc_status_resp_t rlc_status;
|
||||
boolean_t bsr_regular_triggered = FALSE;
|
||||
uint8_t lcid;
|
||||
uint8_t lcgid;
|
||||
uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined
|
||||
uint32_t lcgid_buffer_remain[NR_MAX_NUM_LCGID] = {0,0,0,0,0,0,0,0};
|
||||
int32_t lcid_bytes_in_buffer[NR_MAX_NUM_LCID];
|
||||
/* Array for ordering LCID with data per decreasing priority order */
|
||||
uint8_t lcid_reordered_array[NR_MAX_NUM_LCID]=
|
||||
{NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
|
||||
NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
|
||||
NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
|
||||
NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,NR_MAX_NUM_LCID,
|
||||
};
|
||||
uint8_t pos_next = 0;
|
||||
//uint8_t highest_priority = 16;
|
||||
uint8_t array_index = 0;
|
||||
// Reset All BSR Infos
|
||||
lcid_bytes_in_buffer[0] = 0;
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
for (lcid=DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
|
||||
// Reset transmission status
|
||||
lcid_bytes_in_buffer[lcid] = 0;
|
||||
mac->scheduling_info.LCID_status[lcid]=LCID_EMPTY;
|
||||
}
|
||||
|
||||
for (lcgid=0; lcgid < NR_MAX_NUM_LCGID; lcgid++) {
|
||||
// Reset Buffer Info
|
||||
mac->scheduling_info.BSR[lcgid]=0;
|
||||
mac->scheduling_info.BSR_bytes[lcgid]=0;
|
||||
}
|
||||
|
||||
//Get Buffer Occupancy and fill lcid_reordered_array
|
||||
for (lcid=DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
|
||||
//if (mac->logicalChannelConfig[lcid]) {
|
||||
if (mac->logicalChannelBearer_exist[lcid] ) { // todo
|
||||
lcgid = mac->scheduling_info.LCGID[lcid];
|
||||
|
||||
// Store already available data to transmit per Group
|
||||
if (lcgid < NR_MAX_NUM_LCGID) {
|
||||
lcgid_buffer_remain[lcgid] += mac->scheduling_info.LCID_buffer_remain[lcid];
|
||||
}
|
||||
|
||||
rlc_status = mac_rlc_status_ind(module_idP, mac->crnti,gNB_index,frameP,slotP,ENB_FLAG_NO,MBMS_FLAG_NO, lcid, 0, 0);
|
||||
|
||||
lcid_bytes_in_buffer[lcid] = rlc_status.bytes_in_buffer;
|
||||
|
||||
if (rlc_status.bytes_in_buffer > 0) {
|
||||
LOG_D(NR_MAC,"[UE %d] PDCCH Tick : LCID%d LCGID%d has data to transmit =%d bytes at frame %d slot %d\n",
|
||||
module_idP, lcid,lcgid,rlc_status.bytes_in_buffer,frameP,slotP);
|
||||
mac->scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY;
|
||||
|
||||
//Update BSR_bytes and position in lcid_reordered_array only if Group is defined
|
||||
if (lcgid < NR_MAX_NUM_LCGID) {
|
||||
num_lcid_with_data ++;
|
||||
// sum lcid buffer which has same lcgid
|
||||
mac->scheduling_info.BSR_bytes[lcgid] += rlc_status.bytes_in_buffer;
|
||||
//Fill in the array
|
||||
array_index = 0;
|
||||
|
||||
do {
|
||||
//if (mac->logicalChannelConfig[lcid]->ul_SpecificParameters->priority <= highest_priority) {
|
||||
if (1) { // todo
|
||||
//Insert if priority is higher or equal (lower or equal in value)
|
||||
for (pos_next=num_lcid_with_data-1; pos_next > array_index; pos_next--) {
|
||||
lcid_reordered_array[pos_next] = lcid_reordered_array[pos_next - 1];
|
||||
}
|
||||
|
||||
lcid_reordered_array[array_index] = lcid;
|
||||
break;
|
||||
}
|
||||
|
||||
array_index ++;
|
||||
} while ((array_index < num_lcid_with_data) && (array_index < NR_MAX_NUM_LCID));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check whether a regular BSR can be triggered according to the first cases in 38.321
|
||||
if (num_lcid_with_data) {
|
||||
LOG_D(NR_MAC, "[UE %d] PDCCH Tick at frame %d slot %d: NumLCID with data=%d Reordered LCID0=%d LCID1=%d LCID2=%d\n",
|
||||
module_idP, frameP, slotP, num_lcid_with_data,
|
||||
lcid_reordered_array[0], lcid_reordered_array[1],
|
||||
lcid_reordered_array[2]);
|
||||
|
||||
for (array_index = 0; array_index < num_lcid_with_data; array_index++) {
|
||||
lcid = lcid_reordered_array[array_index];
|
||||
|
||||
/* UL data, for a logical channel which belongs to a LCG, becomes available for transmission in the RLC entity
|
||||
either the data belongs to a logical channel with higher priority than the priorities of the logical channels
|
||||
which belong to any LCG and for which data is already available for transmission
|
||||
*/
|
||||
{
|
||||
bsr_regular_triggered = TRUE;
|
||||
LOG_D(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d slot %d\n",
|
||||
module_idP, lcid,
|
||||
mac->scheduling_info.LCGID[lcid],
|
||||
frameP, slotP);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission
|
||||
if (mac->scheduling_info.retxBSR_SF == 0) {
|
||||
bsr_regular_triggered = TRUE;
|
||||
|
||||
if ((mac->BSR_reporting_active & NR_BSR_TRIGGER_REGULAR) == 0) {
|
||||
LOG_I(NR_MAC, "[UE %d] PDCCH Tick : MAC BSR Triggered ReTxBSR Timer expiry at frame %d slot %d\n",
|
||||
module_idP, frameP, slotP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Store Buffer Occupancy in remain buffers for next TTI
|
||||
for (lcid = DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
|
||||
mac->scheduling_info.LCID_buffer_remain[lcid] = lcid_bytes_in_buffer[lcid];
|
||||
}
|
||||
|
||||
return bsr_regular_triggered;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
nr_locate_BsrIndexByBufferSize(const uint32_t *table, int size, int value) {
|
||||
uint8_t ju, jm, jl;
|
||||
int ascend;
|
||||
//DevAssert(size > 0);
|
||||
//DevAssert(size <= 256);
|
||||
|
||||
if (value == 0) {
|
||||
return 0; //elseif (value > 150000) return 63;
|
||||
}
|
||||
|
||||
jl = 0; // lower bound
|
||||
ju = size - 1; // upper bound
|
||||
ascend = (table[ju] >= table[jl]) ? 1 : 0; // determine the order of the the table: 1 if ascending order of table, 0 otherwise
|
||||
|
||||
while (ju - jl > 1) { //If we are not yet done,
|
||||
jm = (ju + jl) >> 1; //compute a midpoint,
|
||||
|
||||
if ((value >= table[jm]) == ascend) {
|
||||
jl = jm; // replace the lower limit
|
||||
} else {
|
||||
ju = jm; //replace the upper limit
|
||||
}
|
||||
|
||||
LOG_T(NR_MAC, "[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n",
|
||||
jm, table[jm], value);
|
||||
}
|
||||
|
||||
if (value == table[jl]) {
|
||||
return jl;
|
||||
} else {
|
||||
return jl + 1; //equally ju
|
||||
}
|
||||
}
|
||||
|
||||
int nr_get_sf_periodicBSRTimer(uint8_t sf_offset) {
|
||||
switch (sf_offset) {
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf1:
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf5:
|
||||
return 5;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf10:
|
||||
return 10;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf16:
|
||||
return 16;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf20:
|
||||
return 20;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf32:
|
||||
return 32;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf40:
|
||||
return 40;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf64:
|
||||
return 64;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf80:
|
||||
return 80;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf128:
|
||||
return 128;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf160:
|
||||
return 160;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf320:
|
||||
return 320;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf640:
|
||||
return 640;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf1280:
|
||||
return 1280;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_sf2560:
|
||||
return 2560;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__periodicBSR_Timer_infinity:
|
||||
default:
|
||||
return 0xFFFF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int nr_get_sf_retxBSRTimer(uint8_t sf_offset) {
|
||||
switch (sf_offset) {
|
||||
case NR_BSR_Config__retxBSR_Timer_sf10:
|
||||
return 10;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf20:
|
||||
return 20;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf40:
|
||||
return 40;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf80:
|
||||
return 80;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf160:
|
||||
return 160;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf320:
|
||||
return 320;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf640:
|
||||
return 640;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf1280:
|
||||
return 1280;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf2560:
|
||||
return 2560;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf5120:
|
||||
return 5120;
|
||||
break;
|
||||
|
||||
case NR_BSR_Config__retxBSR_Timer_sf10240:
|
||||
return 10240;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// PUSCH scheduler:
|
||||
// - Calculate the slot in which ULSCH should be scheduled. This is current slot + K2,
|
||||
// - where K2 is the offset between the slot in which UL DCI is received and the slot
|
||||
@@ -2041,6 +2370,261 @@ void nr_ue_sib1_scheduler(module_id_t module_idP,
|
||||
|
||||
|
||||
#define MAX_LCID 8 // NR_MAX_NUM_LCID shall be used but the mac_rlc_data_req function can fetch data for max 8 LCID
|
||||
typedef struct {
|
||||
uint8_t bsr_len;
|
||||
uint8_t bsr_ce_len;
|
||||
uint8_t bsr_header_len;
|
||||
uint8_t phr_len;
|
||||
uint8_t phr_ce_len;
|
||||
uint8_t phr_header_len;
|
||||
uint16_t sdu_length_total;
|
||||
NR_BSR_SHORT *bsr_s;
|
||||
NR_BSR_LONG *bsr_l;
|
||||
NR_BSR_SHORT *bsr_t;
|
||||
//NR_POWER_HEADROOM_CMD *phr_pr;
|
||||
int tot_mac_ce_len;
|
||||
uint8_t total_mac_pdu_header_len;
|
||||
} NR_UE_MAC_CE_INFO;
|
||||
|
||||
/*
|
||||
nr_ue_get_sdu_mac_ce_pre finds length in various mac_ce field
|
||||
Need nothing from mac_ce_p:
|
||||
Update the following in mac_ce_p:
|
||||
bsr_len;
|
||||
bsr_ce_len;
|
||||
bsr_header_len;
|
||||
phr_len; TBD
|
||||
phr_ce_len; TBD
|
||||
phr_header_len; TBD
|
||||
*/
|
||||
int nr_ue_get_sdu_mac_ce_pre(module_id_t module_idP,
|
||||
int CC_id,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframe,
|
||||
uint8_t gNB_index,
|
||||
uint8_t *ulsch_buffer,
|
||||
uint16_t buflen,
|
||||
NR_UE_MAC_CE_INFO *mac_ce_p) {
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
|
||||
int num_lcg_id_with_data = 0;
|
||||
// Preparing the MAC CEs sub-PDUs and get the total size
|
||||
mac_ce_p->bsr_header_len = 0;
|
||||
mac_ce_p->phr_header_len = 0; //sizeof(SCH_SUBHEADER_FIXED);
|
||||
int lcg_id = 0;
|
||||
while (lcg_id < NR_MAX_NUM_LCGID) {
|
||||
if (mac->scheduling_info.BSR_bytes[lcg_id]) {
|
||||
num_lcg_id_with_data++;
|
||||
}
|
||||
|
||||
lcg_id++;
|
||||
}
|
||||
|
||||
//Restart ReTxBSR Timer at new grant indication (38.321)
|
||||
if (mac->scheduling_info.retxBSR_SF != MAC_UE_BSR_TIMER_NOT_RUNNING) {
|
||||
mac->scheduling_info.retxBSR_SF = nr_get_sf_retxBSRTimer(mac->scheduling_info.retxBSR_Timer);
|
||||
}
|
||||
|
||||
// periodicBSR-Timer expires, trigger BSR
|
||||
if ((mac->scheduling_info.periodicBSR_Timer != NR_BSR_Config__periodicBSR_Timer_infinity)
|
||||
&& (mac->scheduling_info.periodicBSR_SF == 0)) {
|
||||
// Trigger BSR Periodic
|
||||
mac->BSR_reporting_active |= NR_BSR_TRIGGER_PERIODIC;
|
||||
LOG_D(NR_MAC, "[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d\n",
|
||||
module_idP, frameP, subframe, buflen);
|
||||
}
|
||||
|
||||
//Compute BSR Length if Regular or Periodic BSR is triggered
|
||||
//WARNING: if BSR long is computed, it may be changed to BSR short during or after multiplexing if there remains less than 1 LCGROUP with data after Tx
|
||||
if (mac->BSR_reporting_active) {
|
||||
AssertFatal((mac->BSR_reporting_active & NR_BSR_TRIGGER_PADDING) == 0,
|
||||
"Inconsistent BSR Trigger=%d !\n",
|
||||
mac->BSR_reporting_active);
|
||||
|
||||
//A Regular or Periodic BSR can only be sent if TBS is sufficient as transmitting only a BSR is not allowed if UE has data to transmit
|
||||
if (num_lcg_id_with_data <= 1) {
|
||||
if (buflen >= (sizeof(NR_BSR_SHORT)+sizeof(NR_MAC_SUBHEADER_FIXED)+1)) {
|
||||
mac_ce_p->bsr_ce_len = sizeof(NR_BSR_SHORT); //1 byte
|
||||
mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_FIXED); //1 byte
|
||||
}
|
||||
} else {
|
||||
if (buflen >= (num_lcg_id_with_data+1+sizeof(NR_MAC_SUBHEADER_SHORT)+1)) {
|
||||
mac_ce_p->bsr_ce_len = num_lcg_id_with_data + 1; //variable size
|
||||
mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_SHORT); //2 bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mac_ce_p->bsr_len = mac_ce_p->bsr_ce_len + mac_ce_p->bsr_header_len;
|
||||
return (mac_ce_p->bsr_len + mac_ce_p->phr_len);
|
||||
}
|
||||
|
||||
/*
|
||||
nr_ue_get_sdu_mac_ce_post recalculates length and prepares the mac_ce field
|
||||
Need the following from mac_ce_p:
|
||||
bsr_ce_len
|
||||
bsr_len
|
||||
sdu_length_total
|
||||
total_mac_pdu_header_len
|
||||
Update the following in mac_ce_p:
|
||||
bsr_ce_len
|
||||
bsr_header_len
|
||||
bsr_len
|
||||
tot_mac_ce_len
|
||||
total_mac_pdu_header_len
|
||||
bsr_s
|
||||
bsr_l
|
||||
bsr_t
|
||||
*/
|
||||
void nr_ue_get_sdu_mac_ce_post(module_id_t module_idP,
|
||||
int CC_id,
|
||||
frame_t frameP,
|
||||
sub_frame_t subframe,
|
||||
uint8_t gNB_index,
|
||||
uint8_t *ulsch_buffer,
|
||||
uint16_t buflen,
|
||||
NR_UE_MAC_CE_INFO *mac_ce_p) {
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
|
||||
// Compute BSR Values and update Nb LCGID with data after multiplexing
|
||||
unsigned short padding_len = 0;
|
||||
uint8_t lcid = 0;
|
||||
int lcg_id = 0;
|
||||
int num_lcg_id_with_data = 0;
|
||||
int lcg_id_bsr_trunc = 0;
|
||||
for (lcg_id = 0; lcg_id < NR_MAX_NUM_LCGID; lcg_id++) {
|
||||
if (mac_ce_p->bsr_ce_len == sizeof(NR_BSR_SHORT)) {
|
||||
mac->scheduling_info.BSR[lcg_id] = nr_locate_BsrIndexByBufferSize(NR_SHORT_BSR_TABLE, NR_SHORT_BSR_TABLE_SIZE, mac->scheduling_info.BSR_bytes[lcg_id]);
|
||||
} else {
|
||||
mac->scheduling_info.BSR[lcg_id] = nr_locate_BsrIndexByBufferSize(NR_LONG_BSR_TABLE, NR_LONG_BSR_TABLE_SIZE, mac->scheduling_info.BSR_bytes[lcg_id]);
|
||||
}
|
||||
if (mac->scheduling_info.BSR_bytes[lcg_id]) {
|
||||
num_lcg_id_with_data++;
|
||||
lcg_id_bsr_trunc = lcg_id;
|
||||
}
|
||||
}
|
||||
|
||||
// TS 38.321 Section 5.4.5
|
||||
// Check BSR padding: it is done after PHR according to Logical Channel Prioritization order
|
||||
// Check for max padding size, ie MAC Hdr for last RLC PDU = 1
|
||||
/* For Padding BSR:
|
||||
- if the number of padding bits is equal to or larger than the size of the Short BSR plus its subheader but smaller than the size of the Long BSR plus its subheader:
|
||||
- if more than one LCG has data available for transmission in the TTI where the BSR is transmitted: report Truncated BSR of the LCG with the highest priority logical channel with data available for transmission;
|
||||
- else report Short BSR.
|
||||
- else if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR.
|
||||
*/
|
||||
if (mac_ce_p->sdu_length_total) {
|
||||
padding_len = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total);
|
||||
}
|
||||
|
||||
if ((padding_len) && (mac_ce_p->bsr_len == 0)) {
|
||||
/* if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR */
|
||||
if (padding_len >= (num_lcg_id_with_data+1+sizeof(NR_MAC_SUBHEADER_SHORT))) {
|
||||
mac_ce_p->bsr_ce_len = num_lcg_id_with_data + 1; //variable size
|
||||
mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_SHORT); //2 bytes
|
||||
// Trigger BSR Padding
|
||||
mac->BSR_reporting_active |= NR_BSR_TRIGGER_PADDING;
|
||||
} else if (padding_len >= (sizeof(NR_BSR_SHORT)+sizeof(NR_MAC_SUBHEADER_FIXED))) {
|
||||
mac_ce_p->bsr_ce_len = sizeof(NR_BSR_SHORT); //1 byte
|
||||
mac_ce_p->bsr_header_len = sizeof(NR_MAC_SUBHEADER_FIXED); //1 byte
|
||||
|
||||
if (num_lcg_id_with_data > 1) {
|
||||
// REPORT SHORT TRUNCATED BSR
|
||||
//Get LCGID of highest priority LCID with data (todo)
|
||||
for (lcid = DCCH; lcid < NR_MAX_NUM_LCID; lcid++) {
|
||||
lcg_id = mac->scheduling_info.LCGID[lcid];
|
||||
if ((lcg_id < NR_MAX_NUM_LCGID) && (mac->scheduling_info.BSR_bytes[lcg_id])) {
|
||||
lcg_id_bsr_trunc = lcg_id;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//Report SHORT BSR, clear bsr_t
|
||||
mac_ce_p->bsr_t = NULL;
|
||||
}
|
||||
|
||||
// Trigger BSR Padding
|
||||
mac->BSR_reporting_active |= NR_BSR_TRIGGER_PADDING;
|
||||
}
|
||||
|
||||
mac_ce_p->bsr_len = mac_ce_p->bsr_header_len + mac_ce_p->bsr_ce_len;
|
||||
mac_ce_p->tot_mac_ce_len += mac_ce_p->bsr_len;
|
||||
mac_ce_p->total_mac_pdu_header_len += mac_ce_p->bsr_len;
|
||||
}
|
||||
|
||||
//Fill BSR Infos
|
||||
if (mac_ce_p->bsr_ce_len == 0) {
|
||||
mac_ce_p->bsr_s = NULL;
|
||||
mac_ce_p->bsr_l = NULL;
|
||||
mac_ce_p->bsr_t = NULL;
|
||||
} else if (mac_ce_p->bsr_header_len == sizeof(NR_MAC_SUBHEADER_SHORT)) {
|
||||
mac_ce_p->bsr_s = NULL;
|
||||
mac_ce_p->bsr_t = NULL;
|
||||
mac_ce_p->bsr_l->Buffer_size0 = mac->scheduling_info.BSR[0];
|
||||
mac_ce_p->bsr_l->Buffer_size1 = mac->scheduling_info.BSR[1];
|
||||
mac_ce_p->bsr_l->Buffer_size2 = mac->scheduling_info.BSR[2];
|
||||
mac_ce_p->bsr_l->Buffer_size3 = mac->scheduling_info.BSR[3];
|
||||
mac_ce_p->bsr_l->Buffer_size4 = mac->scheduling_info.BSR[4];
|
||||
mac_ce_p->bsr_l->Buffer_size5 = mac->scheduling_info.BSR[5];
|
||||
mac_ce_p->bsr_l->Buffer_size6 = mac->scheduling_info.BSR[6];
|
||||
mac_ce_p->bsr_l->Buffer_size7 = mac->scheduling_info.BSR[7];
|
||||
LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report LONG BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d level LCGID4 %d,level LCGID5 %d,level LCGID6 %d,level LCGID7 %d)\n",
|
||||
module_idP, frameP, subframe,
|
||||
mac->BSR_reporting_active,
|
||||
mac->scheduling_info.BSR[0],
|
||||
mac->scheduling_info.BSR[1],
|
||||
mac->scheduling_info.BSR[2],
|
||||
mac->scheduling_info.BSR[3],
|
||||
mac->scheduling_info.BSR[4],
|
||||
mac->scheduling_info.BSR[5],
|
||||
mac->scheduling_info.BSR[6],
|
||||
mac->scheduling_info.BSR[7]);
|
||||
} else if (mac_ce_p->bsr_header_len == sizeof(NR_MAC_SUBHEADER_FIXED)) {
|
||||
mac_ce_p->bsr_l = NULL;
|
||||
|
||||
if ((mac_ce_p->bsr_t != NULL) && (mac->BSR_reporting_active & NR_BSR_TRIGGER_PADDING)) {
|
||||
//Truncated BSR
|
||||
mac_ce_p->bsr_s = NULL;
|
||||
mac_ce_p->bsr_t->LcgID = lcg_id_bsr_trunc;
|
||||
mac_ce_p->bsr_t->Buffer_size = mac->scheduling_info.BSR[lcg_id_bsr_trunc];
|
||||
LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report TRUNCATED BSR with level %d for LCGID %d\n",
|
||||
module_idP, frameP, subframe,
|
||||
mac->BSR_reporting_active,
|
||||
mac->scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc);
|
||||
} else {
|
||||
mac_ce_p->bsr_t = NULL;
|
||||
mac_ce_p->bsr_s->LcgID = lcg_id_bsr_trunc;
|
||||
mac_ce_p->bsr_s->Buffer_size = mac->scheduling_info.BSR[lcg_id_bsr_trunc];
|
||||
LOG_D(NR_MAC, "[UE %d] Frame %d subframe %d BSR Trig=%d report SHORT BSR with level %d for LCGID %d\n",
|
||||
module_idP, frameP, subframe,
|
||||
mac->BSR_reporting_active,
|
||||
mac->scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC, "[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", module_idP);
|
||||
mac->scheduling_info.SR_pending = 0;
|
||||
mac->scheduling_info.SR_COUNTER = 0;
|
||||
|
||||
/* Actions when a BSR is sent */
|
||||
if (mac_ce_p->bsr_ce_len) {
|
||||
LOG_D(NR_MAC, "[UE %d] MAC BSR Sent !! bsr (ce%d,hdr%d) buff_len %d\n",
|
||||
module_idP, mac_ce_p->bsr_ce_len, mac_ce_p->bsr_header_len, buflen);
|
||||
// Reset ReTx BSR Timer
|
||||
mac->scheduling_info.retxBSR_SF = nr_get_sf_retxBSRTimer(mac->scheduling_info.retxBSR_Timer);
|
||||
LOG_D(NR_MAC, "[UE %d] MAC ReTx BSR Timer Reset =%d\n", module_idP, mac->scheduling_info.retxBSR_SF);
|
||||
|
||||
// Reset Periodic Timer except when BSR is truncated
|
||||
if ((mac_ce_p->bsr_t == NULL) && (mac->scheduling_info.periodicBSR_Timer != NR_BSR_Config__periodicBSR_Timer_infinity)) {
|
||||
mac->scheduling_info.periodicBSR_SF = nr_get_sf_periodicBSRTimer(mac->scheduling_info.periodicBSR_Timer);
|
||||
LOG_D(NR_MAC, "[UE %d] MAC Periodic BSR Timer Reset =%d\n",
|
||||
module_idP,
|
||||
mac->scheduling_info.periodicBSR_SF);
|
||||
}
|
||||
|
||||
// Reset BSR Trigger flags
|
||||
mac->BSR_reporting_active = BSR_TRIGGER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Function: to fetch data to be transmitted from RLC, place it in the ULSCH PDU buffer
|
||||
@@ -2061,31 +2645,45 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
|
||||
uint8_t gNB_index,
|
||||
uint8_t *ulsch_buffer,
|
||||
uint16_t buflen) {
|
||||
|
||||
NR_UE_MAC_CE_INFO mac_ce_info;
|
||||
NR_UE_MAC_CE_INFO *mac_ce_p=&mac_ce_info;
|
||||
int16_t buflen_remain = 0;
|
||||
mac_ce_p->bsr_len = 0;
|
||||
mac_ce_p->bsr_ce_len = 0;
|
||||
mac_ce_p->bsr_header_len = 0;
|
||||
mac_ce_p->phr_len = 0;
|
||||
//mac_ce_p->phr_ce_len = 0;
|
||||
//mac_ce_p->phr_header_len = 0;
|
||||
|
||||
uint8_t lcid = 0;
|
||||
uint16_t sdu_length = 0;
|
||||
uint16_t num_sdus = 0;
|
||||
uint16_t sdu_length_total = 0;
|
||||
mac_ce_p->sdu_length_total = 0;
|
||||
NR_BSR_SHORT bsr_short, bsr_truncated;
|
||||
NR_BSR_LONG bsr_long;
|
||||
mac_ce_p->bsr_s = &bsr_short;
|
||||
mac_ce_p->bsr_l = &bsr_long;
|
||||
mac_ce_p->bsr_t = &bsr_truncated;
|
||||
//NR_POWER_HEADROOM_CMD phr;
|
||||
//mac_ce_p->phr_p = &phr;
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
|
||||
//int highest_priority = 16;
|
||||
const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_LONG);
|
||||
|
||||
// Pointer used to build the MAC PDU by placing the RLC SDUs in the ULSCH buffer
|
||||
uint8_t *pdu = ulsch_buffer;
|
||||
|
||||
// Preparing the MAC CEs sub-PDUs and get the total size
|
||||
unsigned char mac_header_control_elements[16] = {0};
|
||||
int tot_mac_ce_len = nr_write_ce_ulsch_pdu(&mac_header_control_elements[0], mac);
|
||||
uint8_t total_mac_pdu_header_len = tot_mac_ce_len;
|
||||
//nr_ue_get_sdu_mac_ce_pre updates all mac_ce related header field related to length
|
||||
mac_ce_p->tot_mac_ce_len = nr_ue_get_sdu_mac_ce_pre(module_idP, CC_id, frameP, subframe, gNB_index, ulsch_buffer, buflen, mac_ce_p);
|
||||
mac_ce_p->total_mac_pdu_header_len = mac_ce_p->tot_mac_ce_len;
|
||||
|
||||
LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] process UL transport block at with size TBS = %d bytes \n", __FUNCTION__, module_idP, frameP, subframe, buflen);
|
||||
|
||||
// Check for DCCH first
|
||||
// TO DO: Multiplex in the order defined by the logical channel prioritization
|
||||
for (lcid = UL_SCH_LCID_SRB1;
|
||||
lcid < MAX_LCID; lcid++) {
|
||||
for (lcid = UL_SCH_LCID_SRB1; lcid < MAX_LCID; lcid++) {
|
||||
|
||||
buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
|
||||
buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total + sh_size);
|
||||
|
||||
LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] UL-DXCH -> ULSCH, RLC with LCID 0x%02x (TBS %d bytes, sdu_length_total %d bytes, MAC header len %d bytes, buflen_remain %d bytes)\n",
|
||||
__FUNCTION__,
|
||||
@@ -2094,8 +2692,8 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
|
||||
subframe,
|
||||
lcid,
|
||||
buflen,
|
||||
sdu_length_total,
|
||||
tot_mac_ce_len,
|
||||
mac_ce_p->sdu_length_total,
|
||||
mac_ce_p->tot_mac_ce_len,
|
||||
buflen_remain);
|
||||
|
||||
while (buflen_remain > 0){
|
||||
@@ -2125,7 +2723,7 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
|
||||
|
||||
if (sdu_length > 0) {
|
||||
|
||||
LOG_D(MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
|
||||
LOG_D(NR_MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
|
||||
num_sdus + 1,
|
||||
sdu_length,
|
||||
lcid,
|
||||
@@ -2145,40 +2743,53 @@ uint8_t nr_ue_get_sdu(module_id_t module_idP,
|
||||
#endif
|
||||
|
||||
pdu += sdu_length;
|
||||
sdu_length_total += sdu_length;
|
||||
total_mac_pdu_header_len += sh_size;
|
||||
mac_ce_p->sdu_length_total += sdu_length;
|
||||
mac_ce_p->total_mac_pdu_header_len += sh_size;
|
||||
|
||||
num_sdus++;
|
||||
|
||||
} else {
|
||||
pdu -= sh_size;
|
||||
LOG_D(MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
|
||||
LOG_D(NR_MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
|
||||
break;
|
||||
}
|
||||
|
||||
buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
|
||||
buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total + sh_size);
|
||||
|
||||
//Update Buffer remain and BSR bytes after transmission
|
||||
mac->scheduling_info.LCID_buffer_remain[lcid] -= sdu_length;
|
||||
mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] -= sdu_length;
|
||||
LOG_D(NR_MAC, "[UE %d] Update BSR [%d.%d] BSR_bytes for LCG%d=%d\n",
|
||||
module_idP, frameP, subframe, mac->scheduling_info.LCGID[lcid],
|
||||
mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]]);
|
||||
if (mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] < 0)
|
||||
mac->scheduling_info.BSR_bytes[mac->scheduling_info.LCGID[lcid]] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (tot_mac_ce_len > 0) {
|
||||
//nr_ue_get_sdu_mac_ce_post recalculates all mac_ce related header fields since buffer has been changed after mac_rlc_data_req.
|
||||
//Also, BSR padding is handled here after knowing mac_ce_p->sdu_length_total.
|
||||
nr_ue_get_sdu_mac_ce_post(module_idP, CC_id, frameP, subframe, gNB_index, ulsch_buffer, buflen, mac_ce_p);
|
||||
|
||||
LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, tot_mac_ce_len);
|
||||
memcpy((void *) pdu, (void *) mac_header_control_elements, tot_mac_ce_len);
|
||||
pdu += (unsigned char) tot_mac_ce_len;
|
||||
if (mac_ce_p->tot_mac_ce_len > 0) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, mac_ce_p->tot_mac_ce_len);
|
||||
nr_write_ce_ulsch_pdu(pdu, mac, 0, NULL, mac_ce_p->bsr_t, mac_ce_p->bsr_s, mac_ce_p->bsr_l);
|
||||
pdu += (unsigned char) mac_ce_p->tot_mac_ce_len;
|
||||
|
||||
#ifdef ENABLE_MAC_PAYLOAD_DEBUG
|
||||
LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, tot_mac_ce_len);
|
||||
log_dump(NR_MAC, mac_header_control_elements, tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
|
||||
LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, mac_ce_p->tot_mac_ce_len);
|
||||
log_dump(NR_MAC, mac_header_control_elements, mac_ce_p->tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total);
|
||||
buflen_remain = buflen - (mac_ce_p->total_mac_pdu_header_len + mac_ce_p->sdu_length_total);
|
||||
|
||||
// Compute final offset for padding and fill remainder of ULSCH with 0
|
||||
if (buflen_remain > 0) {
|
||||
|
||||
LOG_D(NR_MAC, "In %s filling remainder %d bytes to the UL PDU \n", __FUNCTION__, buflen_remain);
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
|
||||
((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
|
||||
|
||||
|
||||
@@ -261,6 +261,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
||||
else
|
||||
mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
||||
|
||||
int bwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
|
||||
uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value;
|
||||
// prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4
|
||||
if ( get_nr_prach_info_from_index(config_index,
|
||||
@@ -387,7 +389,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
|
||||
const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch);
|
||||
uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE];
|
||||
for (int i = 0; i < N_RA_RB * fdm; ++i)
|
||||
vrb_map_UL[rach_ConfigGeneric->msg1_FrequencyStart + i] = 0xff; // all symbols
|
||||
vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] = 0xff; // all symbols
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -772,7 +774,6 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
|
||||
|
||||
// generation of DCI 0_0 to schedule msg3 retransmission
|
||||
NR_SearchSpace_t *ss = ra->ra_ss;
|
||||
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config = *ss->controlResourceSetId==0 ? &nr_mac->type0_PDCCH_CSS_config[ra->beam_id] : NULL;
|
||||
NR_ControlResourceSet_t *coreset = get_coreset(module_idP, scc, NULL, ss, NR_SearchSpace__searchSpaceType_PR_common);
|
||||
AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg3 retransmission\n");
|
||||
|
||||
@@ -787,7 +788,7 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
|
||||
ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||
pdcch_pdu_rel15 = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||
ul_dci_req->numPdus += 1;
|
||||
nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
|
||||
nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
|
||||
nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
|
||||
}
|
||||
|
||||
@@ -917,10 +918,19 @@ void nr_get_Msg3alloc(module_id_t module_id,
|
||||
LOG_D(NR_MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u start symbol index %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id, StartSymbolIndex);
|
||||
uint16_t *vrb_map_UL =
|
||||
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
|
||||
const uint16_t bwpSize = NRRIV2BW(ubwp ?
|
||||
ubwp->bwp_Common->genericParameters.locationAndBandwidth :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
|
||||
MAX_BWP_SIZE);
|
||||
|
||||
int bwpSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
|
||||
if (ra->CellGroup) {
|
||||
AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
|
||||
"downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
|
||||
NR_BWP_Uplink_t *ubwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
|
||||
int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int act_bwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
if (!((bwpStart >= act_bwp_start) && ((bwpStart+bwpSize) <= (act_bwp_start+act_bwp_size))))
|
||||
bwpStart = act_bwp_start;
|
||||
}
|
||||
|
||||
/* search msg3_nb_rb free RBs */
|
||||
int rbSize = 0;
|
||||
@@ -928,16 +938,17 @@ void nr_get_Msg3alloc(module_id_t module_id,
|
||||
while (rbSize < msg3_nb_rb) {
|
||||
rbStart += rbSize; /* last iteration rbSize was not enough, skip it */
|
||||
rbSize = 0;
|
||||
while (rbStart < bwpSize && vrb_map_UL[rbStart])
|
||||
while (rbStart < bwpSize && vrb_map_UL[rbStart + bwpStart])
|
||||
rbStart++;
|
||||
AssertFatal(rbStart < bwpSize - msg3_nb_rb, "no space to allocate Msg 3 for RA!\n");
|
||||
while (rbStart + rbSize < bwpSize
|
||||
&& !vrb_map_UL[rbStart + rbSize]
|
||||
&& !vrb_map_UL[rbStart + bwpStart + rbSize]
|
||||
&& rbSize < msg3_nb_rb)
|
||||
rbSize++;
|
||||
}
|
||||
ra->msg3_nb_rb = msg3_nb_rb;
|
||||
ra->msg3_first_rb = rbStart;
|
||||
ra->msg3_bwp_start = bwpStart;
|
||||
}
|
||||
|
||||
|
||||
@@ -1023,12 +1034,12 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
|
||||
uint16_t *vrb_map_UL =
|
||||
&RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
|
||||
for (int i = 0; i < ra->msg3_nb_rb; ++i) {
|
||||
AssertFatal(!vrb_map_UL[i + ra->msg3_first_rb],
|
||||
AssertFatal(!vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start],
|
||||
"RB %d in %4d.%2d is already taken, cannot allocate Msg3!\n",
|
||||
i + ra->msg3_first_rb,
|
||||
ra->Msg3_frame,
|
||||
ra->Msg3_slot);
|
||||
vrb_map_UL[i + ra->msg3_first_rb] = 1;
|
||||
vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] = 1;
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
|
||||
@@ -1047,9 +1058,6 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
|
||||
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
|
||||
|
||||
int ibwp_size = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int ibwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int abwp_size = ibwp_size;
|
||||
int abwp_start = ibwp_start;
|
||||
int scs = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
|
||||
int fh = 0;
|
||||
int startSymbolAndLength = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
|
||||
@@ -1062,8 +1070,6 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
|
||||
|
||||
startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
|
||||
mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
|
||||
abwp_size = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
abwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
|
||||
fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
|
||||
}
|
||||
@@ -1078,17 +1084,11 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
|
||||
ra->msg3_round,
|
||||
ra->rnti);
|
||||
|
||||
int bwp_start;
|
||||
if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size))
|
||||
bwp_start = abwp_start;
|
||||
else
|
||||
bwp_start = ibwp_start;
|
||||
|
||||
fill_msg3_pusch_pdu(pusch_pdu,scc,
|
||||
ra->msg3_round,
|
||||
startSymbolAndLength,
|
||||
ra->rnti, scs,
|
||||
ibwp_size, bwp_start,
|
||||
ibwp_size, ra->msg3_bwp_start,
|
||||
mappingtype, fh,
|
||||
ra->msg3_first_rb, ra->msg3_nb_rb);
|
||||
future_ul_tti_req->n_pdus += 1;
|
||||
@@ -1150,7 +1150,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
|
||||
uint16_t *vrb_map = cc[CC_id].vrb_map;
|
||||
for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) {
|
||||
if (vrb_map[rbStart + i]) {
|
||||
if (vrb_map[BWPStart + rbStart + i]) {
|
||||
rbStart += i;
|
||||
i = 0;
|
||||
}
|
||||
@@ -1204,7 +1204,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||
dl_req->nPDUs += 1;
|
||||
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||
nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
|
||||
nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
|
||||
nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
|
||||
}
|
||||
|
||||
@@ -1364,7 +1364,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
|
||||
// Mark the corresponding RBs as used
|
||||
for (int rb = 0; rb < rbSize; rb++) {
|
||||
vrb_map[rb + rbStart] = 1;
|
||||
vrb_map[BWPStart + rb + rbStart] = 1;
|
||||
}
|
||||
|
||||
ra->state = WAIT_Msg3;
|
||||
@@ -1547,7 +1547,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
|
||||
int i = 0;
|
||||
while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
|
||||
if (vrb_map[rbStart + i]) {
|
||||
if (vrb_map[BWPStart + rbStart + i]) {
|
||||
rbStart += i+1;
|
||||
i = 0;
|
||||
} else {
|
||||
@@ -1580,7 +1580,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||
dl_req->nPDUs += 1;
|
||||
pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||
nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, type0_PDCCH_CSS_config);
|
||||
nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
|
||||
nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
|
||||
}
|
||||
|
||||
@@ -1723,7 +1723,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
|
||||
|
||||
// Mark the corresponding RBs as used
|
||||
for (int rb = 0; rb < pdsch_pdu_rel15->rbSize; rb++) {
|
||||
vrb_map[rb + pdsch_pdu_rel15->rbStart] = 1;
|
||||
vrb_map[BWPStart + rb + pdsch_pdu_rel15->rbStart] = 1;
|
||||
}
|
||||
|
||||
LOG_D(NR_MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
|
||||
|
||||
@@ -60,22 +60,21 @@ uint16_t get_ssboffset_pointa(NR_ServingCellConfigCommon_t *scc,const long band)
|
||||
int ratio;
|
||||
switch (*scc->ssbSubcarrierSpacing) {
|
||||
case NR_SubcarrierSpacing_kHz15:
|
||||
AssertFatal(band <= 79,
|
||||
AssertFatal(band <= 95,
|
||||
"Band %ld is not possible for SSB with 15 kHz SCS\n",
|
||||
band);
|
||||
if (band < 77) // below 3GHz
|
||||
ratio = 3; // NRARFCN step is 5 kHz
|
||||
else
|
||||
ratio = 1; // NRARFCN step is 15 kHz
|
||||
// no band available above 3GHz using 15kHz
|
||||
ratio = 3; // NRARFCN step is 5 kHz
|
||||
break;
|
||||
case NR_SubcarrierSpacing_kHz30:
|
||||
AssertFatal(band <= 79,
|
||||
"Band %ld is not possible for SSB with 15 kHz SCS\n",
|
||||
AssertFatal(band <= 96,
|
||||
"Band %ld is not possible for SSB with 30 kHz SCS\n",
|
||||
band);
|
||||
if (band < 77) // below 3GHz
|
||||
ratio = 6; // NRARFCN step is 5 kHz
|
||||
if (band == 46 || band == 48 || band == 77 ||
|
||||
band == 78 || band == 79 || band == 96) // above 3GHz
|
||||
ratio = 2; // NRARFCN step is 15 kHz
|
||||
else
|
||||
ratio = 2; // NRARFCN step is 15 kHz
|
||||
ratio = 6; // NRARFCN step is 5 kHz
|
||||
break;
|
||||
case NR_SubcarrierSpacing_kHz120:
|
||||
AssertFatal(band >= 257,
|
||||
@@ -339,6 +338,8 @@ uint32_t schedule_control_sib1(module_id_t module_id,
|
||||
gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset));
|
||||
fill_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space,type0_PDCCH_CSS_config);
|
||||
fill_coresetZero(gNB_mac->sched_ctrlCommon->coreset,type0_PDCCH_CSS_config);
|
||||
gNB_mac->cset0_bwp_start = type0_PDCCH_CSS_config->cset_start_rb;
|
||||
gNB_mac->cset0_bwp_size = type0_PDCCH_CSS_config->num_rbs;
|
||||
}
|
||||
|
||||
gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation = time_domain_allocation;
|
||||
@@ -436,7 +437,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
|
||||
dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||
dl_req->nPDUs += 1;
|
||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||
nr_configure_pdcch(pdcch_pdu_rel15,
|
||||
nr_configure_pdcch(NULL,
|
||||
pdcch_pdu_rel15,
|
||||
gNB_mac->sched_ctrlCommon->search_space,
|
||||
gNB_mac->sched_ctrlCommon->coreset,
|
||||
scc,
|
||||
|
||||
@@ -446,7 +446,7 @@ void nr_store_dlsch_buffer(module_id_t module_id,
|
||||
|
||||
if (sched_ctrl->num_total_bytes == 0
|
||||
&& !sched_ctrl->ta_apply) /* If TA should be applied, give at least one RB */
|
||||
return;
|
||||
continue;
|
||||
|
||||
LOG_D(NR_MAC,
|
||||
"[%s][%d.%d], %s%d->DLSCH, RLC status %d bytes TA %d\n",
|
||||
@@ -481,7 +481,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
|
||||
&RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
|
||||
|
||||
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int rbStart = 0; // start wrt BWPstart
|
||||
|
||||
NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
|
||||
const long f = (sched_ctrl->active_bwp ||bwpd) ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
|
||||
@@ -671,7 +671,7 @@ void pf_dl(module_id_t module_id,
|
||||
&scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
|
||||
|
||||
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
|
||||
int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int rbStart = 0; // start wrt BWPstart
|
||||
|
||||
/* Find a free CCE */
|
||||
bool freeCCE = find_free_CCE(module_id, slot, UE_id);
|
||||
@@ -760,6 +760,10 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
||||
sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
|
||||
scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
|
||||
MAX_BWP_SIZE);
|
||||
const uint16_t BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp ?
|
||||
sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth:
|
||||
scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,
|
||||
MAX_BWP_SIZE);
|
||||
|
||||
uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
|
||||
uint8_t rballoc_mask[bwpSize];
|
||||
@@ -767,7 +771,7 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
||||
for (int i = 0; i < bwpSize; i++) {
|
||||
// calculate mask: init with "NOT" vrb_map:
|
||||
// if any RB in vrb_map is blocked (1), the current RBG will be 0
|
||||
rballoc_mask[i] = !vrb_map[i];
|
||||
rballoc_mask[i] = !vrb_map[i+BWPStart];
|
||||
n_rb_sched += rballoc_mask[i];
|
||||
}
|
||||
|
||||
@@ -934,7 +938,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
|
||||
LOG_D(NR_MAC,"Trying to configure DL pdcch for UE %d, bwp %d, cs %d\n",UE_id,bwpid,coresetid);
|
||||
NR_SearchSpace_t *ss = (bwp||bwpd) ? sched_ctrl->search_space:gNB_mac->sched_ctrlCommon->search_space;
|
||||
NR_ControlResourceSet_t *coreset = (bwp||bwpd)? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
|
||||
nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
|
||||
nr_configure_pdcch(gNB_mac, pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
|
||||
gNB_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu;
|
||||
}
|
||||
|
||||
|
||||
@@ -280,6 +280,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||
/* find largest unallocated chunk */
|
||||
const int bwpSize = NRRIV2BW(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
int rbStart = 0;
|
||||
int rbSize = 0;
|
||||
if (target_dl_bw>bwpSize)
|
||||
@@ -288,11 +289,11 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
||||
/* loop ensures that we allocate exactly target_dl_bw, or return */
|
||||
while (true) {
|
||||
/* advance to first free RB */
|
||||
while (rbStart < bwpSize && vrb_map[rbStart])
|
||||
while (rbStart < bwpSize && vrb_map[rbStart + BWPStart])
|
||||
rbStart++;
|
||||
rbSize = 1;
|
||||
/* iterate until we are at target_dl_bw or no available RBs */
|
||||
while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && rbSize < target_dl_bw)
|
||||
while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize + BWPStart] && rbSize < target_dl_bw)
|
||||
rbSize++;
|
||||
/* found target_dl_bw? */
|
||||
if (rbSize == target_dl_bw)
|
||||
@@ -397,7 +398,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
|
||||
|
||||
/* mark the corresponding RBs as used */
|
||||
for (int rb = 0; rb < sched_pdsch->rbSize; rb++)
|
||||
vrb_map[rb + sched_pdsch->rbStart] = 1;
|
||||
vrb_map[rb + sched_pdsch->rbStart + BWPStart] = 1;
|
||||
|
||||
if ((frame&127) == 0) LOG_D(MAC,"phytest: %d.%d DL mcs %d, DL rbStart %d, DL rbSize %d\n", frame, slot, sched_pdsch->mcs, rbStart,rbSize);
|
||||
}
|
||||
@@ -459,8 +460,11 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
||||
uint16_t rbSize;
|
||||
|
||||
const int bw = NRRIV2BW(sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
const int BWPStart = NRRIV2PRBOFFSET(sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth :
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
|
||||
|
||||
if (target_ul_bw>bw)
|
||||
rbSize = bw;
|
||||
@@ -471,7 +475,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
||||
&RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
|
||||
const uint16_t symb = ((1 << ps->nrOfSymbols) - 1) << ps->startSymbolIndex;
|
||||
for (int i = rbStart; i < rbStart + rbSize; ++i) {
|
||||
if ((vrb_map_UL[i] & symb) != 0) {
|
||||
if ((vrb_map_UL[i+BWPStart] & symb) != 0) {
|
||||
LOG_E(MAC,
|
||||
"%s(): %4d.%2d RB %d is already reserved, cannot schedule UE\n",
|
||||
__func__,
|
||||
@@ -540,6 +544,6 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
|
||||
|
||||
/* mark the corresponding RBs as used */
|
||||
for (int rb = rbStart; rb < rbStart + rbSize; rb++)
|
||||
vrb_map_UL[rb] = 1;
|
||||
vrb_map_UL[rb+BWPStart] = 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -723,7 +723,8 @@ int nr_get_default_pucch_res(int pucch_ResourceCommon) {
|
||||
return(default_pucch_csset[pucch_ResourceCommon]);
|
||||
}
|
||||
|
||||
void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
|
||||
void nr_configure_pdcch(gNB_MAC_INST *gNB_mac,
|
||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
|
||||
NR_SearchSpace_t *ss,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
@@ -731,9 +732,19 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
|
||||
NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config) {
|
||||
|
||||
int sps;
|
||||
if (bwp && *ss->controlResourceSetId!=0) { // This is not for coreset0
|
||||
pdcch_pdu->BWPSize = NRRIV2BW(bwp->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
AssertFatal(*ss->controlResourceSetId == coreset->controlResourceSetId,
|
||||
"coreset id in SS %ld does not correspond to the one in coreset %ld",
|
||||
*ss->controlResourceSetId, coreset->controlResourceSetId);
|
||||
|
||||
if (bwp) { // This is not for SIB1
|
||||
if(coreset->controlResourceSetId == 0){
|
||||
pdcch_pdu->BWPSize = gNB_mac->cset0_bwp_size;
|
||||
pdcch_pdu->BWPStart = gNB_mac->cset0_bwp_start;
|
||||
}
|
||||
else {
|
||||
pdcch_pdu->BWPSize = NRRIV2BW(bwp->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
}
|
||||
pdcch_pdu->SubcarrierSpacing = bwp->subcarrierSpacing;
|
||||
pdcch_pdu->CyclicPrefix = (bwp->cyclicPrefix==NULL) ? 0 : *bwp->cyclicPrefix;
|
||||
|
||||
@@ -2257,20 +2268,20 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
csirs_pdu_rel15->row = 1;
|
||||
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
|
||||
csirs_pdu_rel15->row = 2;
|
||||
csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
|
||||
((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<8)&0xff0));
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
|
||||
csirs_pdu_rel15->row = 4;
|
||||
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
|
||||
csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
|
||||
@@ -2281,18 +2292,18 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
|
||||
csirs_pdu_rel15->row = 3;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
|
||||
csirs_pdu_rel15->row = 5;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
|
||||
csirs_pdu_rel15->row = 8;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
}
|
||||
else{
|
||||
int num_k = 0;
|
||||
@@ -2301,12 +2312,12 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
if(num_k==4) {
|
||||
csirs_pdu_rel15->row = 6;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
}
|
||||
else {
|
||||
csirs_pdu_rel15->row = 7;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2314,12 +2325,12 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
|
||||
csirs_pdu_rel15->row = 10;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
}
|
||||
else {
|
||||
csirs_pdu_rel15->row = 9;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (1 << csirs_pdu_rel15->symb_l0);
|
||||
}
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
|
||||
@@ -2328,24 +2339,24 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
else
|
||||
csirs_pdu_rel15->row = 11;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
|
||||
break;
|
||||
case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
|
||||
csirs_pdu_rel15->row = 14;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
}
|
||||
else{
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
|
||||
csirs_pdu_rel15->row = 15;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (7 << csirs_pdu_rel15->symb_l0);
|
||||
}
|
||||
else {
|
||||
csirs_pdu_rel15->row = 13;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2353,18 +2364,18 @@ void nr_csirs_scheduling(int Mod_idP,
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
|
||||
csirs_pdu_rel15->row = 17;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
}
|
||||
else{
|
||||
if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
|
||||
csirs_pdu_rel15->row = 18;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= (7 << csirs_pdu_rel15->symb_l0);
|
||||
}
|
||||
else {
|
||||
csirs_pdu_rel15->row = 16;
|
||||
for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
|
||||
vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
vrb_map[rb+csirs_pdu_rel15->bwp_start] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -294,6 +294,7 @@ uint8_t compute_ri_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||
}
|
||||
else
|
||||
AssertFatal(1==0,"Other configurations not yet implemented\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
void compute_li_bitlen(struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||
@@ -520,6 +521,11 @@ void nr_csi_meas_reporting(int Mod_idP,
|
||||
curr_pucch->csi_bits +=
|
||||
nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id);
|
||||
|
||||
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ?
|
||||
&sched_ctrl->active_ubwp->bwp_Common->genericParameters:
|
||||
&scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
|
||||
|
||||
// going through the list of PUCCH resources to find the one indexed by resource_id
|
||||
uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
|
||||
const int m = pucch_Config->resourceToAddModList->list.count;
|
||||
@@ -550,7 +556,7 @@ void nr_csi_meas_reporting(int Mod_idP,
|
||||
}
|
||||
// verify resources are free
|
||||
for (int i = start; i < start + len; ++i) {
|
||||
vrb_map_UL[i] |= mask;
|
||||
vrb_map_UL[i+bwp_start] |= mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1390,18 +1396,32 @@ int nr_acknack_scheduling(int mod_id,
|
||||
pucch_Config = RC.nrmac[mod_id]->UE_info.CellGroup[UE_id]->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
|
||||
}
|
||||
|
||||
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ?
|
||||
&sched_ctrl->active_ubwp->bwp_Common->genericParameters:
|
||||
&scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
int bwp_start = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
|
||||
|
||||
/* verify that at that slot and symbol, resources are free. We only do this
|
||||
* for initialCyclicShift 0 (we assume it always has that one), so other
|
||||
* initialCyclicShifts can overlap with ICS 0!*/
|
||||
if (pucch_Config) {
|
||||
const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[pucch->resource_indicator];
|
||||
DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0);
|
||||
int second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0;
|
||||
int nr_of_symbols = resource->format.choice.format0->nrofSymbols;
|
||||
if (resource->format.choice.format0->initialCyclicShift == 0) {
|
||||
uint16_t *vrb_map_UL = &RC.nrmac[mod_id]->common_channels[CC_id].vrb_map_UL[pucch->ul_slot * MAX_BWP_SIZE];
|
||||
const uint16_t symb = 1 << resource->format.choice.format0->startingSymbolIndex;
|
||||
if ((vrb_map_UL[resource->startingPRB] & symb) != 0)
|
||||
LOG_W(NR_MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
|
||||
vrb_map_UL[resource->startingPRB] |= symb;
|
||||
for (int l=0; l<nr_of_symbols; l++) {
|
||||
uint16_t symb = 1 << (resource->format.choice.format0->startingSymbolIndex + l);
|
||||
int prb;
|
||||
if (l==1 && second_hop_prb != 0)
|
||||
prb = second_hop_prb;
|
||||
else
|
||||
prb = resource->startingPRB;
|
||||
if ((vrb_map_UL[bwp_start+prb] & symb) != 0)
|
||||
LOG_W(MAC, "symbol 0x%x is not free for PUCCH alloc in vrb_map_UL at RB %ld and slot %d.%d\n", symb, resource->startingPRB, pucch->frame, pucch->ul_slot);
|
||||
vrb_map_UL[bwp_start+prb] |= symb;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -34,34 +34,7 @@
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include <openair2/UTIL/OPT/opt.h>
|
||||
|
||||
|
||||
//38.321 Table 6.1.3.1-1
|
||||
const uint32_t NR_SHORT_BSR_TABLE[32] = {
|
||||
0, 10, 14, 20, 28, 38, 53, 74,
|
||||
102, 142, 198, 276, 384, 535, 745, 1038,
|
||||
1446, 2014, 2806, 3909, 5446, 7587, 10570, 14726,
|
||||
20516, 28581, 39818, 55474, 77284, 107669, 150000, 300000
|
||||
};
|
||||
|
||||
//38.321 Table 6.1.3.1-2
|
||||
const uint32_t NR_LONG_BSR_TABLE[256] ={
|
||||
0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
|
||||
28, 30, 32, 34, 36, 38, 40, 43, 46, 49, 52, 55, 59, 62, 66, 71,
|
||||
75, 80, 85, 91, 97, 103, 110, 117, 124, 132, 141, 150, 160, 170, 181, 193,
|
||||
205, 218, 233, 248, 264, 281, 299, 318, 339, 361, 384, 409, 436, 464, 494, 526,
|
||||
560, 597, 635, 677, 720, 767, 817, 870, 926, 987, 1051, 1119, 1191, 1269, 1351, 1439,
|
||||
1532, 1631, 1737, 1850, 1970, 2098, 2234, 2379, 2533, 2698, 2873, 3059, 3258, 3469, 3694, 3934,
|
||||
4189, 4461, 4751, 5059, 5387, 5737, 6109, 6506, 6928, 7378, 7857, 8367, 8910, 9488, 10104, 10760,
|
||||
11458, 12202, 12994, 13838, 14736, 15692, 16711, 17795, 18951, 20181, 21491, 22885, 24371, 25953, 27638, 29431,
|
||||
31342, 33376, 35543, 37850, 40307, 42923, 45709, 48676, 51836, 55200, 58784, 62599, 66663, 70990, 75598, 80505,
|
||||
85730, 91295, 97221, 103532, 110252, 117409, 125030, 133146, 141789, 150992, 160793, 171231, 182345, 194182, 206786, 220209,
|
||||
234503, 249725, 265935, 283197, 301579, 321155, 342002, 364202, 387842, 413018, 439827, 468377, 498780, 531156, 565634, 602350,
|
||||
641449, 683087, 727427, 774645, 824928, 878475, 935498, 996222, 1060888, 1129752, 1203085, 1281179, 1364342, 1452903, 1547213, 1647644,
|
||||
1754595, 1868488, 1989774, 2118933, 2256475, 2402946, 2558924, 2725027, 2901912, 3090279, 3290873, 3504487, 3731968, 3974215, 4232186, 4506902,
|
||||
4799451, 5110989, 5442750, 5796046, 6172275, 6572925, 6999582, 7453933, 7937777, 8453028, 9001725, 9586039, 10208280, 10870913, 11576557, 12328006,
|
||||
13128233, 13980403, 14887889, 15854280, 16883401, 17979324, 19146385, 20389201, 21712690, 23122088, 24622972, 26221280, 27923336, 29735875, 31666069, 33721553,
|
||||
35910462, 38241455, 40723756, 43367187, 46182206, 49179951, 52372284, 55771835, 59392055, 63247269, 67352729, 71724679, 76380419, 81338368, 162676736, 4294967295
|
||||
};
|
||||
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
|
||||
|
||||
int get_dci_format(NR_UE_sched_ctrl_t *sched_ctrl) {
|
||||
|
||||
@@ -896,7 +869,7 @@ bool nr_UE_is_to_be_scheduled(module_id_t mod_id, int CC_id, int UE_id, frame_t
|
||||
* (2) there is a scheduling request
|
||||
* (3) or we did not schedule it in more than 10 frames */
|
||||
const bool has_data = sched_ctrl->estimated_ul_buffer > sched_ctrl->sched_ul_bytes;
|
||||
const bool high_inactivity = diff >= nrmac->ulsch_max_slots_inactivity;
|
||||
const bool high_inactivity = diff >= nrmac->ulsch_max_frame_inactivity * n;
|
||||
LOG_D(NR_MAC,
|
||||
"%4d.%2d UL inactivity %d slots has_data %d SR %d\n",
|
||||
frame,
|
||||
@@ -930,7 +903,7 @@ bool allocate_ul_retransmission(module_id_t module_id,
|
||||
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
|
||||
NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP:NULL;
|
||||
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
int rbStart = sched_ctrl->active_ubwp ? NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE) : 0;
|
||||
int rbStart = 0; // wrt BWP start
|
||||
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
|
||||
const uint8_t num_dmrs_cdm_grps_no_data = (sched_ctrl->active_bwp || ubwpd) ? 1 : 2;
|
||||
@@ -1066,10 +1039,10 @@ void pf_ul(module_id_t module_id,
|
||||
LOG_D(NR_MAC,"pf_ul: preparing UL scheduling for UE %d\n",UE_id);
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
|
||||
NR_BWP_t *genericParameters = sched_ctrl->active_ubwp ? &sched_ctrl->active_ubwp->bwp_Common->genericParameters : &scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
|
||||
int rbStart = 0; // wrt BWP start
|
||||
NR_CellGroupConfig_t *cg = UE_info->CellGroup[UE_id];
|
||||
NR_BWP_UplinkDedicated_t *ubwpd= cg ? cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP : NULL;
|
||||
|
||||
int rbStart = sched_ctrl->active_ubwp ? NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE) : 0;
|
||||
const uint16_t bwpSize = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
|
||||
NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch;
|
||||
NR_pusch_semi_static_t *ps = &sched_ctrl->pusch_semi_static;
|
||||
@@ -1320,6 +1293,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
|
||||
MAX_BWP_SIZE);
|
||||
const uint16_t bwpStart = NRRIV2PRBOFFSET(sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->genericParameters.locationAndBandwidth:
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
|
||||
MAX_BWP_SIZE);
|
||||
const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = sched_ctrl->active_ubwp ?
|
||||
sched_ctrl->active_ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
|
||||
scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
|
||||
@@ -1333,10 +1310,10 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
|
||||
if (RC.nrmac[module_id]->ulprbbl[i] == 1) vrb_map_UL[i]=symb;
|
||||
|
||||
for (int i = 0; i < bwpSize; i++) {
|
||||
while ((vrb_map_UL[i] & symb) != 0 && i < bwpSize)
|
||||
while ((vrb_map_UL[bwpStart + i] & symb) != 0 && i < bwpSize)
|
||||
i++;
|
||||
st = i;
|
||||
while ((vrb_map_UL[i] & symb) == 0 && i < bwpSize)
|
||||
while ((vrb_map_UL[bwpStart + i] & symb) == 0 && i < bwpSize)
|
||||
i++;
|
||||
if (i - st > len) {
|
||||
len = i - st;
|
||||
@@ -1659,7 +1636,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
|
||||
ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
|
||||
pdcch_pdu = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
|
||||
ul_dci_req->numPdus += 1;
|
||||
nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
|
||||
nr_configure_pdcch(nr_mac, pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
|
||||
pdcch_pdu_bwp_coreset[bwpid][coresetid] = pdcch_pdu;
|
||||
}
|
||||
|
||||
|
||||
@@ -248,7 +248,8 @@ void find_search_space(int ss_type,
|
||||
NR_BWP_Downlink_t *bwp,
|
||||
NR_SearchSpace_t *ss);
|
||||
|
||||
void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
|
||||
void nr_configure_pdcch(gNB_MAC_INST *gNB_mac,
|
||||
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
|
||||
NR_SearchSpace_t *ss,
|
||||
NR_ControlResourceSet_t *coreset,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
|
||||
@@ -145,6 +145,8 @@ typedef struct {
|
||||
uint8_t msg3_first_rb;
|
||||
/// Msg3 number of RB
|
||||
uint8_t msg3_nb_rb;
|
||||
/// Msg3 BWP start
|
||||
uint8_t msg3_bwp_start;
|
||||
/// Msg3 TPC command
|
||||
uint8_t msg3_TPC;
|
||||
/// Msg3 ULdelay command
|
||||
@@ -748,7 +750,7 @@ typedef struct gNB_MAC_INST_s {
|
||||
int *preferred_ul_tda[MAX_NUM_BWP];
|
||||
|
||||
/// maximum number of slots before a UE will be scheduled ULSCH automatically
|
||||
uint32_t ulsch_max_slots_inactivity;
|
||||
uint32_t ulsch_max_frame_inactivity;
|
||||
|
||||
/// DL preprocessor for differentiated scheduling
|
||||
nr_pp_impl_dl pre_processor_dl;
|
||||
@@ -756,6 +758,8 @@ typedef struct gNB_MAC_INST_s {
|
||||
nr_pp_impl_ul pre_processor_ul;
|
||||
|
||||
NR_UE_sched_ctrl_t *sched_ctrlCommon;
|
||||
uint16_t cset0_bwp_start;
|
||||
uint16_t cset0_bwp_size;
|
||||
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64];
|
||||
|
||||
bool first_MIB;
|
||||
|
||||
@@ -67,9 +67,7 @@ typedef struct {
|
||||
} pdcp_params_t;
|
||||
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
#define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
|
||||
#endif
|
||||
#define PDCP_USE_NETLINK ( get_pdcp_optmask() & PDCP_USE_NETLINK_BIT)
|
||||
#define LINK_ENB_PDCP_TO_IP_DRIVER ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_IP_DRIVER_BIT)
|
||||
#define LINK_ENB_PDCP_TO_GTPV1U ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_GTPV1U_BIT)
|
||||
#define UE_NAS_USE_TUN ( get_pdcp_optmask() & UE_NAS_USE_TUN_BIT)
|
||||
@@ -501,7 +499,6 @@ typedef struct {
|
||||
#define REORDERING_WINDOW_SN_7BIT 64
|
||||
#define REORDERING_WINDOW_SN_12BIT 2048
|
||||
|
||||
extern signed int pdcp_2_nas_irq;
|
||||
extern pdcp_stats_t UE_pdcp_stats[MAX_MOBILES_PER_ENB];
|
||||
extern pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
# include "rlc_tm_entity.h"
|
||||
# include "mem_block.h"
|
||||
//# include "rrm_config_structs.h"
|
||||
# include "rlc_tm_structs.h"
|
||||
//# include "rlc.h"
|
||||
# include "platform_types.h"
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include "rlc_um.h"
|
||||
#include "rlc_primitives.h"
|
||||
#include "list.h"
|
||||
#include "rrm_config_structs.h"
|
||||
#include "LAYER2/MAC/mac_extern.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
# include "rlc_um_entity.h"
|
||||
# include "mem_block.h"
|
||||
# include "rrm_config_structs.h"
|
||||
# include "rlc_um_structs.h"
|
||||
# include "rlc_um_constants.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "pdcp.h"
|
||||
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||
#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h"
|
||||
|
||||
#define TODO do { \
|
||||
printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \
|
||||
@@ -447,10 +448,18 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
|
||||
if(IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN){
|
||||
LOG_D(PDCP, "IP packet received, to be sent to TUN interface");
|
||||
len = write(nas_sock_fd[0], buf, size);
|
||||
|
||||
if(entity->has_sdapDLheader){
|
||||
size -= SDAP_HDR_LENGTH;
|
||||
len = write(nas_sock_fd[0], &buf[SDAP_HDR_LENGTH], size);
|
||||
} else {
|
||||
len = write(nas_sock_fd[0], buf, size);
|
||||
}
|
||||
|
||||
if (len != size) {
|
||||
LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
for (i = 0; i < 5; i++) {
|
||||
@@ -480,7 +489,10 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX;
|
||||
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).rnti = ue->rnti;
|
||||
GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).pdusession_id = entity->pdusession_id;
|
||||
if (offset==1) LOG_D(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
|
||||
if (offset==1) {
|
||||
LOG_I(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]);
|
||||
sdap_gnb_ul_header_handler(buf[0]); // Handler for the UL gNB SDAP Header
|
||||
}
|
||||
LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size-offset);
|
||||
itti_send_msg_to_task(TASK_VARIABLE, INSTANCE_DEFAULT, message_p);
|
||||
}
|
||||
@@ -828,10 +840,6 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s,
|
||||
has_sdap = 1;
|
||||
has_sdapULheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderUL == NR_SDAP_Config__sdap_HeaderUL_present ? 1 : 0;
|
||||
has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0;
|
||||
if (has_sdapDLheader==1) {
|
||||
LOG_E(PDCP,"%s:%d:%s: fatal, no support for SDAP DL yet\n",__FILE__,__LINE__,__FUNCTION__);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
/* TODO(?): accept different UL and DL SN sizes? */
|
||||
if (sn_size_ul != sn_size_dl) {
|
||||
@@ -903,9 +911,7 @@ boolean_t nr_rrc_pdcp_config_asn1_req(
|
||||
uint8_t *const kRRCint,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||
#endif
|
||||
,rb_id_t *const defaultDRB,
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list)
|
||||
//struct NR_RLC_Config *rlc_Config)
|
||||
@@ -975,9 +981,7 @@ boolean_t rrc_pdcp_config_asn1_req(
|
||||
uint8_t *const kRRCenc,
|
||||
uint8_t *const kRRCint,
|
||||
uint8_t *const kUPenc
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||
#endif
|
||||
,rb_id_t *const defaultDRB)
|
||||
{
|
||||
return 0;
|
||||
@@ -1240,10 +1244,8 @@ boolean_t pdcp_data_req(
|
||||
const sdu_size_t sdu_buffer_size,
|
||||
unsigned char *const sdu_buffer,
|
||||
const pdcp_transmission_mode_t mode
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
,const uint32_t *const sourceL2Id
|
||||
,const uint32_t *const destinationL2Id
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (srb_flagP) {
|
||||
|
||||
@@ -270,7 +270,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
|
||||
+ buf_stat.retx_size
|
||||
+ buf_stat.tx_size;
|
||||
} else {
|
||||
if (!(frameP%128)) //to supress this warning message
|
||||
if (!(frameP%128)) //to suppress this warning message
|
||||
LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
|
||||
ret.bytes_in_buffer = 0;
|
||||
}
|
||||
@@ -334,6 +334,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
|
||||
+ buf_stat.retx_size
|
||||
+ buf_stat.tx_size;
|
||||
} else {
|
||||
if (!(frameP%128)) //to suppress this warning message
|
||||
LOG_W(RLC, "[%s] Radio Bearer (channel ID %d) is NULL for UE with rntiP %x\n", __FUNCTION__, channel_idP, rntiP);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
@@ -953,16 +955,16 @@ rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt
|
||||
if ((drb2add_listP != NULL) && (rlc_bearer2add_list != NULL)) {
|
||||
for (i = 0; i < drb2add_listP->list.count; i++) {
|
||||
if (rlc_bearer2add_list != NULL) {
|
||||
for(j = 0; j < rlc_bearer2add_list->list.count; j++){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
|
||||
if(drb2add_listP->list.array[i]->drb_Identity == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
|
||||
add_drb(rnti, drb2add_listP->list.array[i], rlc_bearer2add_list->list.array[j]);
|
||||
for(j = 0; j < rlc_bearer2add_list->list.count; j++){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
|
||||
if(drb2add_listP->list.array[i]->drb_Identity == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
|
||||
add_drb(rnti, drb2add_listP->list.array[i], rlc_bearer2add_list->list.array[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -362,264 +362,5 @@ int dump_eNB_l2_stats(char *buffer, int length) {
|
||||
|
||||
return len + 1 /* SR: for trailing \0 */;
|
||||
}
|
||||
#ifdef PROC
|
||||
int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) {
|
||||
int len = 0,fg,Overhead, Sign;
|
||||
unsigned int i,j,k,kk;
|
||||
unsigned int Mod_id = 0,CH_index;
|
||||
unsigned int tx_pdcp_sdu;
|
||||
unsigned int tx_pdcp_sdu_discarded;
|
||||
unsigned int tx_retransmit_pdu_unblock;
|
||||
unsigned int tx_retransmit_pdu_by_status;
|
||||
unsigned int tx_retransmit_pdu;
|
||||
unsigned int tx_data_pdu;
|
||||
unsigned int tx_control_pdu;
|
||||
unsigned int rx_sdu;
|
||||
unsigned int rx_error_pdu;
|
||||
unsigned int rx_data_pdu;
|
||||
unsigned int rx_data_pdu_out_of_window;
|
||||
unsigned int rx_control_pdu;
|
||||
|
||||
// if (mac_xface->is_cluster_head == 0) {
|
||||
for (k=0; k<NB_INST; k++) {
|
||||
if (Mac_rlc_xface->Is_cluster_head[k] == 0) {
|
||||
#ifndef PHY_EMUL_ONE_MACHINE
|
||||
Mod_id=k-NB_CH_INST;
|
||||
len+=sprintf(&buffer[len],"UE TTI: %d\n",Mac_rlc_xface->frame);
|
||||
|
||||
for (CH_index = 0; CH_index<NB_CNX_UE; CH_index++) {
|
||||
if (UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Active==1) {
|
||||
len+=sprintf(&buffer[len],"CH %u: Wideband SINR %d dB---\n",
|
||||
CH_index,UE_mac_inst[Mod_id].Def_meas[CH_index].Wideband_sinr);
|
||||
len+=sprintf(&buffer[len],"CH %u: Subband SINR (dB) :",
|
||||
CH_index);
|
||||
|
||||
for (fg=0; fg<NUMBER_OF_MEASUREMENT_SUBBANDS; fg++) {
|
||||
len+=sprintf(&buffer[len],"%d ",UE_mac_inst[Mod_id].Def_meas[CH_index].Sinr_meas[0][fg]);
|
||||
}
|
||||
|
||||
len+=sprintf(&buffer[len],"\n");
|
||||
len+=sprintf(&buffer[len],"BCCH %d, NB_RX_MAC = %d (%d errors)\n",
|
||||
UE_mac_inst[Mod_id].Bcch_lchan[CH_index].Lchan_info.Lchan_id.Index,
|
||||
UE_mac_inst[Mod_id].Bcch_lchan[CH_index].Lchan_info.NB_RX,
|
||||
UE_mac_inst[Mod_id].Bcch_lchan[CH_index].Lchan_info.NB_RX_ERRORS);
|
||||
len+=sprintf(&buffer[len],"CCCH %d, NB_RX_MAC = %d (%d errors)\n",
|
||||
UE_mac_inst[Mod_id].Ccch_lchan[CH_index].Lchan_info.Lchan_id.Index,
|
||||
UE_mac_inst[Mod_id].Ccch_lchan[CH_index].Lchan_info.NB_RX,
|
||||
UE_mac_inst[Mod_id].Ccch_lchan[CH_index].Lchan_info.NB_RX_ERRORS);
|
||||
len+=sprintf(&buffer[len],"LCHAN %d (DCCH), NB_TX_MAC = %d (%d bits/TTI, %d kbits/sec), NB_RX_MAC = %d (%d errors)\n",
|
||||
UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.Lchan_id.Index,
|
||||
UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_TX,
|
||||
UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.output_rate,
|
||||
(10*UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.output_rate)>>5,
|
||||
UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX,
|
||||
UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX_ERRORS);
|
||||
|
||||
for(i=1; i<NB_RAB_MAX; i++) {
|
||||
if (UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Active==1) {
|
||||
Overhead=UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate - Pdcp_stats_tx_rate[k][CH_index][i];
|
||||
|
||||
if(Overhead<0) {
|
||||
Overhead=-Overhead;
|
||||
Sign=-1;
|
||||
} else {
|
||||
Sign=1;
|
||||
}
|
||||
|
||||
len+=sprintf(&buffer[len],
|
||||
"[PDCP]LCHAN %d: NB_TX = %d ,Tx_rate =(%d bits/TTI ,%d Kbits/s), NB_RX = %d ,Rx_rate =(%d bits/TTI ,%d Kbits/s) , LAYER2 TX OVERHEAD: %d Kbits/s\n",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
Pdcp_stats_tx[k][CH_index][i],
|
||||
Pdcp_stats_tx_rate[k][CH_index][i],
|
||||
(10*Pdcp_stats_tx_rate[k][CH_index][i])>>5,
|
||||
Pdcp_stats_rx[k][CH_index][i],
|
||||
Pdcp_stats_rx_rate[k][CH_index][i],
|
||||
(10*Pdcp_stats_rx_rate[k][CH_index][i])>>5,
|
||||
Sign*(10*Overhead)>>5);
|
||||
int status = rlc_stat_req (k,
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
&tx_pdcp_sdu,
|
||||
&tx_pdcp_sdu_discarded,
|
||||
&tx_retransmit_pdu_unblock,
|
||||
&tx_retransmit_pdu_by_status,
|
||||
&tx_retransmit_pdu,
|
||||
&tx_data_pdu,
|
||||
&tx_control_pdu,
|
||||
&rx_sdu,
|
||||
&rx_error_pdu,
|
||||
&rx_data_pdu,
|
||||
&rx_data_pdu_out_of_window,
|
||||
&rx_control_pdu) ;
|
||||
|
||||
if (status == RLC_OP_STATUS_OK) {
|
||||
len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_SDU_TO_TX = %u\tNB_SDU_DISC %u\tNB_RX_SDU %u\n",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
tx_pdcp_sdu,
|
||||
tx_pdcp_sdu_discarded,
|
||||
rx_sdu);
|
||||
len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_TB_TX_DATA = %u\tNB_TB_TX_CONTROL %u\tNB_TX_TB_RETRANS %u",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
tx_data_pdu,
|
||||
tx_control_pdu,
|
||||
tx_retransmit_pdu);
|
||||
len+=sprintf(&buffer[len],"\tRLC LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %u\tNB_TX_TB_RETRANS_PADD %u\n",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
tx_retransmit_pdu_by_status,
|
||||
tx_retransmit_pdu_unblock);
|
||||
len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_RX_DATA = %u\tNB_RX_TB_OUT_WIN %u\tNB_RX_TB_CORRUPT %u\n",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
rx_data_pdu,
|
||||
rx_data_pdu_out_of_window,
|
||||
rx_error_pdu);
|
||||
}
|
||||
|
||||
len+=sprintf(&buffer[len],"[MAC]: LCHAN %d, NB_TX_MAC = %d (%d bits/TTI, %d kbits/s), NB_RX_MAC = %d (%d errors)\n",
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index,
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_TX,
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate,
|
||||
(10*UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate)>>5,
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX,
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX_ERRORS);
|
||||
len+=sprintf(&buffer[len]," TX per TB: ");
|
||||
|
||||
for(kk=0; kk<MAX_NUMBER_TB_PER_LCHAN/2; kk++) {
|
||||
len+=sprintf(&buffer[len],"%d . ",UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_TX_TB[kk]);
|
||||
}
|
||||
|
||||
len+=sprintf(&buffer[len],"\n");
|
||||
len+=sprintf(&buffer[len]," RXerr per TB: ");
|
||||
|
||||
for(kk=0; kk<MAX_NUMBER_TB_PER_LCHAN/2; kk++)
|
||||
len+=sprintf(&buffer[len],"%d/%d . ",UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX_ERRORS_TB[kk],
|
||||
UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX_TB[kk]);
|
||||
|
||||
len+=sprintf(&buffer[len],"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif //PHY_EMUL_ONE_MACHINE
|
||||
} else if(Mac_rlc_xface->Is_cluster_head[k] ==1) {
|
||||
Mod_id=k;
|
||||
len+=sprintf(&buffer[len],
|
||||
"------------------------------------------------------------------- TTI: %d------------------------------------------------------------------\n",
|
||||
Mac_rlc_xface->frame);
|
||||
|
||||
for(i=1; i<=NB_CNX_CH; i++) {
|
||||
if (CH_mac_inst[Mod_id].Dcch_lchan[i].Active==1) {
|
||||
len+=sprintf(&buffer[len],"\nMR index %u: DL SINR (feedback) %d dB, CQI: %s\n\n",
|
||||
i,//CH_rrc_inst[Mod_id].Info.UE_info[i].L2_id[0],
|
||||
CH_mac_inst[Mod_id].Def_meas[i].Wideband_sinr,
|
||||
print_cqi(CH_mac_inst[Mod_id].Def_meas[i].cqi));
|
||||
len+=sprintf(&buffer[len],
|
||||
"[MAC] LCHAN %d (DCCH), NB_TX_MAC= %d (%d bits/TTI, %d kbits/s), NB_RX_MAC= %d (errors %d, sacch errors %d, sach errors %d, sach_missing %d)\n\n",
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.Lchan_id.Index,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_TX,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate,
|
||||
(10*CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate)>>5,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACCH_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_MISSING);
|
||||
|
||||
for(j=0; j<NB_RAB_MAX; j++) {
|
||||
if (CH_mac_inst[Mod_id].Dtch_lchan[j][i].Active==1) {
|
||||
Overhead=CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate - Pdcp_stats_tx_rate[k][i][j];
|
||||
|
||||
if(Overhead<0) {
|
||||
Overhead=-Overhead;
|
||||
Sign=-1;
|
||||
} else {
|
||||
Sign=1;
|
||||
}
|
||||
|
||||
len+=sprintf(&buffer[len],
|
||||
"[PDCP]LCHAN %d: NB_TX = %d ,Tx_rate =(%d bits/TTI ,%d Kbits/s), NB_RX = %d ,Rx_rate =(%d bits/TTI ,%d Kbits/s), LAYER2 TX OVERHEAD= %d Kbits/s\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
Pdcp_stats_tx[k][i][j],
|
||||
Pdcp_stats_tx_rate[k][i][j],
|
||||
(10*Pdcp_stats_tx_rate[k][i][j])>>5,
|
||||
Pdcp_stats_rx[k][i][j],
|
||||
Pdcp_stats_rx_rate[k][i][j],
|
||||
(10*Pdcp_stats_rx_rate[k][i][j])>>5,
|
||||
Sign*(10*Overhead)>>5);
|
||||
int status = rlc_stat_req (k,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
&tx_pdcp_sdu,
|
||||
&tx_pdcp_sdu_discarded,
|
||||
&tx_retransmit_pdu_unblock,
|
||||
&tx_retransmit_pdu_by_status,
|
||||
&tx_retransmit_pdu,
|
||||
&tx_data_pdu,
|
||||
&tx_control_pdu,
|
||||
&rx_sdu,
|
||||
&rx_error_pdu,
|
||||
&rx_data_pdu,
|
||||
&rx_data_pdu_out_of_window,
|
||||
&rx_control_pdu) ;
|
||||
/*
|
||||
if (status == RLC_OP_STATUS_OK) {
|
||||
len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_SDU_TO_TX = %d\tNB_SDU_DISC %d\tNB_RX_SDU %d\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
tx_pdcp_sdu,
|
||||
tx_pdcp_sdu_discarded,
|
||||
rx_sdu);
|
||||
len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TB_TX_DATA = %d\tNB_TB_TX_CONTROL %d\tNB_TX_TB_RETRANS %\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
tx_data_pdu,
|
||||
tx_control_pdu,
|
||||
tx_retransmit_pdu);
|
||||
len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %d\tNB_TX_TB_RETRANS_PADD %d\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
tx_retransmit_pdu_by_status,
|
||||
tx_retransmit_pdu_unblock);
|
||||
len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_RX_DATA = %d\tNB_RX_TB_OUT_WIN %d\tNB_RX_TB_CORRUPT %d\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
rx_data_pdu,
|
||||
rx_data_pdu_out_of_window,
|
||||
rx_error_pdu);
|
||||
}
|
||||
*/
|
||||
len+=sprintf(&buffer[len],
|
||||
"[MAC]LCHAN %d (CNX %u,RAB %u), NB_TX_MAC= %d (%d bits/TTI, %d kbit/s), NB_RX_MAC= %d (errors %d, sacch_errors %d, sach_errors %d, sach_missing %d)\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index,
|
||||
i,j,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_TX,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate,
|
||||
(10*CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate)>>5,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACCH_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_ERRORS,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_MISSING);
|
||||
len+=sprintf(&buffer[len],"[MAC][SCHEDULER] TX Arrival Rate %d, TX Service Rate %d, RX Arrival rate %d, RX Service rate %d, NB_BW_REQ_RX %d\n\n",
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Arrival_rate,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Tx_rate,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Req_rate,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Rx_rate,
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_BW_REQ_RX);
|
||||
/*
|
||||
len+=sprintf(&buffer[len]," TX per TB: ");
|
||||
for(kk=0;kk<MAX_NUMBER_TB_PER_LCHAN/2;kk++)
|
||||
len+=sprintf(&buffer[len],"%d.",CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_TX_TB[kk]);
|
||||
len+=sprintf(&buffer[len],"\n");
|
||||
len+=sprintf(&buffer[len]," RXerr per TB: ");
|
||||
for(kk=0;kk<MAX_NUMBER_TB_PER_LCHAN/2;kk++)
|
||||
len+=sprintf(&buffer[len],"%d/%d . ",CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_ERRORS_TB[kk],
|
||||
CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_TB[kk]);
|
||||
len+=sprintf(&buffer[len],"\n");
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -389,36 +389,19 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class
|
||||
pdcph.sourceL2Id = 0;
|
||||
pdcph.destinationL2Id = 0;
|
||||
|
||||
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
bytes_wrote = nas_netlink_send((char *)&pdcph,NAS_PDCPH_SIZE);
|
||||
#ifdef NAS_DEBUG_SEND
|
||||
printk("[NAS] Wrote %d bytes (header for %d byte skb) to PDCP via netlink\n",
|
||||
bytes_wrote,skb->len);
|
||||
#endif
|
||||
#else
|
||||
bytes_wrote = rtf_put(NAS2PDCP_FIFO, &pdcph, NAS_PDCPH_SIZE);
|
||||
#ifdef NAS_DEBUG_SEND
|
||||
printk("[NAS] Wrote %d bytes (header for %d byte skb) to PDCP fifo\n",
|
||||
bytes_wrote,skb->len);
|
||||
#endif
|
||||
#endif //PDCP_USE_NETLINK
|
||||
|
||||
if (bytes_wrote != NAS_PDCPH_SIZE) {
|
||||
printk("NAS_COMMON_QOS_SEND: problem while writing PDCP's header (bytes wrote = %d )\n",bytes_wrote);
|
||||
printk("rb_id %ld, Wrote %d, Header Size %lu\n", pdcph.rb_id , bytes_wrote, NAS_PDCPH_SIZE);
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
rtf_reset(NAS2PDCP_FIFO);
|
||||
#endif //PDCP_USE_NETLINK
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
bytes_wrote += nas_netlink_send((char *)skb->data,skb->len);
|
||||
#else
|
||||
bytes_wrote += rtf_put(NAS2PDCP_FIFO, skb->data, skb->len);
|
||||
#endif //PDCP_USE_NETLINK
|
||||
|
||||
if (bytes_wrote != skb->len+NAS_PDCPH_SIZE) {
|
||||
printk("NAS_COMMON_QOS_SEND: Inst %d, RB_ID %ld: problem while writing PDCP's data, bytes_wrote = %d, Data_len %d, PDCPH_SIZE %lu\n",
|
||||
@@ -427,9 +410,6 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class
|
||||
bytes_wrote,
|
||||
skb->len,
|
||||
NAS_PDCPH_SIZE); // congestion
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
rtf_reset(NAS2PDCP_FIFO);
|
||||
#endif //PDCP_USE_NETLINK
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -449,69 +429,6 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
//---------------------------------------------------------------------------
|
||||
void nas_COMMON_QOS_receive()
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
uint8_t sapi;
|
||||
struct pdcp_data_ind_header_s pdcph;
|
||||
unsigned char data_buffer[2048];
|
||||
struct classifier_entity *rclass;
|
||||
struct nas_priv *priv;
|
||||
int bytes_read;
|
||||
|
||||
// Start debug information
|
||||
#ifdef NAS_DEBUG_RECEIVE
|
||||
printk("NAS_COMMON_QOS_RECEIVE - begin \n");
|
||||
#endif
|
||||
|
||||
// End debug information
|
||||
|
||||
bytes_read = rtf_get(PDCP2PDCP_USE_RT_FIFO,&pdcph, NAS_PDCPH_SIZE);
|
||||
|
||||
while (bytes_read>0) {
|
||||
if (bytes_read != NAS_PDCPH_SIZE) {
|
||||
printk("NAS_COMMON_QOS_RECEIVE: problem while reading PDCP header\n");
|
||||
return;
|
||||
}
|
||||
|
||||
priv=netdev_priv(nasdev[pdcph.inst]);
|
||||
rclass = nas_COMMON_search_class_for_rb(pdcph.rb_id,priv);
|
||||
|
||||
bytes_read+= rtf_get(PDCP2PDCP_USE_RT_FIFO,
|
||||
data_buffer,
|
||||
pdcph.data_size);
|
||||
|
||||
#ifdef NAS_DEBUG_RECEIVE
|
||||
printk("NAS_COMMON_QOS_RECEIVE - Got header for RB %d, Inst %d \n",
|
||||
pdcph.rb_id,
|
||||
pdcph.inst);
|
||||
#endif
|
||||
|
||||
if (rclass) {
|
||||
#ifdef NAS_DEBUG_RECEIVE
|
||||
printk("[NAS][COMMON] Found corresponding connection in classifier for RAB\n");
|
||||
#endif //NAS_DEBUG_RECEIVE
|
||||
|
||||
nas_COMMON_receive(pdcph.data_size,
|
||||
(void *)data_buffer,
|
||||
pdcph.inst,
|
||||
rclass,
|
||||
pdcph.rb_id);
|
||||
}
|
||||
|
||||
bytes_read = rtf_get(PDCP2PDCP_USE_RT_FIFO, &pdcph, NAS_PDCPH_SIZE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef NAS_DEBUG_RECEIVE
|
||||
printk("NAS_COMMON_QOS_RECEIVE - end \n");
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
void nas_COMMON_QOS_receive(struct nlmsghdr *nlh)
|
||||
{
|
||||
|
||||
@@ -542,7 +459,6 @@ void nas_COMMON_QOS_receive(struct nlmsghdr *nlh)
|
||||
}
|
||||
|
||||
}
|
||||
#endif //PDCP_USE_NETLINK
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
struct cx_entity *nas_COMMON_search_cx(nasLocalConnectionRef_t lcr,struct nas_priv *priv)
|
||||
|
||||
@@ -53,10 +53,8 @@
|
||||
|
||||
struct net_device *nasdev[NB_INSTANCES_MAX];
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
extern void nas_netlink_release(void);
|
||||
extern int nas_netlink_init(void);
|
||||
#endif
|
||||
|
||||
//int bytes_wrote;
|
||||
//int bytes_read;
|
||||
@@ -82,38 +80,6 @@ int find_inst(struct net_device *dev)
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
//void interrupt(void){
|
||||
void *nas_interrupt(void)
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
uint8_t cxi;
|
||||
|
||||
// struct nas_priv *priv=netdev_priv(dev_id);
|
||||
// unsigned int flags;
|
||||
|
||||
// priv->lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
#ifdef DEBUG_INTERRUPT
|
||||
printk("INTERRUPT - begin\n");
|
||||
#endif
|
||||
// spin_lock_irqsave(&priv->lock,flags);
|
||||
cxi=0;
|
||||
// mesh_GC_receive();
|
||||
// mesh_DC_receive(naspriv->cx+cxi);
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
nas_COMMON_QOS_receive();
|
||||
#endif
|
||||
// spin_unlock_irqrestore(&priv->lock,flags);
|
||||
#ifdef DEBUG_INTERRUPT
|
||||
printk("INTERRUPT: end\n");
|
||||
#endif
|
||||
// return 0;
|
||||
return NULL;
|
||||
}
|
||||
#endif //NETLINK
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Called by ifconfig when the device is activated by ifconfig
|
||||
int nas_open(struct net_device *dev)
|
||||
{
|
||||
@@ -121,15 +87,6 @@ int nas_open(struct net_device *dev)
|
||||
printk("OPEN: begin\n");
|
||||
// MOD_INC_USE_COUNT;
|
||||
// Address has already been set at init
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
|
||||
if (pdcp_2_nas_irq==-EBUSY) {
|
||||
printk("OPEN: irq failure\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
#endif //PDCP_USE_NETLINK
|
||||
|
||||
/*
|
||||
netif_start_queue(dev);
|
||||
//
|
||||
@@ -449,16 +406,6 @@ int init_module (void)
|
||||
|
||||
printk("Starting NASMESH, number of IMEI paramters %d, IMEI %X%X\n",m_arg,nas_IMEI[0],nas_IMEI[1]);
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
|
||||
if (pdcp_2_nas_irq == -EBUSY || pdcp_2_nas_irq == -EINVAL) {
|
||||
printk("[NAS][INIT] No interrupt resource available\n");
|
||||
return -EBUSY;
|
||||
} else
|
||||
printk("[NAS][INIT]: Interrupt %d\n", pdcp_2_nas_irq);
|
||||
|
||||
#endif //NETLINK
|
||||
|
||||
for (inst=0; inst<NB_INSTANCES_MAX; inst++) {
|
||||
printk("[NAS][INIT] nasmesh_init_module: begin init instance %d\n",inst);
|
||||
|
||||
@@ -493,15 +440,11 @@ int init_module (void)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
|
||||
if ((err=nas_netlink_init()) == -1)
|
||||
printk("[NAS][INIT] NETLINK failed\n");
|
||||
|
||||
printk("[NAS][INIT] NETLINK INIT\n");
|
||||
|
||||
#endif //NETLINK
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
@@ -516,22 +459,6 @@ void cleanup_module(void)
|
||||
|
||||
printk("[NAS][CLEANUP]nasmesh_cleanup_module: begin\n");
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
|
||||
if (pdcp_2_nas_irq!=-EBUSY) {
|
||||
pdcp_2_nas_irq=0;
|
||||
// Start IRQ linux
|
||||
// free_irq(priv->irq, NULL);
|
||||
// End IRQ linux
|
||||
|
||||
}
|
||||
|
||||
#else // NETLINK
|
||||
|
||||
|
||||
|
||||
#endif //NETLINK
|
||||
|
||||
for (inst=0; inst<NB_INSTANCES_MAX; inst++) {
|
||||
#ifdef DEBUG_DEVICE
|
||||
printk("nasmesh_cleanup_module: unregister and free net device instance %d\n",inst);
|
||||
@@ -541,9 +468,7 @@ void cleanup_module(void)
|
||||
free_netdev(nasdev[inst]);
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
nas_netlink_release();
|
||||
#endif //PDCP_USE_NETLINK
|
||||
printk("nasmesh_cleanup_module: end\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -178,10 +178,4 @@ extern struct net_device *nasdev[NB_INSTANCES_MAX];
|
||||
|
||||
extern uint8_t NAS_NULL_IMEI[14];
|
||||
|
||||
//global variables shared with RRC
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
extern int pdcp_2_nas_irq;
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -293,10 +293,6 @@ int nas_mesh_DC_send_cx_establish_request(struct cx_entity *cx,struct nas_priv *
|
||||
nas_tool_print_buffer((char *)p,p->length);
|
||||
#endif
|
||||
++cx->retry;
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
|
||||
#endif
|
||||
cx->countimer=gpriv->timer_establishment;
|
||||
|
||||
if (bytes_wrote==p->length) {
|
||||
@@ -353,11 +349,6 @@ int nas_mesh_DC_send_cx_release_request(struct cx_entity *cx,
|
||||
p->length = NAS_TL_SIZE + sizeof(struct NASConnReleaseReq);
|
||||
p->nasUEDCPrimitive.conn_release_req.localConnectionRef = cx->lcr;
|
||||
p->nasUEDCPrimitive.conn_release_req.releaseCause = NAS_CX_RELEASE_UNDEF_CAUSE;
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
|
||||
#else
|
||||
// bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
|
||||
#endif
|
||||
|
||||
if (bytes_wrote==p->length) {
|
||||
cx->state=NAS_IDLE;
|
||||
@@ -441,22 +432,12 @@ void nas_mesh_DC_send_sig_data_request(struct sk_buff *skb,
|
||||
p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr;
|
||||
p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD
|
||||
p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (skb->len)+1; //adds category character
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
|
||||
#endif
|
||||
|
||||
if (bytes_wrote!=p->length) {
|
||||
printk("NAS_MESH_DC_SEND_SIG: Header sent failure in DC-FIFO\n");
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], &data_type, 1);
|
||||
// bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], skb->data, skb->len);
|
||||
#endif
|
||||
|
||||
if (bytes_wrote != p->length + skb->len + 1) {
|
||||
printk("NAS_MESH_DC_SEND_SIG: Data sent failure in DC-FIFO\n");
|
||||
return;
|
||||
@@ -511,22 +492,12 @@ void nas_mesh_DC_send_peer_sig_data_request(struct cx_entity *cx, uint8_t sig_ca
|
||||
p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr;
|
||||
p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD
|
||||
p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (nas_length)+1; //adds category character
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length);
|
||||
#endif
|
||||
|
||||
if (bytes_wrote!=p->length) {
|
||||
printk("NAS_MESH_DC_PEER_SEND_SIG: Header sent failure in DC-FIFO\n");
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], &data_type, 1);
|
||||
// bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], (char *)nas_data, nas_length);
|
||||
#endif
|
||||
|
||||
if (bytes_wrote != p->length + nas_length + 1) {
|
||||
printk("NAS_MESH_DC_PEER_SEND_SIG: Data sent failure in DC-FIFO\n");
|
||||
return;
|
||||
@@ -665,9 +636,6 @@ void nas_mesh_DC_decode_sig_data_ind(struct cx_entity *cx, struct nas_ue_dc_elem
|
||||
}
|
||||
|
||||
// End debug information
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
// nas_COMMON_receive(p->length, p->nasUEDCPrimitive.data_transfer_ind.nasDataLength, cx->sap[NAS_DC_OUTPUT_SAPI]);
|
||||
#endif
|
||||
#ifdef NAS_DEBUG_DC
|
||||
printk("NAS_MESH_DC_RECEIVE: DATA_TRANSFER_IND reception\n");
|
||||
printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.data_transfer_ind.localConnectionRef);
|
||||
@@ -842,20 +810,12 @@ int nas_mesh_DC_receive(struct cx_entity *cx,struct nas_priv *gpriv)
|
||||
}
|
||||
|
||||
// End debug information
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_read = rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI] , gpriv->rbuffer, NAS_TL_SIZE);
|
||||
#endif
|
||||
|
||||
if (bytes_read>0) {
|
||||
struct nas_ue_dc_element *p;
|
||||
|
||||
p= (struct nas_ue_dc_element *)(gpriv->rbuffer);
|
||||
//get the rest of the primitive
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE);
|
||||
#endif
|
||||
|
||||
if (bytes_read!=p->length) {
|
||||
printk("NAS_MESH_DC_RECEIVE: Problem while reading primitive header\n");
|
||||
@@ -982,19 +942,11 @@ int nas_mesh_GC_receive(struct nas_priv *gpriv)
|
||||
#ifdef NAS_DEBUG_GC
|
||||
printk("NAS_MESH_GC_RECEIVE - begin \n");
|
||||
#endif
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_read = rtf_get(gpriv->sap[NAS_GC_SAPI], gpriv->rbuffer, NAS_TL_SIZE);
|
||||
#endif
|
||||
|
||||
if (bytes_read>0) {
|
||||
struct nas_ue_gc_element *p;
|
||||
p= (struct nas_ue_gc_element *)(gpriv->rbuffer);
|
||||
//get the rest of the primitive
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE);
|
||||
#endif
|
||||
|
||||
if (bytes_read!=p->length) {
|
||||
printk("NAS_MESH_GC_RECEIVE: Problem while reading primitive's header\n");
|
||||
@@ -1004,10 +956,6 @@ int nas_mesh_GC_receive(struct nas_priv *gpriv)
|
||||
// start decoding message
|
||||
switch (p->type) {
|
||||
case INFO_BROADCAST_IND :
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
#else
|
||||
// bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+p->length, p->nasUEGCPrimitive.broadcast_ind.nasDataLength);
|
||||
#endif
|
||||
if (bytes_read!=p->length+p->nasUEGCPrimitive.broadcast_ind.nasDataLength) {
|
||||
printk("NAS_MESH_GC_RECEIVE: INFO_BROADCAST_IND reception, Problem while reading primitive's data\n");
|
||||
return bytes_read;
|
||||
|
||||
@@ -110,14 +110,6 @@ void nas_COMMON_del_send(struct sk_buff *skb,
|
||||
struct cx_entity *cx,
|
||||
struct classifier_entity *gc,int inst, struct nas_priv *gpriv);
|
||||
|
||||
#ifndef PDCP_USE_NETLINK
|
||||
/**
|
||||
\fn void nas_COMMON_QOS_receive()
|
||||
\brief Retrieve PDU from PDCP for connection
|
||||
*/
|
||||
void nas_COMMON_QOS_receive(void);
|
||||
#endif //PDCP_USE_NETLINK
|
||||
|
||||
/**
|
||||
\fn struct rb_entity *nas_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rabi, nasQoSTrafficClass_t qos)
|
||||
\brief Add a radio-bearer descriptor
|
||||
@@ -168,7 +160,6 @@ struct classifier_entity
|
||||
*/
|
||||
void nas_COMMON_flush_rb(struct cx_entity *cx);
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
/**
|
||||
\fn int nas_netlink_send(unsigned char *data,unsigned int len)
|
||||
\brief Request the transfer of data by PDCP via netlink socket
|
||||
@@ -185,7 +176,6 @@ int nas_netlink_send(unsigned char *data,unsigned int len);
|
||||
*/
|
||||
void nas_COMMON_QOS_receive(struct nlmsghdr *nlh);
|
||||
|
||||
#endif //PDCP_USE_NETLINK
|
||||
//nasmesh.c
|
||||
|
||||
/**
|
||||
@@ -305,13 +295,10 @@ void nas_tool_print_buffer(char * buffer,int length);
|
||||
void nas_print_rb_entity(struct rb_entity *rb);
|
||||
void nas_print_classifier(struct classifier_entity *gc);
|
||||
|
||||
#ifdef PDCP_USE_NETLINK
|
||||
// nas_netlink.c
|
||||
|
||||
void nas_netlink_release(void);
|
||||
int nas_netlink_init(void);
|
||||
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
#endif
|
||||
|
||||
@@ -97,35 +97,6 @@ rrc_init_global_param(
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
|
||||
//#ifdef USER_MODE
|
||||
// Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE));
|
||||
//#endif //USRE_MODE
|
||||
|
||||
// Rrc_xface->openair_rrc_top_init = openair_rrc_top_init;
|
||||
// Rrc_xface->openair_rrc_eNB_init = openair_rrc_eNB_init;
|
||||
// Rrc_xface->openair_rrc_UE_init = openair_rrc_ue_init;
|
||||
// Rrc_xface->mac_rrc_data_ind = mac_rrc_data_ind;
|
||||
//Rrc_xface->mac_rrc_data_req = mac_rrc_data_req;
|
||||
// Rrc_xface->rrc_data_indP = (void *)rlcrrc_data_ind;
|
||||
// Rrc_xface->rrc_rx_tx = rrc_rx_tx;
|
||||
// Rrc_xface->mac_rrc_meas_ind = mac_rrc_meas_ind;
|
||||
// Rrc_xface->get_rrc_status = get_rrc_status;
|
||||
|
||||
//Rrc_xface->rrc_get_status = ...
|
||||
|
||||
// Mac_rlc_xface->mac_out_of_sync_ind=mac_out_of_sync_ind;
|
||||
|
||||
#ifndef NO_RRM
|
||||
// Rrc_xface->fn_rrc=fn_rrc;
|
||||
#endif
|
||||
// LOG_D(RRC, "[RRC]INIT_GLOBAL_PARAM: Mac_rlc_xface %p, rrc_rlc_register %p,rlcrrc_data_ind%p\n",Mac_rlc_xface,Mac_rlc_xface->rrc_rlc_register_rrc,rlcrrc_data_ind);
|
||||
/*
|
||||
if((Mac_rlc_xface==NULL) || (Mac_rlc_xface->rrc_rlc_register_rrc==NULL) ||
|
||||
(rlcrrc_data_ind==NULL)) {
|
||||
LOG_E(RRC,"Data structured is not initialized \n");
|
||||
return -1;
|
||||
}
|
||||
*/
|
||||
rrc_rlc_register_rrc (rrc_data_ind, NULL); //register with rlc
|
||||
|
||||
DCCH_LCHAN_DESC.transport_block_size = 4;
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
* \email: raymond.knopp@eurecom.fr ,navid.nikaein@eurecom.fr, michele.paffetti@studio.unibo.it
|
||||
*/
|
||||
|
||||
#ifdef USER_MODE
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h> /* for atoi(3) */
|
||||
@@ -36,9 +35,6 @@
|
||||
#include <string.h> /* for strerror(3) */
|
||||
#include <sysexits.h> /* for EX_* exit codes */
|
||||
#include <errno.h> /* for errno */
|
||||
#else
|
||||
#include <linux/module.h> /* Needed by all modules */
|
||||
#endif
|
||||
|
||||
#include <asn_application.h>
|
||||
#include <asn_internal.h> /* for _ASN_DEFAULT_STACK_MAX */
|
||||
|
||||
@@ -1,522 +0,0 @@
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_codecs_prim.c patch_dir/asn_codecs_prim.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_codecs_prim.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/asn_codecs_prim.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 4,10 ****
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <asn_codecs_prim.h>
|
||||
- #include <errno.h>
|
||||
|
||||
/*
|
||||
* Decode an always-primitive type.
|
||||
--- 4,9 ----
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_internal.h patch_dir/asn_internal.h
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_internal.h 2011-03-31 10:22:57.000000000 +0200
|
||||
--- patch_dir/asn_internal.h 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 10,20 ****
|
||||
--- 10,31 ----
|
||||
#define _ASN_INTERNAL_H_
|
||||
|
||||
#include "asn_application.h" /* Application-visible API */
|
||||
+ #ifndef USER_MODE
|
||||
+ #include <rtai.h>
|
||||
+ #include <rtai_malloc.h>
|
||||
+ #include "rtai_mem.h"
|
||||
+ #endif
|
||||
|
||||
#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */
|
||||
#include <assert.h> /* for assert() macro */
|
||||
#endif
|
||||
|
||||
+ #ifndef USER_MODE
|
||||
+ #ifndef assert
|
||||
+ #define assert(expr) ((expr) ? (void) 0 : printk("Assertion failed in %s:%d\n", __FILE__, __LINE__))
|
||||
+ #endif
|
||||
+ #endif
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
***************
|
||||
*** 23,32 ****
|
||||
--- 34,51 ----
|
||||
#define ASN1C_ENVIRONMENT_VERSION 922 /* Compile-time version */
|
||||
int get_asn1c_environment_version(void); /* Run-time version */
|
||||
|
||||
+ #ifdef USER_MODE
|
||||
#define CALLOC(nmemb, size) calloc(nmemb, size)
|
||||
#define MALLOC(size) malloc(size)
|
||||
#define REALLOC(oldptr, size) realloc(oldptr, size)
|
||||
#define FREEMEM(ptr) free(ptr)
|
||||
+ #else
|
||||
+ #define CALLOC(nmemb, size) rt_calloc(nmemb,size)
|
||||
+ #define MALLOC(size) rt_malloc(size)
|
||||
+ #define REALLOC(oldptr, size) rt_realloc(oldptr, size)
|
||||
+ #define FREEMEM(ptr) rt_free(ptr);
|
||||
+ #endif
|
||||
+
|
||||
|
||||
/*
|
||||
* A macro for debugging the ASN.1 internals.
|
||||
***************
|
||||
*** 38,45 ****
|
||||
#ifdef ASN_THREAD_SAFE
|
||||
#define asn_debug_indent 0
|
||||
#else /* !ASN_THREAD_SAFE */
|
||||
! int asn_debug_indent;
|
||||
#endif /* ASN_THREAD_SAFE */
|
||||
#define ASN_DEBUG(fmt, args...) do { \
|
||||
int adi = asn_debug_indent; \
|
||||
while(adi--) fprintf(stderr, " "); \
|
||||
--- 57,65 ----
|
||||
#ifdef ASN_THREAD_SAFE
|
||||
#define asn_debug_indent 0
|
||||
#else /* !ASN_THREAD_SAFE */
|
||||
! extern int asn_debug_indent;
|
||||
#endif /* ASN_THREAD_SAFE */
|
||||
+ #ifdef USER_MODE
|
||||
#define ASN_DEBUG(fmt, args...) do { \
|
||||
int adi = asn_debug_indent; \
|
||||
while(adi--) fprintf(stderr, " "); \
|
||||
***************
|
||||
*** 47,52 ****
|
||||
--- 67,81 ----
|
||||
fprintf(stderr, " (%s:%d)\n", \
|
||||
__FILE__, __LINE__); \
|
||||
} while(0)
|
||||
+ #else
|
||||
+ #define ASN_DEBUG(fmt, args...) do { \
|
||||
+ int adi = asn_debug_indent; \
|
||||
+ while(adi--) printk(" "); \
|
||||
+ printk(fmt, ##args); \
|
||||
+ printk(" (%s:%d)\n", \
|
||||
+ __FILE__, __LINE__); \
|
||||
+ } while(0)
|
||||
+ #endif
|
||||
#else /* !__GNUC__ */
|
||||
void ASN_DEBUG_f(const char *fmt, ...);
|
||||
#define ASN_DEBUG ASN_DEBUG_f
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_SET_OF.c patch_dir/asn_SET_OF.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_SET_OF.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/asn_SET_OF.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 4,10 ****
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <asn_SET_OF.h>
|
||||
- #include <errno.h>
|
||||
|
||||
/*
|
||||
* Add another element into the set.
|
||||
--- 4,9 ----
|
||||
***************
|
||||
*** 21,26 ****
|
||||
--- 20,27 ----
|
||||
/*
|
||||
* Make sure there's enough space to insert an element.
|
||||
*/
|
||||
+ ASN_DEBUG("SET ADD: count %d, size %d",as->count,as->size);
|
||||
+
|
||||
if(as->count == as->size) {
|
||||
int _newsize = as->size ? (as->size << 1) : 4;
|
||||
void *_new_arr;
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_system.h patch_dir/asn_system.h
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/asn_system.h 2011-03-31 10:22:57.000000000 +0200
|
||||
--- patch_dir/asn_system.h 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 13,25 ****
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
! #include <stdio.h> /* For snprintf(3) */
|
||||
! #include <stdlib.h> /* For *alloc(3) */
|
||||
! #include <string.h> /* For memcpy(3) */
|
||||
! #include <sys/types.h> /* For size_t */
|
||||
! #include <limits.h> /* For LONG_MAX */
|
||||
! #include <stdarg.h> /* For va_start */
|
||||
! #include <stddef.h> /* for offsetof and ptrdiff_t */
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
--- 13,39 ----
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
! #ifdef USER_MODE
|
||||
! #include <stdio.h> // For snprintf(3)
|
||||
! #include <stdlib.h> // For *alloc(3)
|
||||
! #include <string.h> // For memcpy(3)
|
||||
! #include <sys/types.h> // For size_t
|
||||
! #include <limits.h> // For LONG_MAX
|
||||
! #include <stdarg.h> // For va_start
|
||||
! #include <stddef.h> // for offsetof and ptrdiff_t
|
||||
! #include <errno.h> // For errno
|
||||
! #else
|
||||
! typedef char FILE;
|
||||
! #include <linux/types.h>
|
||||
! #include <linux/slab.h> // For snprintf
|
||||
! #include <linux/sort.h> // For sort
|
||||
! #define qsort(base,num,size,cmp_func) sort(base,num,size,cmp_func,NULL)
|
||||
! #include <linux/errno.h>// For errno
|
||||
! #ifndef errno
|
||||
! extern int errno;
|
||||
! #endif
|
||||
! #include "bsearch.h"
|
||||
! #endif
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
***************
|
||||
*** 63,69 ****
|
||||
#include <types/vxTypes.h>
|
||||
#else /* !defined(__vxworks) */
|
||||
|
||||
! #include <inttypes.h> /* C99 specifies this file */
|
||||
/*
|
||||
* 1. Earlier FreeBSD version didn't have <stdint.h>,
|
||||
* but <inttypes.h> was present.
|
||||
--- 77,85 ----
|
||||
#include <types/vxTypes.h>
|
||||
#else /* !defined(__vxworks) */
|
||||
|
||||
! #ifdef USER_MODE
|
||||
! #include <inttypes.h> /*C99 specifies this file */
|
||||
! #endif
|
||||
/*
|
||||
* 1. Earlier FreeBSD version didn't have <stdint.h>,
|
||||
* but <inttypes.h> was present.
|
||||
***************
|
||||
*** 81,91 ****
|
||||
#define inline
|
||||
#endif /* __GNUC__ */
|
||||
#else
|
||||
! #include <stdint.h> /* SUSv2+ and C99 specify this file, for uintXX_t */
|
||||
#endif /* defined(sun) */
|
||||
#endif
|
||||
|
||||
! #include <netinet/in.h> /* for ntohl() */
|
||||
#define sys_ntohl(foo) ntohl(foo)
|
||||
|
||||
#endif /* defined(__vxworks) */
|
||||
--- 97,109 ----
|
||||
#define inline
|
||||
#endif /* __GNUC__ */
|
||||
#else
|
||||
! #ifdef USER_MODE
|
||||
! #include <stdint.h> /*SUSv2+ and C99 specify this file, for uintXX_t */
|
||||
! #endif
|
||||
#endif /* defined(sun) */
|
||||
#endif
|
||||
|
||||
! /*#include <netinet/in.h> for ntohl() */
|
||||
#define sys_ntohl(foo) ntohl(foo)
|
||||
|
||||
#endif /* defined(__vxworks) */
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/ber_tlv_tag.c patch_dir/ber_tlv_tag.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/ber_tlv_tag.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/ber_tlv_tag.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 4,10 ****
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <ber_tlv_tag.h>
|
||||
- #include <errno.h>
|
||||
|
||||
ssize_t
|
||||
ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) {
|
||||
--- 4,9 ----
|
||||
***************
|
||||
*** 57,63 ****
|
||||
return 0; /* Want more */
|
||||
}
|
||||
|
||||
!
|
||||
ssize_t
|
||||
ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
|
||||
char buf[sizeof("[APPLICATION ]") + 32];
|
||||
--- 56,62 ----
|
||||
return 0; /* Want more */
|
||||
}
|
||||
|
||||
! #ifdef USER_MODE
|
||||
ssize_t
|
||||
ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) {
|
||||
char buf[sizeof("[APPLICATION ]") + 32];
|
||||
***************
|
||||
*** 71,76 ****
|
||||
--- 70,76 ----
|
||||
|
||||
return fwrite(buf, 1, ret, f);
|
||||
}
|
||||
+ #endif
|
||||
|
||||
ssize_t
|
||||
ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) {
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constraints.c patch_dir/constraints.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constraints.c 2011-03-31 10:22:57.000000000 +0200
|
||||
--- patch_dir/constraints.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 1,4 ****
|
||||
! #include "asn_internal.h"
|
||||
#include "constraints.h"
|
||||
|
||||
int
|
||||
--- 1,4 ----
|
||||
! #include <asn_internal.h>
|
||||
#include "constraints.h"
|
||||
|
||||
int
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constr_TYPE.c patch_dir/constr_TYPE.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/constr_TYPE.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/constr_TYPE.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 4,10 ****
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
#include <constr_TYPE.h>
|
||||
- #include <errno.h>
|
||||
|
||||
/*
|
||||
* Version of the ASN.1 infrastructure shipped with compiler.
|
||||
--- 4,9 ----
|
||||
***************
|
||||
*** 29,34 ****
|
||||
--- 28,34 ----
|
||||
return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0);
|
||||
}
|
||||
|
||||
+ #ifdef USER_MODE
|
||||
/*
|
||||
* Print the target language's structure in human readable form.
|
||||
*/
|
||||
***************
|
||||
*** 75,77 ****
|
||||
--- 75,78 ----
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
}
|
||||
+ #endif
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/der_encoder.c patch_dir/der_encoder.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/der_encoder.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/der_encoder.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 3,9 ****
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
- #include <errno.h>
|
||||
|
||||
static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len,
|
||||
asn_app_consume_bytes_f *cb, void *app_key, int constructed);
|
||||
--- 3,8 ----
|
||||
***************
|
||||
*** 81,89 ****
|
||||
--- 80,90 ----
|
||||
asn_app_consume_bytes_f *cb,
|
||||
void *app_key) {
|
||||
ber_tlv_tag_t *tags; /* Copy of tags stream */
|
||||
+ ber_tlv_tag_t tags_array[8];
|
||||
int tags_count; /* Number of tags */
|
||||
size_t overall_length;
|
||||
ssize_t *lens;
|
||||
+ ssize_t lens_array[8];
|
||||
int i;
|
||||
|
||||
ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)",
|
||||
***************
|
||||
*** 102,111 ****
|
||||
* and initialize it appropriately.
|
||||
*/
|
||||
int stag_offset;
|
||||
! tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t));
|
||||
if(!tags) { /* Can fail on !x86 */
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
}
|
||||
tags_count = sd->tags_count
|
||||
+ 1 /* EXPLICIT or IMPLICIT tag is given */
|
||||
--- 103,121 ----
|
||||
* and initialize it appropriately.
|
||||
*/
|
||||
int stag_offset;
|
||||
! //tags = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t));
|
||||
! tags = &(tags_array[0]);
|
||||
! if ((sd->tags_count + 1)>=8) {
|
||||
! #ifdef USER_MODE
|
||||
! printf("der_encoder.c: ERROR tags array too small. Increase size!\n");
|
||||
! exit(-1);
|
||||
! #endif
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
! }
|
||||
if(!tags) { /* Can fail on !x86 */
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
}
|
||||
tags_count = sd->tags_count
|
||||
+ 1 /* EXPLICIT or IMPLICIT tag is given */
|
||||
***************
|
||||
*** 124,135 ****
|
||||
if(tags_count == 0)
|
||||
return 0;
|
||||
|
||||
! lens = (ssize_t *)alloca(tags_count * sizeof(lens[0]));
|
||||
if(!lens) {
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
}
|
||||
!
|
||||
/*
|
||||
* Array of tags is initialized.
|
||||
* Now, compute the size of the TLV pairs, from right to left.
|
||||
--- 134,154 ----
|
||||
if(tags_count == 0)
|
||||
return 0;
|
||||
|
||||
! //lens = (ssize_t *)alloca(tags_count * sizeof(lens[0]));
|
||||
! lens = &(lens_array[0]);
|
||||
! if (tags_count>=8) {
|
||||
! #ifdef USER_MODE
|
||||
! printf("der_encoder.c: ERROR lens array too small. Increase size!\n");
|
||||
! exit(-1);
|
||||
! #endif
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
! }
|
||||
if(!lens) {
|
||||
! errno = ENOMEM;
|
||||
! return -1;
|
||||
}
|
||||
!
|
||||
/*
|
||||
* Array of tags is initialized.
|
||||
* Now, compute the size of the TLV pairs, from right to left.
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/INTEGER.c patch_dir/INTEGER.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/INTEGER.c 2011-03-31 10:22:56.000000000 +0200
|
||||
--- patch_dir/INTEGER.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 6,12 ****
|
||||
#include <asn_internal.h>
|
||||
#include <INTEGER.h>
|
||||
#include <asn_codecs_prim.h> /* Encoder and decoder of a primitive type */
|
||||
- #include <errno.h>
|
||||
|
||||
/*
|
||||
* INTEGER basic type description.
|
||||
--- 6,11 ----
|
||||
***************
|
||||
*** 103,109 ****
|
||||
static ssize_t
|
||||
INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
! char scratch[32]; /* Enough for 64-bit integer */
|
||||
uint8_t *buf = st->buf;
|
||||
uint8_t *buf_end = st->buf + st->size;
|
||||
signed long accum;
|
||||
--- 102,108 ----
|
||||
static ssize_t
|
||||
INTEGER__dump(asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
! char scratch[128];
|
||||
uint8_t *buf = st->buf;
|
||||
uint8_t *buf_end = st->buf + st->size;
|
||||
signed long accum;
|
||||
***************
|
||||
*** 142,149 ****
|
||||
--- 141,152 ----
|
||||
|
||||
el = INTEGER_map_value2enum(specs, accum);
|
||||
if(el) {
|
||||
+ scrsize = sizeof(scratch);
|
||||
+ scr = scratch;
|
||||
+ /* cannot use alloca in kernel
|
||||
scrsize = el->enum_len + 32;
|
||||
scr = (char *)alloca(scrsize);
|
||||
+ */
|
||||
if(plainOrXER == 0)
|
||||
ret = snprintf(scr, scrsize,
|
||||
"%ld (%s)", accum, el->enum_name);
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/NativeEnumerated.c patch_dir/NativeEnumerated.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/NativeEnumerated.c 2011-03-31 10:22:57.000000000 +0200
|
||||
--- patch_dir/NativeEnumerated.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 46,51 ****
|
||||
--- 46,52 ----
|
||||
asn_app_consume_bytes_f *cb, void *app_key) {
|
||||
asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics;
|
||||
asn_enc_rval_t er;
|
||||
+ char scratch[128];
|
||||
const long *native = (const long *)sptr;
|
||||
const asn_INTEGER_enum_map_t *el;
|
||||
|
||||
***************
|
||||
*** 57,63 ****
|
||||
el = INTEGER_map_value2enum(specs, *native);
|
||||
if(el) {
|
||||
size_t srcsize = el->enum_len + 5;
|
||||
! char *src = (char *)alloca(srcsize);
|
||||
|
||||
er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
|
||||
assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
|
||||
--- 58,64 ----
|
||||
el = INTEGER_map_value2enum(specs, *native);
|
||||
if(el) {
|
||||
size_t srcsize = el->enum_len + 5;
|
||||
! char *src = (char *)scratch; //alloca(srcsize);
|
||||
|
||||
er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name);
|
||||
assert(er.encoded > 0 && (size_t)er.encoded < srcsize);
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/OCTET_STRING.c patch_dir/OCTET_STRING.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/OCTET_STRING.c 2011-03-31 10:22:55.000000000 +0200
|
||||
--- patch_dir/OCTET_STRING.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 6,12 ****
|
||||
#include <asn_internal.h>
|
||||
#include <OCTET_STRING.h>
|
||||
#include <BIT_STRING.h> /* for .bits_unused member */
|
||||
- #include <errno.h>
|
||||
|
||||
/*
|
||||
* OCTET STRING basic type description.
|
||||
--- 6,11 ----
|
||||
diff -cB /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/xer_encoder.c patch_dir/xer_encoder.c
|
||||
*** /homes/kaltenbe/Devel/openair/openair_branches/openair_lte/openair2/RRC/LITE/MESSAGES/asn1c/asn1c/skeletons/xer_encoder.c 2011-04-11 18:03:26.000000000 +0200
|
||||
--- patch_dir/xer_encoder.c 2011-05-31 10:28:26.000000000 +0200
|
||||
***************
|
||||
*** 3,10 ****
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
! #include <stdio.h>
|
||||
! #include <errno.h>
|
||||
|
||||
/*
|
||||
* The XER encoder of any type. May be invoked by the application.
|
||||
--- 3,10 ----
|
||||
* Redistribution and modifications are permitted subject to BSD license.
|
||||
*/
|
||||
#include <asn_internal.h>
|
||||
! //#include <stdio.h>
|
||||
! //#include <errno.h>
|
||||
|
||||
/*
|
||||
* The XER encoder of any type. May be invoked by the application.
|
||||
***************
|
||||
*** 41,46 ****
|
||||
--- 41,47 ----
|
||||
* This is a helper function for xer_fprint, which directs all incoming data
|
||||
* into the provided file descriptor.
|
||||
*/
|
||||
+ #ifdef USER_MODE
|
||||
static int
|
||||
xer__print2fp(const void *buffer, size_t size, void *app_key) {
|
||||
FILE *stream = (FILE *)app_key;
|
||||
***************
|
||||
*** 65,67 ****
|
||||
--- 66,69 ----
|
||||
|
||||
return fflush(stream);
|
||||
}
|
||||
+ #endif
|
||||
@@ -393,15 +393,7 @@ char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_
|
||||
init_SI_UE(&ctxt,eNB_index);
|
||||
LOG_D(RRC,PROTOCOL_RRC_CTXT_FMT" INIT: phy_sync_2_ch_ind\n",
|
||||
PROTOCOL_RRC_CTXT_ARGS(&ctxt));
|
||||
#ifndef NO_RRM
|
||||
send_msg(&S_rrc,msg_rrc_phy_synch_to_CH_ind(ctxt.module_id,eNB_index,UE_rrc_inst[ctxt.module_id].Mac_id));
|
||||
#endif
|
||||
#ifndef NO_RRM
|
||||
send_msg(&S_rrc,msg_rrc_phy_synch_to_CH_ind(ctxt.module_id,eNB_index,UE_rrc_inst[ctxt.module_id].Mac_id));
|
||||
#endif
|
||||
#ifdef NO_RRM //init ch SRB0, SRB1 & BDTCH
|
||||
openair_rrc_on_ue(&ctxt);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2249,9 +2241,6 @@ rrc_ue_decode_dcch(
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NO_RRM
|
||||
send_msg(&S_rrc,msg_rrc_end_scan_req(ctxt_pP->module_id,eNB_indexP));
|
||||
#endif
|
||||
}
|
||||
|
||||
const char siWindowLength[9][5] = {"1ms","2ms","5ms","10ms","15ms","20ms","40ms","80ms","ERR"};
|
||||
@@ -2530,14 +2519,6 @@ int decode_BCCH_MBMS_DLSCH_Message(
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
/*if ((rrc_get_sub_state(ctxt_pP->module_id) == RRC_SUB_STATE_IDLE_SIB_COMPLETE)
|
||||
#if defined(ENABLE_USE_MME)
|
||||
&& (UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data != NULL)
|
||||
#endif
|
||||
) {
|
||||
rrc_ue_generate_RRCConnectionRequest(ctxt_pP, 0);
|
||||
rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_CONNECTING );
|
||||
}*/
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_BCCH, VCD_FUNCTION_OUT );
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -173,13 +173,6 @@ extern pthread_mutex_t slrb_mutex;
|
||||
//the thread function
|
||||
void *send_UE_status_notification(void *);
|
||||
|
||||
|
||||
|
||||
//#include "COMMON/openair_defs.h"
|
||||
#ifndef USER_MODE
|
||||
//#include <rtai.h>
|
||||
#endif
|
||||
|
||||
#include "LTE_SystemInformationBlockType1.h"
|
||||
#include "LTE_SystemInformation.h"
|
||||
#include "LTE_RRCConnectionReconfiguration.h"
|
||||
@@ -217,12 +210,6 @@ void *send_UE_status_notification(void *);
|
||||
#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE
|
||||
#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE
|
||||
|
||||
#ifndef NO_RRM
|
||||
#include "L3_rrc_interface.h"
|
||||
#include "rrc_rrm_msg.h"
|
||||
#include "rrc_rrm_interface.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
|
||||
@@ -3618,9 +3618,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
, (LTE_PMCH_InfoList_r9_t *) NULL
|
||||
#endif
|
||||
, NULL);
|
||||
|
||||
/* Refresh SRBs/DRBs */
|
||||
@@ -3629,11 +3627,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
|
||||
*SRB_configList2, // NULL,
|
||||
*DRB_configList,
|
||||
NULL
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
, (LTE_PMCH_InfoList_r9_t *) NULL,
|
||||
0,
|
||||
0
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6331,9 +6327,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
, (LTE_PMCH_InfoList_r9_t *) NULL
|
||||
#endif
|
||||
, NULL);
|
||||
|
||||
/* Refresh SRBs/DRBs */
|
||||
@@ -6342,11 +6336,9 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
|
||||
*SRB_configList2, // NULL,
|
||||
*DRB_configList,
|
||||
NULL
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
, (LTE_PMCH_InfoList_r9_t *) NULL,
|
||||
0,
|
||||
0
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
@@ -7287,9 +7279,6 @@ rrc_eNB_decode_ccch(
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
rrcConnectionReestablishmentRequest->ue_Identity.physCellId,
|
||||
ue_context_p->ue_context.reestablishment_cause);
|
||||
#ifndef NO_RRM
|
||||
send_msg(&S_rrc, msg_rrc_MR_attach_ind(ctxt_pP->module_id, Mac_id));
|
||||
#else
|
||||
ue_context_p->ue_context.primaryCC_id = CC_id;
|
||||
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
|
||||
Idx = DCCH;
|
||||
@@ -7343,7 +7332,6 @@ rrc_eNB_decode_ccch(
|
||||
);
|
||||
}
|
||||
|
||||
#endif //NO_RRM
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -7532,9 +7520,6 @@ rrc_eNB_decode_ccch(
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NO_RRM
|
||||
send_msg(&S_rrc, msg_rrc_MR_attach_ind(ctxt_pP->module_id, Mac_id));
|
||||
#else
|
||||
ue_context_p->ue_context.primaryCC_id = CC_id;
|
||||
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
|
||||
Idx = DCCH;
|
||||
@@ -7587,7 +7572,6 @@ rrc_eNB_decode_ccch(
|
||||
);
|
||||
}
|
||||
|
||||
#endif //NO_RRM
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -1,277 +0,0 @@
|
||||
/*
|
||||
* 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.1 (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 rrm_sock.c
|
||||
|
||||
\brief RRM (Radio Ressource Manager ) Socket: communication withe other medium:
|
||||
- RRC ,
|
||||
- CMM ,
|
||||
- PUSU
|
||||
|
||||
\author BURLOT Pascal
|
||||
|
||||
\date 10/07/08
|
||||
|
||||
|
||||
\par Historique:
|
||||
P.BURLOT 2009-01-20
|
||||
+ send a message via fifo:
|
||||
- sending header
|
||||
- and data if any
|
||||
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RRC_RRM_FIFOS_XFACE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#else
|
||||
|
||||
#include<rtai_fifos.h>
|
||||
|
||||
#endif
|
||||
|
||||
#include "rrc_rrm_interface.h"
|
||||
#include "defs.h"
|
||||
//! \brief Taille maximale de la charge utile
|
||||
#define SIZE_MAX_PAYLOAD 2048
|
||||
//! \brief PID de l'espace utilisateur (Netlink mode)
|
||||
//#define PID_USERSPACE 0xAA
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef RRC_RRM_FIFOS_XFACE
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief This function opens a unix socket for the rrm communication
|
||||
\return The return value is a socket handle
|
||||
*/
|
||||
int open_socket(
|
||||
sock_rrm_t *s, ///< socket descriptor
|
||||
char *path_local, ///< local socket path if unix socket
|
||||
char *path_dest, ///< host Socket path if unix socket
|
||||
int rrm_inst ///< instance of the rrm entity
|
||||
) {
|
||||
/* Unix socket */
|
||||
int socket_fd ;
|
||||
int len ;
|
||||
|
||||
if ((socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
|
||||
perror("unix socket");
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
memset(&(s->un_local_addr), 0, sizeof(struct sockaddr_un));
|
||||
s->un_local_addr.sun_family = AF_UNIX;
|
||||
sprintf(s->un_local_addr.sun_path,"%s%d", path_local, rrm_inst );
|
||||
unlink(s->un_local_addr.sun_path);
|
||||
msg("local %s\n",s->un_local_addr.sun_path);
|
||||
len = strlen((s->un_local_addr).sun_path) + sizeof((s->un_local_addr).sun_family);
|
||||
|
||||
if (bind(socket_fd, (struct sockaddr *)&(s->un_local_addr), len) == -1) {
|
||||
perror("bind");
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
memset(&(s->un_dest_addr), 0, sizeof(struct sockaddr_un));
|
||||
s->un_dest_addr.sun_family = AF_UNIX;
|
||||
sprintf(s->un_dest_addr.sun_path,"%s%d", path_dest, rrm_inst );
|
||||
msg("Dest %s\n",s->un_dest_addr.sun_path);
|
||||
s->s = socket_fd ;
|
||||
return socket_fd ;
|
||||
}
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief This function closes a RRM socket
|
||||
\return none
|
||||
*/
|
||||
void close_socket(
|
||||
sock_rrm_t *sock ///< the socket handle
|
||||
) {
|
||||
shutdown(sock->s, SHUT_RDWR);
|
||||
close(sock->s);
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief This function send a buffer message to the unix socket
|
||||
\return if OK then "0" is returned else "-1"
|
||||
*/
|
||||
char BUFF[2048];
|
||||
int send_msg_sock(
|
||||
sock_rrm_t *s, ///< socket descriptor
|
||||
msg_t *smsg ///< the message to send
|
||||
) {
|
||||
/* Unix socket */
|
||||
int ret = 0 ;
|
||||
// char *buf = NULL;
|
||||
struct msghdr msghd ;
|
||||
struct iovec iov;
|
||||
int taille = sizeof(msg_head_t) ;
|
||||
|
||||
if ( smsg == NULL ) {
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
if ( smsg->data != NULL ) {
|
||||
taille += smsg->head.size ;
|
||||
}
|
||||
|
||||
//buf = RRM_MALLOC(char, taille);
|
||||
//if (buf ==NULL)
|
||||
//return -1 ;
|
||||
memcpy( BUFF, &(smsg->head), sizeof(msg_head_t) ) ;
|
||||
memcpy( BUFF+sizeof(msg_head_t), smsg->data, smsg->head.size ) ;
|
||||
iov.iov_base = (void *)BUFF;
|
||||
iov.iov_len = taille ;
|
||||
msghd.msg_name = (void *)&(s->un_dest_addr);
|
||||
msghd.msg_namelen = sizeof(s->un_dest_addr);
|
||||
msghd.msg_iov = &iov;
|
||||
msghd.msg_iovlen = 1;
|
||||
msghd.msg_control = NULL ;
|
||||
msghd.msg_controllen = 0 ;
|
||||
|
||||
if ( sendmsg(s->s, &msghd, 0) < 0 ) {
|
||||
ret = -1;
|
||||
msg("socket %d, dest %s\n",s->s,s->un_dest_addr.sun_path);
|
||||
perror("sendmsg:unix socket");
|
||||
}
|
||||
|
||||
//RRM_FREE(buf) ;
|
||||
//RRM_FREE(msg->data) ;
|
||||
//RRM_FREE(msg) ;
|
||||
return ret ;
|
||||
}
|
||||
|
||||
/*!
|
||||
*******************************************************************************
|
||||
\brief This function read a buffer from a unix socket
|
||||
\return the function returns a message pointer. If the pointeur is NULL, a error
|
||||
is happened.
|
||||
*/
|
||||
char *recv_msg(
|
||||
sock_rrm_t *s ///< socket descriptor
|
||||
) {
|
||||
/* Unix socket */
|
||||
char *buf = NULL;
|
||||
char *smsg = NULL;
|
||||
struct msghdr msghd ;
|
||||
struct iovec iov;
|
||||
int size_msg ;
|
||||
msg_head_t *head ;
|
||||
int ret ;
|
||||
int taille = SIZE_MAX_PAYLOAD ;
|
||||
buf = RRM_CALLOC( char,taille);
|
||||
|
||||
if ( buf == NULL ) {
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
iov.iov_base = (void *)buf;
|
||||
iov.iov_len = taille ;
|
||||
msghd.msg_name = (void *)&(s->un_dest_addr);
|
||||
msghd.msg_namelen = sizeof(s->un_dest_addr);
|
||||
msghd.msg_iov = &iov;
|
||||
msghd.msg_iovlen = 1;
|
||||
msghd.msg_control = NULL ;
|
||||
msghd.msg_controllen= 0 ;
|
||||
ret = recvmsg(s->s, &msghd, 0 ) ;
|
||||
|
||||
if ( ret <= 0 ) {
|
||||
// non-blocking socket
|
||||
// perror("PB recvmsg_un");
|
||||
RRM_FREE(buf);
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
if (msghd.msg_flags != 0 ) {
|
||||
fprintf(stderr,"error recvmsg_un: 0x%02x\n", msghd.msg_flags) ;
|
||||
RRM_FREE(buf);
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
head = (msg_head_t *) buf ;
|
||||
size_msg = sizeof(msg_head_t) + head->size ;
|
||||
smsg = RRM_CALLOC(char, size_msg ) ;
|
||||
|
||||
if ( smsg != NULL ) {
|
||||
memcpy( smsg, buf, size_msg ) ;
|
||||
}
|
||||
|
||||
RRM_FREE( buf ) ;
|
||||
return smsg ;
|
||||
}
|
||||
|
||||
#else //XFACE
|
||||
|
||||
int send_msg_fifo(int *s, msg_t *fmsg) {
|
||||
int ret = 0, ret1;
|
||||
int taille = sizeof(msg_head_t) ;
|
||||
msg("write on fifos %d, msg %p\n",*s,fmsg);
|
||||
|
||||
if ( fmsg == NULL ) {
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
// envoi le header
|
||||
ret1 = rtf_put (*s,(char *) &(fmsg->head), taille);
|
||||
|
||||
if(ret1 <0) {
|
||||
msg("rtf_put H ERR %d\n",ret1);
|
||||
rtf_reset(*s);
|
||||
return ret1;
|
||||
}
|
||||
|
||||
ret=ret1;
|
||||
|
||||
// envoi les datas si elles sont definis
|
||||
if ( fmsg->data != NULL ) {
|
||||
ret1 += rtf_put (*s,(char *) fmsg->data, fmsg->head.size);
|
||||
|
||||
if(ret1 <0) {
|
||||
msg("rtf_put D ERR %d\n",ret1);
|
||||
rtf_reset(*s);
|
||||
return ret1;
|
||||
}
|
||||
}
|
||||
|
||||
ret+=ret1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif //XFACE
|
||||
|
||||
int send_msg(void *s, msg_t *smsg) {
|
||||
send_msg_sock((sock_rrm_t *)s, smsg);
|
||||
}
|
||||
@@ -133,18 +133,6 @@
|
||||
|
||||
#include "common/ran_context.h"
|
||||
|
||||
//#include "PHY/defs.h"
|
||||
/*#ifndef USER_MODE
|
||||
#define msg printk
|
||||
#ifndef errno
|
||||
int errno;
|
||||
#endif
|
||||
#else
|
||||
# if !defined (msg)
|
||||
# define msg printf
|
||||
# endif
|
||||
#endif*/
|
||||
|
||||
//#define XER_PRINT
|
||||
|
||||
typedef struct xer_sprint_string_s {
|
||||
@@ -1182,9 +1170,9 @@ void fill_initial_SpCellConfig(rnti_t rnti,
|
||||
AssertFatal(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing==NR_SubcarrierSpacing_kHz30,
|
||||
"SCS != 30kHz\n");
|
||||
AssertFatal(scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity==NR_TDD_UL_DL_Pattern__dl_UL_TransmissionPeriodicity_ms5,
|
||||
"TDD period != 5ms : %ld\n",scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
|
||||
|
||||
schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8+(10*((rnti>>1)&3)) + (rnti&1);
|
||||
"TDD period != 5ms : %ld\n",scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity);
|
||||
|
||||
schedulingRequestResourceConfig->periodicityAndOffset->choice.sl40 = 8 + 10*((rnti>>1)&3) + (rnti&1);
|
||||
schedulingRequestResourceConfig->resource = calloc(1,sizeof(*schedulingRequestResourceConfig->resource));
|
||||
*schedulingRequestResourceConfig->resource = 0;
|
||||
ASN_SEQUENCE_ADD(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig);
|
||||
|
||||
@@ -106,9 +106,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
|
||||
uint8_t *const kRRCint,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||
#endif
|
||||
,rb_id_t *const defaultDRB,
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
|
||||
|
||||
@@ -1010,7 +1008,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
||||
sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t));
|
||||
memset(sdap_config, 0, sizeof(NR_SDAP_Config_t));
|
||||
sdap_config->pdu_Session = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
|
||||
sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent;
|
||||
sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present;
|
||||
sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent;
|
||||
sdap_config->defaultDRB = TRUE;
|
||||
sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd));
|
||||
@@ -1043,7 +1041,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
||||
DRB_config->pdcp_Config->moreThanOneRLC = NULL;
|
||||
|
||||
DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering));
|
||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms750;
|
||||
*DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
|
||||
DRB_config->pdcp_Config->ext1 = NULL;
|
||||
|
||||
if (rrc->security.do_drb_integrity) {
|
||||
@@ -1305,51 +1303,22 @@ rrc_gNB_process_RRCReconfigurationComplete(
|
||||
|
||||
ue_context_pP->ue_context.ue_reestablishment_timer = 0;
|
||||
|
||||
#ifndef PHYSIM
|
||||
uint8_t *k_kdf = NULL;
|
||||
/* Derive the keys from kgnb */
|
||||
if (DRB_configList != NULL) {
|
||||
k_kdf = NULL;
|
||||
nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kUPenc: last 128 bits of key derivation function which returns 256 bits */
|
||||
kUPenc = malloc(16);
|
||||
if (kUPenc == NULL) exit(1);
|
||||
memcpy(kUPenc, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
|
||||
k_kdf = NULL;
|
||||
&kUPenc);
|
||||
nr_derive_key_up_int(ue_context_pP->ue_context.integrity_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kUPint: last 128 bits of key derivation function which returns 256 bits */
|
||||
kUPint = malloc(16);
|
||||
if (kUPint == NULL) exit(1);
|
||||
memcpy(kUPint, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
&kUPint);
|
||||
}
|
||||
|
||||
k_kdf = NULL;
|
||||
nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kRRCenc: last 128 bits of key derivation function which returns 256 bits */
|
||||
kRRCenc = malloc(16);
|
||||
if (kRRCenc == NULL) exit(1);
|
||||
memcpy(kRRCenc, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
|
||||
k_kdf = NULL;
|
||||
&kRRCenc);
|
||||
nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kRRCint: last 128 bits of key derivation function which returns 256 bits */
|
||||
kRRCint = malloc(16);
|
||||
if (kRRCint == NULL) exit(1);
|
||||
memcpy(kRRCint, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
#endif
|
||||
&kRRCint);
|
||||
/* Refresh SRBs/DRBs */
|
||||
MSC_LOG_TX_MESSAGE(MSC_RRC_GNB, MSC_PDCP_ENB, NULL, 0, MSC_AS_TIME_FMT" CONFIG_REQ UE %x DRB (security unchanged)",
|
||||
MSC_AS_TIME_ARGS(ctxt_pP),
|
||||
@@ -3305,57 +3274,6 @@ void *rrc_gnb_task(void *args_p) {
|
||||
case GTPV1U_GNB_DELETE_TUNNEL_RESP:
|
||||
break;
|
||||
|
||||
/*
|
||||
#if defined(ENABLE_USE_MME)
|
||||
|
||||
// Messages from S1AP
|
||||
case S1AP_DOWNLINK_NAS:
|
||||
rrc_eNB_process_S1AP_DOWNLINK_NAS(msg_p, msg_name_p, instance, &rrc_gNB_mui);
|
||||
break;
|
||||
|
||||
case S1AP_INITIAL_CONTEXT_SETUP_REQ:
|
||||
rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_UE_CTXT_MODIFICATION_REQ:
|
||||
rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_PAGING_IND:
|
||||
LOG_D(RRC, "[eNB %d] Received Paging message from S1AP: %s\n", instance, msg_name_p);
|
||||
rrc_eNB_process_PAGING_IND(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_E_RAB_SETUP_REQ:
|
||||
rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(msg_p, msg_name_p, instance);
|
||||
LOG_D(RRC, "[eNB %d] Received the message %s\n", instance, msg_name_p);
|
||||
break;
|
||||
|
||||
case S1AP_E_RAB_MODIFY_REQ:
|
||||
rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_E_RAB_RELEASE_COMMAND:
|
||||
rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_UE_CONTEXT_RELEASE_REQ:
|
||||
rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case S1AP_UE_CONTEXT_RELEASE_COMMAND:
|
||||
rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND(msg_p, msg_name_p, instance);
|
||||
break;
|
||||
|
||||
case GTPV1U_ENB_DELETE_TUNNEL_RESP:
|
||||
///Nothing to do. Apparently everything is done in S1AP processing
|
||||
//LOG_I(RRC, "[eNB %d] Received message %s, not processed because procedure not synched\n",
|
||||
//instance, msg_name_p);
|
||||
AssertFatal(false, "Removed double mechanism for same feature: now delete_tunnel() function should be called\n");
|
||||
break;
|
||||
|
||||
#endif
|
||||
*/
|
||||
/* Messages from gNB app */
|
||||
case NRRRC_CONFIGURATION_REQ:
|
||||
LOG_I(NR_RRC, "[gNB %ld] Received %s : %p\n", instance, msg_name_p,&NRRRC_CONFIGURATION_REQ(msg_p));
|
||||
|
||||
@@ -308,43 +308,19 @@ nr_rrc_pdcp_config_security(
|
||||
uint8_t *kUPenc = NULL;
|
||||
static int print_keys= 1;
|
||||
|
||||
#ifndef PHYSIM
|
||||
|
||||
uint8_t *k_kdf = NULL;
|
||||
|
||||
/* Derive the keys from kgnb */
|
||||
if (SRB_configList != NULL) {
|
||||
k_kdf = NULL;
|
||||
nr_derive_key_up_enc(ue_context_pP->ue_context.ciphering_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kUPenc: last 128 bits of key derivation function which returns 256 bits */
|
||||
kUPenc = malloc(16);
|
||||
if (kUPenc == NULL) exit(1);
|
||||
memcpy(kUPenc, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
&kUPenc);
|
||||
}
|
||||
|
||||
k_kdf = NULL;
|
||||
nr_derive_key_rrc_enc(ue_context_pP->ue_context.ciphering_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kRRCenc: last 128 bits of key derivation function which returns 256 bits */
|
||||
kRRCenc = malloc(16);
|
||||
if (kRRCenc == NULL) exit(1);
|
||||
memcpy(kRRCenc, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
|
||||
k_kdf = NULL;
|
||||
&kRRCenc);
|
||||
nr_derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
|
||||
ue_context_pP->ue_context.kgnb,
|
||||
&k_kdf);
|
||||
/* kRRCint: last 128 bits of key derivation function which returns 256 bits */
|
||||
kRRCint = malloc(16);
|
||||
if (kRRCint == NULL) exit(1);
|
||||
memcpy(kRRCint, k_kdf+16, 16);
|
||||
free(k_kdf);
|
||||
#endif
|
||||
&kRRCint);
|
||||
if (!IS_SOFTMODEM_IQPLAYER) {
|
||||
SET_LOG_DUMP(DEBUG_SECURITY) ;
|
||||
}
|
||||
|
||||
@@ -52,9 +52,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
|
||||
uint8_t *const kRRCint,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||
#endif
|
||||
,rb_id_t *const defaultDRB,
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
|
||||
|
||||
@@ -215,25 +213,12 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
|
||||
LOG_I(RRC, "selecting integrity algorithm %d\n", ue_context_p->ue_context.integrity_algorithm);
|
||||
|
||||
/* derive UP security key */
|
||||
unsigned char *kUPenc_kdf;
|
||||
nr_derive_key_up_enc(ue_context_p->ue_context.ciphering_algorithm,
|
||||
ue_context_p->ue_context.kgnb,
|
||||
&kUPenc_kdf);
|
||||
/* kUPenc: last 128 bits of key derivation function which returns 256 bits */
|
||||
kUPenc = malloc(16);
|
||||
if (kUPenc == NULL) exit(1);
|
||||
memcpy(kUPenc, kUPenc_kdf+16, 16);
|
||||
free(kUPenc_kdf);
|
||||
|
||||
unsigned char *kUPint_kdf;
|
||||
&kUPenc);
|
||||
nr_derive_key_up_int(ue_context_p->ue_context.integrity_algorithm,
|
||||
ue_context_p->ue_context.kgnb,
|
||||
&kUPint_kdf);
|
||||
/* kUPint: last 128 bits of key derivation function which returns 256 bits */
|
||||
kUPint = malloc(16);
|
||||
if (kUPint == NULL) exit(1);
|
||||
memcpy(kUPint, kUPint_kdf+16, 16);
|
||||
free(kUPint_kdf);
|
||||
&kUPint);
|
||||
|
||||
e_NR_CipheringAlgorithm cipher_algo;
|
||||
switch (ue_context_p->ue_context.ciphering_algorithm) {
|
||||
|
||||
+85
-63
@@ -187,9 +187,7 @@ extern boolean_t nr_rrc_pdcp_config_asn1_req(
|
||||
uint8_t *const kRRCint,
|
||||
uint8_t *const kUPenc,
|
||||
uint8_t *const kUPint
|
||||
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
|
||||
,LTE_PMCH_InfoList_r9_t *pmch_InfoList_r9
|
||||
#endif
|
||||
,rb_id_t *const defaultDRB,
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
|
||||
|
||||
@@ -1661,45 +1659,40 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
|
||||
uint8_t *kRRCenc = NULL;
|
||||
uint8_t *kUPenc = NULL;
|
||||
uint8_t *kRRCint = NULL;
|
||||
pdcp_t *pdcp_p = NULL;
|
||||
hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE;
|
||||
hashtable_rc_t h_rc;
|
||||
key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES);
|
||||
h_rc = hashtable_get(pdcp_coll_p, key, (void **) &pdcp_p);
|
||||
nr_derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||
&kUPenc);
|
||||
nr_derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||
&kRRCenc);
|
||||
nr_derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb,
|
||||
&kRRCint);
|
||||
LOG_I(NR_RRC, "driving kRRCenc, kRRCint and kUPenc from KgNB="
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x\n",
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[0], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[1], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[2], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[3],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[4], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[5], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[6], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[7],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[8], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[9], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[10], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[11],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[12], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[13], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[14], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[15],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[16], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[17], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[18], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[19],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[20], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[21], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[22], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[23],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[24], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[25], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[26], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[27],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[28], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[29], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[30], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[31]);
|
||||
|
||||
if (h_rc == HASH_TABLE_OK) {
|
||||
LOG_D(NR_RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %ld\n", key);
|
||||
LOG_D(NR_RRC, "driving kRRCenc, kRRCint and kUPenc from KgNB="
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x\n",
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[0], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[1], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[2], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[3],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[4], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[5], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[6], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[7],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[8], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[9], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[10], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[11],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[12], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[13], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[14], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[15],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[16], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[17], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[18], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[19],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[20], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[21], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[22], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[23],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[24], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[25], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[26], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[27],
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[28], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[29], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[30], NR_UE_rrc_inst[ctxt_pP->module_id].kgnb[31]);
|
||||
derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
|
||||
derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
|
||||
derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
|
||||
|
||||
if (securityMode != 0xff) {
|
||||
pdcp_config_set_security(ctxt_pP, pdcp_p, 0, 0,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm
|
||||
| (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
|
||||
kRRCenc, kRRCint, kUPenc);
|
||||
} else {
|
||||
LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", securityMode);
|
||||
}
|
||||
if (securityMode != 0xff) {
|
||||
pdcp_config_set_security(ctxt_pP, NULL, DCCH, DCCH+2,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm
|
||||
| (NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm << 4),
|
||||
kRRCenc, kRRCint, kUPenc);
|
||||
} else {
|
||||
LOG_I(NR_RRC, "Could not get PDCP instance where key=0x%ld\n", key);
|
||||
LOG_I(NR_RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", securityMode);
|
||||
}
|
||||
|
||||
if (securityModeCommand->criticalExtensions.present == NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand) {
|
||||
@@ -2044,21 +2037,12 @@ nr_rrc_ue_establish_srb2(
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t *k_kdf = NULL;
|
||||
uint8_t *kRRCenc = NULL;
|
||||
uint8_t *kRRCint = NULL;
|
||||
nr_derive_key_rrc_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
|
||||
kRRCenc = malloc(16);
|
||||
if (kRRCenc == NULL) exit(1);
|
||||
memcpy(kRRCenc, k_kdf + 16, 16);
|
||||
free(k_kdf);
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCenc);
|
||||
nr_derive_key_rrc_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
|
||||
kRRCint = malloc(16);
|
||||
if (kRRCint == NULL) exit(1);
|
||||
memcpy(kRRCint, k_kdf + 16, 16);
|
||||
free(k_kdf);
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kRRCint);
|
||||
|
||||
// Refresh SRBs
|
||||
nr_rrc_pdcp_config_asn1_req(ctxt_pP,
|
||||
@@ -2100,6 +2084,7 @@ nr_rrc_ue_establish_srb2(
|
||||
|
||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
|
||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,1,true); //todo handle mac_LogicalChannelConfig
|
||||
// rrc_mac_config_req_ue
|
||||
}
|
||||
} else {
|
||||
@@ -2115,6 +2100,7 @@ nr_rrc_ue_establish_srb2(
|
||||
|
||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, gNB_index, ctxt_pP->module_id);
|
||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,gNB_index,2,true); //todo handle mac_LogicalChannelConfig
|
||||
// rrc_mac_config_req_ue
|
||||
}
|
||||
} // srb2
|
||||
@@ -2135,28 +2121,33 @@ nr_rrc_ue_establish_srb2(
|
||||
memcpy(NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1],
|
||||
radioBearerConfig->drb_ToAddModList->list.array[cnt], sizeof(NR_DRB_ToAddMod_t));
|
||||
} else {
|
||||
LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
|
||||
//LOG_D(NR_RRC, "Adding DRB %ld %p\n", DRB_id-1, radioBearerConfig->drb_ToAddModList->list.array[cnt]);
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].DRB_config[gNB_index][DRB_id-1] = radioBearerConfig->drb_ToAddModList->list.array[cnt];
|
||||
int j;
|
||||
struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list = NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToAddModList;
|
||||
if (rlc_bearer2add_list != NULL) {
|
||||
for(j = 0; j < rlc_bearer2add_list->list.count; j++){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer != NULL){
|
||||
if(rlc_bearer2add_list->list.array[j]->servedRadioBearer->present == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){
|
||||
if(DRB_id == rlc_bearer2add_list->list.array[j]->servedRadioBearer->choice.drb_Identity){
|
||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB lcid %ld gNB %d) --->][MAC_UE][MOD %02d][]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, rlc_bearer2add_list->list.array[j]->logicalChannelIdentity, 0, ctxt_pP->module_id);
|
||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,rlc_bearer2add_list->list.array[j]->logicalChannelIdentity,true); //todo handle mac_LogicalChannelConfig
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t *k_kdf = NULL;
|
||||
uint8_t *kUPenc = NULL;
|
||||
uint8_t *kUPint = NULL;
|
||||
|
||||
nr_derive_key_up_enc(NR_UE_rrc_inst[ctxt_pP->module_id].cipheringAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
|
||||
kUPenc = malloc(16);
|
||||
if (kUPenc == NULL) exit(1);
|
||||
memcpy(kUPenc, k_kdf + 16, 16);
|
||||
free(k_kdf);
|
||||
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPenc);
|
||||
nr_derive_key_up_int(NR_UE_rrc_inst[ctxt_pP->module_id].integrityProtAlgorithm,
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &k_kdf);
|
||||
kUPint = malloc(16);
|
||||
if (kUPint == NULL) exit(1);
|
||||
memcpy(kUPint, k_kdf + 16, 16);
|
||||
free(k_kdf);
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].kgnb, &kUPint);
|
||||
|
||||
MSC_LOG_TX_MESSAGE(
|
||||
MSC_RRC_UE,
|
||||
@@ -2199,6 +2190,15 @@ nr_rrc_ue_establish_srb2(
|
||||
}
|
||||
}
|
||||
|
||||
if (NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList != NULL) {
|
||||
for (i = 0; i < NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.count; i++) {
|
||||
NR_LogicalChannelIdentity_t lcid = *NR_UE_rrc_inst[ctxt_pP->module_id].cell_group_config->rlc_BearerToReleaseList->list.array[i];
|
||||
LOG_I(NR_RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (RB lcid %ld gNB %d release) --->][MAC_UE][MOD %02d][]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, lcid, 0, ctxt_pP->module_id);
|
||||
nr_rrc_mac_config_req_ue_logicalChannelBearer(ctxt_pP->module_id,0,0,lcid,false); //todo handle mac_LogicalChannelConfig
|
||||
}
|
||||
}
|
||||
|
||||
NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].State = NR_RRC_CONNECTED;
|
||||
LOG_I(NR_RRC,"[UE %d] State = NR_RRC_CONNECTED (gNB %d)\n", ctxt_pP->module_id, gNB_index);
|
||||
}
|
||||
@@ -2511,6 +2511,28 @@ nr_rrc_ue_establish_srb2(
|
||||
NR_RRC_DCCH_DATA_IND (msg_p).gNB_index);
|
||||
break;
|
||||
|
||||
case NAS_KENB_REFRESH_REQ:
|
||||
memcpy((void *)NR_UE_rrc_inst[ue_mod_id].kgnb, (void *)NAS_KENB_REFRESH_REQ(msg_p).kenb, sizeof(NR_UE_rrc_inst[ue_mod_id].kgnb));
|
||||
LOG_D(RRC, "[UE %d] Received %s: refreshed RRC::KgNB = "
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x"
|
||||
"%02x%02x%02x%02x\n",
|
||||
ue_mod_id, ITTI_MSG_NAME (msg_p),
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[0], NR_UE_rrc_inst[ue_mod_id].kgnb[1], NR_UE_rrc_inst[ue_mod_id].kgnb[2], NR_UE_rrc_inst[ue_mod_id].kgnb[3],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[4], NR_UE_rrc_inst[ue_mod_id].kgnb[5], NR_UE_rrc_inst[ue_mod_id].kgnb[6], NR_UE_rrc_inst[ue_mod_id].kgnb[7],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[8], NR_UE_rrc_inst[ue_mod_id].kgnb[9], NR_UE_rrc_inst[ue_mod_id].kgnb[10], NR_UE_rrc_inst[ue_mod_id].kgnb[11],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[12], NR_UE_rrc_inst[ue_mod_id].kgnb[13], NR_UE_rrc_inst[ue_mod_id].kgnb[14], NR_UE_rrc_inst[ue_mod_id].kgnb[15],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[16], NR_UE_rrc_inst[ue_mod_id].kgnb[17], NR_UE_rrc_inst[ue_mod_id].kgnb[18], NR_UE_rrc_inst[ue_mod_id].kgnb[19],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[20], NR_UE_rrc_inst[ue_mod_id].kgnb[21], NR_UE_rrc_inst[ue_mod_id].kgnb[22], NR_UE_rrc_inst[ue_mod_id].kgnb[23],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[24], NR_UE_rrc_inst[ue_mod_id].kgnb[25], NR_UE_rrc_inst[ue_mod_id].kgnb[26], NR_UE_rrc_inst[ue_mod_id].kgnb[27],
|
||||
NR_UE_rrc_inst[ue_mod_id].kgnb[28], NR_UE_rrc_inst[ue_mod_id].kgnb[29], NR_UE_rrc_inst[ue_mod_id].kgnb[30], NR_UE_rrc_inst[ue_mod_id].kgnb[31]);
|
||||
break;
|
||||
|
||||
case NAS_UPLINK_DATA_REQ: {
|
||||
uint32_t length;
|
||||
uint8_t *buffer;
|
||||
|
||||
@@ -111,4 +111,4 @@
|
||||
#define RRC_LIST_ENTRY(list, i) \
|
||||
list.entries[i]
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* 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.1 (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
|
||||
*/
|
||||
|
||||
#include "nr_sdap_gnb.h"
|
||||
#include <openair2/LAYER2/PDCP_v10.1.0/pdcp.h>
|
||||
|
||||
boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
|
||||
const srb_flag_t srb_flag,
|
||||
const rb_id_t rb_id,
|
||||
const mui_t mui,
|
||||
const confirm_t confirm,
|
||||
const sdu_size_t sdu_buffer_size,
|
||||
unsigned char *const sdu_buffer,
|
||||
const pdcp_transmission_mode_t pt_mode,
|
||||
const uint32_t *sourceL2Id,
|
||||
const uint32_t *destinationL2Id
|
||||
) {
|
||||
if(sdu_buffer == NULL) {
|
||||
LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(sdu_buffer_size == 0) {
|
||||
LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL or 0 sdu_buffer_size \n", __FILE__, __LINE__, __FUNCTION__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
uint8_t *sdap_buf = (uint8_t *)malloc(sdu_buffer_size+SDAP_HDR_LENGTH);
|
||||
nr_sdap_dl_hdr_t sdap_hdr;
|
||||
sdap_hdr.RDI = 0; // SDAP_Hardcoded -
|
||||
sdap_hdr.RQI = 0; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
|
||||
sdap_hdr.QFI = 1; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION
|
||||
memcpy(&sdap_buf[0], &sdap_hdr, 1);
|
||||
memcpy(&sdap_buf[1], sdu_buffer, sdu_buffer_size);
|
||||
rb_id_t sdap_drb_id = rb_id; // SDAP_Hardcoded - Should get this info from QFI to DRB mapping table
|
||||
boolean_t ret = pdcp_data_req(ctxt_p,
|
||||
srb_flag,
|
||||
sdap_drb_id,
|
||||
mui,
|
||||
confirm,
|
||||
sdu_buffer_size+1,
|
||||
sdap_buf,
|
||||
pt_mode,
|
||||
sourceL2Id,
|
||||
destinationL2Id);
|
||||
|
||||
if(!ret) {
|
||||
LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - PDCP DL refused PDU\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
free(sdap_buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
free(sdap_buf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr) {
|
||||
nr_sdap_ul_hdr_t *sdap_hdr_ul = (nr_sdap_ul_hdr_t *)&sdap_gnb_ul_hdr;
|
||||
|
||||
switch (sdap_hdr_ul->DC) {
|
||||
case SDAP_HDR_UL_DATA_PDU:
|
||||
LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - UL Received SDAP Data PDU\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
break;
|
||||
|
||||
case SDAP_HDR_UL_CTRL_PDU:
|
||||
LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - Received SDAP Control PDU\n", __FILE__, __LINE__, __FUNCTION__);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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.1 (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
|
||||
*/
|
||||
|
||||
#ifndef _NR_SDAP_GNB_
|
||||
#define _NR_SDAP_GNB_
|
||||
|
||||
#include "openair2/COMMON/platform_types.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
|
||||
#define SDAP_BITMASK_DC (0x80)
|
||||
#define SDAP_BITMASK_R (0x40)
|
||||
#define SDAP_BITMASK_QFI (0x3F)
|
||||
#define SDAP_HDR_UL_DATA_PDU (1)
|
||||
#define SDAP_HDR_UL_CTRL_PDU (0)
|
||||
#define SDAP_HDR_LENGTH (1)
|
||||
|
||||
typedef struct nr_sdap_dl_hdr_s {
|
||||
uint8_t QFI:6;
|
||||
uint8_t RQI:1;
|
||||
uint8_t RDI:1;
|
||||
} __attribute__((packed)) nr_sdap_dl_hdr_t;
|
||||
|
||||
typedef struct nr_sdap_ul_hdr_s {
|
||||
uint8_t QFI:6;
|
||||
uint8_t R:1;
|
||||
uint8_t DC:1;
|
||||
} __attribute__((packed)) nr_sdap_ul_hdr_t;
|
||||
|
||||
boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p,
|
||||
const srb_flag_t srb_flag,
|
||||
const rb_id_t rb_id,
|
||||
const mui_t mui,
|
||||
const confirm_t confirm,
|
||||
const sdu_size_t sdu_buffer_size,
|
||||
unsigned char *const sdu_buffer,
|
||||
const pdcp_transmission_mode_t pt_mode,
|
||||
const uint32_t *sourceL2Id,
|
||||
const uint32_t *destinationL2Id
|
||||
);
|
||||
|
||||
void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr);
|
||||
|
||||
#endif
|
||||
@@ -60,10 +60,6 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
|
||||
#ifndef OPENAIR2
|
||||
#include "UTIL/OTG/otg_vars.h"
|
||||
#endif
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
include $(OPENAIR_TARGETS)/Makefile.common
|
||||
ifdef TEST_OMG
|
||||
|
||||
CC= gcc
|
||||
|
||||
OBJstatic = OMG.c common.c static.c
|
||||
OBJrwp = OMG.c common.c job.c rwp.c
|
||||
OBJrwalk = OMG.c common.c job.c rwalk.c
|
||||
OBJtrace = OMG.c common.c job.c trace.c mobility_parser.c hashtable.c
|
||||
OBJsumo = OMG.c common.c sumo.c client_traci_OMG.c socket_traci_OMG.c storage_traci_OMG.c id_manager.c
|
||||
|
||||
OBJ = OMG.c common.c static.c job.c rwp.c rwalk.c trace.c sumo.c mobility_parser.c hashtable.c client_traci_OMG.c socket_traci_OMG.c storage_traci_OMG.c id_manager.c
|
||||
|
||||
CFLAGS += -m32 -DTEST_OMG
|
||||
|
||||
.PHONY: help staticOMG rwpOMG clean
|
||||
|
||||
help:
|
||||
@echo ' "make staticOMG" to compile the STATIC version'
|
||||
@echo ' "make rwpOMG" to compile the RWP version'
|
||||
@echo ' "make rwalkOMG" to compile the RWALK version'
|
||||
@echo ' "make traceOMG" to compile the TRACE version'
|
||||
@echo ' "make sumoOMG" to compile the SUMO version'
|
||||
@echo ' "make clean" to remove the generated files and restore the original distribution'
|
||||
@echo ' "make OMG" to compile the complete version'
|
||||
|
||||
|
||||
staticOMG: ${OBJstatic}
|
||||
${CC} ${OBJstatic} -o staticOMG $(CFLAGS)
|
||||
|
||||
|
||||
rwpOMG: ${OBJrwp}
|
||||
${CC} ${OBJrwp} -lm -o rwpOMG $(CFLAGS)
|
||||
@#-lm: used to link to math lib
|
||||
|
||||
traceOMG:${OBJtrace}
|
||||
${CC} ${OBJtrace} -lm -o traceOMG $(CFLAGS)
|
||||
|
||||
rwalkOMG: ${OBJrwalk}
|
||||
${CC} ${OBJrwalk} -lm -o rwalkOMG $(CFLAGS)
|
||||
|
||||
sumoOMG: ${OBJsumo}
|
||||
${CC} ${OBJsumo} -lm -o rwalkOMG $(CFLAGS)
|
||||
|
||||
OMG: ${OBJ}
|
||||
${CC} ${OBJ} -lm -o OMG $(CFLAGS)
|
||||
|
||||
clean:
|
||||
@echo "Cleaning"
|
||||
@rm OMG
|
||||
@#rm rwpOMG
|
||||
@#rm rwalkOMG
|
||||
@#rm traceOMG
|
||||
@#rm staticOMG
|
||||
@#rm OMG
|
||||
|
||||
else
|
||||
|
||||
TOP_DIR = ../..
|
||||
OPENAIR1_TOP = ../..
|
||||
OPENAIR2_TOP = ../../../openair2
|
||||
OPENAIR3_TOP = ../../../openair3
|
||||
OPENAIR3 = $(OPENAIR3_DIR)
|
||||
|
||||
CFLAGS += -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat
|
||||
|
||||
|
||||
CFLAGS += -DOPENAIR_LTE -DOPENAIR2 #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
|
||||
|
||||
#CFLAGS += -DXFORMS
|
||||
|
||||
ifdef DEBUG_PHY
|
||||
CFLAGS += -DDEBUG_PHY
|
||||
endif
|
||||
|
||||
ifdef PDCP_USE_NETLINK
|
||||
CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL
|
||||
endif
|
||||
|
||||
include $(OPENAIR1_DIR)/PHY/Makefile.inc
|
||||
include $(OPENAIR1_DIR)/SCHED/Makefile.inc
|
||||
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
|
||||
include $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/Makefile.inc
|
||||
|
||||
SIMULATION_OBJS = $(TOP_DIR)/SIMULATION/TOOLS/gauss.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/random_channel.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/rangen_double.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/taus.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/multipath_channel.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/rf.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/adc.o
|
||||
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/dac.o
|
||||
|
||||
OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(ETHERNET_TRANSPORT_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(STATS_OBJS)
|
||||
|
||||
all: physim
|
||||
|
||||
|
||||
$(OBJ) : %.o : %.c
|
||||
$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) -o $@ $<
|
||||
|
||||
$(L2_OBJS) : %.o : %.c
|
||||
$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) -o $@ $<
|
||||
|
||||
physim : $(OBJ) $(L2_OBJS) OMG.c common.c static.c job.c rwp.c rwalk.c hashtable.c mobility_parser.c trace.c -I$(TOP_DIR) $(L2_incl) -o physim $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(L2_OBJS) -lm -lforms -L/usr/local/lib -lforms -lX11 -L/usr/X11R6/lib -lXpm -lblas -lpthread
|
||||
|
||||
clean:
|
||||
rm -f physim
|
||||
rm -f $(OBJ)
|
||||
rm -f $(L2_OBJS)
|
||||
rm -f *.o
|
||||
rm -f *.exe*
|
||||
|
||||
cleanl1:
|
||||
rm -f physim
|
||||
rm -f $(OBJ)
|
||||
rm -f *.o
|
||||
rm -f *.exe
|
||||
cleanl2:
|
||||
rm -f $(L2_OBJS)
|
||||
|
||||
endif
|
||||
|
||||
@@ -121,6 +121,8 @@ int nr_derive_key(algorithm_type_dist_t alg_type, uint8_t alg_id,
|
||||
string[6] = 0x01;
|
||||
|
||||
kdf(string, 7, key, 32, out, 32);
|
||||
// in NR, we use the last 16 bytes, ignoring the first 16 ones
|
||||
memcpy(*out, *out+16, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -37,8 +37,8 @@ unsigned int start_log_GP=0;
|
||||
unsigned int start_log_GP_bg=0;
|
||||
unsigned int start_log_jitter=0;
|
||||
|
||||
#include"otg_kpi.h"
|
||||
#include"otg_externs.h"
|
||||
#include "otg_kpi.h"
|
||||
#include "otg_externs.h"
|
||||
|
||||
extern unsigned char NB_eNB_INST;
|
||||
extern uint16_t NB_UE_INST;
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#ifndef __OTG_RX_SOCKET_H__
|
||||
#define __OTG_RX_SOCKET_H__
|
||||
|
||||
#include"otg.h"
|
||||
#include "otg.h"
|
||||
|
||||
|
||||
//-----------------------begin func proto-------------------
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#include"otg_tx_socket.h"
|
||||
#include "otg_tx_socket.h"
|
||||
#include "otg_vars.h"
|
||||
|
||||
|
||||
|
||||
@@ -37,8 +37,8 @@
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include"otg.h"
|
||||
#include"otg_tx.h"
|
||||
#include "otg.h"
|
||||
#include "otg_tx.h"
|
||||
|
||||
|
||||
//-----------------------begin func proto-------------------
|
||||
|
||||
Reference in New Issue
Block a user