Merge remote-tracking branch 'origin/develop' into ul-phr
This commit is contained in:
+14
-11
@@ -1329,7 +1329,7 @@ class OaiCiTest():
|
||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||
if self.ADBCentralized:
|
||||
SSH.command('adb devices', '\$', 15)
|
||||
self.UEDevices = re.findall("\\\\r\\\\n([A-Za-z0-9]+)\\\\tdevice",SSH.getBefore())
|
||||
self.UEDevices = re.findall('\r\n([A-Za-z0-9]+)\tdevice',SSH.getBefore())
|
||||
#report number and id of devices found
|
||||
msg = "UEDevices found by GetAllUEDevices : " + " ".join(self.UEDevices)
|
||||
logging.debug(msg)
|
||||
@@ -1379,8 +1379,7 @@ class OaiCiTest():
|
||||
SSH.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
|
||||
if self.ADBCentralized:
|
||||
SSH.command('lsusb | egrep --colour=never "Future Technology Devices International, Ltd FT2232C" | sed -e "s#:.*##" -e "s# #_#g"', '\$', 15)
|
||||
#self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
||||
self.CatMDevices = re.findall("\\\\r\\\\n([A-Za-z0-9_]+)",SSH.getBefore())
|
||||
self.CatMDevices = re.findall('\r\n([A-Za-z0-9_]+)',SSH.getBefore())
|
||||
else:
|
||||
if (os.path.isfile('./modules_list.txt')):
|
||||
os.remove('./modules_list.txt')
|
||||
@@ -2046,7 +2045,7 @@ class OaiCiTest():
|
||||
req_bandwidth = '%.1f Gbits/sec' % req_bw
|
||||
req_bw = req_bw * 1000000000
|
||||
|
||||
result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/..\d+) +(\((?P<packetloss>[0-9\.]+)%\))', SSH.getBefore())
|
||||
result = re.search('Server Report:\r\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/..\d+) +(\((?P<packetloss>[0-9\.]+)%\))', SSH.getBefore())
|
||||
if result is not None:
|
||||
bitrate = result.group('bitrate')
|
||||
packetloss = result.group('packetloss')
|
||||
@@ -2262,7 +2261,7 @@ class OaiCiTest():
|
||||
|
||||
def Iperf_analyzeV3Output(self, lock, UE_IPAddress, device_id, statusQueue,SSH):
|
||||
|
||||
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', SSH.getBefore())
|
||||
result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\r\n(?:|\[ *\d+\] Sent \d+ datagrams)\r\niperf Done\.', SSH.getBefore())
|
||||
if result is None:
|
||||
result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', SSH.getBefore())
|
||||
lock.acquire()
|
||||
@@ -3865,7 +3864,7 @@ class OaiCiTest():
|
||||
SSH = sshconnection.SSHConnection()
|
||||
SSH.open(IPAddress, UserName, Password)
|
||||
SSH.command('lsb_release -a', '\$', 5)
|
||||
result = re.search('Description:\\\\t(?P<os_type>[a-zA-Z0-9\-\_\.\ ]+)', SSH.getBefore())
|
||||
result = re.search('Description:\t(?P<os_type>[a-zA-Z0-9\-\_\.\ ]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
OsVersion = result.group('os_type')
|
||||
logging.debug('OS is: ' + OsVersion)
|
||||
@@ -3883,13 +3882,13 @@ class OaiCiTest():
|
||||
logging.debug('OS is: ' + OsVersion)
|
||||
HTML.OsVersion[idx]=OsVersion
|
||||
SSH.command('uname -r', '\$', 5)
|
||||
result = re.search('uname -r\\\\r\\\\n(?P<kernel_version>[a-zA-Z0-9\-\_\.]+)', SSH.getBefore())
|
||||
result = re.search('uname -r\r\n(?P<kernel_version>[a-zA-Z0-9\-\_\.]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
KernelVersion = result.group('kernel_version')
|
||||
logging.debug('Kernel Version is: ' + KernelVersion)
|
||||
HTML.KernelVersion[idx]=KernelVersion
|
||||
SSH.command('dpkg --list | egrep --color=never libuhd003', '\$', 5)
|
||||
result = re.search('libuhd003:amd64 *(?P<uhd_version>[0-9\.]+)', SSH.getBefore())
|
||||
SSH.command('dpkg --list | egrep --color=never libuhd', '\$', 5)
|
||||
result = re.search('libuhd.*:amd64 *(?P<uhd_version>[0-9\.]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
UhdVersion = result.group('uhd_version')
|
||||
logging.debug('UHD Version is: ' + UhdVersion)
|
||||
@@ -3902,7 +3901,7 @@ class OaiCiTest():
|
||||
logging.debug('UHD Version is: ' + UhdVersion)
|
||||
HTML.UhdVersion[idx]=UhdVersion
|
||||
SSH.command('echo ' + Password + ' | sudo -S uhd_find_devices', '\$', 180)
|
||||
usrp_boards = re.findall('product: ([0-9A-Za-z]+)\\\\r\\\\n', SSH.getBefore())
|
||||
usrp_boards = re.findall('product: ([0-9A-Za-z]+)', SSH.getBefore())
|
||||
count = 0
|
||||
for board in usrp_boards:
|
||||
if count == 0:
|
||||
@@ -3914,14 +3913,18 @@ class OaiCiTest():
|
||||
logging.debug('USRP Board(s) : ' + UsrpBoard)
|
||||
HTML.UsrpBoard[idx]=UsrpBoard
|
||||
SSH.command('lscpu', '\$', 5)
|
||||
result = re.search('CPU\(s\): *(?P<nb_cpus>[0-9]+).*Model name: *(?P<model>[a-zA-Z0-9\-\_\.\ \(\)]+).*CPU MHz: *(?P<cpu_mhz>[0-9\.]+)', SSH.getBefore())
|
||||
result = re.search('CPU\(s\): *(?P<nb_cpus>[0-9]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
CpuNb = result.group('nb_cpus')
|
||||
logging.debug('nb_cpus: ' + CpuNb)
|
||||
HTML.CpuNb[idx]=CpuNb
|
||||
result = re.search('Model name: *(?P<model>[a-zA-Z0-9\-\_\.\ \(\)]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
CpuModel = result.group('model')
|
||||
logging.debug('model: ' + CpuModel)
|
||||
HTML.CpuModel[idx]=CpuModel
|
||||
result = re.search('CPU MHz: *(?P<cpu_mhz>[0-9\.]+)', SSH.getBefore())
|
||||
if result is not None:
|
||||
CpuMHz = result.group('cpu_mhz') + ' MHz'
|
||||
logging.debug('cpu_mhz: ' + CpuMHz)
|
||||
HTML.CpuMHz[idx]=CpuMHz
|
||||
|
||||
@@ -33,6 +33,7 @@ gNBs =
|
||||
////////// Physical parameters:
|
||||
|
||||
min_rxtxtime = 6;
|
||||
enable_sdap = 1;
|
||||
|
||||
pdcch_ConfigSIB1 = (
|
||||
{
|
||||
|
||||
+6
-8
@@ -374,7 +374,7 @@ class RANManagement():
|
||||
mySSH.open(lIpAddr, lUserName, lPassWord)
|
||||
eth_interface = 'any'
|
||||
fltr = 'sctp'
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
logging.debug('\u001B[1m Launching tshark on xNB on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
|
||||
mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
|
||||
mySSH.command('echo $USER; nohup sudo -E tshark -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + pcapfile + ' > /dev/null 2>&1 &','\$', 5)
|
||||
@@ -390,7 +390,7 @@ class RANManagement():
|
||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||
eth_interface = 'any'
|
||||
fltr = 'sctp'
|
||||
logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
logging.debug('\u001B[1m Launching tshark on EPC on interface ' + eth_interface + ' with filter "' + fltr + '"\u001B[0m')
|
||||
self.epcPcapFile = 'enb_' + self.testCase_id + '_s1log.pcap'
|
||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S rm -f /tmp/' + self.epcPcapFile , '\$', 5)
|
||||
mySSH.command('echo $USER; nohup sudo tshark -f "host ' + lIpAddr +'" -i ' + eth_interface + ' -f "' + fltr + '" -w /tmp/' + self.epcPcapFile + ' > /tmp/tshark.log 2>&1 &', localEpcUserName, 5)
|
||||
@@ -517,7 +517,7 @@ class RANManagement():
|
||||
localEpcUserName = EPC.UserName
|
||||
localEpcPassword = EPC.Password
|
||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||
logging.debug('\u001B[1m Stopping tshark on EPC \u001B[0m')
|
||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||
if self.epcPcapFile != '':
|
||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S chmod 666 /tmp/' + self.epcPcapFile, '\$', 5)
|
||||
@@ -644,18 +644,16 @@ class RANManagement():
|
||||
time.sleep(5)
|
||||
mySSH.command('rm -f my-lte-softmodem-run' + str(self.eNB_instance) + '.sh', '\$', 5)
|
||||
#stopping tshark (valid if eNB and enabled in xml, will not harm otherwise)
|
||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||
logging.debug('\u001B[1m Stopping tshark on xNB \u001B[0m')
|
||||
mySSH.command('echo ' + lPassWord + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||
time.sleep(1)
|
||||
mySSH.close()
|
||||
# If tracer options is on, stopping tshark on EPC side
|
||||
result = re.search('T_stdout', str(self.Initialize_eNB_args))
|
||||
if (result is not None):
|
||||
if EPC.IPAddress != "none" and EPC.IPAddress != '':
|
||||
localEpcIpAddr = EPC.IPAddress
|
||||
localEpcUserName = EPC.UserName
|
||||
localEpcPassword = EPC.Password
|
||||
logging.debug('\u001B[1m Stopping tshark on EPC (' + localEpcIpAddr + ') \u001B[0m')
|
||||
mySSH.open(localEpcIpAddr, localEpcUserName, localEpcPassword)
|
||||
logging.debug('\u001B[1m Stopping tshark \u001B[0m')
|
||||
mySSH.command('echo ' + localEpcPassword + ' | sudo -S killall --signal SIGKILL tshark', '\$', 5)
|
||||
time.sleep(1)
|
||||
if self.epcPcapFile != '':
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-f1</htmlTabRef>
|
||||
<htmlTabName>Testing 5G NR RF sim in containers - CU-DU F1 split</htmlTabName>
|
||||
<htmlTabName>CU-DU F1 split</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100021
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-down-f1</htmlTabRef>
|
||||
<htmlTabName>CleanUp 5G RF - CU-DU F1 split</htmlTabName>
|
||||
<htmlTabName>CleanUp CU-DU F1 split</htmlTabName>
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100022
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-fdd</htmlTabRef>
|
||||
<htmlTabName>Testing 5G NR RF sim - Monolithic FDD gNB</htmlTabName>
|
||||
<htmlTabName>Monolithic FDD gNB with SDAP</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<repeatCount>4</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-fdd-down</htmlTabRef>
|
||||
<htmlTabName>CleanUp 5G RF - Monolithic FDD gNB</htmlTabName>
|
||||
<htmlTabName>CleanUp Monolithic FDD gNB with SDAP</htmlTabName>
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100012
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-tdd</htmlTabRef>
|
||||
<htmlTabName>Testing 5G NR RF sim - Monolithic TDD gNB</htmlTabName>
|
||||
<htmlTabName>Monolithic TDD gNB</htmlTabName>
|
||||
<htmlTabIcon>wrench</htmlTabIcon>
|
||||
<repeatCount>4</repeatCount>
|
||||
<TestCaseRequestedList>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
-->
|
||||
<testCaseList>
|
||||
<htmlTabRef>rfsim-5gnr-down</htmlTabRef>
|
||||
<htmlTabName>CleanUp 5G RF - Monolithic TDD gNB</htmlTabName>
|
||||
<htmlTabName>CleanUp Monolithic TDD gNB</htmlTabName>
|
||||
<htmlTabIcon>trash</htmlTabIcon>
|
||||
<TestCaseRequestedList>
|
||||
100002
|
||||
|
||||
@@ -334,13 +334,9 @@ add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"")
|
||||
|
||||
# Debug related options
|
||||
#########################################
|
||||
add_boolean_option(ASN_EMIT_DEBUG False "ASN1 coder/decoder Debug")
|
||||
add_boolean_option(ASN_THREAD_SAFE True "ASN1 coder/decoder Debug")
|
||||
add_boolean_option(MSG_PRINT True "print debug messages")
|
||||
add_boolean_option(DEBUG_ASN1C False "ASN1 coder/decoder Debug traces, see common/utils/config.h, the logs are regular OAI logs, in the log group 'ASN'")
|
||||
add_boolean_option(DISABLE_XER_PRINT False "print XER Format")
|
||||
add_boolean_option(XER_PRINT False "print XER Format")
|
||||
add_boolean_option(RRC_MSG_PRINT False "print RRC messages")
|
||||
add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log")
|
||||
add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
|
||||
@@ -358,6 +354,12 @@ add_library(ITTI
|
||||
)
|
||||
add_dependencies(ITTI rrc_flag)
|
||||
|
||||
# asn1c skeletons have hardcoded this flag to make customized debug logs
|
||||
# OAI uses this feature to re-use OAI LOG_I(ASN, ...)
|
||||
if (DEBUG_ASN1C)
|
||||
add_definitions(-DHAVE_CONFIG_H)
|
||||
endif()
|
||||
|
||||
##################################################
|
||||
# ASN.1 grammar C code generation & dependencies #
|
||||
##################################################
|
||||
@@ -845,7 +847,6 @@ add_boolean_option(UE_EXPANSION False "enable UE_EXPANSION w
|
||||
add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||
add_boolean_option(PRE_SCD_THREAD False "enable UE_EXPANSION with max 256 UE")
|
||||
add_boolean_option(UESIM_EXPANSION False "enable UESIM_EXPANSION with max 256 UE")
|
||||
add_boolean_option(ITTI_SIM False "enable itti simulator")
|
||||
|
||||
########################
|
||||
# Include order
|
||||
@@ -1872,6 +1873,8 @@ set(L2_NR_SRC
|
||||
${NR_RRC_DIR}/rrc_gNB.c
|
||||
${NR_RRC_DIR}/nr_rrc_common.c
|
||||
${NR_RRC_DIR}/L2_nr_interface.c
|
||||
${NR_RRC_DIR}/mac_rrc_dl_direct.c
|
||||
${NR_RRC_DIR}/mac_rrc_dl_f1ap.c
|
||||
${NR_RRC_DIR}/nr_rrc_config.c
|
||||
${NR_RRC_DIR}/rrc_gNB_nsa.c
|
||||
${NR_RRC_DIR}/rrc_gNB_internode.c
|
||||
@@ -1950,6 +1953,9 @@ set (MAC_NR_SRC
|
||||
${NR_GNB_MAC_DIR}/gNB_scheduler_uci.c
|
||||
${NR_GNB_MAC_DIR}/gNB_scheduler_srs.c
|
||||
${NR_GNB_MAC_DIR}/gNB_scheduler_RA.c
|
||||
${NR_GNB_MAC_DIR}/mac_rrc_dl_handler.c
|
||||
${NR_GNB_MAC_DIR}/mac_rrc_ul_direct.c
|
||||
${NR_GNB_MAC_DIR}/mac_rrc_ul_f1ap.c
|
||||
)
|
||||
|
||||
|
||||
@@ -3029,7 +3035,7 @@ if (${T_TRACER})
|
||||
foreach(i
|
||||
#all "add_executable" definitions (except tests, rb_tool, updatefw)
|
||||
lte-softmodem lte-uesoftmodem nr-softmodem
|
||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7 nr-ittisim
|
||||
nr-uesoftmodem dlsim dlsim_tm4 dlsim_tm7
|
||||
ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim
|
||||
syncsim nr_ulsim nr_dlsim nr_dlschsim nr_pbchsim nr_pucchsim
|
||||
nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
|
||||
@@ -3115,50 +3121,6 @@ add_executable(rb_tool
|
||||
)
|
||||
target_include_directories(rb_tool PRIVATE ${OPENAIR2_DIR}/NETWORK_DRIVER/MESH/)
|
||||
|
||||
# nr-ittisim
|
||||
###################################################
|
||||
|
||||
add_executable(nr-ittisim
|
||||
${rrc_h}
|
||||
${nr_rrc_h}
|
||||
${OPENAIR2_DIR}/GNB_APP/gnb_app.c
|
||||
${OPENAIR2_DIR}/GNB_APP/gnb_config.c
|
||||
${OPENAIR_DIR}/executables/nr-gnb.c
|
||||
${OPENAIR_DIR}/executables/nr-ru.c
|
||||
${OPENAIR2_DIR}/SIMULATION/NR_RRC/itti_sim.c
|
||||
${OPENAIR_DIR}/executables/softmodem-common.c
|
||||
${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
|
||||
${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
|
||||
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
|
||||
${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
|
||||
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
|
||||
${OPENAIR_DIR}/common/utils/nr/nr_common.c
|
||||
${OPENAIR_DIR}/common/utils/lte/ue_power.c
|
||||
${OPENAIR_DIR}/common/utils/lte/prach_utils.c
|
||||
${OPENAIR2_DIR}/ENB_APP/flexran_agent_ran_api_to_fix.c
|
||||
${XFORMSINTERFACE_SOURCE}
|
||||
${T_SOURCE}
|
||||
${SHLIB_LOADER_SOURCES}
|
||||
)
|
||||
|
||||
target_link_libraries (nr-ittisim
|
||||
-Wl,--start-group
|
||||
UTIL HASHTABLE SCTP_CLIENT SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU GTPV1U SECU_CN SECU_OSA
|
||||
ITTI ${FLPT_MSG_LIB} ${FLEXRAN_AGENT_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
|
||||
NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
|
||||
X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${FSPT_MSG_LIB}
|
||||
PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
|
||||
-Wl,--end-group z dl)
|
||||
|
||||
target_link_libraries (nr-ittisim ${LIBXML2_LIBRARIES})
|
||||
target_link_libraries (nr-ittisim pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${ATLAS_LIBRARIES})
|
||||
target_link_libraries (nr-ittisim ${LIB_LMS_LIBRARIES})
|
||||
target_link_libraries (nr-ittisim ${T_LIB})
|
||||
|
||||
add_dependencies( nr-ittisim ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
|
||||
|
||||
# ???
|
||||
####################
|
||||
list(APPEND oai_nw_drv_src device.c common.c ioctl.c classifier.c tool.c)
|
||||
|
||||
@@ -177,8 +177,6 @@ Options:
|
||||
Enable the address sanitizer on all targets
|
||||
--sanitize-undefined | -fsanitize=undefined
|
||||
Enable the undefined behavior sanitizer on all targets
|
||||
--ittiSIM
|
||||
Makes the itti simulator
|
||||
-h | --help
|
||||
Print this help
|
||||
|
||||
@@ -465,11 +463,6 @@ function main() {
|
||||
--sanitize-undefined | -fundefined=address)
|
||||
CMAKE_CMD="$CMAKE_CMD -DSANITIZE_UNDEFINED=True"
|
||||
shift;;
|
||||
--ittiSIM)
|
||||
ittiSIM=1
|
||||
CMAKE_CMD="$CMAKE_CMD -DITTI_SIM=True"
|
||||
echo_info "Will compile itti simulator"
|
||||
shift;;
|
||||
-h | --help)
|
||||
print_help
|
||||
exit 1;;
|
||||
@@ -623,9 +616,6 @@ function main() {
|
||||
if [ "$nrUE" = 1 ] ; then
|
||||
execlist="$execlist nr-uesoftmodem"
|
||||
fi
|
||||
if [ "$ittiSIM" = "1" ] ; then
|
||||
execlist="$execlist nr-ittisim"
|
||||
fi
|
||||
|
||||
if [[ "$execlist" == "" && "$SIMUS_PHY" != "1" ]]; then
|
||||
echo_success "installing dependencies successful"
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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 LINEAR_ALLOC_H
|
||||
#define LINEAR_ALLOC_H
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
typedef unsigned int uid_t;
|
||||
#define UID_LINEAR_ALLOCATOR_SIZE 1024
|
||||
#define UID_LINEAR_ALLOCATOR_BITMAP_SIZE (((UID_LINEAR_ALLOCATOR_SIZE/8)/sizeof(unsigned int)) + 1)
|
||||
typedef struct uid_linear_allocator_s {
|
||||
unsigned int bitmap[UID_LINEAR_ALLOCATOR_BITMAP_SIZE];
|
||||
} uid_allocator_t;
|
||||
|
||||
static inline void uid_linear_allocator_init(uid_allocator_t *uia) {
|
||||
memset(uia, 0, sizeof(uid_allocator_t));
|
||||
}
|
||||
|
||||
static inline uid_t uid_linear_allocator_new(uid_allocator_t *uia) {
|
||||
unsigned int bit_index = 1;
|
||||
uid_t uid = 0;
|
||||
|
||||
for (unsigned int i = 0; i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE; i++) {
|
||||
if (uia->bitmap[i] != UINT_MAX) {
|
||||
bit_index = 1;
|
||||
uid = 0;
|
||||
|
||||
while ((uia->bitmap[i] & bit_index) == bit_index) {
|
||||
bit_index = bit_index << 1;
|
||||
uid += 1;
|
||||
}
|
||||
|
||||
uia->bitmap[i] |= bit_index;
|
||||
return uid + (i*sizeof(unsigned int)*8);
|
||||
}
|
||||
}
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
|
||||
static inline void uid_linear_allocator_free(uid_allocator_t *uia, uid_t uid) {
|
||||
const unsigned int i = uid/sizeof(unsigned int)/8;
|
||||
const unsigned int bit = uid % (sizeof(unsigned int) * 8);
|
||||
const unsigned int value = ~(1 << bit);
|
||||
|
||||
if (i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE) {
|
||||
uia->bitmap[i] &= value;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* LINEAR_ALLOC_H */
|
||||
@@ -19,33 +19,38 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file itti_sim_messages_types.h
|
||||
* \brief itti message for itti simulator
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
* \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
#ifndef UTILS_CONFIG_H_ASN1
|
||||
#define UTILS_CONFIG_H_ASN1
|
||||
|
||||
// This is hard coded file name "config.h" and HAVE_CONFIG_H_ in asn1c skeletons
|
||||
|
||||
/*
|
||||
* This file "config.h" will be used by asn1c if HAVE_CONFIG_H_ is defined and
|
||||
* included. This logs asn1c encoder and decoder traces at execution time using
|
||||
* the regular OAI logging system, i.e., LOG_I(ASN...);
|
||||
*
|
||||
* As it is very verbose, note that you can change the log level per module in
|
||||
* source or in gdb, e.g., to only activate it for a short time.
|
||||
*
|
||||
* In code:
|
||||
* ```
|
||||
* set_log(ASN, OAI_INFO); // enable logging
|
||||
* // do your encoding here
|
||||
* set_log(ASN, OAI_ERR); // disable logging
|
||||
* ```
|
||||
*
|
||||
* in gdb:
|
||||
* ```
|
||||
* gdb> p set_log(ASN, 1) // disable log, 1 == OAI_ERR
|
||||
* gdb> p set_log(ASN, 5) // enable log, 5 == OAI_INFO
|
||||
* ```
|
||||
*/
|
||||
|
||||
#ifndef ITTI_SIM_MESSAGES_TYPES_H_
|
||||
#define ITTI_SIM_MESSAGES_TYPES_H_
|
||||
#include "common/utils/LOG/log.h"
|
||||
#if DEBUG_ASN1C
|
||||
#define ASN_DEBUG(x...) do{ LOG_I(ASN,x);LOG_I(ASN,"\n"); } while(false)
|
||||
#else
|
||||
#define ASN_DEBUG(x...)
|
||||
#endif
|
||||
|
||||
#include "LTE_asn_constant.h"
|
||||
|
||||
|
||||
|
||||
#define GNB_RRC_BCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBBCCHind
|
||||
#define GNB_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBCCCHind
|
||||
#define GNB_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.GNBDCCHind
|
||||
#define UE_RRC_CCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UECCCHind
|
||||
#define UE_RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.UEDCCHind
|
||||
|
||||
|
||||
|
||||
typedef struct itti_sim_rrc_ch_s {
|
||||
rb_id_t rbid;
|
||||
uint8_t *sdu;
|
||||
int size;
|
||||
} itti_sim_rrc_ch_t;
|
||||
|
||||
#endif /* ITTI_SIM_MESSAGES_TYPES_H_ */
|
||||
#endif /* UTILS_CONFIG_H_ASN1 */
|
||||
@@ -472,6 +472,236 @@ int get_subband_size(int NPRB,int size) {
|
||||
|
||||
}
|
||||
|
||||
void get_samplerate_and_bw(int mu,
|
||||
int n_rb,
|
||||
int8_t threequarter_fs,
|
||||
double *sample_rate,
|
||||
unsigned int *samples_per_frame,
|
||||
double *tx_bw,
|
||||
double *rx_bw) {
|
||||
|
||||
if (mu == 0) {
|
||||
switch(n_rb) {
|
||||
case 270:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=92.16e6;
|
||||
*samples_per_frame = 921600;
|
||||
*tx_bw = 50e6;
|
||||
*rx_bw = 50e6;
|
||||
} else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 50e6;
|
||||
*rx_bw = 50e6;
|
||||
}
|
||||
case 216:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=46.08e6;
|
||||
*samples_per_frame = 460800;
|
||||
*tx_bw = 40e6;
|
||||
*rx_bw = 40e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 40e6;
|
||||
*rx_bw = 40e6;
|
||||
}
|
||||
break;
|
||||
case 160: //30 MHz
|
||||
case 133: //25 MHz
|
||||
if (threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",n_rb);
|
||||
}
|
||||
else {
|
||||
*sample_rate=30.72e6;
|
||||
*samples_per_frame = 307200;
|
||||
*tx_bw = 20e6;
|
||||
*rx_bw = 20e6;
|
||||
}
|
||||
case 106:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=23.04e6;
|
||||
*samples_per_frame = 230400;
|
||||
*tx_bw = 20e6;
|
||||
*rx_bw = 20e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=30.72e6;
|
||||
*samples_per_frame = 307200;
|
||||
*tx_bw = 20e6;
|
||||
*rx_bw = 20e6;
|
||||
}
|
||||
break;
|
||||
case 52:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=11.52e6;
|
||||
*samples_per_frame = 115200;
|
||||
*tx_bw = 10e6;
|
||||
*rx_bw = 10e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=15.36e6;
|
||||
*samples_per_frame = 153600;
|
||||
*tx_bw = 10e6;
|
||||
*rx_bw = 10e6;
|
||||
}
|
||||
case 25:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=5.76e6;
|
||||
*samples_per_frame = 57600;
|
||||
*tx_bw = 5e6;
|
||||
*rx_bw = 5e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=7.68e6;
|
||||
*samples_per_frame = 76800;
|
||||
*tx_bw = 5e6;
|
||||
*rx_bw = 5e6;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",n_rb,mu);
|
||||
}
|
||||
} else if (mu == 1) {
|
||||
switch(n_rb) {
|
||||
|
||||
case 273:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=184.32e6;
|
||||
*samples_per_frame = 1843200;
|
||||
*tx_bw = 100e6;
|
||||
*rx_bw = 100e6;
|
||||
} else {
|
||||
*sample_rate=122.88e6;
|
||||
*samples_per_frame = 1228800;
|
||||
*tx_bw = 100e6;
|
||||
*rx_bw = 100e6;
|
||||
}
|
||||
break;
|
||||
case 217:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=92.16e6;
|
||||
*samples_per_frame = 921600;
|
||||
*tx_bw = 80e6;
|
||||
*rx_bw = 80e6;
|
||||
} else {
|
||||
*sample_rate=122.88e6;
|
||||
*samples_per_frame = 1228800;
|
||||
*tx_bw = 80e6;
|
||||
*rx_bw = 80e6;
|
||||
}
|
||||
break;
|
||||
case 162 :
|
||||
if (threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",n_rb);
|
||||
}
|
||||
else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 60e6;
|
||||
*rx_bw = 60e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 133 :
|
||||
if (threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",n_rb);
|
||||
}
|
||||
else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 50e6;
|
||||
*rx_bw = 50e6;
|
||||
}
|
||||
|
||||
break;
|
||||
case 106:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=46.08e6;
|
||||
*samples_per_frame = 460800;
|
||||
*tx_bw = 40e6;
|
||||
*rx_bw = 40e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 40e6;
|
||||
*rx_bw = 40e6;
|
||||
}
|
||||
break;
|
||||
case 51:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=23.04e6;
|
||||
*samples_per_frame = 230400;
|
||||
*tx_bw = 20e6;
|
||||
*rx_bw = 20e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=30.72e6;
|
||||
*samples_per_frame = 307200;
|
||||
*tx_bw = 20e6;
|
||||
*rx_bw = 20e6;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=11.52e6;
|
||||
*samples_per_frame = 115200;
|
||||
*tx_bw = 10e6;
|
||||
*rx_bw = 10e6;
|
||||
}
|
||||
else {
|
||||
*sample_rate=15.36e6;
|
||||
*samples_per_frame = 153600;
|
||||
*tx_bw = 10e6;
|
||||
*rx_bw = 10e6;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",n_rb,mu);
|
||||
}
|
||||
} else if (mu == 3) {
|
||||
switch(n_rb) {
|
||||
case 66:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=184.32e6;
|
||||
*samples_per_frame = 1843200;
|
||||
*tx_bw = 100e6;
|
||||
*rx_bw = 100e6;
|
||||
} else {
|
||||
*sample_rate = 122.88e6;
|
||||
*samples_per_frame = 1228800;
|
||||
*tx_bw = 100e6;
|
||||
*rx_bw = 100e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 32:
|
||||
if (threequarter_fs) {
|
||||
*sample_rate=92.16e6;
|
||||
*samples_per_frame = 921600;
|
||||
*tx_bw = 50e6;
|
||||
*rx_bw = 50e6;
|
||||
} else {
|
||||
*sample_rate=61.44e6;
|
||||
*samples_per_frame = 614400;
|
||||
*tx_bw = 50e6;
|
||||
*rx_bw = 50e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",n_rb,mu);
|
||||
}
|
||||
} else {
|
||||
AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
|
||||
}
|
||||
}
|
||||
|
||||
// from start symbol index and nb or symbols to symbol occupation bitmap in a slot
|
||||
uint16_t SL_to_bitmap(int startSymbolIndex, int nrOfSymbols) {
|
||||
return ((1<<nrOfSymbols)-1)<<startSymbolIndex;
|
||||
|
||||
@@ -75,6 +75,13 @@ uint16_t SL_to_bitmap(int startSymbolIndex, int nrOfSymbols);
|
||||
int get_nb_periods_per_frame(uint8_t tdd_period);
|
||||
int get_supported_band_index(int scs, int band, int n_rbs);
|
||||
long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS);
|
||||
void get_samplerate_and_bw(int mu,
|
||||
int n_rb,
|
||||
int8_t threequarter_fs,
|
||||
double *sample_rate,
|
||||
unsigned int *samples_per_frame,
|
||||
double *tx_bw,
|
||||
double *rx_bw);
|
||||
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
@@ -17,7 +17,4 @@
|
||||
#include "openair2/COMMON/flexran_messages_def.h"
|
||||
#include "openair2/COMMON/f1ap_messages_def.h"
|
||||
#include "openair2/COMMON/ngap_messages_def.h"
|
||||
#if ITTI_SIM
|
||||
#include "openair2/COMMON/itti_sim_messages_def.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -262,10 +262,6 @@ void *rrc_enb_process_itti_msg(void *);
|
||||
#include <openair3/SCTP/sctp_eNB_task.h>
|
||||
#include <openair3/NGAP/ngap_gNB.h>
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
#include <openair2/COMMON/itti_sim_messages_types.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
static const char *const messages_definition_xml = {
|
||||
#include <messages_xml.h>
|
||||
@@ -308,9 +304,11 @@ void *rrc_enb_process_msg(void *);
|
||||
TASK_DEF(TASK_BM, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_PHY_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_MAC_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_MAC_GNB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_RLC_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_RRC_ENB_NB_IoT, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_PDCP_ENB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_PDCP_GNB, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_DATA_FORWARDING, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_END_MARKER, TASK_PRIORITY_MED, 200, NULL, NULL) \
|
||||
TASK_DEF(TASK_RRC_ENB, TASK_PRIORITY_MED, 200, NULL,NULL)\
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
<table style="border-collapse: collapse; border: none;">
|
||||
<tr style="border-collapse: collapse; border: none;">
|
||||
<td style="border-collapse: collapse; border: none;">
|
||||
<a href="http://www.openairinterface.org/">
|
||||
<img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
|
||||
</img>
|
||||
</a>
|
||||
</td>
|
||||
<td style="border-collapse: collapse; border: none; vertical-align: center;">
|
||||
<b><font size = "5">Running L3 ITTI simulator</font></b>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
This page is valid on the following branches:
|
||||
|
||||
- `develop` starting from tag `2020.w48`
|
||||
|
||||
# 1. Building the ITTI simulator.
|
||||
|
||||
The ITTI simulator is available directly from the standard build.
|
||||
|
||||
```bash
|
||||
$ source oaienv
|
||||
$ cd cmake_targets
|
||||
$ sudo ./build_oai -x -w None -c -ittiSIM
|
||||
```
|
||||
|
||||
# 2. Running the ITTI simulator.
|
||||
|
||||
The ITTI simulator establishes ITTI-threaded communication between the gNB RRC task and the UE RRC task.
|
||||
|
||||
This allows to test the sequence of NGAP/RRC/NAS messages.
|
||||
|
||||
The main limitations are:
|
||||
|
||||
- NAS is a simple stub that just sends and receives messages
|
||||
- only initial Attach sequence
|
||||
|
||||
## 2.1. Starting the ITTI simulator
|
||||
|
||||
The ITTI simulator is able to run with a connected 5GC or without any.
|
||||
The develop branch tag `2020.w48` only works RRC without 5GC connection.
|
||||
|
||||
```bash
|
||||
$ sudo -E ./ran_build/build/nr-ittisim -O gnb.conf
|
||||
```
|
||||
|
||||
+8
-220
@@ -31,6 +31,7 @@
|
||||
|
||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/assertions.h"
|
||||
#include "common/utils/system.h"
|
||||
#include "common/ran_context.h"
|
||||
@@ -809,226 +810,13 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
|
||||
int mu = config->ssb_config.scs_common.value;
|
||||
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
|
||||
|
||||
if (mu == NR_MU_0) {
|
||||
switch(N_RB) {
|
||||
case 270:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=92.16e6;
|
||||
cfg->samples_per_frame = 921600;
|
||||
cfg->tx_bw = 50e6;
|
||||
cfg->rx_bw = 50e6;
|
||||
} else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 50e6;
|
||||
cfg->rx_bw = 50e6;
|
||||
}
|
||||
case 216:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=46.08e6;
|
||||
cfg->samples_per_frame = 460800;
|
||||
cfg->tx_bw = 40e6;
|
||||
cfg->rx_bw = 40e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 40e6;
|
||||
cfg->rx_bw = 40e6;
|
||||
}
|
||||
break;
|
||||
case 160: //30 MHz
|
||||
case 133: //25 MHz
|
||||
if (fp->threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",N_RB);
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=30.72e6;
|
||||
cfg->samples_per_frame = 307200;
|
||||
cfg->tx_bw = 20e6;
|
||||
cfg->rx_bw = 20e6;
|
||||
}
|
||||
case 106:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=23.04e6;
|
||||
cfg->samples_per_frame = 230400;
|
||||
cfg->tx_bw = 20e6;
|
||||
cfg->rx_bw = 20e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=30.72e6;
|
||||
cfg->samples_per_frame = 307200;
|
||||
cfg->tx_bw = 20e6;
|
||||
cfg->rx_bw = 20e6;
|
||||
}
|
||||
break;
|
||||
case 52:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=11.52e6;
|
||||
cfg->samples_per_frame = 115200;
|
||||
cfg->tx_bw = 10e6;
|
||||
cfg->rx_bw = 10e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=15.36e6;
|
||||
cfg->samples_per_frame = 153600;
|
||||
cfg->tx_bw = 10e6;
|
||||
cfg->rx_bw = 10e6;
|
||||
}
|
||||
case 25:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=5.76e6;
|
||||
cfg->samples_per_frame = 57600;
|
||||
cfg->tx_bw = 5e6;
|
||||
cfg->rx_bw = 5e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=7.68e6;
|
||||
cfg->samples_per_frame = 76800;
|
||||
cfg->tx_bw = 5e6;
|
||||
cfg->rx_bw = 5e6;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
|
||||
}
|
||||
} else if (mu == NR_MU_1) {
|
||||
switch(N_RB) {
|
||||
|
||||
case 273:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=184.32e6;
|
||||
cfg->samples_per_frame = 1843200;
|
||||
cfg->tx_bw = 100e6;
|
||||
cfg->rx_bw = 100e6;
|
||||
} else {
|
||||
cfg->sample_rate=122.88e6;
|
||||
cfg->samples_per_frame = 1228800;
|
||||
cfg->tx_bw = 100e6;
|
||||
cfg->rx_bw = 100e6;
|
||||
}
|
||||
break;
|
||||
case 217:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=92.16e6;
|
||||
cfg->samples_per_frame = 921600;
|
||||
cfg->tx_bw = 80e6;
|
||||
cfg->rx_bw = 80e6;
|
||||
} else {
|
||||
cfg->sample_rate=122.88e6;
|
||||
cfg->samples_per_frame = 1228800;
|
||||
cfg->tx_bw = 80e6;
|
||||
cfg->rx_bw = 80e6;
|
||||
}
|
||||
break;
|
||||
case 162 :
|
||||
if (fp->threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",N_RB);
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 60e6;
|
||||
cfg->rx_bw = 60e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 133 :
|
||||
if (fp->threequarter_fs) {
|
||||
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",N_RB);
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 50e6;
|
||||
cfg->rx_bw = 50e6;
|
||||
}
|
||||
|
||||
break;
|
||||
case 106:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=46.08e6;
|
||||
cfg->samples_per_frame = 460800;
|
||||
cfg->tx_bw = 40e6;
|
||||
cfg->rx_bw = 40e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 40e6;
|
||||
cfg->rx_bw = 40e6;
|
||||
}
|
||||
break;
|
||||
case 51:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=23.04e6;
|
||||
cfg->samples_per_frame = 230400;
|
||||
cfg->tx_bw = 20e6;
|
||||
cfg->rx_bw = 20e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=30.72e6;
|
||||
cfg->samples_per_frame = 307200;
|
||||
cfg->tx_bw = 20e6;
|
||||
cfg->rx_bw = 20e6;
|
||||
}
|
||||
break;
|
||||
case 24:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=11.52e6;
|
||||
cfg->samples_per_frame = 115200;
|
||||
cfg->tx_bw = 10e6;
|
||||
cfg->rx_bw = 10e6;
|
||||
}
|
||||
else {
|
||||
cfg->sample_rate=15.36e6;
|
||||
cfg->samples_per_frame = 153600;
|
||||
cfg->tx_bw = 10e6;
|
||||
cfg->rx_bw = 10e6;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
|
||||
}
|
||||
} else if (mu == NR_MU_3) {
|
||||
switch(N_RB) {
|
||||
case 66:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=184.32e6;
|
||||
cfg->samples_per_frame = 1843200;
|
||||
cfg->tx_bw = 100e6;
|
||||
cfg->rx_bw = 100e6;
|
||||
} else {
|
||||
cfg->sample_rate = 122.88e6;
|
||||
cfg->samples_per_frame = 1228800;
|
||||
cfg->tx_bw = 100e6;
|
||||
cfg->rx_bw = 100e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 32:
|
||||
if (fp->threequarter_fs) {
|
||||
cfg->sample_rate=92.16e6;
|
||||
cfg->samples_per_frame = 921600;
|
||||
cfg->tx_bw = 50e6;
|
||||
cfg->rx_bw = 50e6;
|
||||
} else {
|
||||
cfg->sample_rate=61.44e6;
|
||||
cfg->samples_per_frame = 614400;
|
||||
cfg->tx_bw = 50e6;
|
||||
cfg->rx_bw = 50e6;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
|
||||
}
|
||||
} else {
|
||||
AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
|
||||
}
|
||||
get_samplerate_and_bw(mu,
|
||||
N_RB,
|
||||
fp->threequarter_fs,
|
||||
&cfg->sample_rate,
|
||||
&cfg->samples_per_frame,
|
||||
&cfg->tx_bw,
|
||||
&cfg->rx_bw);
|
||||
|
||||
if (config->cell_config.frame_duplex_type.value==TDD)
|
||||
cfg->duplex_mode = duplex_mode_TDD;
|
||||
|
||||
@@ -308,7 +308,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
|
||||
dl_harq->status = SCH_IDLE;
|
||||
dl_harq->first_rx = 1;
|
||||
dl_harq->DLround = 0;
|
||||
dl_harq->Ndi = 1;
|
||||
dl_harq->Ndi = 2; // set to an invalid value
|
||||
dl_harq->ack = DL_ACKNACK_NO_SET;
|
||||
}
|
||||
|
||||
|
||||
@@ -759,7 +759,7 @@ int main(int argc, char **argv)
|
||||
RC.nb_nr_mac_CC = (int*)malloc(RC.nb_nr_macrlc_inst*sizeof(int));
|
||||
for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
|
||||
RC.nb_nr_mac_CC[i] = 1;
|
||||
mac_top_init_gNB();
|
||||
mac_top_init_gNB(ngran_gNB);
|
||||
gNB_mac = RC.nrmac[0];
|
||||
gNB_RRC_INST rrc;
|
||||
memset((void*)&rrc,0,sizeof(rrc));
|
||||
@@ -884,55 +884,22 @@ int main(int argc, char **argv)
|
||||
if (g_rbStart < 0) g_rbStart=0;
|
||||
if (g_rbSize < 0) g_rbSize = N_RB_DL - g_rbStart;
|
||||
|
||||
double fs,bw;
|
||||
double fs,txbw,rxbw;
|
||||
uint32_t samples;
|
||||
|
||||
if (mu == 0 && N_RB_DL == 25) {
|
||||
fs = 7.68e6;
|
||||
bw = 5e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 217) {
|
||||
fs = 122.88e6;
|
||||
bw = 80e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 245) {
|
||||
fs = 122.88e6;
|
||||
bw = 90e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 273) {
|
||||
fs = 122.88e6;
|
||||
bw = 100e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 106) {
|
||||
fs = 61.44e6;
|
||||
bw = 40e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 133) {
|
||||
fs = 61.44e6;
|
||||
bw = 50e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 162) {
|
||||
fs = 61.44e6;
|
||||
bw = 60e6;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 24) {
|
||||
fs = 15.36e6;
|
||||
bw = 10e6;
|
||||
}
|
||||
else if (mu == 3 && N_RB_DL == 66) {
|
||||
fs = 122.88e6;
|
||||
bw = 100e6;
|
||||
}
|
||||
else if (mu == 3 && N_RB_DL == 32) {
|
||||
fs = 61.44e6;
|
||||
bw = 50e6;
|
||||
}
|
||||
else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL);
|
||||
get_samplerate_and_bw(mu,
|
||||
N_RB_DL,
|
||||
frame_parms->threequarter_fs,
|
||||
&fs,
|
||||
&samples,
|
||||
&txbw,
|
||||
&rxbw);
|
||||
|
||||
gNB2UE = new_channel_desc_scm(n_tx,
|
||||
n_rx,
|
||||
channel_model,
|
||||
fs/1e6,//sampling frequency in MHz
|
||||
bw,
|
||||
txbw,
|
||||
30e-9,
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "PHY/types.h"
|
||||
@@ -390,45 +391,18 @@ int main(int argc, char **argv)
|
||||
nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions);
|
||||
phy_init_nr_gNB(gNB,0,0);
|
||||
|
||||
double fs,bw,scs,eps;
|
||||
double fs,txbw,rxbw;
|
||||
uint32_t samples;
|
||||
|
||||
if (mu == 1 && N_RB_DL == 217) {
|
||||
fs = 122.88e6;
|
||||
bw = 80e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 245) {
|
||||
fs = 122.88e6;
|
||||
bw = 90e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 273) {
|
||||
fs = 122.88e6;
|
||||
bw = 100e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else if (mu == 1 && N_RB_DL == 106) {
|
||||
fs = 61.44e6;
|
||||
bw = 40e6;
|
||||
scs = 30000;
|
||||
}
|
||||
else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL);
|
||||
get_samplerate_and_bw(mu,
|
||||
N_RB_DL,
|
||||
frame_parms->threequarter_fs,
|
||||
&fs,
|
||||
&samples,
|
||||
&txbw,
|
||||
&rxbw);
|
||||
|
||||
// cfo with respect to sub-carrier spacing
|
||||
eps = cfo/scs;
|
||||
|
||||
// computation of integer and fractional FO to compare with estimation results
|
||||
int IFO;
|
||||
if(eps!=0.0){
|
||||
printf("Introducing a CFO of %lf relative to SCS of %d kHz\n",eps,(int)(scs/1000));
|
||||
if (eps>0)
|
||||
IFO=(int)(eps+0.5);
|
||||
else
|
||||
IFO=(int)(eps-0.5);
|
||||
printf("FFO = %lf; IFO = %d\n",eps-IFO,IFO);
|
||||
}
|
||||
|
||||
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, bw, DS_TDL,0, 0, 0, 0);
|
||||
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model, fs, txbw, DS_TDL,0, 0, 0, 0);
|
||||
|
||||
if (UE2gNB==NULL) {
|
||||
printf("Problem generating channel model. Exiting.\n");
|
||||
@@ -477,9 +451,6 @@ int main(int argc, char **argv)
|
||||
memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
|
||||
UE->frame_parms.nb_antennas_rx=1;
|
||||
|
||||
if(eps!=0.0)
|
||||
UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
|
||||
|
||||
if (init_nr_ue_signal(UE, 1) != 0)
|
||||
{
|
||||
printf("Error at UE NR initialisation\n");
|
||||
@@ -568,7 +539,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
random_channel(UE2gNB,0);
|
||||
freq_channel(UE2gNB,N_RB_DL,2*N_RB_DL+1,scs/1000);
|
||||
freq_channel(UE2gNB,N_RB_DL,2*N_RB_DL+1,15<<mu);
|
||||
for (int symb=0; symb<nrofSymbols; symb++) {
|
||||
int i0 = (startingSymbolIndex + symb)*gNB->frame_parms.ofdm_symbol_size;
|
||||
for (int re=0;re<N_RB_DL*12;re++) {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "common/ran_context.h"
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/nr/nr_common.h"
|
||||
#include "PHY/defs_gNB.h"
|
||||
#include "PHY/defs_nr_common.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
@@ -668,45 +669,23 @@ int main(int argc, char **argv)
|
||||
|
||||
if (snr1set == 0)
|
||||
snr1 = snr0 + 10;
|
||||
double sampling_frequency;
|
||||
double bandwidth;
|
||||
|
||||
if (mu == 0 && N_RB_UL == 25 ) {
|
||||
sampling_frequency = 7.68;
|
||||
bandwidth = 5;
|
||||
}
|
||||
else if (mu == 1 && N_RB_UL == 273) {
|
||||
sampling_frequency = 122.88;
|
||||
bandwidth = 100;
|
||||
}
|
||||
else if (mu == 1 && N_RB_UL == 217) {
|
||||
sampling_frequency = 122.88;
|
||||
bandwidth = 80;
|
||||
}
|
||||
else if (mu == 1 && N_RB_UL == 106) {
|
||||
sampling_frequency = 61.44;
|
||||
bandwidth = 40;
|
||||
}
|
||||
else if (mu == 1 && N_RB_UL == 24) {
|
||||
sampling_frequency = 15.36;
|
||||
bandwidth = 10;
|
||||
}
|
||||
else if (mu == 3 && N_RB_UL == 32) {
|
||||
sampling_frequency = 61.44;
|
||||
bandwidth = 50;
|
||||
}
|
||||
else {
|
||||
printf("Add N_RB_UL %d\n",N_RB_UL);
|
||||
exit(-1);
|
||||
}
|
||||
double sampling_frequency, tx_bandwidth, rx_bandwidth;
|
||||
uint32_t samples;
|
||||
get_samplerate_and_bw(mu,
|
||||
N_RB_DL,
|
||||
openair0_cfg[0].threequarter_fs,
|
||||
&sampling_frequency,
|
||||
&samples,
|
||||
&tx_bandwidth,
|
||||
&rx_bandwidth);
|
||||
|
||||
LOG_I( PHY,"++++++++++++++++++++++++++++++++++++++++++++++%i+++++++++++++++++++++++++++++++++++++++++",loglvl);
|
||||
|
||||
if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
|
||||
|
||||
UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
|
||||
sampling_frequency,
|
||||
bandwidth,
|
||||
sampling_frequency/1e6,
|
||||
tx_bandwidth,
|
||||
DS_TDL,
|
||||
0, 0, 0, 0);
|
||||
|
||||
@@ -770,7 +749,7 @@ int main(int argc, char **argv)
|
||||
RC.nb_nr_mac_CC = (int*)malloc(RC.nb_nr_macrlc_inst*sizeof(int));
|
||||
for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
|
||||
RC.nb_nr_mac_CC[i] = 1;
|
||||
mac_top_init_gNB();
|
||||
mac_top_init_gNB(ngran_gNB);
|
||||
//gNB_MAC_INST* gNB_mac = RC.nrmac[0];
|
||||
gNB_RRC_INST rrc;
|
||||
memset((void*)&rrc,0,sizeof(rrc));
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define F1AP_MESSAGES_TYPES_H_
|
||||
|
||||
#include "rlc.h"
|
||||
#include "s1ap_messages_types.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------//
|
||||
// Defines to access message fields.
|
||||
@@ -61,7 +62,6 @@
|
||||
|
||||
#define F1AP_MAX_NO_OF_TNL_ASSOCIATIONS 32
|
||||
#define F1AP_MAX_NO_UE_ID 1024
|
||||
#define F1AP_MAX_DU2CU_RRC_LENGTH 1024
|
||||
|
||||
typedef struct f1ap_net_ip_address_s {
|
||||
unsigned ipv4:1;
|
||||
@@ -309,7 +309,7 @@ typedef struct f1ap_initial_ul_rrc_message_s {
|
||||
uint16_t crnti;
|
||||
uint8_t *rrc_container;
|
||||
int rrc_container_length;
|
||||
char du2cu_rrc_container[F1AP_MAX_DU2CU_RRC_LENGTH];
|
||||
uint8_t *du2cu_rrc_container;
|
||||
int du2cu_rrc_container_length;
|
||||
} f1ap_initial_ul_rrc_message_t;
|
||||
|
||||
|
||||
@@ -47,3 +47,7 @@ bool sdap_data_req(protocol_ctxt_t *ctxt_p,
|
||||
const int pdusession_id) {
|
||||
abort();
|
||||
}
|
||||
|
||||
int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc) {
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -35,27 +35,6 @@
|
||||
static f1ap_cudu_inst_t *f1_du_inst[NUMBER_OF_eNB_MAX]= {0};
|
||||
static f1ap_cudu_inst_t *f1_cu_inst[NUMBER_OF_eNB_MAX]= {0};
|
||||
|
||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||
int asn_debug = 0;
|
||||
int asn1_xer_print = 0;
|
||||
|
||||
inline void ASN_DEBUG(const char *fmt, ...) {
|
||||
if (asn_debug) {
|
||||
int adi = asn_debug_indent;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "[ASN1]");
|
||||
|
||||
while(adi--)
|
||||
fprintf(stderr, " ");
|
||||
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t F1AP_get_next_transaction_identifier(instance_t enb_mod_idP, instance_t cu_mod_idP) {
|
||||
static uint8_t transaction_identifier[NUMBER_OF_eNB_MAX];
|
||||
transaction_identifier[enb_mod_idP+cu_mod_idP] =
|
||||
|
||||
@@ -29,11 +29,6 @@
|
||||
* \note
|
||||
* \warning
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifndef F1AP_COMMON_H_
|
||||
#define F1AP_COMMON_H_
|
||||
|
||||
@@ -43,10 +38,6 @@
|
||||
#define F1AP_UE_IDENTIFIER_NUMBER 3
|
||||
#define F1AP_TRANSACTION_IDENTIFIER_NUMBER 3
|
||||
|
||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||
inline void ASN_DEBUG(const char *fmt, ...);
|
||||
#endif
|
||||
|
||||
#include "F1AP_RAT-FrequencyPriorityInformation.h"
|
||||
#include "F1AP_DLUPTNLInformation-ToBeSetup-Item.h"
|
||||
#include "F1AP_PrivateMessage.h"
|
||||
|
||||
@@ -79,56 +79,60 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_C_RNTI, true);
|
||||
rnti = ie->value.choice.C_RNTI;
|
||||
/* RRC Container */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||
F1AP_InitialULRRCMessageTransferIEs_t *rrccont;
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, rrccont, container,
|
||||
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
||||
AssertFatal(ie!=NULL,"RRCContainer is missing\n");
|
||||
AssertFatal(rrccont!=NULL,"RRCContainer is missing\n");
|
||||
|
||||
// create an ITTI message and copy SDU
|
||||
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
ccch_sdu_len = ie->value.choice.RRCContainer.size;
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, ie->value.choice.RRCContainer.buf,
|
||||
ccch_sdu_len);
|
||||
} else {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, RRC_MAC_CCCH_DATA_IND);
|
||||
memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
ccch_sdu_len = ie->value.choice.RRCContainer.size;
|
||||
memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, ie->value.choice.RRCContainer.buf,
|
||||
ccch_sdu_len);
|
||||
}
|
||||
|
||||
LOG_I(F1AP, "%s() RRCContainer (CCCH) size %ld: ", __func__, ie->value.choice.RRCContainer.size);
|
||||
/* DUtoCURRCContainer */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||
F1AP_InitialULRRCMessageTransferIEs_t *du2cu;
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, du2cu, container,
|
||||
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false);
|
||||
|
||||
if (ie) {
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container = malloc(sizeof(OCTET_STRING_t));
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->size = ie->value.choice.DUtoCURRCContainer.size;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf = malloc(ie->value.choice.DUtoCURRCContainer.size);
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf,
|
||||
ie->value.choice.DUtoCURRCContainer.buf,
|
||||
ie->value.choice.DUtoCURRCContainer.size);
|
||||
}
|
||||
|
||||
int f1ap_uid = f1ap_add_ue(CUtype, instance, rnti);
|
||||
|
||||
if (f1ap_uid < 0 ) {
|
||||
LOG_E(F1AP, "Failed to add UE \n");
|
||||
itti_free(ITTI_MSG_ORIGIN_ID(message_p), message_p);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// create an ITTI message and copy SDU
|
||||
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
|
||||
f1ap_initial_ul_rrc_message_t *ul_rrc = &F1AP_INITIAL_UL_RRC_MESSAGE(message_p);
|
||||
ul_rrc->nr_cellid = nr_cellid; // CU instance
|
||||
ul_rrc->crnti = rnti;
|
||||
ul_rrc->rrc_container_length = rrccont->value.choice.RRCContainer.size;
|
||||
ul_rrc->rrc_container = malloc(ul_rrc->rrc_container_length);
|
||||
memcpy(ul_rrc->rrc_container, rrccont->value.choice.RRCContainer.buf, ul_rrc->rrc_container_length);
|
||||
AssertFatal(du2cu != NULL, "no masterCellGroup in initial UL RRC message\n");
|
||||
ul_rrc->du2cu_rrc_container_length = du2cu->value.choice.DUtoCURRCContainer.size;
|
||||
ul_rrc->du2cu_rrc_container = malloc(ul_rrc->du2cu_rrc_container_length);
|
||||
memcpy(ul_rrc->du2cu_rrc_container, du2cu->value.choice.DUtoCURRCContainer.buf, ul_rrc->du2cu_rrc_container_length);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
|
||||
} else {
|
||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, RRC_MAC_CCCH_DATA_IND);
|
||||
memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
ccch_sdu_len = rrccont->value.choice.RRCContainer.size;
|
||||
memcpy(RRC_MAC_CCCH_DATA_IND (message_p).sdu, rrccont->value.choice.RRCContainer.buf,
|
||||
ccch_sdu_len);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).nr_cellid = nr_cellid; // CU instance
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
||||
if (du2cu) {
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container = malloc(sizeof(OCTET_STRING_t));
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->size = du2cu->value.choice.DUtoCURRCContainer.size;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf = malloc(du2cu->value.choice.DUtoCURRCContainer.size);
|
||||
memcpy(NR_RRC_MAC_CCCH_DATA_IND (message_p).du_to_cu_rrc_container->buf,
|
||||
du2cu->value.choice.DUtoCURRCContainer.buf,
|
||||
du2cu->value.choice.DUtoCURRCContainer.size);
|
||||
}
|
||||
itti_send_msg_to_task (TASK_RRC_ENB, instance, message_p);
|
||||
}
|
||||
|
||||
//getCxt(true,ITTI_MSG_DESTINATION_ID(message_p))->f1ap_ue[f1ap_uid].du_ue_f1ap_id = du_ue_f1ap_id;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = 0;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = ccch_sdu_len;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).nr_cellid = nr_cellid; // CU instance
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).rnti = rnti;
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id;
|
||||
itti_send_msg_to_task (f1ap_req(true,ITTI_MSG_DESTINATION_ID(message_p))->cell_type==CELL_MACRO_GNB?TASK_RRC_GNB:TASK_RRC_ENB, instance, message_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -172,6 +172,7 @@ void *F1AP_CU_task(void *arg) {
|
||||
LOG_I(F1AP, "CU Task Received F1AP_DL_RRC_MESSAGE\n");
|
||||
CU_send_DL_RRC_MESSAGE_TRANSFER(ITTI_MSG_DESTINATION_INSTANCE(received_msg),
|
||||
&F1AP_DL_RRC_MESSAGE(received_msg));
|
||||
free(F1AP_DL_RRC_MESSAGE(received_msg).rrc_container);
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_REQ: // from rrc
|
||||
|
||||
@@ -973,9 +973,6 @@ int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
||||
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
||||
}
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
return 0;
|
||||
#endif
|
||||
} else {
|
||||
struct rrc_eNB_ue_context_s *ue_context_p =
|
||||
rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "intertask_interface.h"
|
||||
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
|
||||
|
||||
int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
uint32_t assoc_id,
|
||||
@@ -748,7 +749,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
rnti_t rntiP,
|
||||
const uint8_t *sduP,
|
||||
sdu_size_t sdu_lenP,
|
||||
const char *sdu2P,
|
||||
const uint8_t *sdu2P,
|
||||
sdu_size_t sdu2_lenP) {
|
||||
F1AP_F1AP_PDU_t pdu= {0};
|
||||
F1AP_InitialULRRCMessageTransfer_t *out;
|
||||
@@ -807,7 +808,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
ie5->criticality = F1AP_Criticality_reject;
|
||||
ie5->value.present = F1AP_InitialULRRCMessageTransferIEs__value_PR_DUtoCURRCContainer;
|
||||
OCTET_STRING_fromBuf(&ie5->value.choice.DUtoCURRCContainer,
|
||||
sdu2P,
|
||||
(const char *)sdu2P,
|
||||
sdu2_lenP);
|
||||
}
|
||||
/* mandatory */
|
||||
@@ -986,6 +987,16 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
||||
}
|
||||
}
|
||||
|
||||
f1ap_dl_rrc_message_t dl_rrc = {
|
||||
.rrc_container_length = ie->value.choice.RRCContainer.size,
|
||||
.rrc_container = ie->value.choice.RRCContainer.buf,
|
||||
.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id),
|
||||
.srb_id = srb_id
|
||||
};
|
||||
int rc = dl_rrc_message(instance, &dl_rrc);
|
||||
if (rc == 0)
|
||||
return 0; /* has been handled, otherwise continue below */
|
||||
|
||||
// decode RRC Container and act on the message type
|
||||
AssertFatal(srb_id<3,"illegal srb_id\n");
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION);
|
||||
|
||||
@@ -50,7 +50,7 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instanceP,
|
||||
rnti_t rntiP,
|
||||
const uint8_t *sduP,
|
||||
sdu_size_t sdu_lenP,
|
||||
const char *sdu2P,
|
||||
const uint8_t *sdu2P,
|
||||
sdu_size_t sdu2_lenP);
|
||||
|
||||
#endif /* F1AP_DU_RRC_MESSAGE_TRANSFER_H_ */
|
||||
|
||||
@@ -85,7 +85,8 @@
|
||||
|
||||
extern uint16_t sf_ahead;
|
||||
int macrlc_has_f1 = 0;
|
||||
extern ngran_node_t node_type;
|
||||
|
||||
static ngran_node_t get_node_type(void);
|
||||
|
||||
extern int config_check_band_frequencies(int ind, int16_t band, uint64_t downlink_frequency,
|
||||
int32_t uplink_frequency_offset, uint32_t frame_type);
|
||||
@@ -758,8 +759,6 @@ void RCconfig_NR_L1(void) {
|
||||
LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_nr_CC[0]=%d for init_gNB_afterRU()\n", __FUNCTION__, RC.nb_nr_CC[0]);
|
||||
LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_nr_macrlc_inst:%d because used by mac_top_init_gNB()\n", __FUNCTION__, RC.nb_nr_macrlc_inst);
|
||||
|
||||
mac_top_init_gNB();
|
||||
|
||||
configure_nr_nfapi_pnf(RC.gNB[j]->eth_params_n.remote_addr,
|
||||
RC.gNB[j]->eth_params_n.remote_portc,
|
||||
RC.gNB[j]->eth_params_n.my_addr,
|
||||
@@ -795,6 +794,7 @@ void RCconfig_nr_macrlc() {
|
||||
paramdef_t GNBParams[] = GNBPARAMS_DESC;
|
||||
|
||||
paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
|
||||
ngran_node_t node_type = get_node_type();
|
||||
|
||||
config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL);
|
||||
int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
|
||||
@@ -825,7 +825,7 @@ void RCconfig_nr_macrlc() {
|
||||
if ( MacRLC_ParamList.numelt > 0) {
|
||||
|
||||
RC.nb_nr_macrlc_inst=MacRLC_ParamList.numelt;
|
||||
mac_top_init_gNB();
|
||||
mac_top_init_gNB(node_type);
|
||||
RC.nb_nr_mac_CC = (int*)malloc(RC.nb_nr_macrlc_inst*sizeof(int));
|
||||
|
||||
for (j=0;j<RC.nb_nr_macrlc_inst;j++) {
|
||||
@@ -2259,8 +2259,8 @@ int gNB_app_handle_f1ap_gnb_cu_configuration_update(f1ap_gnb_cu_configuration_up
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void set_node_type(void) {
|
||||
int j;
|
||||
static ngran_node_t get_node_type(void)
|
||||
{
|
||||
paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
|
||||
paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
|
||||
paramdef_t GNBParams[] = GNBPARAMS_DESC;
|
||||
@@ -2271,24 +2271,19 @@ void set_node_type(void) {
|
||||
|
||||
if ( MacRLC_ParamList.numelt > 0) {
|
||||
RC.nb_nr_macrlc_inst = MacRLC_ParamList.numelt;
|
||||
for (j=0;j<RC.nb_nr_macrlc_inst;j++) {
|
||||
for (int j = 0; j < RC.nb_nr_macrlc_inst; j++) {
|
||||
if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "f1") == 0) {
|
||||
macrlc_has_f1 = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(*(GNBParamList.paramarray[0][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0) {
|
||||
node_type = ngran_gNB_CU;
|
||||
} else {
|
||||
if (macrlc_has_f1 == 0) {
|
||||
node_type = ngran_gNB;
|
||||
LOG_I(NR_RRC,"Setting node_type to ngran_gNB\n");
|
||||
} else {
|
||||
node_type = ngran_gNB_DU;
|
||||
LOG_I(NR_RRC,"Setting node_type to ngran_gNB_DU\n");
|
||||
}
|
||||
}
|
||||
if (strcmp(*(GNBParamList.paramarray[0][GNB_TRANSPORT_S_PREFERENCE_IDX].strptr), "f1") == 0)
|
||||
return ngran_gNB_CU;
|
||||
else if (macrlc_has_f1 == 0)
|
||||
return ngran_gNB;
|
||||
else
|
||||
return ngran_gNB_DU;
|
||||
}
|
||||
|
||||
void nr_read_config_and_init(void) {
|
||||
@@ -2297,7 +2292,6 @@ void nr_read_config_and_init(void) {
|
||||
uint32_t gnb_nb = RC.nb_nr_inst;
|
||||
|
||||
RCconfig_NR_L1();
|
||||
set_node_type();
|
||||
RCconfig_nr_macrlc();
|
||||
|
||||
LOG_I(PHY, "%s() RC.nb_nr_L1_inst:%d\n", __FUNCTION__, RC.nb_nr_L1_inst);
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
|
||||
extern RAN_CONTEXT_t RC;
|
||||
//extern int l2_init_gNB(void);
|
||||
extern void mac_top_init_gNB(void);
|
||||
extern uint8_t nfapi_mode;
|
||||
|
||||
void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list,
|
||||
|
||||
@@ -44,9 +44,12 @@
|
||||
#include "OCG.h"
|
||||
#include "OCG_extern.h"
|
||||
|
||||
/* TODO REMOVE_DU_RRC: the RRC in the DU is a hack and should be taken out in the future */
|
||||
#include "RRC/LTE/rrc_extern.h"
|
||||
#include "RRC/NR/nr_rrc_extern.h"
|
||||
#include "RRC/NR/rrc_gNB_UE_context.h"
|
||||
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
||||
#include "RRC/NR/MESSAGES/asn1_msg.h"
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
@@ -2145,7 +2148,7 @@ int rnti_to_remove[10];
|
||||
volatile int rnti_to_remove_count;
|
||||
pthread_mutex_t rnti_to_remove_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr)
|
||||
void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr, uid_allocator_t *uia)
|
||||
{
|
||||
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
|
||||
destroy_nr_list(&sched_ctrl->available_dl_harq);
|
||||
@@ -2154,6 +2157,7 @@ void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr)
|
||||
destroy_nr_list(&sched_ctrl->available_ul_harq);
|
||||
destroy_nr_list(&sched_ctrl->feedback_ul_harq);
|
||||
destroy_nr_list(&sched_ctrl->retrans_ul_harq);
|
||||
uid_linear_allocator_free(uia, UE->uid);
|
||||
LOG_I(NR_MAC, "Remove NR rnti 0x%04x\n", UE->rnti);
|
||||
const rnti_t rnti = UE->rnti;
|
||||
free(UE);
|
||||
@@ -2448,6 +2452,7 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf
|
||||
}
|
||||
|
||||
UE->rnti = rntiP;
|
||||
UE->uid = uid_linear_allocator_new(&UE_info->uid_allocator);
|
||||
UE->CellGroup = CellGroup;
|
||||
|
||||
if (CellGroup)
|
||||
@@ -2501,7 +2506,7 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf
|
||||
}
|
||||
if (i == MAX_MOBILES_PER_GNB) {
|
||||
LOG_E(NR_MAC,"Try to add UE %04x but the list is full\n", rntiP);
|
||||
delete_nr_ue_data(UE, nr_mac->common_channels);
|
||||
delete_nr_ue_data(UE, nr_mac->common_channels, &UE_info->uid_allocator);
|
||||
pthread_mutex_unlock(&UE_info->mutex);
|
||||
return NULL;
|
||||
}
|
||||
@@ -2605,7 +2610,7 @@ void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti)
|
||||
memcpy(UE_info->list, newUEs, sizeof(UE_info->list));
|
||||
pthread_mutex_unlock(&UE_info->mutex);
|
||||
|
||||
delete_nr_ue_data(UE, nr_mac->common_channels);
|
||||
delete_nr_ue_data(UE, nr_mac->common_channels, &UE_info->uid_allocator);
|
||||
}
|
||||
|
||||
void nr_mac_remove_ra_rnti(module_id_t mod_id, rnti_t rnti) {
|
||||
@@ -2988,3 +2993,52 @@ void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCom
|
||||
req->Slot = i;
|
||||
}
|
||||
}
|
||||
|
||||
void send_initial_ul_rrc_message(module_id_t module_id,
|
||||
int CC_id,
|
||||
const NR_UE_info_t *UE,
|
||||
rb_id_t srb_id,
|
||||
const uint8_t *sdu,
|
||||
sdu_size_t sdu_len) {
|
||||
const gNB_MAC_INST *mac = RC.nrmac[module_id];
|
||||
const rnti_t rnti = UE->rnti;
|
||||
LOG_W(MAC,
|
||||
"[RAPROC] Received SDU for CCCH on SRB %ld length %d for UE %04x\n",
|
||||
srb_id, sdu_len, rnti);
|
||||
|
||||
/* TODO REMOVE_DU_RRC: the RRC in the DU is a hack and should be taken out in the future */
|
||||
if (NODE_IS_DU(RC.nrrrc[module_id]->node_type)) {
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_id]);
|
||||
ue_context_p->ue_id_rnti = rnti;
|
||||
ue_context_p->ue_context.rnti = rnti;
|
||||
ue_context_p->ue_context.random_ue_identity = rnti;
|
||||
ue_context_p->ue_context.Srb0.Active = 1;
|
||||
RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_id]->rrc_ue_head, ue_context_p);
|
||||
}
|
||||
|
||||
const NR_ServingCellConfigCommon_t *scc = RC.nrrrc[module_id]->carrier.servingcellconfigcommon;
|
||||
const NR_ServingCellConfig_t *sccd = RC.nrrrc[module_id]->configuration.scd;
|
||||
NR_CellGroupConfig_t cellGroupConfig = {0};
|
||||
fill_initial_cellGroupConfig(UE->uid, &cellGroupConfig, scc, sccd, &RC.nrrrc[module_id]->configuration);
|
||||
|
||||
uint8_t du2cu_rrc_container[1024];
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
&cellGroupConfig,
|
||||
du2cu_rrc_container,
|
||||
sizeof(du2cu_rrc_container));
|
||||
AssertFatal(enc_rval.encoded > 0,
|
||||
"Could not encode cellGroupConfig for UE %04x, failed element %s\n",
|
||||
rnti,
|
||||
enc_rval.failed_type->name);
|
||||
|
||||
const f1ap_initial_ul_rrc_message_t ul_rrc_msg = {
|
||||
/* TODO: add mcc, mnc, cell_id, ..., is not available at MAC yet */
|
||||
.crnti = rnti,
|
||||
.rrc_container = (uint8_t *) sdu,
|
||||
.rrc_container_length = sdu_len,
|
||||
.du2cu_rrc_container = (uint8_t *) du2cu_rrc_container,
|
||||
.du2cu_rrc_container_length = (enc_rval.encoded + 7) / 8
|
||||
};
|
||||
mac->mac_rrc.initial_ul_rrc_message_transfer(module_id, &ul_rrc_msg);
|
||||
}
|
||||
|
||||
@@ -317,9 +317,6 @@ int nr_process_mac_pdu(instance_t module_idP,
|
||||
AssertFatal(1==0,"[UE %04x] Frame/Slot %d.%d : Received LCID %d which is not configured, dropping packet\n",UE->rnti,frameP,slot,rx_lcid);
|
||||
}
|
||||
break;
|
||||
case UL_SCH_LCID_SRB3:
|
||||
// todo
|
||||
break;
|
||||
|
||||
case UL_SCH_LCID_CCCH:
|
||||
case UL_SCH_LCID_CCCH1:
|
||||
@@ -347,16 +344,12 @@ int nr_process_mac_pdu(instance_t module_idP,
|
||||
mac_len = 6;
|
||||
}
|
||||
|
||||
nr_mac_rrc_data_ind(module_idP,
|
||||
CC_id,
|
||||
frameP,
|
||||
0,
|
||||
0,
|
||||
UE->rnti,
|
||||
CCCH,
|
||||
pduP + mac_subheader_len,
|
||||
mac_len,
|
||||
0);
|
||||
send_initial_ul_rrc_message(module_idP,
|
||||
CC_id,
|
||||
UE,
|
||||
CCCH,
|
||||
pduP + mac_subheader_len,
|
||||
mac_len);
|
||||
break;
|
||||
|
||||
case UL_SCH_LCID_DTCH ... (UL_SCH_LCID_DTCH + 28):
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
void set_cset_offset(uint16_t);
|
||||
|
||||
void mac_top_init_gNB(void);
|
||||
void mac_top_init_gNB(ngran_node_t node_type);
|
||||
|
||||
void config_common(int Mod_idP,
|
||||
int pdsch_AntennaPorts,
|
||||
@@ -502,6 +502,13 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset
|
||||
|
||||
void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl);
|
||||
|
||||
void send_initial_ul_rrc_message(module_id_t module_id,
|
||||
int CC_id,
|
||||
const NR_UE_info_t *UE,
|
||||
rb_id_t srb_id,
|
||||
const uint8_t *sdu,
|
||||
sdu_size_t sdu_len);
|
||||
|
||||
void abort_nr_dl_harq(NR_UE_info_t* UE, int8_t harq_pid);
|
||||
|
||||
#endif /*__LAYER2_NR_MAC_PROTO_H__*/
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* 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 "mac_rrc_dl_handler.h"
|
||||
|
||||
#include "mac_proto.h"
|
||||
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
||||
|
||||
#include "NR_RRCSetup.h"
|
||||
#include "NR_DL-CCCH-Message.h"
|
||||
#include "NR_CellGroupConfig.h"
|
||||
|
||||
int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc, NR_RRCSetup_t *rrcSetup);
|
||||
|
||||
int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
{
|
||||
/* dispatch message to dl_rrc_message_rrcSetup() and others, similar to as is
|
||||
* done in the DU (should be the same here) */
|
||||
|
||||
if (dl_rrc->srb_id == 0) {
|
||||
|
||||
NR_DL_CCCH_Message_t *dl_ccch_msg = NULL;
|
||||
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_DL_CCCH_Message,
|
||||
(void **) &dl_ccch_msg,
|
||||
dl_rrc->rrc_container,
|
||||
dl_rrc->rrc_container_length,
|
||||
0,
|
||||
0);
|
||||
AssertFatal(dec_rval.code == RC_OK, "could not decode F1AP message\n");
|
||||
|
||||
switch (dl_ccch_msg->message.choice.c1->present) {
|
||||
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
|
||||
LOG_W(NR_MAC, "Received NOTHING on DL-CCCH-Message\n");
|
||||
break;
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
|
||||
LOG_D(NR_MAC, "DL-CCCH/SRB0, received rrcReject for RNTI %04x\n", dl_rrc->rnti);
|
||||
AssertFatal(0, "rrcReject not implemented yet\n");
|
||||
break;
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup:
|
||||
LOG_I(NR_MAC, "DL-CCCH/SRB0, received rrcSetup for RNTI %04x\n", dl_rrc->rnti);
|
||||
return dl_rrc_message_rrcSetup(module_id, dl_rrc, dl_ccch_msg->message.choice.c1->choice.rrcSetup);
|
||||
break;
|
||||
case NR_DL_CCCH_MessageType__c1_PR_spare2:
|
||||
LOG_W(NR_MAC, "DL-CCCH/SRB0, received spare2\n");
|
||||
break;
|
||||
case NR_DL_CCCH_MessageType__c1_PR_spare1:
|
||||
LOG_W(NR_MAC, "DL-CCCH/SRB0, received spare1\n");
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0 == 1, "Unknown DL-CCCH/SRB0 message %d\n", dl_ccch_msg->message.choice.c1->present);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1; /* not handled yet */
|
||||
}
|
||||
|
||||
int dl_rrc_message_rrcSetup(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc, NR_RRCSetup_t *rrcSetup)
|
||||
{
|
||||
DevAssert(rrcSetup != NULL);
|
||||
|
||||
NR_RRCSetup_IEs_t *rrcSetup_ies = rrcSetup->criticalExtensions.choice.rrcSetup;
|
||||
AssertFatal(rrcSetup_ies->masterCellGroup.buf != NULL,"masterCellGroup is NULL\n");
|
||||
NR_CellGroupConfig_t *cellGroup = NULL;
|
||||
asn_dec_rval_t dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig,
|
||||
(void **)&cellGroup,
|
||||
rrcSetup_ies->masterCellGroup.buf,
|
||||
rrcSetup_ies->masterCellGroup.size,
|
||||
0,
|
||||
0);
|
||||
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
|
||||
|
||||
/* there might be a memory leak for the cell group if we call this multiple
|
||||
* times. Also, the first parameters of rrc_mac_config_req_gNB() are only
|
||||
* relevant when setting the scc, which we don't do (and cannot do) here. */
|
||||
rrc_pdsch_AntennaPorts_t pap = {0};
|
||||
rrc_mac_config_req_gNB(module_id,
|
||||
pap, /* only when scc != NULL */
|
||||
0, /* only when scc != NULL */
|
||||
0, /* only when scc != NULL */
|
||||
0, /* only when scc != NULL */
|
||||
NULL, /* scc */
|
||||
NULL, /* mib */
|
||||
NULL, /* sib1 */
|
||||
0, /* add_ue */
|
||||
dl_rrc->rnti,
|
||||
cellGroup);
|
||||
|
||||
/* TODO: drop the RRC context */
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[module_id];
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_get_ue_context(rrc, dl_rrc->rnti);
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||
ue_context_p->ue_context.SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList;
|
||||
ue_context_p->ue_context.masterCellGroup = cellGroup;
|
||||
|
||||
/* TODO: this should pass through RLC and NOT the RRC with a shared buffer */
|
||||
AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
|
||||
memcpy(ue_p->Srb0.Tx_buffer.Payload, dl_rrc->rrc_container, dl_rrc->rrc_container_length);
|
||||
ue_p->Srb0.Tx_buffer.payload_size = dl_rrc->rrc_container_length;
|
||||
|
||||
protocol_ctxt_t ctxt = { .module_id = module_id, .rnti = dl_rrc->rnti };
|
||||
nr_rrc_rlc_config_asn1_req(&ctxt,
|
||||
ue_context_p->ue_context.SRB_configList,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
cellGroup->rlc_BearerToAddModList);
|
||||
|
||||
return 0;
|
||||
}
|
||||
+6
-12
@@ -19,18 +19,12 @@
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
/*! \file itti_sim_messages_def.h
|
||||
* \brief itti message for itti simulator
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
* \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
*/
|
||||
#ifndef MAC_RRC_DL_HANDLER_H
|
||||
#define MAC_RRC_DL_HANDLER_H
|
||||
|
||||
#include "platform_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
|
||||
int dl_rrc_message(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
MESSAGE_DEF(GNB_RRC_BCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBBCCHind)
|
||||
MESSAGE_DEF(GNB_RRC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBCCCHind)
|
||||
MESSAGE_DEF(GNB_RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, GNBDCCHind)
|
||||
MESSAGE_DEF(UE_RRC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, UECCCHind)
|
||||
MESSAGE_DEF(UE_RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED, itti_sim_rrc_ch_t, UEDCCHind)
|
||||
#endif /* MAC_RRC_DL_HANDLER_H */
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef MAC_RRC_UL_H
|
||||
#define MAC_RRC_UL_H
|
||||
|
||||
#include "platform_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
|
||||
typedef void (*initial_ul_rrc_message_transfer_func_t)(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc);
|
||||
|
||||
struct nr_mac_rrc_ul_if_s;
|
||||
void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc);
|
||||
void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc);
|
||||
|
||||
#endif /* MAC_RRC_UL_H */
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "nr_mac_gNB.h"
|
||||
|
||||
#include "mac_rrc_ul.h"
|
||||
|
||||
static void initial_ul_rrc_message_transfer_direct(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
|
||||
/* copy all fields, but reallocate rrc_containers! */
|
||||
f1ap_initial_ul_rrc_message_t *f1ap_msg = &F1AP_INITIAL_UL_RRC_MESSAGE(msg);
|
||||
*f1ap_msg = *ul_rrc;
|
||||
|
||||
f1ap_msg->rrc_container = malloc(ul_rrc->rrc_container_length);
|
||||
DevAssert(f1ap_msg->rrc_container);
|
||||
memcpy(f1ap_msg->rrc_container, ul_rrc->rrc_container, ul_rrc->rrc_container_length);
|
||||
f1ap_msg->rrc_container_length = ul_rrc->rrc_container_length;
|
||||
|
||||
f1ap_msg->du2cu_rrc_container = malloc(ul_rrc->du2cu_rrc_container_length);
|
||||
DevAssert(f1ap_msg->du2cu_rrc_container);
|
||||
memcpy(f1ap_msg->du2cu_rrc_container, ul_rrc->du2cu_rrc_container, ul_rrc->du2cu_rrc_container_length);
|
||||
f1ap_msg->du2cu_rrc_container_length = ul_rrc->du2cu_rrc_container_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, module_id, msg);
|
||||
}
|
||||
|
||||
void mac_rrc_ul_direct_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
{
|
||||
mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_direct;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "nr_mac_gNB.h"
|
||||
|
||||
#include "mac_rrc_ul.h"
|
||||
|
||||
static void initial_ul_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_initial_ul_rrc_message_t *ul_rrc)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE);
|
||||
/* copy all fields, but reallocate rrc_containers! */
|
||||
f1ap_initial_ul_rrc_message_t *f1ap_msg = &F1AP_INITIAL_UL_RRC_MESSAGE(msg);
|
||||
*f1ap_msg = *ul_rrc;
|
||||
|
||||
f1ap_msg->rrc_container = malloc(ul_rrc->rrc_container_length);
|
||||
DevAssert(f1ap_msg->rrc_container);
|
||||
memcpy(f1ap_msg->rrc_container, ul_rrc->rrc_container, ul_rrc->rrc_container_length);
|
||||
f1ap_msg->rrc_container_length = ul_rrc->rrc_container_length;
|
||||
|
||||
f1ap_msg->du2cu_rrc_container = malloc(ul_rrc->du2cu_rrc_container_length);
|
||||
DevAssert(f1ap_msg->du2cu_rrc_container);
|
||||
memcpy(f1ap_msg->du2cu_rrc_container, ul_rrc->du2cu_rrc_container, ul_rrc->du2cu_rrc_container_length);
|
||||
f1ap_msg->du2cu_rrc_container_length = ul_rrc->du2cu_rrc_container_length;
|
||||
|
||||
itti_send_msg_to_task(TASK_DU_F1, module_id, msg);
|
||||
}
|
||||
|
||||
void mac_rrc_ul_f1ap_init(struct nr_mac_rrc_ul_if_s *mac_rrc)
|
||||
{
|
||||
mac_rrc->initial_ul_rrc_message_transfer = initial_ul_rrc_message_transfer_f1ap;
|
||||
}
|
||||
|
||||
@@ -173,8 +173,25 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset
|
||||
return output - begin;
|
||||
}
|
||||
|
||||
static void mac_rrc_init(gNB_MAC_INST *mac, ngran_node_t node_type)
|
||||
{
|
||||
switch (node_type) {
|
||||
case ngran_gNB_CU:
|
||||
AssertFatal(1 == 0, "nothing to do for CU\n");
|
||||
break;
|
||||
case ngran_gNB_DU:
|
||||
mac_rrc_ul_f1ap_init(&mac->mac_rrc);
|
||||
break;
|
||||
case ngran_gNB:
|
||||
mac_rrc_ul_direct_init(&mac->mac_rrc);
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0 == 1, "Unknown node type %d\n", node_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void mac_top_init_gNB(void)
|
||||
void mac_top_init_gNB(ngran_node_t node_type)
|
||||
{
|
||||
module_id_t i;
|
||||
gNB_MAC_INST *nrmac;
|
||||
@@ -211,6 +228,7 @@ void mac_top_init_gNB(void)
|
||||
RC.nrmac[i]->first_MIB = true;
|
||||
|
||||
pthread_mutex_init(&RC.nrmac[i]->UE_info.mutex, NULL);
|
||||
uid_linear_allocator_init(&RC.nrmac[i]->UE_info.uid_allocator);
|
||||
|
||||
if (get_softmodem_params()->phy_test) {
|
||||
RC.nrmac[i]->pre_processor_dl = nr_preprocessor_phytest;
|
||||
@@ -221,6 +239,8 @@ void mac_top_init_gNB(void)
|
||||
}
|
||||
if (!IS_SOFTMODEM_NOSTATS_BIT)
|
||||
pthread_create(&RC.nrmac[i]->stats_thread, NULL, nrmac_stats_thread, (void*)RC.nrmac[i]);
|
||||
|
||||
mac_rrc_init(RC.nrmac[i], node_type);
|
||||
}//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
|
||||
|
||||
AssertFatal(rlc_module_init(1) == 0,"Could not initialize RLC layer\n");
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "targets/ARCH/COMMON/common_lib.h"
|
||||
#include "COMMON/platform_constants.h"
|
||||
#include "common/ran_context.h"
|
||||
#include "collection/linear_alloc.h"
|
||||
|
||||
/* RRC */
|
||||
#include "NR_BCCH-BCH-Message.h"
|
||||
@@ -60,6 +61,7 @@
|
||||
/* Interface */
|
||||
#include "nfapi_nr_interface_scf.h"
|
||||
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
|
||||
#include "mac_rrc_ul.h"
|
||||
|
||||
/* MAC */
|
||||
#include "LAYER2/MAC/mac.h"
|
||||
@@ -686,9 +688,15 @@ typedef struct NR_bler_options {
|
||||
uint8_t harq_round_max;
|
||||
} NR_bler_options_t;
|
||||
|
||||
typedef struct nr_mac_rrc_ul_if_s {
|
||||
/* TODO add other message types as necessary */
|
||||
initial_ul_rrc_message_transfer_func_t initial_ul_rrc_message_transfer;
|
||||
} nr_mac_rrc_ul_if_t;
|
||||
|
||||
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
|
||||
typedef struct {
|
||||
rnti_t rnti;
|
||||
uid_t uid; // unique ID of this UE
|
||||
/// scheduling control info
|
||||
nr_csi_report_t csi_report_template[MAX_CSI_REPORTCONFIG];
|
||||
NR_UE_sched_ctrl_t UE_sched_ctrl;
|
||||
@@ -715,6 +723,7 @@ typedef struct {
|
||||
pthread_mutex_t mutex;
|
||||
NR_UE_info_t *list[MAX_MOBILES_PER_GNB+1];
|
||||
bool sched_csirs;
|
||||
uid_allocator_t uid_allocator;
|
||||
} NR_UEs_t;
|
||||
|
||||
#define UE_iterator(BaSe, VaR) NR_UE_info_t ** VaR##pptr=BaSe, *VaR; while ((VaR=*(VaR##pptr++)))
|
||||
@@ -839,6 +848,8 @@ typedef struct gNB_MAC_INST_s {
|
||||
NR_bler_options_t ul_bler;
|
||||
uint8_t min_grant_prb;
|
||||
uint8_t min_grant_mcs;
|
||||
|
||||
nr_mac_rrc_ul_if_t mac_rrc;
|
||||
} gNB_MAC_INST;
|
||||
|
||||
#endif /*__LAYER2_NR_MAC_GNB_H__ */
|
||||
|
||||
@@ -484,12 +484,12 @@ static void *ue_tun_read_thread(void *_)
|
||||
ctxt.rnti = rnti;
|
||||
|
||||
bool dc = SDAP_HDR_UL_DATA_PDU;
|
||||
uint8_t qfi = 7;
|
||||
int pdusession_id = 10;
|
||||
extern uint8_t nas_qfi;
|
||||
extern uint8_t nas_pduid;
|
||||
|
||||
sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED,
|
||||
RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf,
|
||||
PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, dc, pdusession_id);
|
||||
PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, nas_qfi, dc, nas_pduid);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -591,8 +591,10 @@ uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id)
|
||||
int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF)? MAX_MOBILES_PER_ENB : 1;
|
||||
netlink_init_tun(ifsuffix_ue, num_if, id);
|
||||
//Add --nr-ip-over-lte option check for next line
|
||||
if (IS_SOFTMODEM_NOS1)
|
||||
nas_config(1, 1, !get_softmodem_params()->nsa ? 2 : 3, ifsuffix_ue);
|
||||
if (IS_SOFTMODEM_NOS1){
|
||||
nas_config(1, 1, !get_softmodem_params()->nsa ? 2 : 3, ifsuffix_ue);
|
||||
set_qfi_pduid(7, 10);
|
||||
}
|
||||
LOG_I(PDCP, "UE pdcp will use tun interface\n");
|
||||
start_pdcp_tun_ue();
|
||||
} else if(ENB_NAS_USE_TUN) {
|
||||
@@ -734,27 +736,30 @@ static void deliver_sdu_srb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
__FILE__, __LINE__, __FUNCTION__, ue->rnti);
|
||||
exit(1);
|
||||
|
||||
srb_found:
|
||||
{
|
||||
uint8_t *rrc_buffer_p = entity->is_gnb ?
|
||||
itti_malloc(TASK_PDCP_ENB, TASK_RRC_GNB, size):
|
||||
itti_malloc(TASK_PDCP_UE, TASK_RRC_NRUE, size);
|
||||
MessageDef *message_p;
|
||||
|
||||
AssertFatal(rrc_buffer_p != NULL, "OUT OF MEMORY");
|
||||
memcpy(rrc_buffer_p, buf, size);
|
||||
message_p = entity->is_gnb ?
|
||||
itti_alloc_new_message(TASK_PDCP_ENB, 0, NR_RRC_DCCH_DATA_IND):
|
||||
itti_alloc_new_message(TASK_PDCP_UE, 0, NR_RRC_DCCH_DATA_IND);
|
||||
|
||||
AssertFatal(message_p != NULL, "OUT OF MEMORY");
|
||||
NR_RRC_DCCH_DATA_IND(message_p).dcch_index = srb_id;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).sdu_p = rrc_buffer_p;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).sdu_size = size;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).rnti = ue->rnti;
|
||||
|
||||
itti_send_msg_to_task(entity->is_gnb ? TASK_RRC_GNB : TASK_RRC_NRUE, 0, message_p);
|
||||
}
|
||||
srb_found:
|
||||
if (entity->is_gnb) {
|
||||
MessageDef *message_p = itti_alloc_new_message(TASK_PDCP_GNB, 0, F1AP_UL_RRC_MESSAGE);
|
||||
AssertFatal(message_p != NULL, "OUT OF MEMORY\n");
|
||||
f1ap_ul_rrc_message_t *ul_rrc = &F1AP_UL_RRC_MESSAGE(message_p);
|
||||
ul_rrc->rnti = ue->rnti;
|
||||
ul_rrc->srb_id = srb_id;
|
||||
ul_rrc->rrc_container = malloc(size);
|
||||
AssertFatal(ul_rrc->rrc_container != NULL, "OUT OF MEMORY\n");
|
||||
memcpy(ul_rrc->rrc_container, buf, size);
|
||||
ul_rrc->rrc_container_length = size;
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, message_p);
|
||||
} else {
|
||||
uint8_t *rrc_buffer_p = itti_malloc(TASK_PDCP_UE, TASK_RRC_NRUE, size);
|
||||
AssertFatal(rrc_buffer_p != NULL, "OUT OF MEMORY\n");
|
||||
memcpy(rrc_buffer_p, buf, size);
|
||||
MessageDef *message_p = itti_alloc_new_message(TASK_PDCP_UE, 0, NR_RRC_DCCH_DATA_IND);
|
||||
AssertFatal(message_p != NULL, "OUT OF MEMORY\n");
|
||||
NR_RRC_DCCH_DATA_IND(message_p).dcch_index = srb_id;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).sdu_p = rrc_buffer_p;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).sdu_size = size;
|
||||
NR_RRC_DCCH_DATA_IND(message_p).rnti = ue->rnti;
|
||||
itti_send_msg_to_task(TASK_RRC_NRUE, 0, message_p);
|
||||
}
|
||||
}
|
||||
|
||||
static void deliver_pdu_srb(void *_ue, nr_pdcp_entity_t *entity,
|
||||
|
||||
@@ -31,27 +31,6 @@
|
||||
#include "m2ap_common.h"
|
||||
#include "M2AP_M2AP-PDU.h"
|
||||
|
||||
int asn_debug = 0;
|
||||
int asn1_xer_print = 0;
|
||||
|
||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||
inline void ASN_DEBUG(const char *fmt, ...)
|
||||
{
|
||||
if (asn_debug) {
|
||||
int adi = asn_debug_indent;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "[ASN1]");
|
||||
|
||||
while(adi--) fprintf(stderr, " ");
|
||||
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ssize_t m2ap_generate_initiating_message(
|
||||
uint8_t **buffer,
|
||||
uint32_t *length,
|
||||
|
||||
@@ -18,10 +18,8 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifndef M2AP_COMMON_H_
|
||||
#define M2AP_COMMON_H_
|
||||
|
||||
#include "M2AP_ProtocolIE-Field.h"
|
||||
#include "M2AP_M2AP-PDU.h"
|
||||
@@ -38,9 +36,6 @@
|
||||
|
||||
#include "common/ran_context.h"
|
||||
|
||||
#ifndef M2AP_COMMON_H_
|
||||
#define M2AP_COMMON_H_
|
||||
|
||||
/** @defgroup _m2ap_impl_ M2AP Layer Reference Implementation
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
|
||||
@@ -37,9 +37,6 @@
|
||||
|
||||
#include "COMMON/s1ap_messages_types.h"
|
||||
#include "COMMON/rrc_messages_types.h"
|
||||
#if ITTI_SIM
|
||||
#include "COMMON/itti_sim_messages_types.h"
|
||||
#endif
|
||||
|
||||
#include "collection/tree.h"
|
||||
#include "rrc_types_NB_IoT.h"
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "collection/tree.h"
|
||||
#include "collection/linear_alloc.h"
|
||||
#include "common/ngran_types.h"
|
||||
#include "rrc_types.h"
|
||||
//#include "PHY/phy_defs.h"
|
||||
#include "LAYER2/RLC/rlc.h"
|
||||
#include "RRC/NR/nr_rrc_types.h"
|
||||
#include "NR_UE-MRDC-Capability.h"
|
||||
#include "NR_UE-NR-Capability.h"
|
||||
|
||||
@@ -219,17 +219,6 @@ void *send_UE_status_notification(void *);
|
||||
#include "commonDef.h"
|
||||
|
||||
|
||||
//--------
|
||||
typedef unsigned int uid_t;
|
||||
#define UID_LINEAR_ALLOCATOR_BITMAP_SIZE (((MAX_MOBILES_PER_ENB/8)/sizeof(unsigned int)) + 1)
|
||||
typedef struct uid_linear_allocator_s {
|
||||
unsigned int bitmap[UID_LINEAR_ALLOCATOR_BITMAP_SIZE];
|
||||
} uid_allocator_t;
|
||||
|
||||
//--------
|
||||
|
||||
|
||||
|
||||
#define PROTOCOL_RRC_CTXT_UE_FMT PROTOCOL_CTXT_FMT
|
||||
#define PROTOCOL_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp)
|
||||
|
||||
@@ -668,8 +657,6 @@ typedef struct eNB_RRC_UE_s {
|
||||
int nr_capabilities_requested;
|
||||
} eNB_RRC_UE_t;
|
||||
|
||||
typedef uid_t ue_uid_t;
|
||||
|
||||
typedef struct rrc_eNB_ue_context_s {
|
||||
/* Tree related data */
|
||||
RB_ENTRY(rrc_eNB_ue_context_s) entries;
|
||||
@@ -680,7 +667,7 @@ typedef struct rrc_eNB_ue_context_s {
|
||||
rnti_t ue_id_rnti;
|
||||
|
||||
// another key for protocol layers but should not be used as a key for RB tree
|
||||
ue_uid_t local_uid;
|
||||
uid_t local_uid;
|
||||
|
||||
/* UE id for initial connection to S1AP */
|
||||
struct eNB_RRC_UE_s ue_context;
|
||||
@@ -762,7 +749,7 @@ typedef struct eNB_RRC_INST_s {
|
||||
char *node_name;
|
||||
uint32_t node_id;
|
||||
rrc_eNB_carrier_data_t carrier[MAX_NUM_CCs];
|
||||
uid_allocator_t uid_allocator; // for rrc_ue_head
|
||||
uid_allocator_t uid_allocator;
|
||||
RB_HEAD(rrc_ue_tree_s, rrc_eNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti
|
||||
uint8_t HO_flag;
|
||||
uint8_t Nb_ue;
|
||||
|
||||
@@ -37,64 +37,6 @@
|
||||
#include "rrc_eNB_UE_context.h"
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
uid_linear_allocator_init(
|
||||
uid_allocator_t *const uid_pP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
memset(uid_pP, 0, sizeof(uid_allocator_t));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
uid_t
|
||||
uid_linear_allocator_new(
|
||||
eNB_RRC_INST *const rrc_instance_pP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int bit_index = 1;
|
||||
uid_t uid = 0;
|
||||
uid_allocator_t *uia_p = &rrc_instance_pP->uid_allocator;
|
||||
|
||||
for (i=0; i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE; i++) {
|
||||
if (uia_p->bitmap[i] != UINT_MAX) {
|
||||
bit_index = 1;
|
||||
uid = 0;
|
||||
|
||||
while ((uia_p->bitmap[i] & bit_index) == bit_index) {
|
||||
bit_index = bit_index << 1;
|
||||
uid += 1;
|
||||
}
|
||||
|
||||
uia_p->bitmap[i] |= bit_index;
|
||||
return uid + (i*sizeof(unsigned int)*8);
|
||||
}
|
||||
}
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
uid_linear_allocator_free(
|
||||
eNB_RRC_INST *rrc_instance_pP,
|
||||
uid_t uidP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
unsigned int i = uidP/sizeof(unsigned int)/8;
|
||||
unsigned int bit = uidP % (sizeof(unsigned int) * 8);
|
||||
unsigned int value = ~(0x00000001 << bit);
|
||||
|
||||
if (i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE) {
|
||||
rrc_instance_pP->uid_allocator.bitmap[i] &= value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int rrc_eNB_compare_ue_rnti_id(
|
||||
@@ -134,7 +76,7 @@ rrc_eNB_allocate_new_UE_context(
|
||||
}
|
||||
|
||||
memset(new_p, 0, sizeof(struct rrc_eNB_ue_context_s));
|
||||
new_p->local_uid = uid_linear_allocator_new(rrc_instance_pP);
|
||||
new_p->local_uid = uid_linear_allocator_new(&rrc_instance_pP->uid_allocator);
|
||||
|
||||
for(int i = 0; i < NB_RB_MAX; i++) {
|
||||
new_p->ue_context.e_rab[i].xid = -1;
|
||||
@@ -210,7 +152,7 @@ void rrc_eNB_remove_ue_context(
|
||||
|
||||
RB_REMOVE(rrc_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
|
||||
rrc_eNB_free_mem_UE_context(ctxt_pP, ue_context_pP);
|
||||
uid_linear_allocator_free(rrc_instance_pP, ue_context_pP->local_uid);
|
||||
uid_linear_allocator_free(&rrc_instance_pP->uid_allocator, ue_context_pP->local_uid);
|
||||
free(ue_context_pP);
|
||||
rrc_instance_pP->Nb_ue --;
|
||||
LOG_I(RRC,
|
||||
|
||||
@@ -34,27 +34,6 @@
|
||||
#include "COMMON/platform_types.h"
|
||||
#include "rrc_defs.h"
|
||||
|
||||
|
||||
void
|
||||
uid_linear_allocator_init(
|
||||
uid_allocator_t* const uid_pP
|
||||
);
|
||||
|
||||
uid_t
|
||||
uid_linear_allocator_new(
|
||||
eNB_RRC_INST* rrc_instance_pP
|
||||
);
|
||||
|
||||
|
||||
void
|
||||
uid_linear_allocator_free(
|
||||
eNB_RRC_INST* rrc_instance_pP,
|
||||
uid_t uidP
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
int rrc_eNB_compare_ue_rnti_id(
|
||||
struct rrc_eNB_ue_context_s* c1_pP,
|
||||
struct rrc_eNB_ue_context_s* c2_pP
|
||||
|
||||
@@ -202,74 +202,6 @@ int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t sub_frameP,
|
||||
const int UE_id,
|
||||
const rnti_t rntiP,
|
||||
const rb_id_t srb_idP,
|
||||
const uint8_t *sduP,
|
||||
const sdu_size_t sdu_lenP,
|
||||
const bool brOption) {
|
||||
|
||||
if (NODE_IS_DU(RC.nrrrc[module_idP]->node_type)) {
|
||||
LOG_W(RRC,"[DU %d][RAPROC] Received SDU for CCCH on SRB %ld length %d for UE id %d RNTI %x \n",
|
||||
module_idP, srb_idP, sdu_lenP, UE_id, rntiP);
|
||||
|
||||
// Generate DUtoCURRCContainer
|
||||
// call do_RRCSetup like full procedure and extract masterCellGroup
|
||||
NR_CellGroupConfig_t cellGroupConfig;
|
||||
NR_ServingCellConfigCommon_t *scc=RC.nrrrc[module_idP]->carrier.servingcellconfigcommon;
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated = RC.nrrrc[module_idP]->configuration.scd;
|
||||
memset(&cellGroupConfig,0,sizeof(cellGroupConfig));
|
||||
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[module_idP]);
|
||||
ue_context_p->ue_id_rnti = rntiP;
|
||||
ue_context_p->ue_context.rnti = rntiP;
|
||||
ue_context_p->ue_context.random_ue_identity = rntiP;
|
||||
ue_context_p->ue_context.Srb0.Active = 1;
|
||||
RB_INSERT(rrc_nr_ue_tree_s, &RC.nrrrc[module_idP]->rrc_ue_head, ue_context_p);
|
||||
|
||||
fill_initial_cellGroupConfig(ue_context_p->local_uid,&cellGroupConfig,scc,servingcellconfigdedicated,&RC.nrrrc[module_idP]->configuration);
|
||||
|
||||
MessageDef* tmp=itti_alloc_new_message_sized(TASK_RRC_GNB, 0, F1AP_INITIAL_UL_RRC_MESSAGE, sizeof(f1ap_initial_ul_rrc_message_t) + sdu_lenP);
|
||||
f1ap_initial_ul_rrc_message_t *msg = &F1AP_INITIAL_UL_RRC_MESSAGE(tmp);
|
||||
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
(void *)&cellGroupConfig,
|
||||
msg->du2cu_rrc_container,
|
||||
F1AP_MAX_DU2CU_RRC_LENGTH);
|
||||
|
||||
if (enc_rval.encoded == -1) {
|
||||
LOG_E(F1AP,"Could not encoded cellGroupConfig, failed element %s\n",enc_rval.failed_type->name);
|
||||
exit(-1);
|
||||
}
|
||||
/* do ITTI message */
|
||||
msg->du2cu_rrc_container_length = (enc_rval.encoded+7)/8;
|
||||
msg->crnti=rntiP;
|
||||
msg->rrc_container=(uint8_t*) (msg+1); // Made extra room after the struct with itti_alloc_msg_sized()
|
||||
memcpy(msg->rrc_container, sduP, sdu_lenP);
|
||||
msg->rrc_container_length=sdu_lenP;
|
||||
itti_send_msg_to_task(TASK_DU_F1, 0, tmp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
protocol_ctxt_t ctxt;
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, GNB_FLAG_YES, rntiP, frameP, sub_frameP,0);
|
||||
|
||||
if((srb_idP & RAB_OFFSET) == CCCH) {
|
||||
LOG_D(NR_RRC, "[gNB %d] Received SDU for CCCH on SRB %ld\n", module_idP, srb_idP);
|
||||
ctxt.brOption = brOption;
|
||||
if (sdu_lenP > 0) {
|
||||
nr_rrc_gNB_decode_ccch(&ctxt, sduP, sdu_lenP, NULL, CC_id);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
|
||||
const int CC_idP,
|
||||
const frame_t frameP,
|
||||
|
||||
@@ -986,8 +986,8 @@ uint8_t do_RRCReject(uint8_t Mod_id,
|
||||
|
||||
void fill_default_downlinkBWP(NR_BWP_Downlink_t *bwp,
|
||||
int bwp_loop,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const gNB_RrcConfigurationReq *configuration) {
|
||||
|
||||
/// BWP common configuration
|
||||
@@ -1133,8 +1133,8 @@ void fill_default_downlinkBWP(NR_BWP_Downlink_t *bwp,
|
||||
|
||||
void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
|
||||
int bwp_loop,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const gNB_RrcConfigurationReq *configuration,
|
||||
int uid) {
|
||||
|
||||
@@ -1330,13 +1330,11 @@ void fill_default_uplinkBWP(NR_BWP_Uplink_t *ubwp,
|
||||
}
|
||||
|
||||
void fill_initial_SpCellConfig(int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration) {
|
||||
|
||||
NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig;
|
||||
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration)
|
||||
{
|
||||
// This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4.
|
||||
// However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources,
|
||||
// where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations.
|
||||
@@ -1915,8 +1913,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
|
||||
void fill_initial_cellGroupConfig(int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration)
|
||||
{
|
||||
NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = NULL;
|
||||
@@ -1970,20 +1968,21 @@ void fill_initial_cellGroupConfig(int uid,
|
||||
|
||||
cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig));
|
||||
|
||||
fill_initial_SpCellConfig(uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
|
||||
fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,servingcellconfigdedicated,configuration);
|
||||
|
||||
cellGroupConfig->sCellToAddModList = NULL;
|
||||
cellGroupConfig->sCellToReleaseList = NULL;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
uint8_t *const buffer,
|
||||
const uint8_t transaction_id,
|
||||
OCTET_STRING_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration)
|
||||
int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
uint8_t *const buffer,
|
||||
const uint8_t transaction_id,
|
||||
const uint8_t *masterCellGroup,
|
||||
int masterCellGroup_len,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
asn_enc_rval_t enc_rval;
|
||||
@@ -1993,7 +1992,6 @@ int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
NR_SRB_ToAddMod_t *SRB1_config = NULL;
|
||||
NR_PDCP_Config_t *pdcp_Config = NULL;
|
||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||
char masterCellGroup_buf[3000];
|
||||
|
||||
AssertFatal(ue_context_pP != NULL,"ue_context_p is null\n");
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
@@ -2036,38 +2034,14 @@ int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
ie->radioBearerConfig.securityConfig = NULL;
|
||||
|
||||
/****************************** masterCellGroup ******************************/
|
||||
/* TODO */
|
||||
if (masterCellGroup_from_DU) {
|
||||
memcpy(&ie->masterCellGroup,masterCellGroup_from_DU,sizeof(*masterCellGroup_from_DU));
|
||||
// decode masterCellGroup OCTET_STRING received from DU and place in ue context
|
||||
uper_decode(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig, //might be added prefix later
|
||||
(void **)&cellGroupConfig,
|
||||
(uint8_t *)masterCellGroup_from_DU->buf,
|
||||
masterCellGroup_from_DU->size, 0, 0);
|
||||
}
|
||||
else {
|
||||
cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t));
|
||||
fill_initial_cellGroupConfig(ue_context_pP->local_uid,cellGroupConfig,scc,servingcellconfigdedicated,configuration);
|
||||
|
||||
enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
(void *)cellGroupConfig,
|
||||
masterCellGroup_buf,
|
||||
3000);
|
||||
|
||||
if(enc_rval.encoded == -1) {
|
||||
LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n",
|
||||
enc_rval.failed_type->name, enc_rval.encoded);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (OCTET_STRING_fromBuf(&ie->masterCellGroup, masterCellGroup_buf, (enc_rval.encoded+7)/8) == -1) {
|
||||
LOG_E(NR_RRC, "fatal: OCTET_STRING_fromBuf failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
DevAssert(masterCellGroup && masterCellGroup_len > 0);
|
||||
ie->masterCellGroup.buf = malloc(masterCellGroup_len);
|
||||
AssertFatal(ie->masterCellGroup.buf != NULL, "could not allocate memory for masterCellGroup\n");
|
||||
memcpy(ie->masterCellGroup.buf, masterCellGroup, masterCellGroup_len);
|
||||
ie->masterCellGroup.size = masterCellGroup_len;
|
||||
|
||||
// decode masterCellGroup OCTET_STRING received from DU and place in ue context
|
||||
uper_decode(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, masterCellGroup, masterCellGroup_len, 0, 0);
|
||||
ue_p->masterCellGroup = cellGroupConfig;
|
||||
|
||||
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
|
||||
|
||||
@@ -100,15 +100,15 @@ uint8_t do_RRCReject(uint8_t Mod_id,
|
||||
uint8_t *const buffer);
|
||||
|
||||
void fill_initial_SpCellConfig(int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration);
|
||||
|
||||
void fill_initial_cellGroupConfig(int uid,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration);
|
||||
|
||||
void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
@@ -124,13 +124,14 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
|
||||
uint8_t nb_bearers_to_setup,
|
||||
long *priority);
|
||||
|
||||
int16_t do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
uint8_t *const buffer,
|
||||
const uint8_t transaction_id,
|
||||
OCTET_STRING_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration);
|
||||
int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
uint8_t *const buffer,
|
||||
const uint8_t transaction_id,
|
||||
const uint8_t *masterCellGroup,
|
||||
int masterCellGroup_len,
|
||||
const NR_ServingCellConfigCommon_t *scc,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const gNB_RrcConfigurationReq *configuration);
|
||||
|
||||
uint8_t do_NR_SecurityModeCommand(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#ifndef MAC_RRC_DL_H
|
||||
#define MAC_RRC_DL_H
|
||||
|
||||
#include "platform_types.h"
|
||||
#include "f1ap_messages_types.h"
|
||||
|
||||
typedef void (*dl_rrc_message_transfer_func_t)(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc);
|
||||
|
||||
struct nr_mac_rrc_dl_if_s;
|
||||
void mac_rrc_dl_direct_init(struct nr_mac_rrc_dl_if_s *mac_rrc);
|
||||
void mac_rrc_dl_f1ap_init(struct nr_mac_rrc_dl_if_s *mac_rrc);
|
||||
|
||||
#endif /* MAC_RRC_DL_H */
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "nr_rrc_defs.h"
|
||||
|
||||
#include "mac_rrc_dl.h"
|
||||
#include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
|
||||
|
||||
static void dl_rrc_message_transfer_direct(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
{
|
||||
/* TODO how to manage inter-thread communication? */
|
||||
|
||||
dl_rrc_message(module_id, dl_rrc);
|
||||
}
|
||||
|
||||
void mac_rrc_dl_direct_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
{
|
||||
mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_direct;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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:
|
||||
* conmnc_digit_lengtht@openairinterface.org
|
||||
*/
|
||||
|
||||
#include "mac_rrc_dl.h"
|
||||
#include "nr_rrc_defs.h"
|
||||
|
||||
static void dl_rrc_message_transfer_f1ap(module_id_t module_id, const f1ap_dl_rrc_message_t *dl_rrc)
|
||||
{
|
||||
/* TODO call F1AP function directly? no real-time constraint here */
|
||||
|
||||
MessageDef *message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);
|
||||
f1ap_dl_rrc_message_t *msg = &F1AP_DL_RRC_MESSAGE(message_p);
|
||||
*msg = *dl_rrc;
|
||||
if (dl_rrc->rrc_container) {
|
||||
msg->rrc_container = malloc(dl_rrc->rrc_container_length);
|
||||
AssertFatal(msg->rrc_container != NULL, "out of memory\n");
|
||||
msg->rrc_container_length = dl_rrc->rrc_container_length;
|
||||
memcpy(msg->rrc_container, dl_rrc->rrc_container, dl_rrc->rrc_container_length);
|
||||
}
|
||||
itti_send_msg_to_task (TASK_CU_F1, module_id, message_p);
|
||||
}
|
||||
|
||||
void mac_rrc_dl_f1ap_init(nr_mac_rrc_dl_if_t *mac_rrc)
|
||||
{
|
||||
mac_rrc->dl_rrc_message_transfer = dl_rrc_message_transfer_f1ap;
|
||||
}
|
||||
@@ -71,7 +71,7 @@ void rrc_coreset_config(NR_ControlResourceSet_t *coreset,
|
||||
coreset->pdcch_DMRS_ScramblingID = NULL;
|
||||
}
|
||||
|
||||
uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc) {
|
||||
uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc) {
|
||||
uint64_t bitmap=0;
|
||||
switch (scc->ssb_PositionsInBurst->present) {
|
||||
case 1 :
|
||||
@@ -138,7 +138,7 @@ void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_sl
|
||||
}
|
||||
}
|
||||
|
||||
void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||
int uid,
|
||||
int num_dl_antenna_ports,
|
||||
@@ -495,7 +495,7 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
|
||||
phy_Parameters->phy_ParametersFRX_Diff->pucch_F0_2WithoutFH = NULL;
|
||||
}
|
||||
|
||||
void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
|
||||
void nr_rrc_config_dl_tda(const NR_ServingCellConfigCommon_t *scc,
|
||||
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
|
||||
int curr_bwp) {
|
||||
|
||||
@@ -716,9 +716,9 @@ void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs) {
|
||||
ASN_SEQUENCE_ADD(&pucch_Config->spatialRelationInfoToAddModList->list,pucchspatial);
|
||||
}
|
||||
|
||||
void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig,
|
||||
NR_ServingCellConfigCommon_t *scc) {
|
||||
|
||||
static void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequestResourceConfig,
|
||||
const NR_ServingCellConfigCommon_t *scc)
|
||||
{
|
||||
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
|
||||
int sr_slot = 1; // in FDD SR in slot 1
|
||||
if(tdd)
|
||||
@@ -760,7 +760,7 @@ void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedulingRequ
|
||||
schedulingRequestResourceConfig->periodicityAndOffset->choice.sl640 = sr_slot;
|
||||
}
|
||||
|
||||
void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
|
||||
void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc,
|
||||
NR_PUCCH_Config_t *pucch_Config) {
|
||||
|
||||
// format with <=2 bits in pucch resource set 0
|
||||
@@ -784,7 +784,7 @@ void set_dl_mcs_table(int scs,
|
||||
NR_UE_NR_Capability_t *cap,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
|
||||
NR_ServingCellConfigCommon_t *scc) {
|
||||
const NR_ServingCellConfigCommon_t *scc) {
|
||||
|
||||
if (cap == NULL){
|
||||
bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL;
|
||||
|
||||
@@ -111,12 +111,12 @@ typedef struct physicalcellgroup_s{
|
||||
long RNTI_Value[MAX_NUM_CCs];
|
||||
}physicalcellgroup_t;
|
||||
|
||||
uint64_t get_ssb_bitmap(NR_ServingCellConfigCommon_t *scc);
|
||||
uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc);
|
||||
void rrc_coreset_config(NR_ControlResourceSet_t *coreset,
|
||||
int bwp_id,
|
||||
int curr_bwp,
|
||||
uint64_t ssb_bitmap);
|
||||
void nr_rrc_config_dl_tda(NR_ServingCellConfigCommon_t *scc,
|
||||
void nr_rrc_config_dl_tda(const NR_ServingCellConfigCommon_t *scc,
|
||||
NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
|
||||
int curr_bwp);
|
||||
void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay);
|
||||
@@ -124,9 +124,9 @@ void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp
|
||||
void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap);
|
||||
void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time);
|
||||
void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs);
|
||||
void scheduling_request_config(NR_ServingCellConfigCommon_t *scc,
|
||||
void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc,
|
||||
NR_PUCCH_Config_t *pucch_Config);
|
||||
void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
NR_CSI_MeasConfig_t *csi_MeasConfig,
|
||||
int uid,
|
||||
int num_dl_antenna_ports,
|
||||
@@ -142,7 +142,7 @@ void set_dl_mcs_table(int scs,
|
||||
NR_UE_NR_Capability_t *cap,
|
||||
NR_SpCellConfig_t *SpCellConfig,
|
||||
NR_BWP_DownlinkDedicated_t *bwp_Dedicated,
|
||||
NR_ServingCellConfigCommon_t *scc);
|
||||
const NR_ServingCellConfigCommon_t *scc);
|
||||
void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
int numerology,
|
||||
|
||||
@@ -36,12 +36,13 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "collection/tree.h"
|
||||
#include "collection/linear_alloc.h"
|
||||
#include "nr_rrc_types.h"
|
||||
|
||||
#include "common/ngran_types.h"
|
||||
#include "COMMON/platform_constants.h"
|
||||
#include "COMMON/platform_types.h"
|
||||
#include "RRC/LTE/rrc_defs.h"
|
||||
//#include "LAYER2/RLC/rlc.h"
|
||||
#include "mac_rrc_dl.h"
|
||||
|
||||
//#include "COMMON/mac_rrc_primitives.h"
|
||||
|
||||
@@ -79,17 +80,6 @@
|
||||
|
||||
#include "commonDef.h"
|
||||
|
||||
|
||||
/*I will change the name of the structure for compile purposes--> hope not to undo this process*/
|
||||
|
||||
typedef unsigned int uid_nr_t;
|
||||
#define NR_UID_LINEAR_ALLOCATOR_BITMAP_SIZE (((MAX_MOBILES_PER_GNB/8)/sizeof(unsigned int)) + 1)
|
||||
|
||||
typedef struct nr_uid_linear_allocator_s {
|
||||
unsigned int bitmap[NR_UID_LINEAR_ALLOCATOR_BITMAP_SIZE];
|
||||
} nr_uid_allocator_t;
|
||||
|
||||
|
||||
#define PROTOCOL_NR_RRC_CTXT_UE_FMT PROTOCOL_CTXT_FMT
|
||||
#define PROTOCOL_NR_RRC_CTXT_UE_ARGS(CTXT_Pp) PROTOCOL_NR_CTXT_ARGS(CTXT_Pp)
|
||||
|
||||
@@ -282,12 +272,11 @@ typedef struct pdu_session_param_s {
|
||||
|
||||
typedef struct gNB_RRC_UE_s {
|
||||
uint8_t primaryCC_id;
|
||||
LTE_SCellToAddMod_r10_t sCell_config[2];
|
||||
NR_SRB_ToAddModList_t *SRB_configList;
|
||||
NR_SRB_ToAddModList_t *SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
NR_SRB_ToAddModList_t *SRB_configList2[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
NR_DRB_ToAddModList_t *DRB_configList;
|
||||
NR_DRB_ToAddModList_t *DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
NR_DRB_ToReleaseList_t *DRB_Release_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
NR_DRB_ToAddModList_t *DRB_configList2[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
NR_DRB_ToReleaseList_t *DRB_Release_configList2[NR_RRC_TRANSACTION_IDENTIFIER_NUMBER];
|
||||
uint8_t DRB_active[8];
|
||||
|
||||
NR_SRB_INFO SI;
|
||||
@@ -295,7 +284,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb1;
|
||||
NR_SRB_INFO_TABLE_ENTRY Srb2;
|
||||
NR_MeasConfig_t *measConfig;
|
||||
HANDOVER_INFO *handover_info;
|
||||
NR_HANDOVER_INFO *handover_info;
|
||||
NR_MeasResults_t *measResults;
|
||||
|
||||
|
||||
@@ -352,7 +341,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
/* Number of e_rab to be modified in the list */
|
||||
uint8_t nb_of_modify_e_rabs;
|
||||
uint8_t nb_of_failed_e_rabs;
|
||||
e_rab_param_t modify_e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||
nr_e_rab_param_t modify_e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||
/* Total number of pdu session already setup in the list */
|
||||
uint8_t setup_pdu_sessions;
|
||||
/* Number of pdu session to be setup in the list */
|
||||
@@ -363,7 +352,7 @@ typedef struct gNB_RRC_UE_s {
|
||||
pdu_session_param_t modify_pdusession[NR_NB_RB_MAX];
|
||||
/* list of e_rab to be setup by RRC layers */
|
||||
/* list of pdu session to be setup by RRC layers */
|
||||
e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||
nr_e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB];
|
||||
pdu_session_param_t pduSession[NR_NB_RB_MAX];//[NGAP_MAX_PDU_SESSION];
|
||||
//release e_rabs
|
||||
uint8_t nb_release_of_e_rabs;
|
||||
@@ -410,8 +399,6 @@ typedef struct gNB_RRC_UE_s {
|
||||
|
||||
} gNB_RRC_UE_t;
|
||||
|
||||
typedef uid_t ue_uid_t;
|
||||
|
||||
typedef struct rrc_gNB_ue_context_s {
|
||||
/* Tree related data */
|
||||
RB_ENTRY(rrc_gNB_ue_context_s) entries;
|
||||
@@ -422,7 +409,7 @@ typedef struct rrc_gNB_ue_context_s {
|
||||
rnti_t ue_id_rnti;
|
||||
|
||||
// another key for protocol layers but should not be used as a key for RB tree
|
||||
ue_uid_t local_uid;
|
||||
uid_t local_uid;
|
||||
|
||||
/* UE id for initial connection to S1AP */
|
||||
struct gNB_RRC_UE_s ue_context;
|
||||
@@ -480,6 +467,11 @@ typedef struct {
|
||||
int do_drb_integrity;
|
||||
} nr_security_configuration_t;
|
||||
|
||||
typedef struct nr_mac_rrc_dl_if_s {
|
||||
/* TODO add other message types as necessary */
|
||||
dl_rrc_message_transfer_func_t dl_rrc_message_transfer;
|
||||
} nr_mac_rrc_dl_if_t;
|
||||
|
||||
//---NR---(completely change)---------------------
|
||||
typedef struct gNB_RRC_INST_s {
|
||||
|
||||
@@ -489,7 +481,7 @@ typedef struct gNB_RRC_INST_s {
|
||||
int module_id;
|
||||
eth_params_t eth_params_s;
|
||||
rrc_gNB_carrier_data_t carrier;
|
||||
nr_uid_allocator_t uid_allocator; // for rrc_ue_head
|
||||
uid_allocator_t uid_allocator;
|
||||
RB_HEAD(rrc_nr_ue_tree_s, rrc_gNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti
|
||||
int Nb_ue;
|
||||
hash_table_t *initial_id2_s1ap_ids; // key is content is rrc_ue_s1ap_ids_t
|
||||
@@ -529,6 +521,8 @@ typedef struct gNB_RRC_INST_s {
|
||||
|
||||
// security configuration (preferred algorithms)
|
||||
nr_security_configuration_t security;
|
||||
|
||||
nr_mac_rrc_dl_if_t mac_rrc;
|
||||
} gNB_RRC_INST;
|
||||
|
||||
#include "nr_rrc_proto.h" //should be put here otherwise compilation error
|
||||
|
||||
@@ -108,9 +108,9 @@ void
|
||||
rrc_gNB_generate_RRCSetup(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
OCTET_STRING_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
const int CC_id);
|
||||
const uint8_t *masterCellGroup,
|
||||
int masterCellGroup_len,
|
||||
NR_ServingCellConfigCommon_t *scc);
|
||||
|
||||
int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m);
|
||||
|
||||
@@ -174,17 +174,6 @@ int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP,
|
||||
const int dl_bwp_id,
|
||||
const int ul_bwp_id);
|
||||
|
||||
int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
|
||||
const int CC_id,
|
||||
const frame_t frameP,
|
||||
const sub_frame_t sub_frameP,
|
||||
const int UE_id,
|
||||
const rnti_t rntiP,
|
||||
const rb_id_t srb_idP,
|
||||
const uint8_t *sduP,
|
||||
const sdu_size_t sdu_lenP,
|
||||
const bool brOption);
|
||||
|
||||
int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
protocol_ctxt_t *const ctxt_pP,
|
||||
const int dl_bwp_id,
|
||||
@@ -193,8 +182,8 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
|
||||
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
const uint8_t *buffer,
|
||||
int buffer_length,
|
||||
OCTET_STRING_t *du_to_cu_rrc_container,
|
||||
const int CC_id);
|
||||
const uint8_t *du_to_cu_rrc_container,
|
||||
int du_to_cu_rrc_container_length);
|
||||
|
||||
void
|
||||
rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
||||
|
||||
+131
-383
@@ -196,6 +196,26 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
|
||||
}
|
||||
}
|
||||
|
||||
static void rrc_gNB_mac_rrc_init(gNB_RRC_INST *rrc)
|
||||
{
|
||||
switch (rrc->node_type) {
|
||||
case ngran_gNB_CU:
|
||||
mac_rrc_dl_f1ap_init(&rrc->mac_rrc);
|
||||
break;
|
||||
case ngran_gNB_DU:
|
||||
/* silently drop this, as we currently still need the RRC at the DU. As
|
||||
* soon as this is not the case anymore, we can add the AssertFatal() */
|
||||
//AssertFatal(1==0,"nothing to do for DU\n");
|
||||
break;
|
||||
case ngran_gNB:
|
||||
mac_rrc_dl_direct_init(&rrc->mac_rrc);
|
||||
break;
|
||||
default:
|
||||
AssertFatal(0 == 1, "Unknown node type %d\n", rrc->node_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigurationReq *configuration) {
|
||||
protocol_ctxt_t ctxt = { 0 };
|
||||
gNB_RRC_INST *rrc=RC.nrrrc[gnb_mod_idP];
|
||||
@@ -203,14 +223,14 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
|
||||
LOG_I(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_FMT" Init...\n",
|
||||
PROTOCOL_NR_RRC_CTXT_ARGS(&ctxt));
|
||||
|
||||
AssertFatal(rrc != NULL, "RC.nrrrc not initialized!");
|
||||
AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
|
||||
AssertFatal(configuration!=NULL,"configuration input is null\n");
|
||||
rrc->module_id = gnb_mod_idP;
|
||||
rrc->Nb_ue = 0;
|
||||
rrc->carrier.Srb0.Active = 0;
|
||||
nr_uid_linear_allocator_init(&rrc->uid_allocator);
|
||||
rrc_gNB_mac_rrc_init(rrc);
|
||||
uid_linear_allocator_init(&rrc->uid_allocator);
|
||||
RB_INIT(&rrc->rrc_ue_head);
|
||||
rrc->initial_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
rrc->s1ap_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL);
|
||||
@@ -319,119 +339,52 @@ void
|
||||
rrc_gNB_generate_RRCSetup(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
OCTET_STRING_t *masterCellGroup_from_DU,
|
||||
NR_ServingCellConfigCommon_t *scc,
|
||||
const int CC_id
|
||||
)
|
||||
const uint8_t *masterCellGroup,
|
||||
int masterCellGroup_len,
|
||||
NR_ServingCellConfigCommon_t *scc)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
LOG_D(NR_RRC, "rrc_gNB_generate_RRCSetup \n");
|
||||
MessageDef *message_p;
|
||||
LOG_I(NR_RRC, "rrc_gNB_generate_RRCSetup for RNTI %04x\n", ctxt_pP->rnti);
|
||||
|
||||
// T(T_GNB_RRC_SETUP,
|
||||
// T_INT(ctxt_pP->module_id),
|
||||
// T_INT(ctxt_pP->frame),
|
||||
// T_INT(ctxt_pP->subframe),
|
||||
// T_INT(ctxt_pP->rnti));
|
||||
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context;
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id];
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated = rrc->configuration.scd;
|
||||
int16_t ret = do_RRCSetup(ue_context_pP,
|
||||
(uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
|
||||
rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
|
||||
masterCellGroup_from_DU,
|
||||
scc,servingcellconfigdedicated,&rrc->configuration);
|
||||
|
||||
AssertFatal(ret>0,"Error generating RRCSetup for RRCSetupRequest\n");
|
||||
|
||||
ue_p->Srb0.Tx_buffer.payload_size = ret;
|
||||
const NR_ServingCellConfig_t *sccd = rrc->configuration.scd;
|
||||
ue_p->Srb0.Tx_buffer.payload_size = do_RRCSetup(ue_context_pP,
|
||||
(uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
|
||||
rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
|
||||
masterCellGroup,
|
||||
masterCellGroup_len,
|
||||
scc,
|
||||
sccd,
|
||||
&rrc->configuration);
|
||||
|
||||
LOG_DUMPMSG(NR_RRC, DEBUG_RRC,
|
||||
(char *)(ue_p->Srb0.Tx_buffer.Payload),
|
||||
ue_p->Srb0.Tx_buffer.payload_size,
|
||||
"[MSG] RRC Setup\n");
|
||||
|
||||
switch (rrc->node_type) {
|
||||
case ngran_gNB_CU:
|
||||
// create an ITTI message
|
||||
/* TODO: F1 IDs ar missing in RRC */
|
||||
nr_rrc_pdcp_config_asn1_req(ctxt_pP,
|
||||
ue_context_pP->ue_context.SRB_configList,
|
||||
NULL,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, F1AP_DL_RRC_MESSAGE);
|
||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container = (uint8_t *)ue_p->Srb0.Tx_buffer.Payload;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).rrc_container_length = ue_p->Srb0.Tx_buffer.payload_size;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_CU_ue_id = 0;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).gNB_DU_ue_id = 0;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).old_gNB_DU_ue_id = 0xFFFFFFFF; // unknown
|
||||
F1AP_DL_RRC_MESSAGE (message_p).rnti = ue_p->rnti;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).srb_id = CCCH;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).execute_duplication = 1;
|
||||
F1AP_DL_RRC_MESSAGE (message_p).RAT_frequency_priority_information.en_dc = 0;
|
||||
itti_send_msg_to_task (TASK_CU_F1, ctxt_pP->module_id, message_p);
|
||||
LOG_D(NR_RRC, "Send F1AP_DL_RRC_MESSAGE with ITTI\n");
|
||||
// activate release timer, if RRCSetupComplete not received after 100 frames, remove UE
|
||||
ue_context_pP->ue_context.ue_release_timer = 1;
|
||||
// remove UE after 10 frames after RRCConnectionRelease is triggered
|
||||
ue_context_pP->ue_context.ue_release_timer_thres = 1000;
|
||||
|
||||
break;
|
||||
/* TODO: this should go through the E1 interface */
|
||||
apply_pdcp_config(ue_context_pP,ctxt_pP);
|
||||
|
||||
case ngran_gNB_DU:
|
||||
// nothing to do for DU
|
||||
AssertFatal(1==0,"nothing to do for DU\n");
|
||||
break;
|
||||
|
||||
case ngran_gNB:
|
||||
{
|
||||
// rrc_mac_config_req_gNB
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
LOG_I(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCSetup (bytes %d)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM,
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
memcpy (message_buffer, (uint8_t*)ue_p->Srb0.Tx_buffer.Payload, ue_p->Srb0.Tx_buffer.payload_size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_CCCH_DATA_IND);
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
LOG_D(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" RRC_gNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_gNB\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
LOG_I(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCSetup (bytes %d)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
// activate release timer, if RRCSetupComplete not received after 100 frames, remove UE
|
||||
ue_context_pP->ue_context.ue_release_timer = 1;
|
||||
// remove UE after 10 frames after RRCConnectionRelease is triggered
|
||||
ue_context_pP->ue_context.ue_release_timer_thres = 1000;
|
||||
/* init timers */
|
||||
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
|
||||
|
||||
// configure MAC
|
||||
|
||||
apply_macrlc_config(rrc,ue_context_pP,ctxt_pP);
|
||||
|
||||
apply_pdcp_config(ue_context_pP,ctxt_pP);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_W(NR_RRC, "Unknown node type %d\n", rrc->node_type);
|
||||
break;
|
||||
}
|
||||
f1ap_dl_rrc_message_t dl_rrc = {
|
||||
.old_gNB_DU_ue_id = 0xFFFFFF,
|
||||
.rrc_container = (uint8_t *)ue_p->Srb0.Tx_buffer.Payload,
|
||||
.rrc_container_length = ue_p->Srb0.Tx_buffer.payload_size,
|
||||
.rnti = ue_p->rnti,
|
||||
.srb_id = CCCH
|
||||
};
|
||||
rrc->mac_rrc.dl_rrc_message_transfer(ctxt_pP->module_id, &dl_rrc);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -445,8 +398,8 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
|
||||
LOG_I(NR_RRC, "generate RRCSetup for RRCReestablishmentRequest \n");
|
||||
rrc_gNB_ue_context_t *ue_context_pP = NULL;
|
||||
gNB_RRC_INST *rrc_instance_p = RC.nrrrc[ctxt_pP->module_id];
|
||||
NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon;
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated = rrc_instance_p->configuration.scd;
|
||||
const NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon;
|
||||
const NR_ServingCellConfig_t *sccd = rrc_instance_p->configuration.scd;
|
||||
|
||||
ue_context_pP = rrc_gNB_get_next_free_ue_context(ctxt_pP, rrc_instance_p, 0);
|
||||
|
||||
@@ -455,7 +408,10 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
|
||||
(uint8_t *) ue_p->Srb0.Tx_buffer.Payload,
|
||||
rrc_gNB_get_next_transaction_identifier(ctxt_pP->module_id),
|
||||
NULL,
|
||||
scc,servingcellconfigdedicated,&rrc_instance_p->configuration);
|
||||
0,
|
||||
scc,
|
||||
sccd,
|
||||
&rrc_instance_p->configuration);
|
||||
|
||||
AssertFatal(ret>0,"Error generating RRCSetup for RRCReestablishmentRequest\n");
|
||||
|
||||
@@ -492,25 +448,12 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
|
||||
ue_context_pP->ue_context.ue_release_timer_thres = 1000;
|
||||
/* init timers */
|
||||
// ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM,
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
memcpy (message_buffer, (uint8_t*)ue_p->Srb0.Tx_buffer.Payload, ue_p->Srb0.Tx_buffer.payload_size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_CCCH_DATA_IND);
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
rrc_gNB_generate_RRCReject(
|
||||
const protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_ue_context_t *const ue_context_pP,
|
||||
const int CC_id
|
||||
)
|
||||
rrc_gNB_ue_context_t *const ue_context_pP)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
LOG_I(NR_RRC, "rrc_gNB_generate_RRCReject \n");
|
||||
@@ -552,16 +495,8 @@ rrc_gNB_generate_RRCReject(
|
||||
|
||||
case ngran_gNB:
|
||||
{
|
||||
#ifdef ITTI_SIM
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM,
|
||||
ue_p->Srb0.Tx_buffer.payload_size);
|
||||
memcpy (message_buffer, (uint8_t*)ue_p->Srb0.Tx_buffer.Payload, ue_p->Srb0.Tx_buffer.payload_size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_CCCH_DATA_IND);
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).size = ue_p->Srb0.Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#endif
|
||||
// NOTE: there was ITTI_SIM which has been removed. This case is maybe
|
||||
// not necessary anymore
|
||||
// rrc_mac_config_req_gNB
|
||||
}
|
||||
break;
|
||||
@@ -769,17 +704,6 @@ rrc_gNB_generate_defaultRRCReconfiguration(
|
||||
|
||||
case ngran_gNB:
|
||||
{
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
LOG_D(NR_RRC, "[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||
ctxt_pP->frame,
|
||||
ctxt_pP->module_id,
|
||||
@@ -796,7 +720,6 @@ rrc_gNB_generate_defaultRRCReconfiguration(
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
// rrc_pdcp_config_asn1_req
|
||||
#endif
|
||||
// rrc_rlc_config_asn1_req
|
||||
}
|
||||
break;
|
||||
@@ -1059,17 +982,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
||||
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
nr_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -1078,7 +990,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
|
||||
if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) {
|
||||
rrc_mac_config_req_gNB(rrc->module_id,
|
||||
@@ -1257,17 +1168,6 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
||||
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB_SIM, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
nr_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -1276,7 +1176,6 @@ rrc_gNB_modify_dedicatedRRCReconfiguration(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
|
||||
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||
uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
|
||||
@@ -1370,17 +1269,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
||||
LOG_D(NR_RRC,
|
||||
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
nr_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -1389,7 +1277,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration_release(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
|
||||
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||
uint32_t delay_ms = ue_context_pP->ue_context.masterCellGroup &&
|
||||
@@ -1447,7 +1334,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
|
||||
&kRRCint);
|
||||
/* Refresh SRBs/DRBs */
|
||||
|
||||
#ifndef ITTI_SIM
|
||||
LOG_D(NR_RRC,"Configuring PDCP DRBs/SRBs for UE %x\n",ue_context_pP->ue_context.rnti);
|
||||
|
||||
nr_rrc_pdcp_config_asn1_req(ctxt_pP,
|
||||
@@ -1473,7 +1359,6 @@ rrc_gNB_process_RRCReconfigurationComplete(
|
||||
NULL,
|
||||
get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set the SRB active in UE context */
|
||||
if (SRB_configList != NULL) {
|
||||
@@ -1635,18 +1520,6 @@ rrc_gNB_generate_RRCReestablishment(
|
||||
rnti);
|
||||
}
|
||||
#endif
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, ue_context->Srb0.Tx_buffer.payload_size);
|
||||
memcpy (message_buffer, (uint8_t *) ue_context->Srb0.Tx_buffer.Payload, ue_context->Srb0.Tx_buffer.payload_size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = ue_context->Srb0.Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1884,17 +1757,6 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
|
||||
LOG_D(NR_RRC,
|
||||
"[FRAME %05d][RRC_gNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n",
|
||||
ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_gNB_mui, ctxt_pP->module_id, DCCH);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
nr_rrc_data_req(
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -1903,7 +1765,6 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (NODE_IS_DU(RC.nrrrc[ctxt_pP->module_id]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||
@@ -1997,8 +1858,8 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP
|
||||
int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
const uint8_t *buffer,
|
||||
int buffer_length,
|
||||
OCTET_STRING_t *du_to_cu_rrc_container,
|
||||
const int CC_id)
|
||||
const uint8_t *du_to_cu_rrc_container,
|
||||
int du_to_cu_rrc_container_len)
|
||||
{
|
||||
module_id_t Idx;
|
||||
asn_dec_rval_t dec_rval;
|
||||
@@ -2008,22 +1869,16 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
NR_RRCSetupRequest_IEs_t *rrcSetupRequest = NULL;
|
||||
NR_RRCReestablishmentRequest_IEs_t rrcReestablishmentRequest;
|
||||
uint64_t random_value = 0;
|
||||
int i;
|
||||
|
||||
dec_rval = uper_decode( NULL,
|
||||
&asn_DEF_NR_UL_CCCH_Message,
|
||||
(void **)&ul_ccch_msg,
|
||||
(uint8_t *) buffer,
|
||||
100,
|
||||
0,
|
||||
0);
|
||||
LOG_I(NR_RRC, "Decoding CCCH: RNTI %04x, inst %ld, payload_size %d\n", ctxt_pP->rnti, ctxt_pP->instance, buffer_length);
|
||||
dec_rval = uper_decode(NULL, &asn_DEF_NR_UL_CCCH_Message, (void **) &ul_ccch_msg, buffer, buffer_length, 0, 0);
|
||||
|
||||
if (dec_rval.consumed == 0) {
|
||||
/* TODO */
|
||||
LOG_E(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" FATAL Error in receiving CCCH\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
return -1;
|
||||
}
|
||||
if (dec_rval.code != RC_OK || dec_rval.consumed == 0) {
|
||||
LOG_E(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" FATAL Error in receiving CCCH\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ul_ccch_msg->message.present == NR_UL_CCCH_MessageType_PR_c1) {
|
||||
switch (ul_ccch_msg->message.choice.c1->present) {
|
||||
@@ -2129,8 +1984,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" RRCSetupRequest without random UE identity or S-TMSI not supported, let's reject the UE\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
rrc_gNB_generate_RRCReject(ctxt_pP,
|
||||
rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti),
|
||||
CC_id);
|
||||
rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2139,8 +1993,8 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
rrc_gNB_generate_RRCSetup(ctxt_pP,
|
||||
rrc_gNB_get_ue_context(gnb_rrc_inst, ctxt_pP->rnti),
|
||||
du_to_cu_rrc_container,
|
||||
gnb_rrc_inst->carrier.servingcellconfigcommon,
|
||||
CC_id);
|
||||
du_to_cu_rrc_container_len,
|
||||
gnb_rrc_inst->carrier.servingcellconfigcommon);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2172,13 +2026,13 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
rrcReestablishmentRequest.ue_Identity.physCellId,
|
||||
RC.nrrrc[ctxt_pP->module_id]->carrier.physCellId);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, CC_id);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_D(NR_RRC, "physCellId is %ld\n", rrcReestablishmentRequest.ue_Identity.physCellId);
|
||||
|
||||
for (i = 0; i < rrcReestablishmentRequest.ue_Identity.shortMAC_I.size; i++) {
|
||||
for (int i = 0; i < rrcReestablishmentRequest.ue_Identity.shortMAC_I.size; i++) {
|
||||
LOG_D(NR_RRC, "rrcReestablishmentRequest.ue_Identity.shortMAC_I.buf[%d] = %x\n",
|
||||
i, rrcReestablishmentRequest.ue_Identity.shortMAC_I.buf[i]);
|
||||
}
|
||||
@@ -2189,7 +2043,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
LOG_E(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" NR_RRCReestablishmentRequest c_RNTI range error, fallback to RRC establishment\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, CC_id);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2201,7 +2055,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
LOG_E(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" NR_RRCReestablishmentRequest without UE context, fallback to RRC establishment\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, CC_id);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
|
||||
break;
|
||||
}
|
||||
#if(0)
|
||||
@@ -2212,14 +2066,14 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
LOG_E(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" NR_RRCReestablishmentRequest without UE_id(MAC) rnti %x, fallback to RRC establishment\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),c_rnti);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, CC_id);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
//previous rnti
|
||||
rnti_t previous_rnti = 0;
|
||||
|
||||
for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||
if (reestablish_rnti_map[i][1] == c_rnti) {
|
||||
previous_rnti = reestablish_rnti_map[i][0];
|
||||
break;
|
||||
@@ -2233,7 +2087,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
LOG_E(NR_RRC,
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" RRCReestablishmentRequest without UE_id(MAC) previous rnti %x, fallback to RRC establishment\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),previous_rnti);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, CC_id);
|
||||
rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(ctxt_pP, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2287,7 +2141,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
ue_context_p->ue_context.reestablishment_xid = -1;
|
||||
|
||||
// insert C-RNTI to map
|
||||
for (i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||
if (reestablish_rnti_map[i][0] == 0) {
|
||||
reestablish_rnti_map[i][0] = ctxt_pP->rnti;
|
||||
reestablish_rnti_map[i][1] = c_rnti;
|
||||
@@ -2303,7 +2157,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
rrcReestablishmentRequest.ue_Identity.physCellId,
|
||||
ue_context_p->ue_context.reestablishment_cause);
|
||||
|
||||
ue_context_p->ue_context.primaryCC_id = CC_id;
|
||||
ue_context_p->ue_context.primaryCC_id = 0;
|
||||
//LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH;
|
||||
Idx = DCCH;
|
||||
// SRB1
|
||||
@@ -2325,7 +2179,7 @@ int nr_rrc_gNB_decode_ccch(protocol_ctxt_t *const ctxt_pP,
|
||||
&DCCH_LCHAN_DESC,
|
||||
LCHAN_DESC_SIZE);
|
||||
|
||||
rrc_gNB_generate_RRCReestablishment(ctxt_pP, ue_context_p, CC_id);
|
||||
rrc_gNB_generate_RRCReestablishment(ctxt_pP, ue_context_p, 0);
|
||||
|
||||
LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT"CALLING RLC CONFIG SRB1 (rbid %d)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
@@ -3015,6 +2869,38 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
|
||||
}//for (int i=0;i<f1_setup_req->num_cells_available;i++)
|
||||
}
|
||||
|
||||
void rrc_gNB_process_initial_ul_rrc_message(const f1ap_initial_ul_rrc_message_t *ul_rrc)
|
||||
{
|
||||
// first get RRC instance (note, no the ITTI instance)
|
||||
module_id_t i = 0;
|
||||
for (i=0; i < RC.nb_nr_inst; i++) {
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[i];
|
||||
if (rrc->nr_cellid == ul_rrc->nr_cellid)
|
||||
break;
|
||||
}
|
||||
//AssertFatal(i != RC.nb_nr_inst, "Cell_id not found\n");
|
||||
// TODO REMOVE_DU_RRC in monolithic mode, the MAC does not have the
|
||||
// nr_cellid. Thus, the above check would fail. For the time being, just put
|
||||
// a warning, as we handle one DU only anyway
|
||||
if (i == RC.nb_nr_inst) {
|
||||
i = 0;
|
||||
LOG_W(RRC, "initial UL RRC message nr_cellid %ld does not match RRC's %ld\n", ul_rrc->nr_cellid, RC.nrrrc[0]->nr_cellid);
|
||||
}
|
||||
protocol_ctxt_t ctxt = { 0 };
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, i, GNB_FLAG_YES, ul_rrc->crnti, 0, 0);
|
||||
|
||||
nr_rrc_gNB_decode_ccch(&ctxt,
|
||||
ul_rrc->rrc_container,
|
||||
ul_rrc->rrc_container_length,
|
||||
ul_rrc->du2cu_rrc_container,
|
||||
ul_rrc->du2cu_rrc_container_length);
|
||||
|
||||
if (ul_rrc->rrc_container)
|
||||
free(ul_rrc->rrc_container);
|
||||
if (ul_rrc->du2cu_rrc_container)
|
||||
free(ul_rrc->du2cu_rrc_container);
|
||||
}
|
||||
|
||||
void rrc_gNB_process_release_request(const module_id_t gnb_mod_idP, x2ap_ENDC_sgnb_release_request_t *m)
|
||||
{
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[gnb_mod_idP];
|
||||
@@ -3041,67 +2927,7 @@ static int rrc_process_DU_DL(MessageDef *msg_p, const char *msg_name, instance_
|
||||
rrc_gNB_get_ue_context(rrc, ctxt.rnti);
|
||||
|
||||
if (req->srb_id == 0) {
|
||||
NR_DL_CCCH_Message_t *dl_ccch_msg=NULL;
|
||||
asn_dec_rval_t dec_rval;
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_DL_CCCH_Message,
|
||||
(void **)&dl_ccch_msg,
|
||||
req->buf->data,
|
||||
req->buf->size,0,0);
|
||||
AssertFatal(dec_rval.code == RC_OK, "could not decode F1AP message\n");
|
||||
|
||||
switch (dl_ccch_msg->message.choice.c1->present) {
|
||||
case NR_DL_CCCH_MessageType__c1_PR_NOTHING:
|
||||
LOG_I(F1AP,"Received PR_NOTHING on DL-CCCH-Message\n");
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcReject:
|
||||
LOG_I(F1AP,"Logical Channel DL-CCCH (SRB0), Received RRCReject\n");
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_rrcSetup: {
|
||||
LOG_I(F1AP, "Logical Channel DL-CCCH (SRB0), Received RRCSetup RNTI %x\n",
|
||||
req->rnti);
|
||||
// Get configuration
|
||||
NR_RRCSetup_t *rrcSetup = dl_ccch_msg->message.choice.c1->choice.rrcSetup;
|
||||
AssertFatal(rrcSetup!=NULL, "rrcSetup is null\n");
|
||||
NR_RRCSetup_IEs_t *rrcSetup_ies = rrcSetup->criticalExtensions.choice.rrcSetup;
|
||||
ue_context_p->ue_context.SRB_configList = rrcSetup_ies->radioBearerConfig.srb_ToAddModList;
|
||||
AssertFatal(rrcSetup_ies->masterCellGroup.buf!=NULL,"masterCellGroup is null\n");
|
||||
asn_dec_rval_t dec_rval;
|
||||
dec_rval = uper_decode(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig,
|
||||
(void **)&ue_context_p->ue_context.masterCellGroup,
|
||||
rrcSetup_ies->masterCellGroup.buf,
|
||||
rrcSetup_ies->masterCellGroup.size,0,0);
|
||||
AssertFatal(dec_rval.code == RC_OK, "could not decode masterCellGroup\n");
|
||||
apply_macrlc_config(rrc,ue_context_p,&ctxt);
|
||||
gNB_RRC_UE_t *ue_p = &ue_context_p->ue_context;
|
||||
AssertFatal(ue_p->Srb0.Active == 1,"SRB0 is not active\n");
|
||||
memcpy((void *)ue_p->Srb0.Tx_buffer.Payload,
|
||||
(void *)req->buf->data,
|
||||
req->buf->size); // ie->value.choice.RRCContainer.size
|
||||
ue_p->Srb0.Tx_buffer.payload_size = req->buf->size;
|
||||
break;
|
||||
} // case
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_spare2:
|
||||
LOG_I(F1AP,
|
||||
"Logical Channel DL-CCCH (SRB0), Received spare2\n");
|
||||
break;
|
||||
|
||||
case NR_DL_CCCH_MessageType__c1_PR_spare1:
|
||||
LOG_I(F1AP,
|
||||
"Logical Channel DL-CCCH (SRB0), Received spare1\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
AssertFatal(1==0,
|
||||
"Unknown message\n");
|
||||
break;
|
||||
}// switch case
|
||||
|
||||
return(0);
|
||||
AssertFatal(0 == 1, "should pass through dl_rrc_message()\n");
|
||||
} else if (req->srb_id == 1) {
|
||||
NR_DL_DCCH_Message_t *dl_dcch_msg=NULL;
|
||||
asn_dec_rval_t dec_rval;
|
||||
@@ -4095,73 +3921,31 @@ void *rrc_gnb_task(void *args_p) {
|
||||
nr_rrc_subframe_process(&RRC_SUBFRAME_PROCESS(msg_p).ctxt, RRC_SUBFRAME_PROCESS(msg_p).CC_id);
|
||||
break;
|
||||
|
||||
/* Messages from MAC */
|
||||
case NR_RRC_MAC_CCCH_DATA_IND:
|
||||
{
|
||||
instance_t i;
|
||||
for (i=0; i<RC.nb_nr_inst; i++) {
|
||||
// first get RRC instance (note, no the ITTI instance)
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[i];
|
||||
|
||||
if (rrc->nr_cellid == NR_RRC_MAC_CCCH_DATA_IND(msg_p).nr_cellid)
|
||||
break;
|
||||
}
|
||||
AssertFatal(i!=RC.nb_nr_inst, "Cell_id not found\n");
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
i,
|
||||
GNB_FLAG_YES,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).rnti,
|
||||
msg_p->ittiMsgHeader.lte_time.frame,
|
||||
msg_p->ittiMsgHeader.lte_time.slot);
|
||||
LOG_I(NR_RRC,"Decoding CCCH : ue %d, inst %ld, CC_id %d, ctxt %p, sib_info_p->Rx_buffer.payload_size %d\n",
|
||||
ctxt.rnti,
|
||||
i,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).CC_id,
|
||||
&ctxt,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size);
|
||||
|
||||
if (NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size >= CCCH_SDU_SIZE) {
|
||||
LOG_I(NR_RRC, "CCCH message has size %d > %d\n",
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size,CCCH_SDU_SIZE);
|
||||
break;
|
||||
}
|
||||
|
||||
nr_rrc_gNB_decode_ccch(&ctxt,
|
||||
(uint8_t *)NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).du_to_cu_rrc_container,
|
||||
NR_RRC_MAC_CCCH_DATA_IND(msg_p).CC_id);
|
||||
|
||||
if (NR_RRC_MAC_CCCH_DATA_IND(msg_p).du_to_cu_rrc_container) {
|
||||
free(NR_RRC_MAC_CCCH_DATA_IND(msg_p).du_to_cu_rrc_container->buf);
|
||||
free(NR_RRC_MAC_CCCH_DATA_IND(msg_p).du_to_cu_rrc_container);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F1AP_INITIAL_UL_RRC_MESSAGE:
|
||||
AssertFatal(NODE_IS_CU(RC.nrrrc[instance]->node_type) || NODE_IS_MONOLITHIC(RC.nrrrc[instance]->node_type),
|
||||
"should not receive F1AP_INITIAL_UL_RRC_MESSAGE, need call by CU!\n");
|
||||
rrc_gNB_process_initial_ul_rrc_message(&F1AP_INITIAL_UL_RRC_MESSAGE(msg_p));
|
||||
break;
|
||||
|
||||
/* Messages from PDCP */
|
||||
case NR_RRC_DCCH_DATA_IND:
|
||||
case F1AP_UL_RRC_MESSAGE:
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
instance,
|
||||
GNB_FLAG_YES,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).rnti,
|
||||
msg_p->ittiMsgHeader.lte_time.frame,
|
||||
msg_p->ittiMsgHeader.lte_time.slot);
|
||||
LOG_D(NR_RRC,"Decoding DCCH : ue %d, inst %ld, ctxt %p, size %d\n",
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rnti,
|
||||
0,
|
||||
0);
|
||||
LOG_D(NR_RRC,"Decoding DCCH %d: ue %04x, inst %ld, ctxt %p, size %d\n",
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
|
||||
ctxt.rnti,
|
||||
instance,
|
||||
&ctxt,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).sdu_size);
|
||||
LOG_D(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Received on DCCH %d %s\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt),
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
|
||||
msg_name_p);
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
|
||||
rrc_gNB_decode_dcch(&ctxt,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).dcch_index,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).sdu_p,
|
||||
NR_RRC_DCCH_DATA_IND(msg_p).sdu_size);
|
||||
result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), NR_RRC_DCCH_DATA_IND(msg_p).sdu_p);
|
||||
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).srb_id,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container,
|
||||
F1AP_UL_RRC_MESSAGE(msg_p).rrc_container_length);
|
||||
free(F1AP_UL_RRC_MESSAGE(msg_p).rrc_container);
|
||||
break;
|
||||
|
||||
case NGAP_DOWNLINK_NAS:
|
||||
@@ -4315,17 +4099,6 @@ rrc_gNB_generate_SecurityModeCommand(
|
||||
size,
|
||||
rrc_gNB_mui,
|
||||
DCCH);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM,size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
LOG_D(NR_RRC,"calling rrc_data_req :securityModeCommand\n");
|
||||
nr_rrc_data_req(ctxt_pP,
|
||||
DCCH,
|
||||
@@ -4334,7 +4107,6 @@ rrc_gNB_generate_SecurityModeCommand(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
break;
|
||||
|
||||
default :
|
||||
@@ -4387,17 +4159,6 @@ rrc_gNB_generate_UECapabilityEnquiry(
|
||||
size,
|
||||
rrc_gNB_mui,
|
||||
DCCH);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
nr_rrc_data_req(ctxt_pP,
|
||||
DCCH,
|
||||
rrc_gNB_mui++,
|
||||
@@ -4405,7 +4166,6 @@ rrc_gNB_generate_UECapabilityEnquiry(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
break;
|
||||
|
||||
default :
|
||||
@@ -4447,17 +4207,6 @@ rrc_gNB_generate_RRCRelease(
|
||||
rrc_gNB_mui,
|
||||
DCCH);
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
if (NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
|
||||
uint8_t *message_buffer = itti_malloc (TASK_RRC_GNB, TASK_CU_F1, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
@@ -4480,7 +4229,6 @@ rrc_gNB_generate_RRCRelease(
|
||||
rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_COMPLETE(ctxt_pP->instance, ue_context_pP->ue_context.gNB_ue_ngap_id);
|
||||
ue_context_pP->ue_context.ue_release_timer_rrc = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe)
|
||||
{
|
||||
|
||||
@@ -824,17 +824,6 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
|
||||
case ngran_gNB:
|
||||
{
|
||||
// rrc_mac_config_req_gNB
|
||||
#ifdef ITTI_SIM
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_GNB, TASK_RRC_UE_SIM, length);
|
||||
memcpy (message_buffer, buffer, length);
|
||||
MessageDef *message_p = itti_alloc_new_message (TASK_RRC_GNB, 0, GNB_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = length;
|
||||
itti_send_msg_to_task (TASK_RRC_UE_SIM, instance, message_p);
|
||||
LOG_I(NR_RRC, "Send DL NAS message \n");
|
||||
#else
|
||||
/* Transfer data to PDCP */
|
||||
nr_rrc_data_req (
|
||||
&ctxt,
|
||||
@@ -844,7 +833,6 @@ rrc_gNB_process_NGAP_DOWNLINK_NAS(
|
||||
length,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -37,61 +37,6 @@
|
||||
#include "rrc_gNB_UE_context.h"
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void nr_uid_linear_allocator_init(
|
||||
nr_uid_allocator_t *const uid_pP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
memset(uid_pP, 0, sizeof(nr_uid_allocator_t));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
uid_nr_t nr_uid_linear_allocator_new(gNB_RRC_INST *const rrc_instance_pP)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int bit_index = 1;
|
||||
uid_nr_t uid = 0;
|
||||
nr_uid_allocator_t *uia_p = &rrc_instance_pP->uid_allocator;
|
||||
|
||||
for (i=0; i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE; i++) {
|
||||
if (uia_p->bitmap[i] != UINT_MAX) {
|
||||
bit_index = 1;
|
||||
uid = 0;
|
||||
|
||||
while ((uia_p->bitmap[i] & bit_index) == bit_index) {
|
||||
bit_index = bit_index << 1;
|
||||
uid += 1;
|
||||
}
|
||||
|
||||
uia_p->bitmap[i] |= bit_index;
|
||||
return uid + (i*sizeof(unsigned int)*8);
|
||||
}
|
||||
}
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
void
|
||||
nr_uid_linear_allocator_free(
|
||||
gNB_RRC_INST *rrc_instance_pP,
|
||||
uid_nr_t uidP
|
||||
)
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
unsigned int i = uidP/sizeof(unsigned int)/8;
|
||||
unsigned int bit = uidP % (sizeof(unsigned int) * 8);
|
||||
unsigned int value = ~(0x00000001 << bit);
|
||||
|
||||
if (i < UID_LINEAR_ALLOCATOR_BITMAP_SIZE) {
|
||||
rrc_instance_pP->uid_allocator.bitmap[i] &= value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
int rrc_gNB_compare_ue_rnti_id(
|
||||
struct rrc_gNB_ue_context_s *c1_pP, struct rrc_gNB_ue_context_s *c2_pP)
|
||||
@@ -130,7 +75,7 @@ rrc_gNB_allocate_new_UE_context(
|
||||
}
|
||||
|
||||
memset(new_p, 0, sizeof(struct rrc_gNB_ue_context_s));
|
||||
new_p->local_uid = nr_uid_linear_allocator_new(rrc_instance_pP);
|
||||
new_p->local_uid = uid_linear_allocator_new(&rrc_instance_pP->uid_allocator);
|
||||
|
||||
for(int i = 0; i < NB_RB_MAX; i++) {
|
||||
new_p->ue_context.e_rab[i].xid = -1;
|
||||
@@ -177,12 +122,12 @@ void rrc_gNB_free_mem_UE_context(
|
||||
{
|
||||
|
||||
LOG_T(RRC,
|
||||
PROTOCOL_RRC_CTXT_UE_FMT" Clearing UE context 0x%p (free internal structs)\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" Clearing UE context 0x%p (free internal structs)\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP),
|
||||
ue_context_pP);
|
||||
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_LTE_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[0]);
|
||||
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_LTE_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[1]);
|
||||
//ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_LTE_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[0]);
|
||||
//ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_LTE_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[1]);
|
||||
|
||||
// empty the internal fields of the UE context here
|
||||
}
|
||||
@@ -195,25 +140,25 @@ void rrc_gNB_remove_ue_context(
|
||||
//------------------------------------------------------------------------------
|
||||
{
|
||||
if (rrc_instance_pP == NULL) {
|
||||
LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Bad RRC instance\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
LOG_E(RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Bad RRC instance\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
return;
|
||||
}
|
||||
|
||||
if (ue_context_pP == NULL) {
|
||||
LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Trying to free a NULL UE context\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
LOG_E(RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT" Trying to free a NULL UE context\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
return;
|
||||
}
|
||||
|
||||
RB_REMOVE(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_pP);
|
||||
rrc_gNB_free_mem_UE_context(ctxt_pP, ue_context_pP);
|
||||
nr_uid_linear_allocator_free(rrc_instance_pP, ue_context_pP->local_uid);
|
||||
uid_linear_allocator_free(&rrc_instance_pP->uid_allocator, ue_context_pP->local_uid);
|
||||
free(ue_context_pP);
|
||||
rrc_instance_pP->Nb_ue --;
|
||||
LOG_I(RRC,
|
||||
PROTOCOL_RRC_CTXT_UE_FMT" Removed UE context\n",
|
||||
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
PROTOCOL_NR_RRC_CTXT_UE_FMT" Removed UE context\n",
|
||||
PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -34,27 +34,6 @@
|
||||
#include "COMMON/platform_types.h"
|
||||
#include "nr_rrc_defs.h"
|
||||
|
||||
|
||||
void
|
||||
nr_uid_linear_allocator_init(
|
||||
nr_uid_allocator_t* const uid_pP
|
||||
);
|
||||
|
||||
uid_t
|
||||
nr_uid_linear_allocator_new(
|
||||
gNB_RRC_INST* rrc_instance_pP
|
||||
);
|
||||
|
||||
|
||||
void
|
||||
nr_uid_linear_allocator_free(
|
||||
gNB_RRC_INST* rrc_instance_pP,
|
||||
uid_t uidP
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
int rrc_gNB_compare_ue_rnti_id(
|
||||
struct rrc_gNB_ue_context_s* c1_pP,
|
||||
struct rrc_gNB_ue_context_s* c2_pP
|
||||
|
||||
@@ -82,9 +82,9 @@ void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) {
|
||||
|
||||
void fill_default_nsa_downlinkBWP(NR_BWP_Downlink_t *bwp,
|
||||
long bwp_loop,
|
||||
NR_CellGroupConfig_t *secondaryCellGroup,
|
||||
NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
const NR_CellGroupConfig_t *secondaryCellGroup,
|
||||
const NR_ServingCellConfig_t *servingcellconfigdedicated,
|
||||
const NR_ServingCellConfigCommon_t *servingcellconfigcommon,
|
||||
const gNB_RrcConfigurationReq *configuration,
|
||||
NR_UE_NR_Capability_t *uecap,
|
||||
int dl_antenna_ports,
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "rrc_proto.h"
|
||||
#include "assertions.h"
|
||||
#include "rrc_vars.h"
|
||||
#include "MAC/mac.h"
|
||||
|
||||
typedef uint32_t channel_t;
|
||||
|
||||
|
||||
@@ -1342,12 +1342,6 @@ static void rrc_ue_generate_RRCSetupComplete(
|
||||
int nas_msg_length;
|
||||
|
||||
if (AMF_MODE_ENABLED) {
|
||||
#if defined(ITTI_SIM)
|
||||
as_nas_info_t initialNasMsg;
|
||||
generateRegistrationRequest(&initialNasMsg, ctxt_pP->module_id);
|
||||
nas_msg = (char*)initialNasMsg.data;
|
||||
nas_msg_length = initialNasMsg.length;
|
||||
#else
|
||||
if (get_softmodem_params()->sa) {
|
||||
as_nas_info_t initialNasMsg;
|
||||
generateRegistrationRequest(&initialNasMsg, ctxt_pP->module_id);
|
||||
@@ -1357,7 +1351,6 @@ static void rrc_ue_generate_RRCSetupComplete(
|
||||
nas_msg = (char *) NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.data;
|
||||
nas_msg_length = NR_UE_rrc_inst[ctxt_pP->module_id].initialNasMsg.length;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
nas_msg = nr_nas_attach_req_imsi;
|
||||
nas_msg_length = sizeof(nr_nas_attach_req_imsi);
|
||||
@@ -1381,18 +1374,6 @@ static void rrc_ue_generate_RRCSetupComplete(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE, TASK_RRC_GNB_SIM, size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
UE_RRC_DCCH_DATA_IND (message_p).rbid = 1;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
#endif
|
||||
}
|
||||
|
||||
int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB_INFO *const Srb_info, const uint8_t gNB_index ){
|
||||
@@ -1711,19 +1692,6 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
|
||||
}
|
||||
|
||||
LOG_T(NR_RRC, "\n");
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,
|
||||
(enc_rval.encoded + 7) / 8);
|
||||
memcpy (message_buffer, buffer, (enc_rval.encoded + 7) / 8);
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = (enc_rval.encoded + 7) / 8;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
rrc_data_req_nr_ue (ctxt_pP,
|
||||
DCCH,
|
||||
nr_rrc_mui++,
|
||||
@@ -1731,7 +1699,6 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
} else
|
||||
LOG_W(NR_RRC,"securityModeCommand->criticalExtensions.present (%d) != NR_SecurityModeCommand__criticalExtensions_PR_securityModeCommand\n",
|
||||
securityModeCommand->criticalExtensions.present);
|
||||
@@ -1777,19 +1744,6 @@ int8_t nr_rrc_ue_decode_ccch( const protocol_ctxt_t *const ctxt_pP, const NR_SRB
|
||||
//printf("\n");
|
||||
/*UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.Payload[i] = taus()&0xff;
|
||||
UE_rrc_inst[ue_mod_idP].Srb0[Idx].Tx_buffer.payload_size =i; */
|
||||
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,
|
||||
NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size);
|
||||
memcpy (message_buffer, (uint8_t*)NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.Payload,
|
||||
NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size);
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_CCCH_DATA_IND);
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_CCCH_DATA_IND (message_p).size = NR_UE_rrc_inst[module_id].Srb0[gNB_index].Tx_buffer.payload_size;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, gNB_index, message_p);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2254,19 +2208,6 @@ nr_rrc_ue_establish_srb2(
|
||||
nr_rrc_mui,
|
||||
UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id),
|
||||
DCCH);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,size);
|
||||
memcpy (message_buffer, buffer, size);
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
UE_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).size = size;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
|
||||
#else
|
||||
rrc_data_req_nr_ue (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -2275,8 +2216,6 @@ nr_rrc_ue_establish_srb2(
|
||||
size,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// from NR SRB1
|
||||
@@ -2523,22 +2462,6 @@ nr_rrc_ue_establish_srb2(
|
||||
length = do_NR_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data);
|
||||
/* Transfer data to PDCP */
|
||||
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_UE_rrc_inst[ue_mod_id].Info[0].rnti, 0, 0,0);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,length);
|
||||
memcpy (message_buffer, buffer, length);
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
if(NR_UE_rrc_inst[ue_mod_id].SRB2_config[0] == NULL)
|
||||
UE_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
else
|
||||
UE_RRC_DCCH_DATA_IND (message_p).rbid = DCCH1;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).size = length;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt.instance, message_p);
|
||||
|
||||
#else
|
||||
// check if SRB2 is created, if yes request data_req on DCCH1 (SRB2)
|
||||
if(NR_UE_rrc_inst[ue_mod_id].SRB2_config[0] == NULL) {
|
||||
rrc_data_req_nr_ue (&ctxt,
|
||||
@@ -2555,7 +2478,6 @@ nr_rrc_ue_establish_srb2(
|
||||
length, buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2699,19 +2621,6 @@ nr_rrc_ue_process_ueCapabilityEnquiry(
|
||||
}
|
||||
|
||||
LOG_I(NR_RRC, "UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,
|
||||
(enc_rval.encoded + 7) / 8);
|
||||
memcpy (message_buffer, buffer, (enc_rval.encoded + 7) / 8);
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
GNB_RRC_DCCH_DATA_IND (message_p).size = (enc_rval.encoded + 7) / 8;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
#else
|
||||
rrc_data_req_nr_ue (
|
||||
ctxt_pP,
|
||||
DCCH,
|
||||
@@ -2720,7 +2629,6 @@ nr_rrc_ue_process_ueCapabilityEnquiry(
|
||||
(enc_rval.encoded + 7) / 8,
|
||||
buffer,
|
||||
PDCP_TRANSMISSION_MODE_CONTROL);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2739,19 +2647,6 @@ nr_rrc_ue_generate_rrcReestablishmentComplete(
|
||||
rrcReestablishment->rrc_TransactionIdentifier);
|
||||
LOG_I(NR_RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCReestablishmentComplete (bytes%d, gNB %d)\n",
|
||||
ctxt_pP->module_id,ctxt_pP->frame, length, gNB_index);
|
||||
#ifdef ITTI_SIM
|
||||
MessageDef *message_p;
|
||||
uint8_t *message_buffer;
|
||||
message_buffer = itti_malloc (TASK_RRC_NRUE,TASK_RRC_GNB_SIM,length);
|
||||
memcpy (message_buffer, buffer, length);
|
||||
|
||||
message_p = itti_alloc_new_message (TASK_RRC_NRUE, 0, UE_RRC_DCCH_DATA_IND);
|
||||
UE_RRC_DCCH_DATA_IND (message_p).rbid = DCCH;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).sdu = message_buffer;
|
||||
UE_RRC_DCCH_DATA_IND (message_p).size = length;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB_SIM, ctxt_pP->instance, message_p);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void *recv_msgs_from_lte_ue(void *args_p)
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
|
||||
#include "nr_sdap.h"
|
||||
|
||||
uint8_t nas_qfi;
|
||||
uint8_t nas_pduid;
|
||||
|
||||
bool sdap_data_req(protocol_ctxt_t *ctxt_p,
|
||||
const srb_flag_t srb_flag,
|
||||
const rb_id_t rb_id,
|
||||
@@ -84,3 +87,9 @@ void sdap_data_ind(rb_id_t pdcp_entity,
|
||||
buf,
|
||||
size);
|
||||
}
|
||||
|
||||
void set_qfi_pduid(uint8_t qfi, uint8_t pduid){
|
||||
nas_qfi = qfi;
|
||||
nas_pduid = pduid;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -62,4 +62,6 @@ void sdap_data_ind(rb_id_t pdcp_entity,
|
||||
int size
|
||||
);
|
||||
|
||||
void set_qfi_pduid(uint8_t qfi, uint8_t pduid);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,664 +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 itti_sim.c
|
||||
* \brief simulator for itti message from node to UE
|
||||
* \author Yoshio INOUE, Masayuki HARADA
|
||||
* \email yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
|
||||
* \date 2020
|
||||
* \version 0.1
|
||||
*/
|
||||
|
||||
|
||||
#include <sched.h>
|
||||
|
||||
|
||||
#include "T.h"
|
||||
|
||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
#include <common/utils/assertions.h>
|
||||
|
||||
#include "common/ran_context.h"
|
||||
|
||||
#include "common/config/config_userapi.h"
|
||||
#include "common/utils/load_module_shlib.h"
|
||||
#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
|
||||
|
||||
#include "PHY/phy_vars.h"
|
||||
#include "SCHED/sched_common_vars.h"
|
||||
#include "LAYER2/MAC/mac_vars.h"
|
||||
#include "RRC/LTE/rrc_vars.h"
|
||||
#include "gnb_config.h"
|
||||
#include "SIMULATION/TOOLS/sim.h"
|
||||
|
||||
#ifdef SMBV
|
||||
#include "PHY/TOOLS/smbv.h"
|
||||
unsigned short config_frames[4] = {2,9,11,13};
|
||||
#endif
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
#include "common/utils/LOG/vcd_signal_dumper.h"
|
||||
#include "UTIL/OPT/opt.h"
|
||||
|
||||
#include "intertask_interface.h"
|
||||
|
||||
|
||||
#include "system.h"
|
||||
#include <openair2/GNB_APP/gnb_app.h>
|
||||
#include "PHY/TOOLS/phy_scope_interface.h"
|
||||
#include "PHY/TOOLS/nr_phy_scope.h"
|
||||
#include "stats.h"
|
||||
#include "nr-softmodem.h"
|
||||
#include "executables/softmodem-common.h"
|
||||
#include "executables/thread-common.h"
|
||||
#include "NB_IoT_interface.h"
|
||||
#include "x2ap_eNB.h"
|
||||
#include "ngap_gNB.h"
|
||||
#include "RRC/NR_UE/rrc_proto.h"
|
||||
#include "RRC/NR_UE/rrc_vars.h"
|
||||
#include "openair3/NAS/UE/nas_ue_task.h"
|
||||
#include <executables/split_headers.h>
|
||||
#include <executables/nr-uesoftmodem.h>
|
||||
#if ITTI_SIM
|
||||
#include "nr_nas_msg_sim.h"
|
||||
#endif
|
||||
|
||||
pthread_cond_t nfapi_sync_cond;
|
||||
pthread_mutex_t nfapi_sync_mutex;
|
||||
int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
|
||||
|
||||
uint32_t timing_advance = 0;
|
||||
uint64_t num_missed_slots=0;
|
||||
|
||||
int split73=0;
|
||||
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask, uint16_t rnti, int32_t stat) {
|
||||
AssertFatal(false, "Must not be called in this context\n");
|
||||
}
|
||||
|
||||
nrUE_params_t nrUE_params;
|
||||
nrUE_params_t *get_nrUE_params(void) {
|
||||
return &nrUE_params;
|
||||
}
|
||||
|
||||
void processSlotTX(void *arg) {}
|
||||
|
||||
THREAD_STRUCT thread_struct;
|
||||
pthread_cond_t sync_cond;
|
||||
pthread_mutex_t sync_mutex;
|
||||
int sync_var=-1; //!< protected by mutex \ref sync_mutex.
|
||||
int config_sync_var=-1;
|
||||
|
||||
openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
|
||||
//volatile int start_gNB = 0;
|
||||
volatile int oai_exit = 0;
|
||||
|
||||
//static int wait_for_sync = 0;
|
||||
|
||||
unsigned int mmapped_dma=0;
|
||||
int single_thread_flag=1;
|
||||
|
||||
int8_t threequarter_fs=0;
|
||||
|
||||
uint64_t downlink_frequency[MAX_NUM_CCs][4];
|
||||
int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
|
||||
|
||||
//Temp fix for inexistent NR upper layer
|
||||
unsigned char NB_gNB_INST = 1;
|
||||
|
||||
|
||||
int UE_scan = 1;
|
||||
int UE_scan_carrier = 0;
|
||||
runmode_t mode = normal_txrx;
|
||||
static double snr_dB=20;
|
||||
|
||||
FILE *input_fd=NULL;
|
||||
|
||||
int chain_offset=0;
|
||||
|
||||
|
||||
uint8_t dci_Format = 0;
|
||||
uint8_t agregation_Level =0xFF;
|
||||
|
||||
uint8_t nb_antenna_tx = 1;
|
||||
uint8_t nb_antenna_rx = 1;
|
||||
|
||||
char ref[128] = "internal";
|
||||
char channels[128] = "0";
|
||||
|
||||
int otg_enabled;
|
||||
|
||||
extern void *udp_eNB_task(void *args_p);
|
||||
|
||||
int transmission_mode=1;
|
||||
int emulate_rf = 0;
|
||||
int numerology = 0;
|
||||
|
||||
|
||||
double cpuf;
|
||||
|
||||
extern char uecap_xer[1024];
|
||||
char uecap_xer_in=0;
|
||||
|
||||
/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
|
||||
* this is very hackish - find a proper solution
|
||||
*/
|
||||
uint8_t abstraction_flag=0;
|
||||
|
||||
/* forward declarations */
|
||||
void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs], NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]);
|
||||
|
||||
/*---------------------BMC: timespec helpers -----------------------------*/
|
||||
|
||||
struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
|
||||
struct timespec max_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
|
||||
|
||||
struct timespec clock_difftime(struct timespec start, struct timespec end) {
|
||||
struct timespec temp;
|
||||
|
||||
if ((end.tv_nsec-start.tv_nsec)<0) {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec-1;
|
||||
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
|
||||
} else {
|
||||
temp.tv_sec = end.tv_sec-start.tv_sec;
|
||||
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
|
||||
}
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define KNRM "\x1B[0m"
|
||||
#define KRED "\x1B[31m"
|
||||
#define KGRN "\x1B[32m"
|
||||
#define KBLU "\x1B[34m"
|
||||
#define RESET "\033[0m"
|
||||
|
||||
|
||||
void exit_function(const char *file, const char *function, const int line, const char *s) {
|
||||
int ru_id;
|
||||
|
||||
if (s != NULL) {
|
||||
printf("%s:%d %s() Exiting OAI softmodem: %s\n",file,line, function, s);
|
||||
}
|
||||
|
||||
oai_exit = 1;
|
||||
|
||||
if (RC.ru == NULL)
|
||||
exit(-1); // likely init not completed, prevent crash or hang, exit now...
|
||||
|
||||
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->rfdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice);
|
||||
RC.ru[ru_id]->rfdevice.trx_end_func = NULL;
|
||||
}
|
||||
|
||||
if (RC.ru[ru_id] && RC.ru[ru_id]->ifdevice.trx_end_func) {
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
|
||||
RC.ru[ru_id]->ifdevice.trx_end_func = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
sleep(1); //allow lte-softmodem threads to exit first
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void wait_gNBs(void) {
|
||||
int i;
|
||||
int waiting=1;
|
||||
|
||||
while (waiting==1) {
|
||||
printf("Waiting for gNB L1 instances to all get configured ... sleeping 50ms (nb_nr_sL1_inst %d)\n",RC.nb_nr_L1_inst);
|
||||
usleep(50*1000);
|
||||
waiting=0;
|
||||
|
||||
for (i=0; i<RC.nb_nr_L1_inst; i++) {
|
||||
|
||||
if (RC.gNB[i]->configured==0) {
|
||||
waiting=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("gNB L1 are configured\n");
|
||||
}
|
||||
|
||||
void wait_RUs(void) {
|
||||
LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask);
|
||||
// wait for all RUs to be configured over fronthaul
|
||||
pthread_mutex_lock(&RC.ru_mutex);
|
||||
|
||||
while (RC.ru_mask>0) {
|
||||
pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex);
|
||||
printf("RC.ru_mask:%02lx\n", RC.ru_mask);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&RC.ru_mutex);
|
||||
LOG_I(PHY,"RUs configured\n");
|
||||
}
|
||||
|
||||
|
||||
int stop_L1L2(module_id_t gnb_id) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int restart_L1L2(module_id_t gnb_id) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int create_gNB_tasks(uint32_t gnb_nb) {
|
||||
LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb);
|
||||
itti_wait_ready(1);
|
||||
|
||||
|
||||
if (gnb_nb > 0) {
|
||||
if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
|
||||
LOG_E(SCTP, "Create task for SCTP failed\n");
|
||||
return -1;
|
||||
}
|
||||
if (is_x2ap_enabled()) {
|
||||
if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
|
||||
LOG_E(X2AP, "Create task for X2AP failed\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOG_I(X2AP, "X2AP is disabled.\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (AMF_MODE_ENABLED && (get_softmodem_params()->phy_test==0 && get_softmodem_params()->do_ra==0 && get_softmodem_params()->sa==0)) {
|
||||
if (gnb_nb > 0) {
|
||||
if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
|
||||
LOG_E(S1AP, "Create task for NGAP failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if(!emulate_rf){
|
||||
if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) {
|
||||
LOG_E(UDP_, "Create task for UDP failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (itti_create_task (TASK_GTPV1_U, &nr_gtpv1u_gNB_task, NULL) < 0) {
|
||||
LOG_E(GTPU, "Create task for GTPV1U failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (gnb_nb > 0) {
|
||||
if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
|
||||
LOG_E(GNB_APP, "Create task for gNB APP failed\n");
|
||||
return -1;
|
||||
}
|
||||
LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
|
||||
|
||||
if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
|
||||
LOG_E(NR_RRC, "Create task for NR RRC gNB failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void get_options(void) {
|
||||
|
||||
|
||||
paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
|
||||
|
||||
CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
|
||||
get_common_options(SOFTMODEM_GNB_BIT );
|
||||
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
|
||||
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
|
||||
|
||||
|
||||
|
||||
|
||||
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
|
||||
memset((void *)&RC,0,sizeof(RC));
|
||||
/* Read RC configuration file */
|
||||
NRRCConfig();
|
||||
NB_gNB_INST = RC.nb_nr_inst;
|
||||
NB_RU = RC.nb_RU;
|
||||
printf("Configuration: nb_rrc_inst %d, nb_nr_L1_inst %d, nb_ru %hhu\n",NB_gNB_INST,RC.nb_nr_L1_inst,NB_RU);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
|
||||
NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs])
|
||||
{
|
||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
frame_parms[CC_id] = (NR_DL_FRAME_PARMS *) malloc(sizeof(NR_DL_FRAME_PARMS));
|
||||
config[CC_id] = (nfapi_nr_config_request_scf_t *) malloc(sizeof(nfapi_nr_config_request_scf_t));
|
||||
config[CC_id]->ssb_config.scs_common.value = 1;
|
||||
config[CC_id]->cell_config.frame_duplex_type.value = 1; //FDD
|
||||
config[CC_id]->carrier_config.dl_grid_size[1].value = 106;
|
||||
config[CC_id]->carrier_config.ul_grid_size[1].value = 106;
|
||||
config[CC_id]->cell_config.phy_cell_id.value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* helper function to terminate a certain ITTI task
|
||||
*/
|
||||
void terminate_task(task_id_t task_id, module_id_t mod_id) {
|
||||
LOG_I(GNB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id);
|
||||
MessageDef *msg;
|
||||
msg = itti_alloc_new_message (ENB_APP, 0, TERMINATE_MESSAGE);
|
||||
itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
|
||||
}
|
||||
|
||||
//extern void free_transport(PHY_VARS_gNB *);
|
||||
extern void nr_phy_free_RU(RU_t *);
|
||||
|
||||
statis void init_pdcp(void) {
|
||||
//if (!NODE_IS_DU(RC.rrc[0]->node_type)) {
|
||||
pdcp_layer_init();
|
||||
uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
|
||||
(PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
|
||||
|
||||
if (IS_SOFTMODEM_NOS1) {
|
||||
printf("IS_SOFTMODEM_NOS1 option enabled \n");
|
||||
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
|
||||
}
|
||||
|
||||
pdcp_module_init(pdcp_initmask, 0);
|
||||
|
||||
pdcp_set_rlc_data_req_func(rlc_data_req);
|
||||
pdcp_set_pdcp_data_ind_func(pdcp_data_ind);
|
||||
}
|
||||
|
||||
|
||||
int create_tasks_nrue(uint32_t ue_nb) {
|
||||
LOG_D(ENB_APP, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb);
|
||||
itti_wait_ready(1);
|
||||
|
||||
if (ue_nb > 0) {
|
||||
LOG_D(NR_RRC, "create TASK_RRC_NRUE\n");
|
||||
if (itti_create_task (TASK_RRC_NRUE, rrc_nrue_task, NULL) < 0) {
|
||||
LOG_E(NR_RRC, "Create task for RRC UE failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOG_D(NR_RRC,"create TASK_NAS_NRUE\n");
|
||||
if (itti_create_task (TASK_NAS_NRUE, nas_nrue_task, NULL) < 0) {
|
||||
LOG_E(NR_RRC, "Create task for NAS UE failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
itti_wait_ready(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void *itti_sim_ue_rrc_task( void *args_p) {
|
||||
MessageDef *msg_p, *message_p;
|
||||
instance_t instance;
|
||||
unsigned int ue_mod_id;
|
||||
int result;
|
||||
itti_mark_task_ready (TASK_RRC_UE_SIM);
|
||||
|
||||
while(1) {
|
||||
// Wait for a message
|
||||
itti_receive_msg (TASK_RRC_UE_SIM, &msg_p);
|
||||
instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p);
|
||||
ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance);
|
||||
|
||||
switch (ITTI_MSG_ID(msg_p)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
LOG_W(NR_RRC, " *** Exiting RRC thread\n");
|
||||
itti_exit_task ();
|
||||
break;
|
||||
|
||||
case MESSAGE_TEST:
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
case GNB_RRC_BCCH_DATA_IND:
|
||||
message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, 0, NR_RRC_MAC_BCCH_DATA_IND);
|
||||
memset (NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE);
|
||||
NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = GNB_RRC_BCCH_DATA_IND(msg_p).size;
|
||||
memcpy (NR_RRC_MAC_BCCH_DATA_IND (message_p).sdu, GNB_RRC_BCCH_DATA_IND(msg_p).sdu, GNB_RRC_BCCH_DATA_IND(msg_p).size);
|
||||
itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
|
||||
break;
|
||||
case GNB_RRC_CCCH_DATA_IND:
|
||||
message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
printf("receive GNB_RRC_CCCH_DATA_IND\n");
|
||||
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, GNB_RRC_CCCH_DATA_IND(msg_p).sdu, GNB_RRC_CCCH_DATA_IND(msg_p).size);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = GNB_RRC_CCCH_DATA_IND(msg_p).size;
|
||||
itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
|
||||
break;
|
||||
case GNB_RRC_DCCH_DATA_IND:
|
||||
printf("receive GNB_RRC_DCCH_DATA_IND\n");
|
||||
message_p = itti_alloc_new_message (TASK_RRC_UE_SIM, 0, NR_RRC_DCCH_DATA_IND);
|
||||
NR_RRC_DCCH_DATA_IND (message_p).dcch_index = GNB_RRC_DCCH_DATA_IND(msg_p).rbid;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_size = GNB_RRC_DCCH_DATA_IND(msg_p).size;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_p = GNB_RRC_DCCH_DATA_IND(msg_p).sdu;
|
||||
itti_send_msg_to_task (TASK_RRC_NRUE, instance, message_p);
|
||||
break;
|
||||
default:
|
||||
LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
}
|
||||
|
||||
result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
|
||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
msg_p = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *itti_sim_gnb_rrc_task( void *args_p) {
|
||||
MessageDef *msg_p, *message_p;
|
||||
instance_t instance;
|
||||
unsigned int ue_mod_id;
|
||||
int result;
|
||||
itti_mark_task_ready (TASK_RRC_GNB_SIM);
|
||||
|
||||
while(1) {
|
||||
// Wait for a message
|
||||
itti_receive_msg (TASK_RRC_GNB_SIM, &msg_p);
|
||||
instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p);
|
||||
ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance);
|
||||
|
||||
switch (ITTI_MSG_ID(msg_p)) {
|
||||
case TERMINATE_MESSAGE:
|
||||
LOG_W(NR_RRC, " *** Exiting RRC thread\n");
|
||||
itti_exit_task ();
|
||||
break;
|
||||
|
||||
case MESSAGE_TEST:
|
||||
LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
case UE_RRC_CCCH_DATA_IND:
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, 0, NR_RRC_MAC_CCCH_DATA_IND);
|
||||
NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = UE_RRC_CCCH_DATA_IND(msg_p).size;
|
||||
memset (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE);
|
||||
memcpy (NR_RRC_MAC_CCCH_DATA_IND (message_p).sdu, UE_RRC_CCCH_DATA_IND(msg_p).sdu, UE_RRC_CCCH_DATA_IND(msg_p).size);
|
||||
itti_send_msg_to_task (TASK_RRC_GNB, instance, message_p);
|
||||
break;
|
||||
case UE_RRC_DCCH_DATA_IND:
|
||||
message_p = itti_alloc_new_message (TASK_RRC_GNB_SIM, 0, NR_RRC_DCCH_DATA_IND);
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_size = UE_RRC_DCCH_DATA_IND(msg_p).size;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).dcch_index = UE_RRC_DCCH_DATA_IND(msg_p).rbid;
|
||||
NR_RRC_DCCH_DATA_IND (message_p).sdu_p = UE_RRC_DCCH_DATA_IND(msg_p).sdu;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB, instance, message_p);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p));
|
||||
break;
|
||||
}
|
||||
|
||||
result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
|
||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||
msg_p = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
start_background_system();
|
||||
|
||||
///static configuration for NR at the moment
|
||||
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) {
|
||||
exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
|
||||
}
|
||||
set_softmodem_sighandler();
|
||||
#ifdef DEBUG_CONSOLE
|
||||
setvbuf(stdout, NULL, _IONBF, 0);
|
||||
setvbuf(stderr, NULL, _IONBF, 0);
|
||||
#endif
|
||||
|
||||
logInit();
|
||||
//set_latency_target();
|
||||
printf("Reading in command-line options\n");
|
||||
get_options ();
|
||||
|
||||
if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) {
|
||||
fprintf(stderr,"Getting configuration failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
AMF_MODE_ENABLED = !IS_SOFTMODEM_NOS1;
|
||||
// AMF_MODE_ENABLED = 0;
|
||||
NGAP_CONF_MODE = !IS_SOFTMODEM_NOS1; //!get_softmodem_params()->phy_test;
|
||||
|
||||
#if T_TRACER
|
||||
T_Config_Init();
|
||||
#endif
|
||||
//randominit (0);
|
||||
set_taus_seed (0);
|
||||
printf("configuring for RAU/RRU\n");
|
||||
|
||||
if (opp_enabled ==1) {
|
||||
reset_opp_meas();
|
||||
}
|
||||
|
||||
cpuf=get_cpu_freq_GHz();
|
||||
itti_init(TASK_MAX, tasks_info);
|
||||
|
||||
init_opt();
|
||||
|
||||
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
|
||||
|
||||
if(IS_SOFTMODEM_NOS1)
|
||||
init_pdcp();
|
||||
|
||||
if (RC.nb_nr_inst > 0) {
|
||||
nr_read_config_and_init();
|
||||
// don't create if node doesn't connect to RRC/S1/GTP
|
||||
AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
|
||||
for (int gnb_id = 0; gnb_id < RC.nb_nr_inst; gnb_id++) {
|
||||
MessageDef *msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, NRRRC_CONFIGURATION_REQ);
|
||||
NRRRC_CONFIGURATION_REQ(msg_p) = RC.nrrrc[gnb_id]->configuration;
|
||||
itti_send_msg_to_task (TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(gnb_id), msg_p);
|
||||
}
|
||||
} else {
|
||||
printf("No ITTI, Initializing L1\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(itti_create_task (TASK_RRC_GNB_SIM, itti_sim_gnb_rrc_task, NULL) < 0){
|
||||
printf("cannot create ITTI tasks\n");
|
||||
exit(-1); // need a softer mode
|
||||
}
|
||||
|
||||
openair_rrc_top_init_ue_nr("./");
|
||||
|
||||
if (create_tasks_nrue(1) < 0) {
|
||||
printf("cannot create ITTI tasks\n");
|
||||
exit(-1); // need a softer mode
|
||||
}
|
||||
|
||||
if(itti_create_task (TASK_RRC_UE_SIM, itti_sim_ue_rrc_task, NULL) < 0){
|
||||
printf("cannot create ITTI tasks\n");
|
||||
exit(-1); // need a softer mode
|
||||
}
|
||||
|
||||
pthread_cond_init(&sync_cond,NULL);
|
||||
pthread_mutex_init(&sync_mutex, NULL);
|
||||
|
||||
printf("Sending sync to all threads\n");
|
||||
pthread_mutex_lock(&sync_mutex);
|
||||
sync_var=0;
|
||||
pthread_cond_broadcast(&sync_cond);
|
||||
pthread_mutex_unlock(&sync_mutex);
|
||||
// wait for end of program
|
||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||
|
||||
usleep(100000);
|
||||
protocol_ctxt_t ctxt;
|
||||
struct rrc_gNB_ue_context_s *ue_context_p = NULL;
|
||||
|
||||
|
||||
ue_context_p = rrc_gNB_allocate_new_UE_context(RC.nrrrc[0]);
|
||||
|
||||
if(ue_context_p == NULL){
|
||||
printf("ue_context_p == NULL");
|
||||
}
|
||||
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
|
||||
0,
|
||||
ENB_FLAG_YES,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
NR_UE_rrc_inst[ctxt.module_id].Info[0].State = RRC_SI_RECEIVED;
|
||||
|
||||
nr_rrc_ue_generate_RRCSetupRequest(ctxt.module_id, 0);
|
||||
|
||||
printf("Entering ITTI signals handler\n");
|
||||
itti_wait_tasks_end();
|
||||
printf("Returned from ITTI signal handler\n");
|
||||
oai_exit=1;
|
||||
printf("oai_exit=%d\n",oai_exit);
|
||||
|
||||
printf("stopping MODEM threads\n");
|
||||
|
||||
|
||||
/* release memory used by the RU/gNB threads (incomplete), after all
|
||||
* threads have been stopped (they partially use the same memory) */
|
||||
|
||||
pthread_cond_destroy(&sync_cond);
|
||||
pthread_mutex_destroy(&sync_mutex);
|
||||
|
||||
logClean();
|
||||
printf("Bye.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -31,27 +31,6 @@
|
||||
#include "x2ap_common.h"
|
||||
#include "X2AP_X2AP-PDU.h"
|
||||
|
||||
int asn_debug = 0;
|
||||
int asn1_xer_print = 0;
|
||||
|
||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||
inline void ASN_DEBUG(const char *fmt, ...)
|
||||
{
|
||||
if (asn_debug) {
|
||||
int adi = asn_debug_indent;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "[ASN1]");
|
||||
|
||||
while(adi--) fprintf(stderr, " ");
|
||||
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ssize_t x2ap_generate_initiating_message(
|
||||
uint8_t **buffer,
|
||||
uint32_t *length,
|
||||
|
||||
@@ -18,10 +18,8 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifndef X2AP_COMMON_H_
|
||||
#define X2AP_COMMON_H_
|
||||
|
||||
#include "X2AP_ProtocolIE-Field.h"
|
||||
#include "X2AP_X2AP-PDU.h"
|
||||
@@ -35,9 +33,6 @@
|
||||
#include "X2AP_asn_constant.h"
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#ifndef X2AP_COMMON_H_
|
||||
#define X2AP_COMMON_H_
|
||||
|
||||
/** @defgroup _x2ap_impl_ X2AP Layer Reference Implementation
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
|
||||
@@ -18,10 +18,8 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifndef SECURITY_TYPES_H_
|
||||
#define SECURITY_TYPES_H_
|
||||
|
||||
#if !defined(HAVE_UINT128_T)
|
||||
# include <gmp.h>
|
||||
@@ -31,8 +29,6 @@
|
||||
#include <stdint.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifndef SECURITY_TYPES_H_
|
||||
#define SECURITY_TYPES_H_
|
||||
|
||||
#define RAND_LENGTH_BITS (128)
|
||||
#define RAND_LENGTH_OCTETS (RAND_LENGTH_BITS/8)
|
||||
|
||||
@@ -31,27 +31,6 @@
|
||||
#include "m3ap_common.h"
|
||||
#include "M3AP_M3AP-PDU.h"
|
||||
|
||||
int asn_debug = 0;
|
||||
int asn1_xer_print = 0;
|
||||
|
||||
#if defined(EMIT_ASN_DEBUG_EXTERN)
|
||||
inline void ASN_DEBUG(const char *fmt, ...)
|
||||
{
|
||||
if (asn_debug) {
|
||||
int adi = asn_debug_indent;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
fprintf(stderr, "[ASN1]");
|
||||
|
||||
while(adi--) fprintf(stderr, " ");
|
||||
|
||||
vfprintf(stderr, fmt, ap);
|
||||
fprintf(stderr, "\n");
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
ssize_t m3ap_generate_initiating_message(
|
||||
uint8_t **buffer,
|
||||
uint32_t *length,
|
||||
|
||||
@@ -18,10 +18,8 @@
|
||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
||||
* contact@openairinterface.org
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
# include "config.h"
|
||||
#endif
|
||||
#ifndef M3AP_COMMON_H_
|
||||
#define M3AP_COMMON_H_
|
||||
|
||||
#include "M3AP_ProtocolIE-Field.h"
|
||||
#include "M3AP_M3AP-PDU.h"
|
||||
@@ -35,8 +33,6 @@
|
||||
#include "M3AP_asn_constant.h"
|
||||
#include "intertask_interface.h"
|
||||
|
||||
#ifndef M3AP_COMMON_H_
|
||||
#define M3AP_COMMON_H_
|
||||
|
||||
/** @defgroup _m3ap_impl_ M3AP Layer Reference Implementation
|
||||
* @ingroup _ref_implementation_
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <openair3/NAS/COMMON/NR_NAS_defs.h>
|
||||
#include <openair1/PHY/phy_extern_nr_ue.h>
|
||||
#include <openair1/SIMULATION/ETH_TRANSPORT/proto.h>
|
||||
#include "openair2/SDAP/nr_sdap/nr_sdap.h"
|
||||
|
||||
uint8_t *registration_request_buf;
|
||||
uint32_t registration_request_len;
|
||||
@@ -915,7 +916,7 @@ void *nas_nrue_task(void *args_p)
|
||||
payload_container = pdu_buffer + offset;
|
||||
}
|
||||
offset = 0;
|
||||
|
||||
uint8_t pdu_id = *(pdu_buffer+14);
|
||||
while(offset < payload_container_length) {
|
||||
// Fixme: this is not good 'type' 0x29 searching in TLV like structure
|
||||
// AND fix dirsty code copy hereafter of the same!!!
|
||||
@@ -929,9 +930,13 @@ void *nas_nrue_task(void *args_p)
|
||||
*(payload_container+offset+3), *(payload_container+offset+4),
|
||||
*(payload_container+offset+5), *(payload_container+offset+6));
|
||||
nas_config(1,third_octet,fourth_octet,"oaitun_ue");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (*(payload_container + offset) == 0x79) {
|
||||
uint8_t qfi = *(payload_container+offset+3);
|
||||
set_qfi_pduid(qfi, pdu_id);
|
||||
break;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,23 +33,11 @@
|
||||
*/
|
||||
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#ifndef NGAP_COMMON_H_
|
||||
#define NGAP_COMMON_H_
|
||||
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
/* replace ASN_DEBUG defined in asn_internal.h by oai tracing system
|
||||
Would be cleaner to modify asn_internal.h but it seems to come
|
||||
from non oai source, with BSD license, so prefer to do that here..
|
||||
*/
|
||||
#ifdef ASN_DEBUG
|
||||
# undef ASN_DEBUG
|
||||
#endif
|
||||
#define ASN_DEBUG( x... ) LOG_I(ASN, x)
|
||||
|
||||
#include "NGAP_ProtocolIE-Field.h"
|
||||
#include "NGAP_NGAP-PDU.h"
|
||||
|
||||
@@ -494,7 +494,7 @@ static int ngap_gNB_generate_ng_setup_request(
|
||||
ssi = (NGAP_SliceSupportItem_t *)calloc(1, sizeof(NGAP_SliceSupportItem_t));
|
||||
INT8_TO_OCTET_STRING(instance_p->s_nssai[i][si].sST, &ssi->s_NSSAI.sST);
|
||||
|
||||
if(instance_p->s_nssai[i]->sD_flag) {
|
||||
if (instance_p->s_nssai[i][si].sD_flag) {
|
||||
ssi->s_NSSAI.sD = calloc(1, sizeof(NGAP_SD_t));
|
||||
ssi->s_NSSAI.sD->buf = calloc(3, sizeof(uint8_t));
|
||||
ssi->s_NSSAI.sD->size = 3;
|
||||
|
||||
@@ -1369,15 +1369,6 @@ int ngap_gNB_pdusession_release_resp(instance_t instance,
|
||||
item->pDUSessionResourceReleaseResponseTransfer.size = 0;
|
||||
item->pDUSessionResourceReleaseResponseTransfer.buf = NULL;
|
||||
NGAP_DEBUG("pdusession_release_resp: transfer_buffer is NULL!\n");
|
||||
#ifdef ITTI_SIM
|
||||
//For testing only
|
||||
item->pDUSessionResourceReleaseResponseTransfer.buf = malloc(sizeof(uint8_t) * 1);
|
||||
item->pDUSessionResourceReleaseResponseTransfer.size = 1;
|
||||
uint8_t temp = 0;
|
||||
memcpy(item->pDUSessionResourceReleaseResponseTransfer.buf,
|
||||
&temp,
|
||||
item->pDUSessionResourceReleaseResponseTransfer.size);
|
||||
#endif
|
||||
}
|
||||
NGAP_DEBUG("pdusession_release_resp: pdusession ID %ld\n", item->pDUSessionID);
|
||||
ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceReleasedListRelRes.list, item);
|
||||
|
||||
@@ -23,24 +23,10 @@
|
||||
* @ingroup _ref_implementation_
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H_
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#ifndef S1AP_COMMON_H_
|
||||
#define S1AP_COMMON_H_
|
||||
|
||||
|
||||
#include "common/utils/LOG/log.h"
|
||||
/* replace ASN_DEBUG defined in asn_internal.h by oai tracing system
|
||||
Would be cleaner to modify asn_internal.h but it seems to come
|
||||
from non oai source, with BSD license, so prefer to do that here..
|
||||
*/
|
||||
#ifdef ASN_DEBUG
|
||||
# undef ASN_DEBUG
|
||||
#endif
|
||||
#define ASN_DEBUG( x... ) LOG_I(ASN, x)
|
||||
|
||||
#include "S1AP_ProtocolIE-Field.h"
|
||||
#include "S1AP_S1AP-PDU.h"
|
||||
@@ -63,7 +49,6 @@
|
||||
|
||||
#define S1AP_UE_ID_FMT "0x%06"PRIX32
|
||||
|
||||
extern int asn_debug;
|
||||
extern int asn1_xer_print;
|
||||
|
||||
#if defined(ENB_MODE)
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include "test_util.h"
|
||||
#include "secu_defs.h"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user