Merge with branch NR_F1C_F1U_extensions
This commit is contained in:
@@ -503,6 +503,29 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage ("Test F1 - FDD - Band 7 - B210") {
|
||||||
|
when {
|
||||||
|
expression {doFullTestsuite}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
sh "sleep 60"
|
||||||
|
triggerSlaveJob ('eNB-CI-F1-FDD-Band7-B210', 'Test-F1-FDD-Band7')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
script {
|
||||||
|
finalizeSlaveJob('eNB-CI-F1-FDD-Band7-B210')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
script {
|
||||||
|
currentBuild.result = 'FAILURE'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage ("Test IF4p5 - TDD - Band 40 - B210") {
|
stage ("Test IF4p5 - TDD - Band 40 - B210") {
|
||||||
when {
|
when {
|
||||||
expression {doFullTestsuite}
|
expression {doFullTestsuite}
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ class Containerize():
|
|||||||
self.allImagesSize = {}
|
self.allImagesSize = {}
|
||||||
self.collectInfo = {}
|
self.collectInfo = {}
|
||||||
|
|
||||||
|
self.tsharkStarted = False
|
||||||
self.pingContName = ''
|
self.pingContName = ''
|
||||||
self.pingOptions = ''
|
self.pingOptions = ''
|
||||||
self.pingLossThreshold = ''
|
self.pingLossThreshold = ''
|
||||||
@@ -597,6 +598,10 @@ class Containerize():
|
|||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
if count == 100 and healthy == self.nb_healthy[0]:
|
if count == 100 and healthy == self.nb_healthy[0]:
|
||||||
|
if self.tsharkStarted == False:
|
||||||
|
logging.debug('Starting tshark on public network')
|
||||||
|
self.CaptureOnDockerNetworks()
|
||||||
|
self.tsharkStarted = True
|
||||||
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
|
||||||
logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
|
logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
|
||||||
else:
|
else:
|
||||||
@@ -604,6 +609,20 @@ class Containerize():
|
|||||||
HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK)
|
HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK)
|
||||||
logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
|
logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
|
||||||
|
|
||||||
|
def CaptureOnDockerNetworks(self):
|
||||||
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
|
||||||
|
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
cmd = 'sudo nohup tshark -f "not tcp and not arp and not port 53 and not host archive.ubuntu.com and not host security.ubuntu.com"'
|
||||||
|
for name in networkNames.split('\n'):
|
||||||
|
res = re.search('rfsim', name)
|
||||||
|
if res is not None:
|
||||||
|
cmd += ' -i ' + name
|
||||||
|
cmd += ' -w /tmp/capture_'
|
||||||
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
|
cmd += ymlPath[1] + '.pcap > /tmp/tshark.log 2>&1 &'
|
||||||
|
logging.debug(cmd)
|
||||||
|
networkNames = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
def UndeployGenObject(self, HTML):
|
def UndeployGenObject(self, HTML):
|
||||||
self.exitStatus = 0
|
self.exitStatus = 0
|
||||||
ymlPath = self.yamlPath[0].split('/')
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
@@ -638,6 +657,18 @@ class Containerize():
|
|||||||
cmd = 'mkdir -p '+ logPath + ' && mv ' + self.yamlPath[0] + '/*.log ' + logPath
|
cmd = 'mkdir -p '+ logPath + ' && mv ' + self.yamlPath[0] + '/*.log ' + logPath
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
if self.tsharkStarted:
|
||||||
|
self.tsharkStarted = True
|
||||||
|
ymlPath = self.yamlPath[0].split('/')
|
||||||
|
cmd = 'sudo chmod 666 /tmp/capture_' + ymlPath[1] + '.pcap'
|
||||||
|
logging.debug(cmd)
|
||||||
|
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
cmd = 'cp /tmp/capture_' + ymlPath[1] + '.pcap ' + logPath
|
||||||
|
logging.debug(cmd)
|
||||||
|
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
cmd = 'sudo rm /tmp/capture_' + ymlPath[1] + '.pcap'
|
||||||
|
logging.debug(cmd)
|
||||||
|
copyStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
|
||||||
|
|
||||||
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
|
cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
|
||||||
logging.debug(cmd)
|
logging.debug(cmd)
|
||||||
@@ -715,9 +746,16 @@ class Containerize():
|
|||||||
if status:
|
if status:
|
||||||
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue)
|
||||||
else:
|
else:
|
||||||
self.exitStatus = 1
|
logging.error('\u001B[1;37;41m ping test FAIL -- ' + message + ' \u001B[0m')
|
||||||
logging.error('\u001B[1;37;41m ' + message + ' \u001B[0m')
|
|
||||||
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'KO', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.pingOptions, 'KO', 1, html_queue)
|
||||||
|
# Automatic undeployment
|
||||||
|
logging.debug('----------------------------------------')
|
||||||
|
logging.debug('\u001B[1m Starting Automatic undeployment \u001B[0m')
|
||||||
|
logging.debug('----------------------------------------')
|
||||||
|
HTML.testCase_id = 'AUTO-UNDEPLOY'
|
||||||
|
HTML.desc = 'Automatic Un-Deployment'
|
||||||
|
self.UndeployGenObject(HTML)
|
||||||
|
self.exitStatus = 1
|
||||||
|
|
||||||
def IperfFromContainer(self, HTML):
|
def IperfFromContainer(self, HTML):
|
||||||
self.exitStatus = 0
|
self.exitStatus = 0
|
||||||
@@ -836,5 +874,13 @@ class Containerize():
|
|||||||
if status:
|
if status:
|
||||||
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'OK', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'OK', 1, html_queue)
|
||||||
else:
|
else:
|
||||||
self.exitStatus = 1
|
logging.error('\u001B[1m Iperf Test FAIL -- ' + message + ' \u001B[0m')
|
||||||
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', 1, html_queue)
|
HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', 1, html_queue)
|
||||||
|
# Automatic undeployment
|
||||||
|
logging.debug('----------------------------------------')
|
||||||
|
logging.debug('\u001B[1m Starting Automatic undeployment \u001B[0m')
|
||||||
|
logging.debug('----------------------------------------')
|
||||||
|
HTML.testCase_id = 'AUTO-UNDEPLOY'
|
||||||
|
HTML.desc = 'Automatic Un-Deployment'
|
||||||
|
self.UndeployGenObject(HTML)
|
||||||
|
self.exitStatus = 1
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ eNBs = (
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ( { mcc = 450; mnc = 05; mnc_length = 2; } )
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
@@ -179,7 +179,7 @@ eNBs = (
|
|||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = (
|
mme_ip_address = (
|
||||||
{
|
{
|
||||||
ipv4 = "192.168.5.233";
|
ipv4 = "CI_MME_IP_ADDR";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
port = 36412 ;
|
port = 36412 ;
|
||||||
active = "yes";
|
active = "yes";
|
||||||
@@ -189,11 +189,11 @@ eNBs = (
|
|||||||
|
|
||||||
NETWORK_INTERFACES : {
|
NETWORK_INTERFACES : {
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.5.244";
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "CI_ENB_IP_ADDR";
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.5.244";
|
ENB_IPV4_ADDRESS_FOR_S1U = "CI_ENB_IP_ADDR";
|
||||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
ENB_IPV4_ADDRESS_FOR_X2C = "192.168.5.244";
|
ENB_IPV4_ADDRESS_FOR_X2C = "CI_ENB_IP_ADDR";
|
||||||
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
ENB_PORT_FOR_X2C = 36422; # Spec 36422
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ eNBs =
|
|||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ( { mcc = 450; mnc = 05; mnc_length = 2; } )
|
plmn_list = ( { mcc = 208; mnc = 92; mnc_length = 2; } )
|
||||||
|
|
||||||
nr_cellid = 12345678L
|
nr_cellid = 12345678L
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,11 @@ gNBs =
|
|||||||
|
|
||||||
gNB_name = "gNB-Eurecom-CU";
|
gNB_name = "gNB-Eurecom-CU";
|
||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({
|
||||||
mcc = 450;
|
mcc = 208;
|
||||||
mnc = 05;
|
mnc = 99;
|
||||||
mnc_length = 2;
|
mnc_length = 2;
|
||||||
snssaiList = (
|
snssaiList = (
|
||||||
{
|
{
|
||||||
@@ -66,10 +65,10 @@ gNBs =
|
|||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
|
|
||||||
GNB_INTERFACE_NAME_FOR_NG_AMF = "enp0s31f6:";
|
GNB_INTERFACE_NAME_FOR_NG_AMF = "eth0";
|
||||||
GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.5.244/24";
|
GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR";
|
||||||
GNB_INTERFACE_NAME_FOR_NGU = "bond0";
|
GNB_INTERFACE_NAME_FOR_NGU = "eth0";
|
||||||
GNB_IPV4_ADDRESS_FOR_NGU = "192.168.5.244/24";
|
GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR";
|
||||||
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
GNB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,11 @@ gNBs =
|
|||||||
|
|
||||||
gNB_name = "gNB-Eurecom-DU";
|
gNB_name = "gNB-Eurecom-DU";
|
||||||
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
|
||||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||||
tracking_area_code = 1;
|
tracking_area_code = 1;
|
||||||
plmn_list = ({
|
plmn_list = ({
|
||||||
mcc = 450;
|
mcc = 208;
|
||||||
mnc = 05;
|
mnc = 99;
|
||||||
mnc_length = 2;
|
mnc_length = 2;
|
||||||
snssaiList = (
|
snssaiList = (
|
||||||
{
|
{
|
||||||
@@ -236,9 +235,9 @@ MACRLCs = (
|
|||||||
local_n_if_name = "lo";
|
local_n_if_name = "lo";
|
||||||
local_n_address = "127.0.0.3";
|
local_n_address = "127.0.0.3";
|
||||||
remote_n_address = "127.0.0.4";
|
remote_n_address = "127.0.0.4";
|
||||||
local_n_portc = 601;
|
local_n_portc = 500;
|
||||||
local_n_portd = 2152;
|
local_n_portd = 2152;
|
||||||
remote_n_portc = 600;
|
remote_n_portc = 501;
|
||||||
remote_n_portd = 2152;
|
remote_n_portd = 2152;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100021
|
100021
|
||||||
|
000020
|
||||||
000021
|
000021
|
||||||
000022
|
000022
|
||||||
000023
|
000023
|
||||||
@@ -33,16 +34,23 @@
|
|||||||
020021
|
020021
|
||||||
020022
|
020022
|
||||||
030021
|
030021
|
||||||
030022
|
|
||||||
100021
|
100021
|
||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000020">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy MySql Database</desc>
|
||||||
|
<yaml_path>yaml_files/5g_f1_rfsimulator</yaml_path>
|
||||||
|
<services>mysql</services>
|
||||||
|
<nb_healthy>1</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000021">
|
<testCase id="000021">
|
||||||
<class>DeployGenObject</class>
|
<class>DeployGenObject</class>
|
||||||
<desc>Deploy OAI 5G CoreNetwork</desc>
|
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||||
<yaml_path>yaml_files/5g_f1_rfsimulator</yaml_path>
|
<yaml_path>yaml_files/5g_f1_rfsimulator</yaml_path>
|
||||||
<services>mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
|
<services>oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
|
||||||
<nb_healthy>6</nb_healthy>
|
<nb_healthy>6</nb_healthy>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
@@ -92,7 +100,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-nr-ue</server_container_name>
|
<server_container_name>rfsim5g-oai-nr-ue</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-ext-dn</client_container_name>
|
<client_container_name>rfsim5g-oai-ext-dn</client_container_name>
|
||||||
<server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
|
<server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
|
||||||
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 400K</client_options>
|
<client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 200K</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="030022">
|
<testCase id="030022">
|
||||||
@@ -101,7 +109,7 @@
|
|||||||
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
<server_container_name>rfsim5g-oai-ext-dn</server_container_name>
|
||||||
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
<client_container_name>rfsim5g-oai-nr-ue</client_container_name>
|
||||||
<server_options>-u -i 1 -s</server_options>
|
<server_options>-u -i 1 -s</server_options>
|
||||||
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 20K</client_options>
|
<client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 5K</client_options>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
<testCase id="100021">
|
<testCase id="100021">
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
<htmlTabIcon>wrench</htmlTabIcon>
|
<htmlTabIcon>wrench</htmlTabIcon>
|
||||||
<TestCaseRequestedList>
|
<TestCaseRequestedList>
|
||||||
100001
|
100001
|
||||||
|
000000
|
||||||
000001
|
000001
|
||||||
000002
|
000002
|
||||||
000003
|
000003
|
||||||
@@ -37,11 +38,19 @@
|
|||||||
</TestCaseRequestedList>
|
</TestCaseRequestedList>
|
||||||
<TestCaseExclusionList></TestCaseExclusionList>
|
<TestCaseExclusionList></TestCaseExclusionList>
|
||||||
|
|
||||||
|
<testCase id="000000">
|
||||||
|
<class>DeployGenObject</class>
|
||||||
|
<desc>Deploy MySql Database</desc>
|
||||||
|
<yaml_path>yaml_files/5g_rfsimulator</yaml_path>
|
||||||
|
<services>mysql</services>
|
||||||
|
<nb_healthy>1</nb_healthy>
|
||||||
|
</testCase>
|
||||||
|
|
||||||
<testCase id="000001">
|
<testCase id="000001">
|
||||||
<class>DeployGenObject</class>
|
<class>DeployGenObject</class>
|
||||||
<desc>Deploy OAI 5G CoreNetwork</desc>
|
<desc>Deploy OAI 5G CoreNetwork</desc>
|
||||||
<yaml_path>yaml_files/5g_rfsimulator</yaml_path>
|
<yaml_path>yaml_files/5g_rfsimulator</yaml_path>
|
||||||
<services>mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
|
<services>oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
|
||||||
<nb_healthy>6</nb_healthy>
|
<nb_healthy>6</nb_healthy>
|
||||||
</testCase>
|
</testCase>
|
||||||
|
|
||||||
|
|||||||
@@ -90,11 +90,14 @@ services:
|
|||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- AUSF_IPV4_ADDRESS=127.0.0.1
|
- EXTERNAL_AUSF=no
|
||||||
|
- AUSF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AUSF_PORT=80
|
- AUSF_PORT=80
|
||||||
- AUSF_API_VERSION=v1
|
- AUSF_API_VERSION=v1
|
||||||
|
- AUSF_FQDN=localhost
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- mysql
|
||||||
volumes:
|
volumes:
|
||||||
- ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
- ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -139,6 +142,7 @@ services:
|
|||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- oai-amf
|
||||||
volumes:
|
volumes:
|
||||||
- ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
- ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
||||||
- ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
|
- ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
|
||||||
@@ -183,6 +187,7 @@ services:
|
|||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- oai-smf
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
- SYS_ADMIN
|
- SYS_ADMIN
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
This page is only valid for an `Ubuntu18` host.
|
This page is only valid for an `Ubuntu18` host.
|
||||||
|
|
||||||
|
**NOTE: this version (2021-10-05) is valid for the `v1.1.0` and `v1.2.0` versions of the `OAI 5G CN`.**
|
||||||
|
|
||||||
**TABLE OF CONTENTS**
|
**TABLE OF CONTENTS**
|
||||||
|
|
||||||
1. [Retrieving the images on Docker-Hub](#1-retrieving-the-images-on-docker-hub)
|
1. [Retrieving the images on Docker-Hub](#1-retrieving-the-images-on-docker-hub)
|
||||||
@@ -26,6 +28,9 @@ This page is only valid for an `Ubuntu18` host.
|
|||||||
2. [Start the iperf server inside the NR-UE container](#32-start-the-iperf-server-inside-the-nr-ue-container)
|
2. [Start the iperf server inside the NR-UE container](#32-start-the-iperf-server-inside-the-nr-ue-container)
|
||||||
3. [Start the iperf client inside the ext-dn container](#33-start-the-iperf-client-inside-the-ext-dn-container)
|
3. [Start the iperf client inside the ext-dn container](#33-start-the-iperf-client-inside-the-ext-dn-container)
|
||||||
4. [Un-deployment](#4-un-deployment)
|
4. [Un-deployment](#4-un-deployment)
|
||||||
|
5. [Explanations on the configuration in the docker-compose.yaml](##5-explanations-on-the-configuration-in-the-docker-composeyaml)
|
||||||
|
1. [Making the NR-UE connect to the core network](#51-making-the-nr-ue-connect-to-the-core-network)
|
||||||
|
2. [Making the gNB connect to the core network](#52-making-the-gnb-connect-to-the-core-network)
|
||||||
|
|
||||||
# 1. Retrieving the images on Docker-Hub #
|
# 1. Retrieving the images on Docker-Hub #
|
||||||
|
|
||||||
@@ -71,6 +76,10 @@ $ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
|
|||||||
$ docker logout
|
$ docker logout
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**CAUTION: 2021/10/05 with the release `v1.2.0` of the `CN5G`, the previous version was not compatible any-more.**
|
||||||
|
|
||||||
|
**This new version is working for both the `v1.1.0` and `v1.2.0` of the `CN5G`.**
|
||||||
|
|
||||||
# 2. Deploy containers #
|
# 2. Deploy containers #
|
||||||
|
|
||||||

|

|
||||||
@@ -79,7 +88,9 @@ $ docker logout
|
|||||||
|
|
||||||
**Just `docker-compose up -d` WILL NOT WORK!**
|
**Just `docker-compose up -d` WILL NOT WORK!**
|
||||||
|
|
||||||
All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_rfsimulator` folder.
|
All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_rfsimulator` folder for a deployment with monolithic gNB.
|
||||||
|
|
||||||
|
For a deployment with the gNB split in CU and DU components, the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_f1_rfsimulator` folder.
|
||||||
|
|
||||||
## 2.1. Deploy OAI 5G Core Network ##
|
## 2.1. Deploy OAI 5G Core Network ##
|
||||||
|
|
||||||
@@ -137,6 +148,11 @@ rfsim5g-traffic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
|
|||||||
|
|
||||||
## 2.2. Deploy OAI gNB in RF simulator mode and in Standalone Mode ##
|
## 2.2. Deploy OAI gNB in RF simulator mode and in Standalone Mode ##
|
||||||
|
|
||||||
|
**CAUTION: To execute this 2nd step, the whole `CN5G` SHALL be in `healthy` state (especially the `mysql` container).**
|
||||||
|
|
||||||
|
The gNB can be deployed either in monolithic mode, or in CU/DU split mode.
|
||||||
|
- For a deployment with a monolithic gNB:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker-compose up -d oai-gnb
|
$ docker-compose up -d oai-gnb
|
||||||
rfsim5g-oai-nrf is up-to-date
|
rfsim5g-oai-nrf is up-to-date
|
||||||
@@ -144,7 +160,16 @@ rfsim5g-oai-spgwu is up-to-date
|
|||||||
rfsim5g-oai-ext-dn is up-to-date
|
rfsim5g-oai-ext-dn is up-to-date
|
||||||
Creating rfsim5g-oai-gnb ... done
|
Creating rfsim5g-oai-gnb ... done
|
||||||
```
|
```
|
||||||
|
- For a deployment with the gNB split in CU and DU components:
|
||||||
|
```bash
|
||||||
|
#Deployment of the CU
|
||||||
|
$ docker-compose up -d oai-cu
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#Deployment of the DU
|
||||||
|
$ docker-compose up -d oai-du
|
||||||
|
```
|
||||||
Wait for a bit.
|
Wait for a bit.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -160,6 +185,18 @@ rfsim5g-oai-smf /bin/bash -c /openair-smf/ ... Up (healthy) 80/tcp, 880
|
|||||||
rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
|
rfsim5g-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can verify that the `gNB` is connected with the `AMF`:
|
||||||
|
|
||||||
|
```bagh
|
||||||
|
$ docker logs rfsim5g-oai-amf
|
||||||
|
...
|
||||||
|
[AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
|
||||||
|
[AMF] [amf_app] [info ] | Index | Status | Global ID | gNB Name | PLMN |
|
||||||
|
[AMF] [amf_app] [info ] | 1 | Connected | 0x0 | gnb-rfsim | 208, 99 |
|
||||||
|
[AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
## 2.3. Deploy OAI NR-UE in RF simulator mode and in Standalone Mode ##
|
## 2.3. Deploy OAI NR-UE in RF simulator mode and in Standalone Mode ##
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -366,3 +403,47 @@ Removing rfsim5g-mysql ... done
|
|||||||
Removing network rfsim5g-oai-public-net
|
Removing network rfsim5g-oai-public-net
|
||||||
Removing network rfsim5g-oai-traffic_net-net
|
Removing network rfsim5g-oai-traffic_net-net
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# 5. Explanations on the configuration in the `docker-compose.yaml` #
|
||||||
|
|
||||||
|
## 5.1. Making the NR-UE connect to the core network ##
|
||||||
|
|
||||||
|
The NR-UE **SHALL** be provisioned in the core network, especially in the `SQL` database and in the `AMF`.
|
||||||
|
|
||||||
|
* in AMF section of `docker-compose.yaml` --> `OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1`
|
||||||
|
* in NR-UE section --> `OPC: 'C42449363BBAD02B66D16BC975D77CC1'
|
||||||
|
|
||||||
|
Both values shall match!
|
||||||
|
|
||||||
|
This value is also present in the `oai_db.sql` file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
INSERT INTO `users` VALUES ('208990100001100','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, 2 other values shall match in the NR-UE section of `docker-compose.yaml`:
|
||||||
|
|
||||||
|
* `FULL_IMSI: '208990100001100'`
|
||||||
|
* `FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'`
|
||||||
|
|
||||||
|
We are also using a dedicated `oai-smf.conf` for the `SMF` container: the `oai` DNN shall match the one in the NR-UE section of `docker-compose.yaml` (`DNN: oai`).
|
||||||
|
|
||||||
|
## 5.2. Making the gNB connect to the core network ##
|
||||||
|
|
||||||
|
Mainly you need to match the PLMN in `gNB`, `AMF` and `SPGWU` parameters:
|
||||||
|
|
||||||
|
* `AMF`
|
||||||
|
- `MCC=208`
|
||||||
|
- `MNC=99`
|
||||||
|
- `PLMN_SUPPORT_TAC=0x0001`
|
||||||
|
- ...
|
||||||
|
* `SPGWU`
|
||||||
|
- `MCC=208`
|
||||||
|
- `MNC=99`
|
||||||
|
- `TAC=1`
|
||||||
|
* `gNB`
|
||||||
|
- `MCC: '208'`
|
||||||
|
- `MNC: '99'`
|
||||||
|
- `TAC: 1`
|
||||||
|
|
||||||
|
The `ST` and `SD` values shall also match.
|
||||||
|
|||||||
@@ -90,11 +90,14 @@ services:
|
|||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
- NRF_API_VERSION=v1
|
- NRF_API_VERSION=v1
|
||||||
- NRF_FQDN=oai-nrf
|
- NRF_FQDN=oai-nrf
|
||||||
- AUSF_IPV4_ADDRESS=127.0.0.1
|
- EXTERNAL_AUSF=no
|
||||||
|
- AUSF_IPV4_ADDRESS=0.0.0.0
|
||||||
- AUSF_PORT=80
|
- AUSF_PORT=80
|
||||||
- AUSF_API_VERSION=v1
|
- AUSF_API_VERSION=v1
|
||||||
|
- AUSF_FQDN=localhost
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- mysql
|
||||||
volumes:
|
volumes:
|
||||||
- ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
- ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -139,6 +142,7 @@ services:
|
|||||||
- USE_FQDN_DNS=yes
|
- USE_FQDN_DNS=yes
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- oai-amf
|
||||||
volumes:
|
volumes:
|
||||||
- ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
- ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
|
||||||
- ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
|
- ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
|
||||||
@@ -183,6 +187,7 @@ services:
|
|||||||
- DNN_0=oai
|
- DNN_0=oai
|
||||||
depends_on:
|
depends_on:
|
||||||
- oai-nrf
|
- oai-nrf
|
||||||
|
- oai-smf
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
- SYS_ADMIN
|
- SYS_ADMIN
|
||||||
@@ -285,7 +290,7 @@ networks:
|
|||||||
com.docker.network.bridge.name: "rfsim5g-public"
|
com.docker.network.bridge.name: "rfsim5g-public"
|
||||||
traffic_net:
|
traffic_net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
name: rfsim5g-oai-traffic_net-net
|
name: rfsim5g-oai-traffic-net
|
||||||
ipam:
|
ipam:
|
||||||
config:
|
config:
|
||||||
- subnet: 192.168.72.128/26
|
- subnet: 192.168.72.128/26
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ To get the code and build the gNB executable:
|
|||||||
./build_oai --gNB -w USRP
|
./build_oai --gNB -w USRP
|
||||||
```
|
```
|
||||||
|
|
||||||
A reference configuration file for the gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf).
|
A reference configuration file for the **monolithic** gNB is provided [here](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf).
|
||||||
|
|
||||||
|
|
||||||
In the following, we highlight the fields of the file that have to be configured according to the configuration and interfaces of the Core Network. First, the PLMN section has to be filled with the proper values that match the configuration of the AMF and the UE USIM.
|
In the following, we highlight the fields of the file that have to be configured according to the configuration and interfaces of the Core Network. First, the PLMN section has to be filled with the proper values that match the configuration of the AMF and the UE USIM.
|
||||||
@@ -194,6 +194,8 @@ The SA setup with OAI UE has been validated with **RFSIMULATOR**. Both control p
|
|||||||
|
|
||||||
In the following, we provide the instructions on how to build, configure and execute this SA setup.
|
In the following, we provide the instructions on how to build, configure and execute this SA setup.
|
||||||
|
|
||||||
|
As another option, if you do not want to build anything and instead deploy the OAI RAN (RFSIMULATOR) and Core Network components directly using docker images and docker-compose, please have a look at [this tutorial](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/ci-scripts/yaml_files/5g_rfsimulator/README.md).
|
||||||
|
|
||||||
### NAS configuration for the OAI UE
|
### NAS configuration for the OAI UE
|
||||||
The NAS configuration parameters of the OAI UE can be set as input parameters, configuration file or can be hardcoded. More specifically:
|
The NAS configuration parameters of the OAI UE can be set as input parameters, configuration file or can be hardcoded. More specifically:
|
||||||
- SUCI (*Subscription Concealed Identifier*)
|
- SUCI (*Subscription Concealed Identifier*)
|
||||||
@@ -245,7 +247,6 @@ The gNB configuration can be performed according to what is described in [sectio
|
|||||||
## 2.2 OAI 5G Core Network installation and configuration
|
## 2.2 OAI 5G Core Network installation and configuration
|
||||||
The instructions for the installation of OAI CN components (AMF, SMF, NRF, UPF) using `docker-compose` can be found [here](https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed/-/blob/master/README.md).
|
The instructions for the installation of OAI CN components (AMF, SMF, NRF, UPF) using `docker-compose` can be found [here](https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed/-/blob/master/README.md).
|
||||||
|
|
||||||
In addition, if you do not want to build anything, please have a look at [this tutorial](https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/ci-scripts/yaml_files/5g_rfsimulator/README.md).
|
|
||||||
|
|
||||||
## 2.3 Execution of SA scenario
|
## 2.3 Execution of SA scenario
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ int f1ap_add_ue(F1_t isCu,
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We didn't find the rnti
|
// We didn't find the rnti
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].rnti == 0 ) {
|
if (f1_inst->f1ap_ue[i].rnti == 0 ) {
|
||||||
@@ -188,12 +189,12 @@ int f1ap_du_add_cu_ue_id(instance_t instanceP,
|
|||||||
instance_t du_ue_f1ap_id,
|
instance_t du_ue_f1ap_id,
|
||||||
instance_t cu_ue_f1ap_id) {
|
instance_t cu_ue_f1ap_id) {
|
||||||
f1ap_cudu_inst_t *f1_inst=getCxt(DUtype, instanceP);
|
f1ap_cudu_inst_t *f1_inst=getCxt(DUtype, instanceP);
|
||||||
|
|
||||||
instance_t f1ap_uid=-1;
|
instance_t f1ap_uid=-1;
|
||||||
|
|
||||||
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) {
|
||||||
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
if (f1_inst->f1ap_ue[i].du_ue_f1ap_id == du_ue_f1ap_id) {
|
||||||
f1ap_uid=i;
|
f1ap_uid=i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,8 +97,6 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
|
|
||||||
/* assoc_id */
|
/* assoc_id */
|
||||||
f1ap_setup_req_t *req=&getCxt(true, instance)->setupReq;
|
f1ap_setup_req_t *req=&getCxt(true, instance)->setupReq;
|
||||||
|
|
||||||
|
|
||||||
req->assoc_id = assoc_id;
|
req->assoc_id = assoc_id;
|
||||||
/* gNB_DU_id */
|
/* gNB_DU_id */
|
||||||
// this function exits if the ie is mandatory
|
// this function exits if the ie is mandatory
|
||||||
@@ -124,8 +122,8 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
for (i=0; i<num_cells_available; i++) {
|
for (i=0; i<num_cells_available; i++) {
|
||||||
F1AP_GNB_DU_Served_Cells_Item_t *served_cells_item_p;
|
F1AP_GNB_DU_Served_Cells_Item_t *served_cells_item_p;
|
||||||
served_cells_item_p = &(((F1AP_GNB_DU_Served_Cells_ItemIEs_t *)
|
served_cells_item_p = &(((F1AP_GNB_DU_Served_Cells_ItemIEs_t *)
|
||||||
ie->value.choice.GNB_DU_Served_Cells_List.list.array[i])->
|
ie->value.choice.GNB_DU_Served_Cells_List.list.array[i])->
|
||||||
value.choice.GNB_DU_Served_Cells_Item);
|
value.choice.GNB_DU_Served_Cells_Item);
|
||||||
|
|
||||||
/* tac */
|
/* tac */
|
||||||
if (served_cells_item_p->served_Cell_Information.fiveGS_TAC) {
|
if (served_cells_item_p->served_Cell_Information.fiveGS_TAC) {
|
||||||
@@ -153,6 +151,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
f1ap_req(true, instance)->cell_type=CELL_MACRO_GNB;
|
f1ap_req(true, instance)->cell_type=CELL_MACRO_GNB;
|
||||||
else
|
else
|
||||||
f1ap_req(true, instance)->cell_type=CELL_MACRO_ENB;
|
f1ap_req(true, instance)->cell_type=CELL_MACRO_ENB;
|
||||||
|
|
||||||
LOG_I(F1AP, "Received Cell in %d context\n", f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB);
|
LOG_I(F1AP, "Received Cell in %d context\n", f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB);
|
||||||
// System Information
|
// System Information
|
||||||
/* mib */
|
/* mib */
|
||||||
@@ -209,10 +208,10 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
// uint16_t nr_sul_band[32];
|
// uint16_t nr_sul_band[32];
|
||||||
// } tdd;
|
// } tdd;
|
||||||
// } nr_mode_info[F1AP_MAX_NB_CELLS];
|
// } nr_mode_info[F1AP_MAX_NB_CELLS];
|
||||||
|
|
||||||
// We copy and store in F1 task data, RRC will free "req" as it frees all itti received messages
|
// We copy and store in F1 task data, RRC will free "req" as it frees all itti received messages
|
||||||
message_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_SETUP_REQ);
|
message_p = itti_alloc_new_message(TASK_CU_F1, 0, F1AP_SETUP_REQ);
|
||||||
memcpy(&F1AP_SETUP_REQ(message_p), req, sizeof(f1ap_setup_req_t) );
|
memcpy(&F1AP_SETUP_REQ(message_p), req, sizeof(f1ap_setup_req_t) );
|
||||||
|
|
||||||
if (num_cells_available > 0) {
|
if (num_cells_available > 0) {
|
||||||
if (f1ap_req(true, instance)->cell_type == CELL_MACRO_GNB) {
|
if (f1ap_req(true, instance)->cell_type == CELL_MACRO_GNB) {
|
||||||
itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p);
|
itti_send_msg_to_task(TASK_RRC_GNB, GNB_MODULE_ID_TO_INSTANCE(instance), message_p);
|
||||||
@@ -221,7 +220,7 @@ int CU_handle_F1_SETUP_REQUEST(instance_t instance,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
CU_send_F1_SETUP_FAILURE(instance);
|
CU_send_F1_SETUP_FAILURE(instance);
|
||||||
itti_free(TASK_RRC_GNB,message_p);
|
itti_free(TASK_CU_F1,message_p);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,13 +521,13 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC3->value.choice.Cells_to_be_Deactivated_List.list,
|
asn1cSequenceAdd(ieC3->value.choice.Cells_to_be_Deactivated_List.list,
|
||||||
F1AP_Cells_to_be_Deactivated_List_ItemIEs_t, cells_to_be_deactivated);
|
F1AP_Cells_to_be_Deactivated_List_ItemIEs_t, cells_to_be_deactivated);
|
||||||
cells_to_be_deactivated->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
cells_to_be_deactivated->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
||||||
cells_to_be_deactivated->criticality = F1AP_Criticality_reject;
|
cells_to_be_deactivated->criticality = F1AP_Criticality_reject;
|
||||||
cells_to_be_deactivated->value.present = F1AP_Cells_to_be_Deactivated_List_ItemIEs__value_PR_Cells_to_be_Deactivated_List_Item;
|
cells_to_be_deactivated->value.present = F1AP_Cells_to_be_Deactivated_List_ItemIEs__value_PR_Cells_to_be_Deactivated_List_Item;
|
||||||
// 3.1 cells to be Deactivated list item
|
// 3.1 cells to be Deactivated list item
|
||||||
F1AP_Cells_to_be_Deactivated_List_Item_t *cells_to_be_deactivated_list=
|
F1AP_Cells_to_be_Deactivated_List_Item_t *cells_to_be_deactivated_list=
|
||||||
cells_to_be_deactivated->value.choice.Cells_to_be_Deactivated_List_Item;
|
cells_to_be_deactivated->value.choice.Cells_to_be_Deactivated_List_Item;
|
||||||
addnRCGI(cells_to_be_deactivated_item->nRCGI, f1ap_setup_resp->cells_to_deactivate+i);
|
addnRCGI(cells_to_be_deactivated_item->nRCGI, f1ap_setup_resp->cells_to_deactivate+i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -543,18 +542,18 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC4->value.choice.GNB_CU_TNL_Association_To_Add_List.list,
|
asn1cSequenceAdd(ieC4->value.choice.GNB_CU_TNL_Association_To_Add_List.list,
|
||||||
F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs_t, gnb_cu_tnl_association_to_add;
|
F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs_t, gnb_cu_tnl_association_to_add;
|
||||||
gnb_cu_tnl_association_to_add->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Add_Item;
|
gnb_cu_tnl_association_to_add->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Add_Item;
|
||||||
gnb_cu_tnl_association_to_add->criticality = F1AP_Criticality_reject;
|
gnb_cu_tnl_association_to_add->criticality = F1AP_Criticality_reject;
|
||||||
gnb_cu_tnl_association_to_add->value.present = F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Add_Item;
|
gnb_cu_tnl_association_to_add->value.present = F1AP_GNB_CU_TNL_Association_To_Add_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Add_Item;
|
||||||
|
|
||||||
// 4.1 GNB_CU_TNL_Association_To_Add_Item
|
// 4.1 GNB_CU_TNL_Association_To_Add_Item
|
||||||
F1AP_GNB_CU_TNL_Association_To_Add_Item_t *gnb_cu_tnl_association_to_add_item=
|
F1AP_GNB_CU_TNL_Association_To_Add_Item_t *gnb_cu_tnl_association_to_add_item=
|
||||||
&gnb_cu_tnl_association_to_add_item_ies->value.choice.GNB_CU_TNL_Association_To_Add_Item;
|
&gnb_cu_tnl_association_to_add_item_ies->value.choice.GNB_CU_TNL_Association_To_Add_Item;
|
||||||
|
|
||||||
// 4.1.1 tNLAssociationTransportLayerAddress
|
// 4.1.1 tNLAssociationTransportLayerAddress
|
||||||
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=;
|
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=;
|
||||||
gnb_cu_tnl_association_to_add->value.choice.GNB_CU_TNL_Association_To_Add_Item;
|
gnb_cu_tnl_association_to_add->value.choice.GNB_CU_TNL_Association_To_Add_Item;
|
||||||
|
|
||||||
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
|
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
|
||||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
|
||||||
@@ -577,18 +576,18 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
ieC5->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Remove_List;
|
ieC5->value.present = F1AP_GNBCUConfigurationUpdateIEs__value_PR_GNB_CU_TNL_Association_To_Remove_List;
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC5->value.choice.GNB_CU_TNL_Association_To_Remove_List.list,
|
asn1cSequenceAdd(ieC5->value.choice.GNB_CU_TNL_Association_To_Remove_List.list,
|
||||||
F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs_t, gnb_cu_tnl_association_to_remove);
|
F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs_t, gnb_cu_tnl_association_to_remove);
|
||||||
gnb_cu_tnl_association_to_remove->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Remove_Item;
|
gnb_cu_tnl_association_to_remove->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Remove_Item;
|
||||||
gnb_cu_tnl_association_to_remove->criticality = F1AP_Criticality_reject;
|
gnb_cu_tnl_association_to_remove->criticality = F1AP_Criticality_reject;
|
||||||
gnb_cu_tnl_association_to_remove->value.present = F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Remove_Item;
|
gnb_cu_tnl_association_to_remove->value.present = F1AP_GNB_CU_TNL_Association_To_Remove_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Remove_Item;
|
||||||
|
|
||||||
// 4.1 GNB_CU_TNL_Association_To_Remove_Item
|
// 4.1 GNB_CU_TNL_Association_To_Remove_Item
|
||||||
F1AP_GNB_CU_TNL_Association_To_Remove_Item_t *gnb_cu_tnl_association_to_remove_item=
|
F1AP_GNB_CU_TNL_Association_To_Remove_Item_t *gnb_cu_tnl_association_to_remove_item=
|
||||||
&gnb_cu_tnl_association_to_remove->value.choice.GNB_CU_TNL_Association_To_Remove_Item;
|
&gnb_cu_tnl_association_to_remove->value.choice.GNB_CU_TNL_Association_To_Remove_Item;
|
||||||
|
|
||||||
// 4.1.1 tNLAssociationTransportLayerAddress
|
// 4.1.1 tNLAssociationTransportLayerAddress
|
||||||
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=
|
F1AP_CP_TransportLayerAddress_t *transportLayerAddress=
|
||||||
&gnb_cu_tnl_association_to_remove_item->tNLAssociationTransportLayerAddress;
|
&gnb_cu_tnl_association_to_remove_item->tNLAssociationTransportLayerAddress;
|
||||||
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
|
transportLayerAddress->present = F1AP_CP_TransportLayerAddress_PR_endpoint_IP_address;
|
||||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &transportLayerAddress->choice.endpoint_IP_address);
|
||||||
|
|
||||||
@@ -609,7 +608,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC3->value.choice.GNB_CU_TNL_Association_To_Update_List.list,
|
asn1cSequenceAdd(ieC3->value.choice.GNB_CU_TNL_Association_To_Update_List.list,
|
||||||
F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs_t, gnb_cu_tnl_association_to_update);
|
F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs_t, gnb_cu_tnl_association_to_update);
|
||||||
gnb_cu_tnl_association_to_update->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Update_Item;
|
gnb_cu_tnl_association_to_update->id = F1AP_ProtocolIE_ID_id_GNB_CU_TNL_Association_To_Update_Item;
|
||||||
gnb_cu_tnl_association_to_update->criticality = F1AP_Criticality_reject;
|
gnb_cu_tnl_association_to_update->criticality = F1AP_Criticality_reject;
|
||||||
gnb_cu_tnl_association_to_update->value.present = F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Update_Item;
|
gnb_cu_tnl_association_to_update->value.present = F1AP_GNB_CU_TNL_Association_To_Update_ItemIEs__value_PR_GNB_CU_TNL_Association_To_Update_Item;
|
||||||
@@ -642,7 +641,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC7->value.choice.Cells_to_be_Barred_List.list,
|
asn1cSequenceAdd(ieC7->value.choice.Cells_to_be_Barred_List.list,
|
||||||
F1AP_Cells_to_be_Barred_ItemIEs_t,cells_to_be_barred);
|
F1AP_Cells_to_be_Barred_ItemIEs_t,cells_to_be_barred);
|
||||||
cells_to_be_barred->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
cells_to_be_barred->id = F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
|
||||||
cells_to_be_barred->criticality = F1AP_Criticality_reject;
|
cells_to_be_barred->criticality = F1AP_Criticality_reject;
|
||||||
cells_to_be_barred->value.present = F1AP_Cells_to_be_Barred_ItemIEs__value_PR_Cells_to_be_Barred_Item;
|
cells_to_be_barred->value.present = F1AP_Cells_to_be_Barred_ItemIEs__value_PR_Cells_to_be_Barred_Item;
|
||||||
@@ -665,7 +664,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ieC8->value.choice.Protected_EUTRA_Resources_List.list,
|
asn1cSequenceAdd(ieC8->value.choice.Protected_EUTRA_Resources_List.list,
|
||||||
F1AP_Protected_EUTRA_Resources_ItemIEs_t, protected_eutra_resources);
|
F1AP_Protected_EUTRA_Resources_ItemIEs_t, protected_eutra_resources);
|
||||||
// 8.1 SpectrumSharingGroupID
|
// 8.1 SpectrumSharingGroupID
|
||||||
protected_eutra_resources->id = F1AP_ProtocolIE_ID_id_Protected_EUTRA_Resources_List;
|
protected_eutra_resources->id = F1AP_ProtocolIE_ID_id_Protected_EUTRA_Resources_List;
|
||||||
protected_eutra_resources->criticality = F1AP_Criticality_reject;
|
protected_eutra_resources->criticality = F1AP_Criticality_reject;
|
||||||
@@ -675,11 +674,11 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(instance_t instance, f1ap_gnb_cu_configu
|
|||||||
sizeof(F1AP_Protected_EUTRA_Resources_Item_t));
|
sizeof(F1AP_Protected_EUTRA_Resources_Item_t));
|
||||||
|
|
||||||
asn1cSequenceAdd(protected_eutra_resources->value.choice.ListofEUTRACellsinGNBDUCoordination.list,
|
asn1cSequenceAdd(protected_eutra_resources->value.choice.ListofEUTRACellsinGNBDUCoordination.list,
|
||||||
F1AP_Served_EUTRA_Cells_Information_t, served_eutra_cells_information);
|
F1AP_Served_EUTRA_Cells_Information_t, served_eutra_cells_information);
|
||||||
memset((void *)&served_eutra_cells_information, 0, sizeof(F1AP_Served_EUTRA_Cells_Information_t));
|
memset((void *)&served_eutra_cells_information, 0, sizeof(F1AP_Served_EUTRA_Cells_Information_t));
|
||||||
|
|
||||||
F1AP_EUTRA_Mode_Info_t *eUTRA_Mode_Info=
|
F1AP_EUTRA_Mode_Info_t *eUTRA_Mode_Info=
|
||||||
&served_eutra_cells_information.eUTRA_Mode_Info;
|
&served_eutra_cells_information.eUTRA_Mode_Info;
|
||||||
|
|
||||||
// eUTRAFDD
|
// eUTRAFDD
|
||||||
eUTRA_Mode_Info->present = F1AP_EUTRA_Mode_Info_PR_eUTRAFDD;
|
eUTRA_Mode_Info->present = F1AP_EUTRA_Mode_Info_PR_eUTRAFDD;
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
instance_t du_ue_f1ap_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
|
||||||
/* NRCGI
|
/* NRCGI
|
||||||
* Fixme: process NRCGI
|
* Fixme: process NRCGI
|
||||||
*/
|
*/
|
||||||
@@ -101,7 +100,6 @@ int CU_handle_INITIAL_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_I(F1AP, "%s() RRCContainer (CCCH) size %ld: ", __func__, ie->value.choice.RRCContainer.size);
|
LOG_I(F1AP, "%s() RRCContainer (CCCH) size %ld: ", __func__, ie->value.choice.RRCContainer.size);
|
||||||
|
|
||||||
/* DUtoCURRCContainer */
|
/* DUtoCURRCContainer */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_InitialULRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false);
|
F1AP_ProtocolIE_ID_id_DUtoCURRCContainer, false);
|
||||||
@@ -289,28 +287,9 @@ int CU_handle_UL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
/* RRC Container */
|
/* RRC Container */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_ULRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
||||||
// print message in debug mode
|
|
||||||
// create an ITTI message and copy SDU
|
|
||||||
/*
|
|
||||||
|
|
||||||
message_p = itti_alloc_new_message (TASK_CU_F1, 0, RRC_DCCH_DATA_IND);
|
|
||||||
|
|
||||||
RRC_DCCH_DATA_IND (message_p).sdu_p = malloc(ie->value.choice.RRCContainer.size);
|
|
||||||
|
|
||||||
RRC_DCCH_DATA_IND (message_p).sdu_size = ie->value.choice.RRCContainer.size;
|
|
||||||
memcpy(RRC_DCCH_DATA_IND (message_p).sdu_p, ie->value.choice.RRCContainer.buf,
|
|
||||||
ie->value.choice.RRCContainer.size);
|
|
||||||
|
|
||||||
RRC_DCCH_DATA_IND (message_p).dcch_index = srb_id;
|
|
||||||
RRC_DCCH_DATA_IND (message_p).rnti = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id);
|
|
||||||
RRC_DCCH_DATA_IND (message_p).instance = instance;
|
|
||||||
RRC_DCCH_DATA_IND (message_p).eNB_index = instance; // not needed for CU
|
|
||||||
|
|
||||||
itti_send_msg_to_task(TASK_RRC_ENB, instance, message_p);
|
|
||||||
*/
|
|
||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.rnti = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id);
|
ctxt.rnti = f1ap_get_rnti_by_cu_id(CUtype, instance, cu_ue_f1ap_id);
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
ctxt.eNB_index = 0;
|
ctxt.eNB_index = 0;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
instance_t CUuniqInstance=0;
|
instance_t CUuniqInstance=0;
|
||||||
|
|
||||||
static instance_t cu_task_create_gtpu_instance_to_du(eth_params_t *IPaddrs) {
|
static instance_t cu_task_create_gtpu_instance_to_du(eth_params_t *IPaddrs) {
|
||||||
openAddr_t tmp={0};
|
openAddr_t tmp= {0};
|
||||||
strncpy(tmp.originHost, IPaddrs->my_addr, sizeof(tmp.originHost)-1);
|
strncpy(tmp.originHost, IPaddrs->my_addr, sizeof(tmp.originHost)-1);
|
||||||
strncpy(tmp.destinationHost, IPaddrs->remote_addr, sizeof(tmp.destinationHost)-1);
|
strncpy(tmp.destinationHost, IPaddrs->remote_addr, sizeof(tmp.destinationHost)-1);
|
||||||
sprintf(tmp.originService, "%d", IPaddrs->my_portd);
|
sprintf(tmp.originService, "%d", IPaddrs->my_portd);
|
||||||
@@ -51,7 +51,7 @@ static instance_t cu_task_create_gtpu_instance_to_du(eth_params_t *IPaddrs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind,
|
static void cu_task_handle_sctp_association_ind(instance_t instance, sctp_new_association_ind_t *sctp_new_association_ind,
|
||||||
eth_params_t *IPaddrs) {
|
eth_params_t *IPaddrs) {
|
||||||
createF1inst(true, instance, NULL);
|
createF1inst(true, instance, NULL);
|
||||||
// save the assoc id
|
// save the assoc id
|
||||||
f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance);
|
f1ap_setup_req_t *f1ap_cu_data=f1ap_req(true, instance);
|
||||||
@@ -90,7 +90,7 @@ static void cu_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *s
|
|||||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cu_task_send_sctp_init_req(instance_t instance, char * my_addr) {
|
static void cu_task_send_sctp_init_req(instance_t instance, char *my_addr) {
|
||||||
// 1. get the itti msg, and retrive the enb_id from the message
|
// 1. get the itti msg, and retrive the enb_id from the message
|
||||||
// 2. use RC.rrc[enb_id] to fill the sctp_init_t with the ip, port
|
// 2. use RC.rrc[enb_id] to fill the sctp_init_t with the ip, port
|
||||||
// 3. creat an itti message to init
|
// 3. creat an itti message to init
|
||||||
@@ -103,7 +103,6 @@ static void cu_task_send_sctp_init_req(instance_t instance, char * my_addr) {
|
|||||||
message_p->ittiMsg.sctp_init.ipv6 = 0;
|
message_p->ittiMsg.sctp_init.ipv6 = 0;
|
||||||
message_p->ittiMsg.sctp_init.nb_ipv4_addr = 1;
|
message_p->ittiMsg.sctp_init.nb_ipv4_addr = 1;
|
||||||
message_p->ittiMsg.sctp_init.ipv4_address[0] = inet_addr(my_addr);
|
message_p->ittiMsg.sctp_init.ipv4_address[0] = inet_addr(my_addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SR WARNING: ipv6 multi-homing fails sometimes for localhost.
|
* SR WARNING: ipv6 multi-homing fails sometimes for localhost.
|
||||||
* * * * Disable it for now.
|
* * * * Disable it for now.
|
||||||
@@ -113,7 +112,7 @@ static void cu_task_send_sctp_init_req(instance_t instance, char * my_addr) {
|
|||||||
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
itti_send_msg_to_task(TASK_SCTP, instance, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void * F1AP_CU_task(void *arg) {
|
void *F1AP_CU_task(void *arg) {
|
||||||
MessageDef *received_msg = NULL;
|
MessageDef *received_msg = NULL;
|
||||||
int result;
|
int result;
|
||||||
LOG_I(F1AP, "Starting F1AP at CU\n");
|
LOG_I(F1AP, "Starting F1AP at CU\n");
|
||||||
@@ -121,11 +120,13 @@ void * F1AP_CU_task(void *arg) {
|
|||||||
pool_buffer_init();
|
pool_buffer_init();
|
||||||
itti_mark_task_ready(TASK_CU_F1);
|
itti_mark_task_ready(TASK_CU_F1);
|
||||||
eth_params_t *IPaddrs;
|
eth_params_t *IPaddrs;
|
||||||
|
|
||||||
// Hardcoded instance id!
|
// Hardcoded instance id!
|
||||||
if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_CU)
|
if (RC.nrrrc && RC.nrrrc[0]->node_type == ngran_gNB_CU)
|
||||||
IPaddrs=&RC.nrrrc[0]->eth_params_s;
|
IPaddrs=&RC.nrrrc[0]->eth_params_s;
|
||||||
else
|
else
|
||||||
IPaddrs=&RC.rrc[0]->eth_params_s;
|
IPaddrs=&RC.rrc[0]->eth_params_s;
|
||||||
|
|
||||||
cu_task_send_sctp_init_req(0, IPaddrs->my_addr);
|
cu_task_send_sctp_init_req(0, IPaddrs->my_addr);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -137,7 +138,7 @@ void * F1AP_CU_task(void *arg) {
|
|||||||
ITTI_MSG_DESTINATION_INSTANCE(received_msg));
|
ITTI_MSG_DESTINATION_INSTANCE(received_msg));
|
||||||
cu_task_handle_sctp_association_ind(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
|
cu_task_handle_sctp_association_ind(ITTI_MSG_ORIGIN_INSTANCE(received_msg),
|
||||||
&received_msg->ittiMsg.sctp_new_association_ind,
|
&received_msg->ittiMsg.sctp_new_association_ind,
|
||||||
IPaddrs);
|
IPaddrs);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCTP_NEW_ASSOCIATION_RESP:
|
case SCTP_NEW_ASSOCIATION_RESP:
|
||||||
|
|||||||
@@ -215,7 +215,8 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
OCTET_STRING_fromBuf(&ie9->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
|
OCTET_STRING_fromBuf(&ie9->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
|
||||||
strlen("asdsa1d32sa1d31asd31as"));
|
strlen("asdsa1d32sa1d31asd31as"));
|
||||||
}
|
}
|
||||||
/* mandatory */
|
|
||||||
|
/* mandatory */
|
||||||
/* c10. SCell_ToBeSetup_List */
|
/* c10. SCell_ToBeSetup_List */
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie10);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie10);
|
||||||
ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetup_List;
|
ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetup_List;
|
||||||
@@ -404,7 +405,6 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* 12.1.2.2 sNSSAI */
|
/* 12.1.2.2 sNSSAI */
|
||||||
{
|
{
|
||||||
/* sST */
|
/* sST */
|
||||||
|
|
||||||
OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
|
OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
|
||||||
|
|
||||||
/* OPTIONAL */
|
/* OPTIONAL */
|
||||||
@@ -518,16 +518,15 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
|
int sz=sizeof(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address);
|
||||||
memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
|
memcpy(addr.buffer,&f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].tl_address, sz);
|
||||||
addr.length = sz*8;
|
addr.length = sz*8;
|
||||||
|
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid=
|
||||||
newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
|
newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
|
||||||
f1ap_ue_context_setup_req->rnti,
|
f1ap_ue_context_setup_req->rnti,
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
||||||
0xFFFF, // We will set the right value from DU answer
|
0xFFFF, // We will set the right value from DU answer
|
||||||
addr,
|
addr,
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
|
||||||
cu_f1u_data_req);
|
cu_f1u_data_req);
|
||||||
/* 12.3.1 ULTunnels_ToBeSetup_Item */
|
/* 12.3.1 ULTunnels_ToBeSetup_Item */
|
||||||
asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
|
asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
|
||||||
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
||||||
@@ -536,10 +535,10 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
gTPTunnel);
|
gTPTunnel);
|
||||||
/* 12.3.1.1.1 transportLayerAddress */
|
/* 12.3.1.1.1 transportLayerAddress */
|
||||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
|
||||||
&gTPTunnel->transportLayerAddress);
|
&gTPTunnel->transportLayerAddress);
|
||||||
/* 12.3.1.1.2 gTP_TEID */
|
/* 12.3.1.1.2 gTP_TEID */
|
||||||
INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
|
INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
|
||||||
&gTPTunnel->gTP_TEID);
|
&gTPTunnel->gTP_TEID);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 12.1.4 rLCMode */
|
/* 12.1.4 rLCMode */
|
||||||
@@ -653,89 +652,90 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
|
|||||||
f1ap_ue_context_setup_t *f1ap_ue_context_setup_resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
f1ap_ue_context_setup_t *f1ap_ue_context_setup_resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||||
container = &pdu->choice.successfulOutcome->value.choice.UEContextSetupResponse;
|
container = &pdu->choice.successfulOutcome->value.choice.UEContextSetupResponse;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* GNB_CU_UE_F1AP_ID */
|
/* GNB_CU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, false);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
f1ap_ue_context_setup_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
f1ap_ue_context_setup_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||||
|
|
||||||
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_CU_ue_id);
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_CU_ue_id);
|
||||||
|
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||||
f1ap_ue_context_setup_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
f1ap_ue_context_setup_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||||
|
|
||||||
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||||
|
|
||||||
f1ap_ue_context_setup_resp->rnti =
|
f1ap_ue_context_setup_resp->rnti =
|
||||||
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||||
|
|
||||||
// DUtoCURRCInformation
|
// DUtoCURRCInformation
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, true);
|
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, true);
|
||||||
if (ie == NULL){
|
|
||||||
|
if (ie == NULL) {
|
||||||
LOG_E(F1AP,"%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
|
LOG_E(F1AP,"%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
|
||||||
|
|
||||||
|
f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||||
memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||||
f1ap_ue_context_setup_resp->du_to_cu_rrc_information_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
f1ap_ue_context_setup_resp->du_to_cu_rrc_information_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
||||||
|
|
||||||
// DRBs_Setup_List
|
// DRBs_Setup_List
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
|
F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
|
||||||
if(ie!=NULL){
|
|
||||||
|
if(ie!=NULL) {
|
||||||
f1ap_ue_context_setup_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_Setup_List.list.count;
|
f1ap_ue_context_setup_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_Setup_List.list.count;
|
||||||
f1ap_ue_context_setup_resp->drbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_to_be_setup_length,
|
f1ap_ue_context_setup_resp->drbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_to_be_setup_length,
|
||||||
sizeof(f1ap_drb_to_be_setup_t));
|
sizeof(f1ap_drb_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_resp->drbs_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_resp->drbs_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_to_be_setup_length; ++i) {
|
||||||
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_to_be_setup[i];
|
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_to_be_setup[i];
|
||||||
F1AP_DRBs_Setup_Item_t *drbs_setup_item_p;
|
F1AP_DRBs_Setup_Item_t *drbs_setup_item_p;
|
||||||
drbs_setup_item_p = &((F1AP_DRBs_Setup_ItemIEs_t *)ie->value.choice.DRBs_Setup_List.list.array[i])->value.choice.DRBs_Setup_Item;
|
drbs_setup_item_p = &((F1AP_DRBs_Setup_ItemIEs_t *)ie->value.choice.DRBs_Setup_List.list.array[i])->value.choice.DRBs_Setup_Item;
|
||||||
drb_p->drb_id = drbs_setup_item_p->dRBID;
|
drb_p->drb_id = drbs_setup_item_p->dRBID;
|
||||||
// TODO in the following, assume only one UP UL TNL is present.
|
// TODO in the following, assume only one UP UL TNL is present.
|
||||||
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
||||||
drb_p->up_dl_tnl_length = 1;
|
drb_p->up_dl_tnl_length = 1;
|
||||||
AssertFatal(drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
AssertFatal(drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
||||||
"no DL UP TNL Information in DRBs to be Setup list\n");
|
"no DL UP TNL Information in DRBs to be Setup list\n");
|
||||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
||||||
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
||||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
||||||
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
||||||
GtpuUpdateTunnelOutgoingTeid(getCxt(CUtype, instance)->gtpInst,
|
GtpuUpdateTunnelOutgoingTeid(getCxt(CUtype, instance)->gtpInst,
|
||||||
f1ap_ue_context_setup_resp->rnti,
|
f1ap_ue_context_setup_resp->rnti,
|
||||||
(ebi_t)drbs_setup_item_p->dRBID,
|
(ebi_t)drbs_setup_item_p->dRBID,
|
||||||
drb_p->up_dl_tnl[0].teid);
|
drb_p->up_dl_tnl[0].teid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRBs_FailedToBeSetup_List
|
// SRBs_FailedToBeSetup_List
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List, false);
|
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List, false);
|
||||||
if(ie!=NULL){
|
|
||||||
|
if(ie!=NULL) {
|
||||||
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetup_List.list.count;
|
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetup_List.list.count;
|
||||||
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length,
|
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length,
|
||||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length; ++i) {
|
||||||
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_failed_to_be_setup[i];
|
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_failed_to_be_setup[i];
|
||||||
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetup_Item_t *)ie->value.choice.SRBs_FailedToBeSetup_List.list.array[i])->sRBID;
|
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetup_Item_t *)ie->value.choice.SRBs_FailedToBeSetup_List.list.array[i])->sRBID;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DRBs_FailedToBeSetup_List
|
// DRBs_FailedToBeSetup_List
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List, false);
|
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List, false);
|
||||||
if(ie!=NULL){
|
|
||||||
|
if(ie!=NULL) {
|
||||||
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetup_List.list.count;
|
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetup_List.list.count;
|
||||||
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length,
|
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length,
|
||||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length; ++i) {
|
||||||
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_failed_to_be_setup[i];
|
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_failed_to_be_setup[i];
|
||||||
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetup_Item_t *)ie->value.choice.DRBs_FailedToBeSetup_List.list.array[i])->dRBID;
|
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetup_Item_t *)ie->value.choice.DRBs_FailedToBeSetup_List.list.array[i])->dRBID;
|
||||||
@@ -745,19 +745,22 @@ int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
|
|||||||
// SCell_FailedtoSetup_List
|
// SCell_FailedtoSetup_List
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List, false);
|
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List, false);
|
||||||
if(ie!=NULL){
|
|
||||||
|
if(ie!=NULL) {
|
||||||
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetup_List \n");
|
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetup_List \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// SRBs_Setup_List
|
// SRBs_Setup_List
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_SRBs_Setup_List, false);
|
F1AP_ProtocolIE_ID_id_SRBs_Setup_List, false);
|
||||||
if(ie!=NULL){
|
|
||||||
|
if(ie!=NULL) {
|
||||||
f1ap_ue_context_setup_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_Setup_List.list.count;
|
f1ap_ue_context_setup_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_Setup_List.list.count;
|
||||||
f1ap_ue_context_setup_resp->srbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_to_be_setup_length,
|
f1ap_ue_context_setup_resp->srbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_to_be_setup_length,
|
||||||
sizeof(f1ap_srb_to_be_setup_t));
|
sizeof(f1ap_srb_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_resp->srbs_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_resp->srbs_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_to_be_setup_length; ++i) {
|
||||||
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_to_be_setup[i];
|
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_to_be_setup[i];
|
||||||
F1AP_SRBs_Setup_Item_t *srbs_setup_item_p;
|
F1AP_SRBs_Setup_Item_t *srbs_setup_item_p;
|
||||||
@@ -1078,7 +1081,7 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context
|
|||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
asn1cCallocOne(ie5->value.choice.DRXCycle.shortDRXCycleLength,
|
asn1cCallocOne(ie5->value.choice.DRXCycle.shortDRXCycleLength,
|
||||||
F1AP_ShortDRXCycleLength_ms2); // enum
|
F1AP_ShortDRXCycleLength_ms2); // enum
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
|
|||||||
@@ -44,8 +44,10 @@ int to_NRNRB(int nrb) {
|
|||||||
for (int i=0; i<sizeofArray(nrb_lut); i++)
|
for (int i=0; i<sizeofArray(nrb_lut); i++)
|
||||||
if (nrb_lut[i] == nrb)
|
if (nrb_lut[i] == nrb)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
if(!RC.nrrrc)
|
if(!RC.nrrrc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
AssertFatal(1==0,"nrb %d is not in the list of possible NRNRB\n",nrb);
|
AssertFatal(1==0,"nrb %d is not in the list of possible NRNRB\n",nrb);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -435,7 +437,7 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
|
|||||||
memcpy((void *)F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container[si],
|
memcpy((void *)F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_container[si],
|
||||||
(void *)sib_item->sIBmessage.buf,
|
(void *)sib_item->sIBmessage.buf,
|
||||||
size);
|
size);
|
||||||
F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_type[si]=sib_item->sIBtype;
|
F1AP_SETUP_RESP (msg_p).cells_to_activate[i].SI_type[si]=sib_item->sIBtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -869,7 +871,7 @@ int DU_handle_gNB_CU_CONFIGURATION_UPDATE(instance_t instance,
|
|||||||
memcpy((void *)F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p).cells_to_activate[i].SI_container[si],
|
memcpy((void *)F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p).cells_to_activate[i].SI_container[si],
|
||||||
(void *)sib_item->sIBmessage.buf,
|
(void *)sib_item->sIBmessage.buf,
|
||||||
size);
|
size);
|
||||||
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p).cells_to_activate[i].SI_type[si]=sib_item->sIBtype;
|
F1AP_GNB_CU_CONFIGURATION_UPDATE (msg_p).cells_to_activate[i].SI_type[si]=sib_item->sIBtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -137,7 +137,6 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
/* RRC Container */
|
/* RRC Container */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
F1AP_ProtocolIE_ID_id_RRCContainer, true);
|
||||||
|
|
||||||
rrc_dl_sdu_len = ie->value.choice.RRCContainer.size;
|
rrc_dl_sdu_len = ie->value.choice.RRCContainer.size;
|
||||||
|
|
||||||
/* optional */
|
/* optional */
|
||||||
@@ -166,7 +165,7 @@ int DU_handle_DL_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
protocol_ctxt_t ctxt;
|
protocol_ctxt_t ctxt;
|
||||||
ctxt.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
|
ctxt.rnti = f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(
|
struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_ue_context(
|
||||||
RC.rrc[ctxt.instance],
|
RC.rrc[ctxt.instance],
|
||||||
@@ -932,7 +931,6 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
/* SRBID */
|
/* SRBID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_DLRRCMessageTransferIEs_t, ie, container,
|
||||||
F1AP_ProtocolIE_ID_id_SRBID, true);
|
F1AP_ProtocolIE_ID_id_SRBID, true);
|
||||||
|
|
||||||
uint64_t srb_id = ie->value.choice.SRBID;
|
uint64_t srb_id = ie->value.choice.SRBID;
|
||||||
LOG_D(F1AP, "srb_id %lu \n", srb_id);
|
LOG_D(F1AP, "srb_id %lu \n", srb_id);
|
||||||
|
|
||||||
@@ -985,13 +983,12 @@ int DU_handle_DL_NR_RRC_MESSAGE_TRANSFER(instance_t instance,
|
|||||||
|
|
||||||
// decode RRC Container and act on the message type
|
// decode RRC Container and act on the message type
|
||||||
AssertFatal(srb_id<3,"illegal srb_id\n");
|
AssertFatal(srb_id<3,"illegal srb_id\n");
|
||||||
MessageDef * msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION);
|
MessageDef *msg = itti_alloc_new_message(TASK_DU_F1, 0, NR_DU_RRC_DL_INDICATION);
|
||||||
NRDuDlReq_t * req=&NRDuDlReq(msg);
|
NRDuDlReq_t *req=&NRDuDlReq(msg);
|
||||||
req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
|
req->rnti=f1ap_get_rnti_by_du_id(DUtype, instance, du_ue_f1ap_id);
|
||||||
req->srb_id=srb_id;
|
req->srb_id=srb_id;
|
||||||
req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__);
|
req->buf= get_free_mem_block( ie->value.choice.RRCContainer.size, __func__);
|
||||||
memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
|
memcpy(req->buf->data, ie->value.choice.RRCContainer.buf, ie->value.choice.RRCContainer.size);
|
||||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg);
|
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,23 +85,6 @@ void du_task_handle_sctp_association_resp(instance_t instance, sctp_new_associat
|
|||||||
f1ap_du_data->sctp_out_streams = sctp_new_association_resp->out_streams;
|
f1ap_du_data->sctp_out_streams = sctp_new_association_resp->out_streams;
|
||||||
f1ap_du_data->default_sctp_stream_id = 0;
|
f1ap_du_data->default_sctp_stream_id = 0;
|
||||||
/* setup parameters for F1U and start the server */
|
/* setup parameters for F1U and start the server */
|
||||||
eth_params_t *tmp;
|
|
||||||
if ( RC.nrmac )
|
|
||||||
tmp= &RC.nrmac[instance]->eth_params_n;
|
|
||||||
else
|
|
||||||
tmp= &RC.mac[instance]->eth_params_n;
|
|
||||||
const cudu_params_t params = {
|
|
||||||
.local_ipv4_address = tmp->my_addr,
|
|
||||||
.local_port = tmp->my_portd,
|
|
||||||
.remote_ipv4_address = tmp->remote_addr,
|
|
||||||
.remote_port = tmp->remote_portd
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (!RC.nrrrc)
|
|
||||||
AssertFatal(proto_agent_start(instance, ¶ms) == 0,
|
|
||||||
"could not start PROTO_AGENT for F1U on instance %ld!\n", instance);
|
|
||||||
*/
|
|
||||||
DU_send_F1_SETUP_REQUEST(instance);
|
DU_send_F1_SETUP_REQUEST(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,8 +97,8 @@ void du_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_dat
|
|||||||
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static instance_t du_create_gtpu_instance_to_cu(char* CUaddr, uint16_t CUport, char * DUaddr, uint16_t DUport) {
|
static instance_t du_create_gtpu_instance_to_cu(char *CUaddr, uint16_t CUport, char *DUaddr, uint16_t DUport) {
|
||||||
openAddr_t tmp={0};
|
openAddr_t tmp= {0};
|
||||||
strncpy(tmp.originHost, DUaddr, sizeof(tmp.originHost)-1);
|
strncpy(tmp.originHost, DUaddr, sizeof(tmp.originHost)-1);
|
||||||
strncpy(tmp.destinationHost, CUaddr, sizeof(tmp.destinationHost)-1);
|
strncpy(tmp.destinationHost, CUaddr, sizeof(tmp.destinationHost)-1);
|
||||||
sprintf(tmp.originService, "%d", DUport);
|
sprintf(tmp.originService, "%d", DUport);
|
||||||
@@ -137,22 +120,22 @@ void *F1AP_DU_task(void *arg) {
|
|||||||
|
|
||||||
switch (ITTI_MSG_ID(msg)) {
|
switch (ITTI_MSG_ID(msg)) {
|
||||||
case F1AP_SETUP_REQ:
|
case F1AP_SETUP_REQ:
|
||||||
// this is not a true F1 message, but rather an ITTI message sent by enb_app
|
// this is not a true F1 message, but rather an ITTI message sent by enb_app
|
||||||
// 1. save the itti msg so that you can use it to sen f1ap_setup_req, fill the f1ap_setup_req message,
|
// 1. save the itti msg so that you can use it to sen f1ap_setup_req, fill the f1ap_setup_req message,
|
||||||
// 2. store the message in f1ap context, that is also stored in RC
|
// 2. store the message in f1ap context, that is also stored in RC
|
||||||
// 2. send a sctp_association req
|
// 2. send a sctp_association req
|
||||||
LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
|
LOG_I(F1AP, "DU Task Received F1AP_SETUP_REQ\n");
|
||||||
f1ap_setup_req_t * msgSetup=&F1AP_SETUP_REQ(msg);
|
f1ap_setup_req_t *msgSetup=&F1AP_SETUP_REQ(msg);
|
||||||
createF1inst(false, myInstance, msgSetup);
|
createF1inst(false, myInstance, msgSetup);
|
||||||
getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address,
|
getCxt(DUtype, myInstance)->gtpInst=du_create_gtpu_instance_to_cu(msgSetup->CU_f1_ip_address.ipv4_address,
|
||||||
msgSetup->CUport,
|
msgSetup->CUport,
|
||||||
msgSetup->DU_f1_ip_address.ipv4_address,
|
msgSetup->DU_f1_ip_address.ipv4_address,
|
||||||
msgSetup->DUport);
|
msgSetup->DUport);
|
||||||
AssertFatal(getCxt(DUtype, myInstance)->gtpInst>0,"Failed to create CU F1-U UDP listener");
|
AssertFatal(getCxt(DUtype, myInstance)->gtpInst>0,"Failed to create CU F1-U UDP listener");
|
||||||
// Fixme: fully inconsistent instances management
|
// Fixme: fully inconsistent instances management
|
||||||
// dirty global var is a bad fix
|
// dirty global var is a bad fix
|
||||||
extern instance_t legacyInstanceMapping;
|
extern instance_t legacyInstanceMapping;
|
||||||
legacyInstanceMapping = DUuniqInstance = getCxt(DUtype, myInstance)->gtpInst;
|
legacyInstanceMapping = DUuniqInstance = getCxt(DUtype, myInstance)->gtpInst;
|
||||||
du_task_send_sctp_association_req(myInstance,msgSetup);
|
du_task_send_sctp_association_req(myInstance,msgSetup);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -43,15 +43,15 @@
|
|||||||
#include <openair3/ocp-gtpu/gtp_itf.h>
|
#include <openair3/ocp-gtpu/gtp_itf.h>
|
||||||
|
|
||||||
boolean_t lteDURecvCb( protocol_ctxt_t *ctxt_pP,
|
boolean_t lteDURecvCb( protocol_ctxt_t *ctxt_pP,
|
||||||
const srb_flag_t srb_flagP,
|
const srb_flag_t srb_flagP,
|
||||||
const rb_id_t rb_idP,
|
const rb_id_t rb_idP,
|
||||||
const mui_t muiP,
|
const mui_t muiP,
|
||||||
const confirm_t confirmP,
|
const confirm_t confirmP,
|
||||||
const sdu_size_t sdu_buffer_sizeP,
|
const sdu_size_t sdu_buffer_sizeP,
|
||||||
unsigned char *const sdu_buffer_pP,
|
unsigned char *const sdu_buffer_pP,
|
||||||
const pdcp_transmission_mode_t modeP,
|
const pdcp_transmission_mode_t modeP,
|
||||||
const uint32_t *sourceL2Id,
|
const uint32_t *sourceL2Id,
|
||||||
const uint32_t *destinationL2Id) {
|
const uint32_t *destinationL2Id) {
|
||||||
// The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue
|
// The buffer comes from the stack in gtp-u thread, we have a make a separate buffer to enqueue in a inter-thread message queue
|
||||||
mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__);
|
mem_block_t *sdu=get_free_mem_block(sdu_buffer_sizeP, __func__);
|
||||||
memcpy(sdu->data, sdu_buffer_pP, sdu_buffer_sizeP);
|
memcpy(sdu->data, sdu_buffer_pP, sdu_buffer_sizeP);
|
||||||
@@ -146,52 +146,55 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* DRB */
|
/* DRB */
|
||||||
F1AP_UEContextSetupRequestIEs_t *ieDrb;
|
F1AP_UEContextSetupRequestIEs_t *ieDrb;
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDrb, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieDrb, container,
|
||||||
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List, false);
|
F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List, false);
|
||||||
|
|
||||||
if(ieDrb!=NULL) {
|
if(ieDrb!=NULL) {
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetup_List.list.count;
|
f1ap_ue_context_setup_req->drbs_to_be_setup_length = ieDrb->value.choice.DRBs_ToBeSetup_List.list.count;
|
||||||
f1ap_ue_context_setup_req->drbs_to_be_setup = calloc(f1ap_ue_context_setup_req->drbs_to_be_setup_length,
|
f1ap_ue_context_setup_req->drbs_to_be_setup = calloc(f1ap_ue_context_setup_req->drbs_to_be_setup_length,
|
||||||
sizeof(f1ap_drb_to_be_setup_t));
|
sizeof(f1ap_drb_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_req->drbs_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_req->drbs_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_req->drbs_to_be_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; ++i) {
|
||||||
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_req->drbs_to_be_setup[i];
|
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_req->drbs_to_be_setup[i];
|
||||||
F1AP_DRBs_ToBeSetup_Item_t *drbs_tobesetup_item_p =
|
F1AP_DRBs_ToBeSetup_Item_t *drbs_tobesetup_item_p =
|
||||||
&((F1AP_DRBs_ToBeSetup_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetup_List.list.array[i])->value.choice.DRBs_ToBeSetup_Item;
|
&((F1AP_DRBs_ToBeSetup_ItemIEs_t *)ieDrb->value.choice.DRBs_ToBeSetup_List.list.array[i])->value.choice.DRBs_ToBeSetup_Item;
|
||||||
drb_p->drb_id = drbs_tobesetup_item_p->dRBID;
|
drb_p->drb_id = drbs_tobesetup_item_p->dRBID;
|
||||||
/* TODO in the following, assume only one UP UL TNL is present.
|
/* TODO in the following, assume only one UP UL TNL is present.
|
||||||
* this matches/assumes OAI CU implementation, can be up to 2! */
|
* this matches/assumes OAI CU implementation, can be up to 2! */
|
||||||
drb_p->up_ul_tnl_length = 1;
|
drb_p->up_ul_tnl_length = 1;
|
||||||
AssertFatal(drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
AssertFatal(drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
||||||
"no UL UP TNL Information in DRBs to be Setup list\n");
|
"no UL UP TNL Information in DRBs to be Setup list\n");
|
||||||
F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t *ul_up_tnl_info_p = (F1AP_ULUPTNLInformation_ToBeSetup_Item_t *)drbs_tobesetup_item_p->uLUPTNLInformation_ToBeSetup_List.list.array[0];
|
||||||
F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
|
F1AP_GTPTunnel_t *ul_up_tnl0 = ul_up_tnl_info_p->uLUPTNLInformation.choice.gTPTunnel;
|
||||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
|
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&ul_up_tnl0->transportLayerAddress, drb_p->up_ul_tnl[0].tl_address);
|
||||||
OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid);
|
OCTET_STRING_TO_INT32(&ul_up_tnl0->gTP_TEID, drb_p->up_ul_tnl[0].teid);
|
||||||
|
// 3GPP assumes GTP-U is on port 2152, but OAI is configurable
|
||||||
|
drb_p->up_ul_tnl[0].port=getCxt(false,instance)->setupReq.CUport;
|
||||||
|
|
||||||
switch (drbs_tobesetup_item_p->rLCMode) {
|
switch (drbs_tobesetup_item_p->rLCMode) {
|
||||||
case F1AP_RLCMode_rlc_am:
|
case F1AP_RLCMode_rlc_am:
|
||||||
drb_p->rlc_mode = RLC_MODE_AM;
|
drb_p->rlc_mode = RLC_MODE_AM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
drb_p->rlc_mode = RLC_MODE_TM;
|
drb_p->rlc_mode = RLC_MODE_TM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) {
|
if (!(RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU)) {
|
||||||
transport_layer_addr_t addr;
|
transport_layer_addr_t addr;
|
||||||
memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address));
|
memcpy(addr.buffer, &drb_p->up_ul_tnl[0].tl_address, sizeof(drb_p->up_ul_tnl[0].tl_address));
|
||||||
addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8;
|
addr.length=sizeof(drb_p->up_ul_tnl[0].tl_address)*8;
|
||||||
drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT,
|
drb_p->up_dl_tnl[0].teid=newGtpuCreateTunnel(INSTANCE_DEFAULT,
|
||||||
f1ap_ue_context_setup_req->rnti,
|
f1ap_ue_context_setup_req->rnti,
|
||||||
drb_p->drb_id,
|
drb_p->drb_id,
|
||||||
drb_p->drb_id,
|
drb_p->drb_id,
|
||||||
drb_p->up_ul_tnl[0].teid,
|
drb_p->up_ul_tnl[0].teid,
|
||||||
addr,
|
addr,
|
||||||
2152,
|
drb_p->up_ul_tnl[0].port,
|
||||||
lteDURecvCb);
|
lteDURecvCb);
|
||||||
drb_p->up_dl_tnl_length++;
|
drb_p->up_dl_tnl_length++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,14 +202,14 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
/* SRB */
|
/* SRB */
|
||||||
F1AP_UEContextSetupRequestIEs_t *ieSrb;
|
F1AP_UEContextSetupRequestIEs_t *ieSrb;
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieSrb, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupRequestIEs_t, ieSrb, container,
|
||||||
F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List, false);
|
F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List, false);
|
||||||
|
|
||||||
if(ieSrb != NULL) {
|
if(ieSrb != NULL) {
|
||||||
f1ap_ue_context_setup_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetup_List.list.count;
|
f1ap_ue_context_setup_req->srbs_to_be_setup_length = ieSrb->value.choice.SRBs_ToBeSetup_List.list.count;
|
||||||
f1ap_ue_context_setup_req->srbs_to_be_setup = calloc(f1ap_ue_context_setup_req->srbs_to_be_setup_length,
|
f1ap_ue_context_setup_req->srbs_to_be_setup = calloc(f1ap_ue_context_setup_req->srbs_to_be_setup_length,
|
||||||
sizeof(f1ap_srb_to_be_setup_t));
|
sizeof(f1ap_srb_to_be_setup_t));
|
||||||
AssertFatal(f1ap_ue_context_setup_req->srbs_to_be_setup,
|
AssertFatal(f1ap_ue_context_setup_req->srbs_to_be_setup,
|
||||||
"could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n");
|
"could not allocate memory for f1ap_ue_context_setup_req->srbs_to_be_setup\n");
|
||||||
|
|
||||||
for (i = 0; i < f1ap_ue_context_setup_req->srbs_to_be_setup_length; ++i) {
|
for (i = 0; i < f1ap_ue_context_setup_req->srbs_to_be_setup_length; ++i) {
|
||||||
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_req->srbs_to_be_setup[i];
|
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_req->srbs_to_be_setup[i];
|
||||||
@@ -250,6 +253,7 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|||||||
else
|
else
|
||||||
// in 4G, race conditon is to fix
|
// in 4G, race conditon is to fix
|
||||||
DU_send_UE_CONTEXT_SETUP_RESPONSE(instance, f1ap_ue_context_setup_req);
|
DU_send_UE_CONTEXT_SETUP_RESPONSE(instance, f1ap_ue_context_setup_req);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,7 +391,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
|
|||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
/* c8. SRBs_FailedToBeSetup_List */
|
/* c8. SRBs_FailedToBeSetup_List */
|
||||||
if(0){
|
if(0) {
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie8);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie8);
|
||||||
ie8->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List;
|
ie8->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List;
|
||||||
ie8->criticality = F1AP_Criticality_ignore;
|
ie8->criticality = F1AP_Criticality_ignore;
|
||||||
@@ -396,13 +400,13 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
|
|||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
//
|
//
|
||||||
asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list,
|
asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list,
|
||||||
F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
|
F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
|
||||||
srbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item;
|
srbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item;
|
||||||
srbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
srbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
|
srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
|
||||||
/* 8.1 SRBs_Setup_Item */
|
/* 8.1 SRBs_Setup_Item */
|
||||||
F1AP_SRBs_FailedToBeSetup_Item_t *srbs_failedToBeSetup_item=
|
F1AP_SRBs_FailedToBeSetup_Item_t *srbs_failedToBeSetup_item=
|
||||||
&srbs_failedToBeSetup_item_ies->value.choice.SRBs_FailedToBeSetup_Item;
|
&srbs_failedToBeSetup_item_ies->value.choice.SRBs_FailedToBeSetup_Item;
|
||||||
/* sRBID */
|
/* sRBID */
|
||||||
srbs_failedToBeSetup_item->sRBID = 13L;
|
srbs_failedToBeSetup_item->sRBID = 13L;
|
||||||
/* cause */
|
/* cause */
|
||||||
@@ -414,6 +418,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
|
|||||||
case F1AP_Cause_PR_radioNetwork:
|
case F1AP_Cause_PR_radioNetwork:
|
||||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_transport:
|
case F1AP_Cause_PR_transport:
|
||||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||||
break;
|
break;
|
||||||
@@ -435,99 +440,99 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
/* c9. DRBs_FailedToBeSetup_List */
|
/* c9. DRBs_FailedToBeSetup_List */
|
||||||
if(0){
|
if(0) {
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie9);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie9);
|
||||||
ie9->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List;
|
ie9->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List;
|
||||||
ie9->criticality = F1AP_Criticality_ignore;
|
ie9->criticality = F1AP_Criticality_ignore;
|
||||||
ie9->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_FailedToBeSetup_List;
|
ie9->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_FailedToBeSetup_List;
|
||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ie9->value.choice.DRBs_FailedToBeSetup_List.list,
|
asn1cSequenceAdd(ie9->value.choice.DRBs_FailedToBeSetup_List.list,
|
||||||
F1AP_DRBs_FailedToBeSetup_ItemIEs_t, drbs_failedToBeSetup_item_ies);
|
F1AP_DRBs_FailedToBeSetup_ItemIEs_t, drbs_failedToBeSetup_item_ies);
|
||||||
drbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_Item;
|
drbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_Item;
|
||||||
drbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
drbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
drbs_failedToBeSetup_item_ies->value.present = F1AP_DRBs_FailedToBeSetup_ItemIEs__value_PR_DRBs_FailedToBeSetup_Item;
|
drbs_failedToBeSetup_item_ies->value.present = F1AP_DRBs_FailedToBeSetup_ItemIEs__value_PR_DRBs_FailedToBeSetup_Item;
|
||||||
/* 9.1 DRBs_Setup_Item */
|
/* 9.1 DRBs_Setup_Item */
|
||||||
/* ADD */
|
/* ADD */
|
||||||
F1AP_DRBs_FailedToBeSetup_Item_t *drbs_failedToBeSetup_item=
|
F1AP_DRBs_FailedToBeSetup_Item_t *drbs_failedToBeSetup_item=
|
||||||
&drbs_failedToBeSetup_item_ies->value.choice.DRBs_FailedToBeSetup_Item;
|
&drbs_failedToBeSetup_item_ies->value.choice.DRBs_FailedToBeSetup_Item;
|
||||||
/* dRBID */
|
/* dRBID */
|
||||||
drbs_failedToBeSetup_item->dRBID = 14;
|
drbs_failedToBeSetup_item->dRBID = 14;
|
||||||
/* cause */
|
/* cause */
|
||||||
asn1cCalloc(drbs_failedToBeSetup_item->cause,tmp);
|
asn1cCalloc(drbs_failedToBeSetup_item->cause,tmp);
|
||||||
// dummy value
|
// dummy value
|
||||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||||
|
|
||||||
switch(tmp->present) {
|
switch(tmp->present) {
|
||||||
case F1AP_Cause_PR_radioNetwork:
|
case F1AP_Cause_PR_radioNetwork:
|
||||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_transport:
|
case F1AP_Cause_PR_transport:
|
||||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_protocol:
|
case F1AP_Cause_PR_protocol:
|
||||||
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_misc:
|
case F1AP_Cause_PR_misc:
|
||||||
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_NOTHING:
|
case F1AP_Cause_PR_NOTHING:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
} // for i
|
} // for i
|
||||||
}
|
}
|
||||||
|
|
||||||
// /* */
|
// /* */
|
||||||
/* c10. SCell_FailedtoSetup_List */
|
/* c10. SCell_FailedtoSetup_List */
|
||||||
if(0){
|
if(0) {
|
||||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie10);
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie10);
|
||||||
ie10->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List;
|
ie10->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List;
|
||||||
ie10->criticality = F1AP_Criticality_ignore;
|
ie10->criticality = F1AP_Criticality_ignore;
|
||||||
ie10->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SCell_FailedtoSetup_List;
|
ie10->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SCell_FailedtoSetup_List;
|
||||||
|
|
||||||
for (int i=0; i<1; i++) {
|
for (int i=0; i<1; i++) {
|
||||||
asn1cSequenceAdd(ie10->value.choice.SCell_FailedtoSetup_List.list,
|
asn1cSequenceAdd(ie10->value.choice.SCell_FailedtoSetup_List.list,
|
||||||
F1AP_SCell_FailedtoSetup_ItemIEs_t, sCell_FailedtoSetup_item_ies);
|
F1AP_SCell_FailedtoSetup_ItemIEs_t, sCell_FailedtoSetup_item_ies);
|
||||||
sCell_FailedtoSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item;
|
sCell_FailedtoSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item;
|
||||||
sCell_FailedtoSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
sCell_FailedtoSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
sCell_FailedtoSetup_item_ies->value.present = F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item;
|
sCell_FailedtoSetup_item_ies->value.present = F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item;
|
||||||
/* 10.1 DRBs_Setup_Item */
|
/* 10.1 DRBs_Setup_Item */
|
||||||
F1AP_SCell_FailedtoSetup_Item_t *sCell_FailedtoSetup_item=
|
F1AP_SCell_FailedtoSetup_Item_t *sCell_FailedtoSetup_item=
|
||||||
&sCell_FailedtoSetup_item_ies->value.choice.SCell_FailedtoSetup_Item;
|
&sCell_FailedtoSetup_item_ies->value.choice.SCell_FailedtoSetup_Item;
|
||||||
/* sCell_ID */
|
/* sCell_ID */
|
||||||
addnRCGI(sCell_FailedtoSetup_item->sCell_ID,f1ap_req(false, instance)->cell+i);
|
addnRCGI(sCell_FailedtoSetup_item->sCell_ID,f1ap_req(false, instance)->cell+i);
|
||||||
/* cause */
|
/* cause */
|
||||||
asn1cCalloc(sCell_FailedtoSetup_item->cause, tmp);
|
asn1cCalloc(sCell_FailedtoSetup_item->cause, tmp);
|
||||||
// dummy value
|
// dummy value
|
||||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||||
|
|
||||||
switch(tmp->present) {
|
switch(tmp->present) {
|
||||||
case F1AP_Cause_PR_radioNetwork:
|
case F1AP_Cause_PR_radioNetwork:
|
||||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_transport:
|
case F1AP_Cause_PR_transport:
|
||||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_protocol:
|
case F1AP_Cause_PR_protocol:
|
||||||
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_misc:
|
case F1AP_Cause_PR_misc:
|
||||||
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case F1AP_Cause_PR_NOTHING:
|
case F1AP_Cause_PR_NOTHING:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
} // switch
|
} // switch
|
||||||
} // for i
|
} // for i
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mandatory */
|
/* mandatory */
|
||||||
@@ -540,7 +545,7 @@ int DU_send_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, f1ap_ue_context_setup
|
|||||||
|
|
||||||
for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
|
for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
|
||||||
asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list,
|
asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list,
|
||||||
F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies);
|
F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies);
|
||||||
srbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item;
|
srbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item;
|
||||||
srbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
srbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||||
srbs_setup_item_ies->value.present = F1AP_SRBs_Setup_ItemIEs__value_PR_SRBs_Setup_Item;
|
srbs_setup_item_ies->value.present = F1AP_SRBs_Setup_ItemIEs__value_PR_SRBs_Setup_Item;
|
||||||
@@ -683,7 +688,7 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||||
ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
|
ctxt.rnti = f1ap_get_rnti_by_cu_id(DUtype, instance, ie->value.choice.GNB_CU_UE_F1AP_ID);
|
||||||
ctxt.instance = instance;
|
ctxt.instance = instance;
|
||||||
ctxt.instance = instance;
|
ctxt.module_id = instance;
|
||||||
ctxt.enb_flag = 1;
|
ctxt.enb_flag = 1;
|
||||||
/* GNB_DU_UE_F1AP_ID */
|
/* GNB_DU_UE_F1AP_ID */
|
||||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCommandIEs_t, ie, container,
|
||||||
@@ -693,7 +698,6 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
AssertFatal(ctxt.rnti == rnti,
|
AssertFatal(ctxt.rnti == rnti,
|
||||||
"RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
"RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
||||||
rnti, ctxt.rnti);
|
rnti, ctxt.rnti);
|
||||||
|
|
||||||
int UE_out_of_sync = 0;
|
int UE_out_of_sync = 0;
|
||||||
|
|
||||||
if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
|
if (RC.nrrrc && RC.nrrrc[instance]->node_type == ngran_gNB_DU) {
|
||||||
@@ -767,9 +771,7 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
|
DU_send_UE_CONTEXT_RELEASE_COMPLETE(instance, &cplt);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
struct rrc_eNB_ue_context_s *ue_context_p;
|
struct rrc_eNB_ue_context_s *ue_context_p;
|
||||||
|
|
||||||
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
|
ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt.instance], ctxt.rnti);
|
||||||
|
|
||||||
if (ue_context_p && !UE_out_of_sync) {
|
if (ue_context_p && !UE_out_of_sync) {
|
||||||
@@ -778,21 +780,21 @@ int DU_handle_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|||||||
pthread_mutex_lock(&rrc_release_freelist);
|
pthread_mutex_lock(&rrc_release_freelist);
|
||||||
|
|
||||||
for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
|
for (uint16_t release_num = 0; release_num < NUMBER_OF_UE_MAX; release_num++) {
|
||||||
if (rrc_release_info.RRC_release_ctrl[release_num].flag == 0) {
|
if (rrc_release_info.RRC_release_ctrl[release_num].flag == 0) {
|
||||||
if (ue_context_p->ue_context.ue_release_timer_s1 > 0)
|
if (ue_context_p->ue_context.ue_release_timer_s1 > 0)
|
||||||
rrc_release_info.RRC_release_ctrl[release_num].flag = 1;
|
rrc_release_info.RRC_release_ctrl[release_num].flag = 1;
|
||||||
else
|
else
|
||||||
rrc_release_info.RRC_release_ctrl[release_num].flag = 2;
|
rrc_release_info.RRC_release_ctrl[release_num].flag = 2;
|
||||||
|
|
||||||
rrc_release_info.RRC_release_ctrl[release_num].rnti = ctxt.rnti;
|
rrc_release_info.RRC_release_ctrl[release_num].rnti = ctxt.rnti;
|
||||||
LOG_D(F1AP, "add rrc_release_info RNTI %x\n", ctxt.rnti);
|
LOG_D(F1AP, "add rrc_release_info RNTI %x\n", ctxt.rnti);
|
||||||
// TODO: how to provide the correct MUI?
|
// TODO: how to provide the correct MUI?
|
||||||
rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui = 0;
|
rrc_release_info.RRC_release_ctrl[release_num].rrc_eNB_mui = 0;
|
||||||
rrc_release_info.num_UEs++;
|
rrc_release_info.num_UEs++;
|
||||||
LOG_D(RRC,"Generate DLSCH Release send: index %d rnti %x mui %d flag %d \n",release_num,
|
LOG_D(RRC,"Generate DLSCH Release send: index %d rnti %x mui %d flag %d \n",release_num,
|
||||||
ctxt.rnti, 0, rrc_release_info.RRC_release_ctrl[release_num].flag);
|
ctxt.rnti, 0, rrc_release_info.RRC_release_ctrl[release_num].flag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&rrc_release_freelist);
|
pthread_mutex_unlock(&rrc_release_freelist);
|
||||||
|
|||||||
@@ -50,10 +50,12 @@ int f1ap_encode_pdu(F1AP_F1AP_PDU_t *pdu, uint8_t **buffer, uint32_t *length) {
|
|||||||
char errbuf[128]; /* Buffer for error message */
|
char errbuf[128]; /* Buffer for error message */
|
||||||
size_t errlen = sizeof(errbuf); /* Size of the buffer */
|
size_t errlen = sizeof(errbuf); /* Size of the buffer */
|
||||||
int ret = asn_check_constraints(&asn_DEF_F1AP_F1AP_PDU, pdu, errbuf, &errlen);
|
int ret = asn_check_constraints(&asn_DEF_F1AP_F1AP_PDU, pdu, errbuf, &errlen);
|
||||||
|
|
||||||
/* assert(errlen < sizeof(errbuf)); // Guaranteed: you may rely on that */
|
/* assert(errlen < sizeof(errbuf)); // Guaranteed: you may rely on that */
|
||||||
if(ret) {
|
if(ret) {
|
||||||
fprintf(stderr, "Constraint validation failed: %s\n", errbuf);
|
fprintf(stderr, "Constraint validation failed: %s\n", errbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
encoded = aper_encode_to_new_buffer(&asn_DEF_F1AP_F1AP_PDU, 0, pdu, (void **)buffer);
|
encoded = aper_encode_to_new_buffer(&asn_DEF_F1AP_F1AP_PDU, 0, pdu, (void **)buffer);
|
||||||
|
|
||||||
if (encoded < 0) {
|
if (encoded < 0) {
|
||||||
|
|||||||
@@ -537,16 +537,16 @@ rb_found:
|
|||||||
__func__, rb_id, size);
|
__func__, rb_id, size);
|
||||||
extern instance_t CUuniqInstance;
|
extern instance_t CUuniqInstance;
|
||||||
itti_send_msg_to_task(TASK_VARIABLE, CUuniqInstance, message_p);
|
itti_send_msg_to_task(TASK_VARIABLE, CUuniqInstance, message_p);
|
||||||
return;
|
} else {
|
||||||
|
|
||||||
|
memblock = get_free_mem_block(size, __FUNCTION__);
|
||||||
|
memcpy(memblock->data, buf, size);
|
||||||
|
|
||||||
|
LOG_D(PDCP, "%s(): (srb %d) calling rlc_data_req size %d\n", __func__, rb_id, size);
|
||||||
|
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
||||||
|
//printf("\n");
|
||||||
|
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
memblock = get_free_mem_block(size, __FUNCTION__);
|
|
||||||
memcpy(memblock->data, buf, size);
|
|
||||||
|
|
||||||
LOG_D(PDCP, "%s(): (srb %d) calling rlc_data_req size %d\n", __func__, rb_id, size);
|
|
||||||
//for (i = 0; i < size; i++) printf(" %2.2x", (unsigned char)memblock->data[i]);
|
|
||||||
//printf("\n");
|
|
||||||
enqueue_rlc_data_req(&ctxt, 0, MBMS_FLAG_NO, rb_id, sdu_id, 0, size, memblock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void deliver_sdu_srb(void *_ue, nr_pdcp_entity_t *entity,
|
static void deliver_sdu_srb(void *_ue, nr_pdcp_entity_t *entity,
|
||||||
|
|||||||
@@ -153,15 +153,6 @@ typedef struct xer_sprint_string_s {
|
|||||||
size_t string_index;
|
size_t string_index;
|
||||||
} xer_sprint_string_t;
|
} xer_sprint_string_t;
|
||||||
|
|
||||||
|
|
||||||
#define asn1cCallocOne(VaR, VaLue) \
|
|
||||||
VaR = calloc(1,sizeof(*VaR)); *VaR=VaLue;
|
|
||||||
#define asn1cCalloc(VaR, lOcPtr) \
|
|
||||||
typeof(VaR) lOcPtr = VaR = calloc(1,sizeof(*VaR));
|
|
||||||
#define asn1cSequenceAdd(VaR, TyPe, lOcPtr) \
|
|
||||||
TyPe *lOcPtr= calloc(1,sizeof(TyPe)); \
|
|
||||||
ASN_SEQUENCE_ADD(&VaR,lOcPtr);
|
|
||||||
|
|
||||||
//replace LTE
|
//replace LTE
|
||||||
//extern unsigned char NB_eNB_INST;
|
//extern unsigned char NB_eNB_INST;
|
||||||
extern unsigned char NB_gNB_INST;
|
extern unsigned char NB_gNB_INST;
|
||||||
@@ -310,9 +301,6 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
|
|||||||
|
|
||||||
return((enc_rval.encoded+7)/8);
|
return((enc_rval.encoded+7)/8);
|
||||||
}
|
}
|
||||||
#define asn1cCalloc(VaR, TyPe, lOcPtr) TyPe *lOcPtr=VaR=(TyPe*) calloc(1,sizeof(TyPe));
|
|
||||||
#define asn1cCallocOne(VaR, VaLue) VaR=calloc(1,sizeof(*VaR)); *VaR=VaLue;
|
|
||||||
#define asn1cSequenceAdd(VaR, TyPe, lOcPtr) TyPe *lOcPtr=(TyPe*) calloc(1,sizeof(TyPe)); ASN_SEQUENCE_ADD(&VaR,lOcPtr);
|
|
||||||
|
|
||||||
uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
||||||
gNB_RrcConfigurationReq *configuration
|
gNB_RrcConfigurationReq *configuration
|
||||||
@@ -342,7 +330,7 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
|||||||
asn1cSequenceAdd(sib1->cellAccessRelatedInfo.plmn_IdentityList.list, struct NR_PLMN_IdentityInfo, nr_plmn_info);
|
asn1cSequenceAdd(sib1->cellAccessRelatedInfo.plmn_IdentityList.list, struct NR_PLMN_IdentityInfo, nr_plmn_info);
|
||||||
for (int i = 0; i < num_plmn; ++i) {
|
for (int i = 0; i < num_plmn; ++i) {
|
||||||
asn1cSequenceAdd(nr_plmn_info->plmn_IdentityList.list, struct NR_PLMN_Identity, nr_plmn);
|
asn1cSequenceAdd(nr_plmn_info->plmn_IdentityList.list, struct NR_PLMN_Identity, nr_plmn);
|
||||||
asn1cCalloc(nr_plmn->mcc, struct NR_MCC, mcc);
|
asn1cCalloc(nr_plmn->mcc, mcc);
|
||||||
int confMcc=configuration->mcc[i];
|
int confMcc=configuration->mcc[i];
|
||||||
asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc0);
|
asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc0);
|
||||||
*mcc0=(confMcc/100)%10;
|
*mcc0=(confMcc/100)%10;
|
||||||
@@ -411,8 +399,7 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
|||||||
ASN_SEQUENCE_ADD(&sib1->si_SchedulingInfo->schedulingInfoList.list,schedulingInfo);*/
|
ASN_SEQUENCE_ADD(&sib1->si_SchedulingInfo->schedulingInfoList.list,schedulingInfo);*/
|
||||||
|
|
||||||
// servingCellConfigCommon
|
// servingCellConfigCommon
|
||||||
asn1cCalloc(sib1->servingCellConfigCommon,
|
asn1cCalloc(sib1->servingCellConfigCommon, ServCellCom);
|
||||||
struct NR_ServingCellConfigCommonSIB, ServCellCom);
|
|
||||||
NR_BWP_DownlinkCommon_t *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP;
|
NR_BWP_DownlinkCommon_t *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP;
|
||||||
initialDownlinkBWP->genericParameters=
|
initialDownlinkBWP->genericParameters=
|
||||||
configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
|
configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
|
||||||
@@ -547,19 +534,17 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
|
|||||||
ServCellCom->downlinkConfigCommon.pcch_Config.ns = NR_PCCH_Config__ns_one;
|
ServCellCom->downlinkConfigCommon.pcch_Config.ns = NR_PCCH_Config__ns_one;
|
||||||
|
|
||||||
asn1cCalloc(ServCellCom->downlinkConfigCommon.pcch_Config.firstPDCCH_MonitoringOccasionOfPO,
|
asn1cCalloc(ServCellCom->downlinkConfigCommon.pcch_Config.firstPDCCH_MonitoringOccasionOfPO,
|
||||||
struct NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO,
|
|
||||||
P0);
|
P0);
|
||||||
P0->present = NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT;
|
P0->present = NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT;
|
||||||
|
|
||||||
asn1cCalloc(P0->choice.sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT,
|
asn1cCalloc(P0->choice.sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT,
|
||||||
struct NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO__sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT,
|
|
||||||
Z8);
|
Z8);
|
||||||
asn1cSequenceAdd(Z8->list,
|
asn1cSequenceAdd(Z8->list,
|
||||||
long,
|
long,
|
||||||
ZoneEight);
|
ZoneEight);
|
||||||
asn1cCallocOne(ZoneEight, 0);
|
asn1cCallocOne(ZoneEight, 0);
|
||||||
|
|
||||||
asn1cCalloc(ServCellCom->uplinkConfigCommon, struct NR_UplinkConfigCommonSIB, UL)
|
asn1cCalloc(ServCellCom->uplinkConfigCommon, UL)
|
||||||
asn_set_empty(&UL->frequencyInfoUL.scs_SpecificCarrierList.list);
|
asn_set_empty(&UL->frequencyInfoUL.scs_SpecificCarrierList.list);
|
||||||
for(int i = 0; i< configuration->scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.count; i++) {
|
for(int i = 0; i< configuration->scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.count; i++) {
|
||||||
ASN_SEQUENCE_ADD(&UL->frequencyInfoUL.scs_SpecificCarrierList.list,
|
ASN_SEQUENCE_ADD(&UL->frequencyInfoUL.scs_SpecificCarrierList.list,
|
||||||
|
|||||||
@@ -3364,7 +3364,7 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
|
|||||||
drb_p.drb_id,
|
drb_p.drb_id,
|
||||||
drb_p.up_ul_tnl[0].teid,
|
drb_p.up_ul_tnl[0].teid,
|
||||||
addr,
|
addr,
|
||||||
2152,
|
drb_p.up_ul_tnl[0].port,
|
||||||
DURecvCb);
|
DURecvCb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3417,10 +3417,11 @@ static void rrc_DU_process_ue_context_setup_request(MessageDef *msg_p, const cha
|
|||||||
resp->du_to_cu_rrc_information = calloc(1,1024*sizeof(uint8_t));
|
resp->du_to_cu_rrc_information = calloc(1,1024*sizeof(uint8_t));
|
||||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||||
NULL,
|
NULL,
|
||||||
(void *)ue_context_p->ue_context.masterCellGroup,
|
(void *)cellGroupConfig,
|
||||||
resp->du_to_cu_rrc_information,
|
resp->du_to_cu_rrc_information,
|
||||||
1024);
|
1024);
|
||||||
resp->du_to_cu_rrc_information_length = (enc_rval.encoded+7)>>3;
|
resp->du_to_cu_rrc_information_length = (enc_rval.encoded+7)>>3;
|
||||||
|
free(cellGroupConfig);
|
||||||
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
|
itti_send_msg_to_task (TASK_DU_F1, ctxt.module_id, message_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
|
|||||||
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
||||||
LOG_E(GTPU, "gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", rnti);
|
LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -171,13 +171,13 @@ static void gtpv1uSend(instance_t instance, gtpv1u_enb_tunnel_data_req_t *req, b
|
|||||||
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
|
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
|
||||||
|
|
||||||
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
||||||
LOG_E(GTPU,"GTP-U instance: %ld sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
|
LOG_E(GTPU,"[%ld] GTP-U instance: sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(GTPU,"sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d\n",
|
LOG_D(GTPU,"[%ld] sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d\n",
|
||||||
rnti, rab_id,ptr2->second.teid_outgoing,length, ptr2->second.seqNum,ptr2->second.npduNum );
|
instance, rnti, rab_id,ptr2->second.teid_outgoing,length, ptr2->second.seqNum,ptr2->second.npduNum );
|
||||||
|
|
||||||
if(seqNumFlag)
|
if(seqNumFlag)
|
||||||
ptr2->second.seqNum++;
|
ptr2->second.seqNum++;
|
||||||
@@ -205,7 +205,7 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
|
|||||||
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
||||||
LOG_E(GTPU, "GTP-U instance: %ld gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
|
LOG_E(GTPU, "[%ld] GTP-U gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -218,7 +218,7 @@ static void gtpv1uSend2(instance_t instance, gtpv1u_gnb_tunnel_data_req_t *req,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(GTPU,"GTP-U instance: %ld sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d\n",
|
LOG_D(GTPU,"[%ld] GTP-U sending a packet to RNTI:RAB:teid %x/%x/%x, len %lu, oldseq %d, oldnum %d\n",
|
||||||
instance, rnti, rab_id,ptr2->second.teid_outgoing,length, ptr2->second.seqNum,ptr2->second.npduNum );
|
instance, rnti, rab_id,ptr2->second.teid_outgoing,length, ptr2->second.seqNum,ptr2->second.npduNum );
|
||||||
|
|
||||||
if(seqNumFlag)
|
if(seqNumFlag)
|
||||||
@@ -245,7 +245,7 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *r
|
|||||||
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
if ( ptrRnti==inst->ue2te_mapping.end() ) {
|
||||||
LOG_E(GTPU, "gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", rnti);
|
LOG_E(GTPU, "[%ld] gtpv1uSend failed: while getting ue rnti %x in hashtable ue_mapping\n", instance, rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -253,13 +253,13 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *r
|
|||||||
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
|
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(rab_id);
|
||||||
|
|
||||||
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
||||||
LOG_E(GTPU,"GTP-U instance: %ld sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
|
LOG_E(GTPU,"[%ld] GTP-U sending a packet to a non existant RNTI:RAB: %x/%x\n", instance, rnti, rab_id);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_D(GTPU,"sending a end packet packet to RNTI:RAB:teid %x/%x/%x\n",
|
LOG_D(GTPU,"[%ld] sending a end packet packet to RNTI:RAB:teid %x/%x/%x\n",
|
||||||
rnti, rab_id,ptr2->second.teid_outgoing);
|
instance, rnti, rab_id,ptr2->second.teid_outgoing);
|
||||||
ocp_gtpv1u_bearer_t tmp=ptr2->second;
|
ocp_gtpv1u_bearer_t tmp=ptr2->second;
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
Gtpv1uMsgHeaderT msgHdr;
|
Gtpv1uMsgHeaderT msgHdr;
|
||||||
@@ -281,11 +281,11 @@ static void gtpv1uEndTunnel(instance_t instance, gtpv1u_enb_tunnel_data_req_t *r
|
|||||||
to.sin_addr.s_addr = tmp.outgoing_ip_addr;
|
to.sin_addr.s_addr = tmp.outgoing_ip_addr;
|
||||||
char ip4[INET_ADDRSTRLEN];
|
char ip4[INET_ADDRSTRLEN];
|
||||||
//char ip6[INET6_ADDRSTRLEN];
|
//char ip6[INET6_ADDRSTRLEN];
|
||||||
LOG_D(GTPU,"sending end packet to %s\n", inet_ntoa(to.sin_addr) );
|
LOG_D(GTPU,"[%ld] sending end packet to %s\n", instance, inet_ntoa(to.sin_addr) );
|
||||||
|
|
||||||
if (sendto(compatInst(instance), (void *)&msgHdr, sizeof(msgHdr), 0,(struct sockaddr *)&to, sizeof(to) ) != sizeof(msgHdr)) {
|
if (sendto(compatInst(instance), (void *)&msgHdr, sizeof(msgHdr), 0,(struct sockaddr *)&to, sizeof(to) ) != sizeof(msgHdr)) {
|
||||||
LOG_E(GTPU,
|
LOG_E(GTPU,
|
||||||
"[SD %ld] Failed to send data to %s on port %d, buffer size %lu\n",
|
"[%ld] Failed to send data to %s on port %d, buffer size %lu\n",
|
||||||
compatInst(instance), inet_ntop(AF_INET, &tmp.outgoing_ip_addr, ip4, INET_ADDRSTRLEN), tmp.outgoing_port, sizeof(msgHdr));
|
compatInst(instance), inet_ntop(AF_INET, &tmp.outgoing_ip_addr, ip4, INET_ADDRSTRLEN), tmp.outgoing_port, sizeof(msgHdr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -373,7 +373,7 @@ static int udpServerSocket(openAddr_s addr) {
|
|||||||
|
|
||||||
int sendbuff = 1000*1000*10;
|
int sendbuff = 1000*1000*10;
|
||||||
AssertFatal(0==setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)),"");
|
AssertFatal(0==setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuff, sizeof(sendbuff)),"");
|
||||||
LOG_D(GTPU,"Created listener for paquets to: %s:%s, send buffer size: %d\n", addr.originHost, addr.originService,sendbuff);
|
LOG_D(GTPU,"[%d] Created listener for paquets to: %s:%s, send buffer size: %d\n", sockfd, addr.originHost, addr.originService,sendbuff);
|
||||||
return sockfd;
|
return sockfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +397,7 @@ void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer
|
|||||||
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
auto ptrRnti=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( ptrRnti == inst->ue2te_mapping.end() ) {
|
if ( ptrRnti == inst->ue2te_mapping.end() ) {
|
||||||
LOG_E(GTPU,"Update tunnel for a not existing rnti %x\n", rnti);
|
LOG_E(GTPU,"[%ld] Update tunnel for a not existing rnti %x\n", instance, rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -405,13 +405,13 @@ void GtpuUpdateTunnelOutgoingTeid(instance_t instance, rnti_t rnti, ebi_t bearer
|
|||||||
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(bearer_id);
|
map<int, ocp_gtpv1u_bearer_t>::iterator ptr2=ptrRnti->second.bearers.find(bearer_id);
|
||||||
|
|
||||||
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
if ( ptr2 == ptrRnti->second.bearers.end() ) {
|
||||||
LOG_E(GTPU,"Update tunnel for a existing rnti %x, but wrong bearer_id %u\n", rnti, bearer_id);
|
LOG_E(GTPU,"[%ld] Update tunnel for a existing rnti %x, but wrong bearer_id %u\n", instance, rnti, bearer_id);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr2->second.teid_outgoing = newOutgoingTeid;
|
ptr2->second.teid_outgoing = newOutgoingTeid;
|
||||||
LOG_I(GTPU, "Tunnel Outgoing TEID updated to %d \n", ptr2->second.teid_outgoing);
|
LOG_I(GTPU, "[%ld] Tunnel Outgoing TEID updated to %x \n", instance, ptr2->second.teid_outgoing);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -424,14 +424,14 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
auto it=inst->ue2te_mapping.find(rnti);
|
auto it=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( it != inst->ue2te_mapping.end() ) {
|
if ( it != inst->ue2te_mapping.end() ) {
|
||||||
LOG_W(GTPU,"Create a config for a already existing GTP tunnel (rnti %x)\n", rnti);
|
LOG_W(GTPU,"[%ld] Create a config for a already existing GTP tunnel (rnti %x)\n", instance, rnti);
|
||||||
inst->ue2te_mapping.erase(it);
|
inst->ue2te_mapping.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
teid_t incoming_teid=gtpv1uNewTeid();
|
teid_t incoming_teid=gtpv1uNewTeid();
|
||||||
|
|
||||||
while ( inst->te2ue_mapping.find(incoming_teid) != inst->te2ue_mapping.end() ) {
|
while ( inst->te2ue_mapping.find(incoming_teid) != inst->te2ue_mapping.end() ) {
|
||||||
LOG_W(GTPU, "generated a random Teid that exists, re-generating (%x)\n",incoming_teid);
|
LOG_W(GTPU, "[%ld] generated a random Teid that exists, re-generating (%x)\n", instance, incoming_teid);
|
||||||
incoming_teid=gtpv1uNewTeid();
|
incoming_teid=gtpv1uNewTeid();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -471,7 +471,8 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
char ip4[INET_ADDRSTRLEN];
|
char ip4[INET_ADDRSTRLEN];
|
||||||
char ip6[INET6_ADDRSTRLEN];
|
char ip6[INET6_ADDRSTRLEN];
|
||||||
LOG_I(GTPU, "Created tunnel for RNTI %x, teid for DL: %u, teid for UL %u to remote IPv4: %s, IPv6 %s\n",
|
LOG_I(GTPU, "[%ld] Created tunnel for RNTI %x, teid for DL: %x, teid for UL %x to remote IPv4: %s, IPv6 %s\n",
|
||||||
|
instance,
|
||||||
rnti,
|
rnti,
|
||||||
tmp->teid_incoming,
|
tmp->teid_incoming,
|
||||||
tmp->teid_outgoing,
|
tmp->teid_outgoing,
|
||||||
@@ -483,7 +484,8 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer
|
|||||||
int ocp_gtpv1u_create_s1u_tunnel(instance_t instance,
|
int ocp_gtpv1u_create_s1u_tunnel(instance_t instance,
|
||||||
const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req,
|
const gtpv1u_enb_create_tunnel_req_t *create_tunnel_req,
|
||||||
gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp) {
|
gtpv1u_enb_create_tunnel_resp_t *create_tunnel_resp) {
|
||||||
LOG_D(GTPU, "Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x\n",
|
LOG_D(GTPU, "[%ld] Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x\n",
|
||||||
|
instance,
|
||||||
create_tunnel_req->rnti,
|
create_tunnel_req->rnti,
|
||||||
create_tunnel_req->num_tunnels,
|
create_tunnel_req->num_tunnels,
|
||||||
create_tunnel_req->sgw_S1u_teid[0]);
|
create_tunnel_req->sgw_S1u_teid[0]);
|
||||||
@@ -517,7 +519,8 @@ int ocp_gtpv1u_update_s1u_tunnel(
|
|||||||
const gtpv1u_enb_create_tunnel_req_t *const create_tunnel_req,
|
const gtpv1u_enb_create_tunnel_req_t *const create_tunnel_req,
|
||||||
const rnti_t prior_rnti
|
const rnti_t prior_rnti
|
||||||
) {
|
) {
|
||||||
LOG_D(GTPU, "Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %x, eps_bearer_id %x\n",
|
LOG_D(GTPU, "[%ld] Start update tunnels for old RNTI %x, new RNTI %x, num_tunnels %d, sgw_S1u_teid %x, eps_bearer_id %x\n",
|
||||||
|
instance,
|
||||||
prior_rnti,
|
prior_rnti,
|
||||||
create_tunnel_req->rnti,
|
create_tunnel_req->rnti,
|
||||||
create_tunnel_req->num_tunnels,
|
create_tunnel_req->num_tunnels,
|
||||||
@@ -527,13 +530,13 @@ int ocp_gtpv1u_update_s1u_tunnel(
|
|||||||
auto inst=&globGtp.instances[compatInst(instance)];
|
auto inst=&globGtp.instances[compatInst(instance)];
|
||||||
|
|
||||||
if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) == inst->ue2te_mapping.end() ) {
|
if ( inst->ue2te_mapping.find(create_tunnel_req->rnti) == inst->ue2te_mapping.end() ) {
|
||||||
LOG_E(GTPU,"Update not already existing tunnel (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti);
|
LOG_E(GTPU,"[%ld] Update not already existing tunnel (new rnti %x, old rnti %x)\n", instance, create_tunnel_req->rnti, prior_rnti);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto it=inst->ue2te_mapping.find(prior_rnti);
|
auto it=inst->ue2te_mapping.find(prior_rnti);
|
||||||
|
|
||||||
if ( it != inst->ue2te_mapping.end() ) {
|
if ( it != inst->ue2te_mapping.end() ) {
|
||||||
LOG_W(GTPU,"Update a not existing tunnel, start create the new one (new rnti %x, old rnti %x)\n", create_tunnel_req->rnti, prior_rnti);
|
LOG_W(GTPU,"[%ld] Update a not existing tunnel, start create the new one (new rnti %x, old rnti %x)\n", instance, create_tunnel_req->rnti, prior_rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
gtpv1u_enb_create_tunnel_resp_t tmp;
|
gtpv1u_enb_create_tunnel_resp_t tmp;
|
||||||
(void)ocp_gtpv1u_create_s1u_tunnel(instance, create_tunnel_req, &tmp);
|
(void)ocp_gtpv1u_create_s1u_tunnel(instance, create_tunnel_req, &tmp);
|
||||||
@@ -549,7 +552,8 @@ int ocp_gtpv1u_update_s1u_tunnel(
|
|||||||
int gtpv1u_create_ngu_tunnel( const instance_t instance,
|
int gtpv1u_create_ngu_tunnel( const instance_t instance,
|
||||||
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req,
|
const gtpv1u_gnb_create_tunnel_req_t *const create_tunnel_req,
|
||||||
gtpv1u_gnb_create_tunnel_resp_t *const create_tunnel_resp) {
|
gtpv1u_gnb_create_tunnel_resp_t *const create_tunnel_resp) {
|
||||||
LOG_D(GTPU, "Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x\n",
|
LOG_D(GTPU, "[%ld] Start create tunnels for RNTI %x, num_tunnels %d, sgw_S1u_teid %x\n",
|
||||||
|
instance,
|
||||||
create_tunnel_req->rnti,
|
create_tunnel_req->rnti,
|
||||||
create_tunnel_req->num_tunnels,
|
create_tunnel_req->num_tunnels,
|
||||||
create_tunnel_req->outgoing_teid[0]);
|
create_tunnel_req->outgoing_teid[0]);
|
||||||
@@ -590,14 +594,14 @@ int ocp_gtpv1u_create_x2u_tunnel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
int newGtpuDeleteTunnel(instance_t instance, rnti_t rnti) {
|
int newGtpuDeleteTunnel(instance_t instance, rnti_t rnti) {
|
||||||
LOG_D(GTPU, "Start delete tunnels for RNTI %x\n",
|
LOG_D(GTPU, "[%ld] Start delete tunnels for RNTI %x\n",
|
||||||
rnti);
|
instance, rnti);
|
||||||
pthread_mutex_lock(&globGtp.gtp_lock);
|
pthread_mutex_lock(&globGtp.gtp_lock);
|
||||||
auto inst=&globGtp.instances[compatInst(instance)];
|
auto inst=&globGtp.instances[compatInst(instance)];
|
||||||
auto it=inst->ue2te_mapping.find(rnti);
|
auto it=inst->ue2te_mapping.find(rnti);
|
||||||
|
|
||||||
if ( it == inst->ue2te_mapping.end() ) {
|
if ( it == inst->ue2te_mapping.end() ) {
|
||||||
LOG_W(GTPU,"Delete a non existing GTP tunnel\n");
|
LOG_W(GTPU,"[%ld] Delete GTP tunnels for rnti: %x, but no tunnel exits\n", instance, rnti);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -613,7 +617,7 @@ int newGtpuDeleteTunnel(instance_t instance, rnti_t rnti) {
|
|||||||
|
|
||||||
inst->ue2te_mapping.erase(it);
|
inst->ue2te_mapping.erase(it);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
LOG_I(GTPU, "Deleted all tunnels for RNTI %d (%d tunnels deleted)\n", rnti, nb);
|
LOG_I(GTPU, "[%ld] Deleted all tunnels for RNTI %x (%d tunnels deleted)\n", instance, rnti, nb);
|
||||||
return !GTPNOK;
|
return !GTPNOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -635,7 +639,7 @@ static int Gtpv1uHandleEchoReq(int h,
|
|||||||
uint32_t msgBufLen,
|
uint32_t msgBufLen,
|
||||||
uint16_t peerPort,
|
uint16_t peerPort,
|
||||||
uint32_t peerIp) {
|
uint32_t peerIp) {
|
||||||
LOG_E(GTPU,"to be dev\n");
|
LOG_E(GTPU,"EchoReq reply to be dev\n");
|
||||||
int rc = GTPNOK;
|
int rc = GTPNOK;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -645,7 +649,7 @@ static int Gtpv1uHandleError(int h,
|
|||||||
uint32_t msgBufLen,
|
uint32_t msgBufLen,
|
||||||
uint16_t peerPort,
|
uint16_t peerPort,
|
||||||
uint32_t peerIp) {
|
uint32_t peerIp) {
|
||||||
LOG_E(GTPU,"to be dev\n");
|
LOG_E(GTPU,"Hadle error to be dev\n");
|
||||||
int rc = GTPNOK;
|
int rc = GTPNOK;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -655,7 +659,7 @@ static int Gtpv1uHandleSupportedExt(int h,
|
|||||||
uint32_t msgBufLen,
|
uint32_t msgBufLen,
|
||||||
uint16_t peerPort,
|
uint16_t peerPort,
|
||||||
uint32_t peerIp) {
|
uint32_t peerIp) {
|
||||||
LOG_E(GTPU,"to be dev\n");
|
LOG_E(GTPU,"Supported extensions to be dev\n");
|
||||||
int rc = GTPNOK;
|
int rc = GTPNOK;
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -671,7 +675,7 @@ static int Gtpv1uHandleEndMarker(int h,
|
|||||||
Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *) msgBuf;
|
Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *) msgBuf;
|
||||||
|
|
||||||
if ( msgHdr->version != 1 || msgHdr->PT != 1 ) {
|
if ( msgHdr->version != 1 || msgHdr->PT != 1 ) {
|
||||||
LOG_E(GTPU, "Received a packet that is not GTP header\n");
|
LOG_E(GTPU, "[%d] Received a packet that is not GTP header\n", h);
|
||||||
return GTPNOK;
|
return GTPNOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -681,7 +685,7 @@ static int Gtpv1uHandleEndMarker(int h,
|
|||||||
auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid));
|
auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid));
|
||||||
|
|
||||||
if ( tunnel == inst->te2ue_mapping.end() ) {
|
if ( tunnel == inst->te2ue_mapping.end() ) {
|
||||||
LOG_E(GTPU,"Received a incoming packet on unknown teid (%x) Dropping!\n", msgHdr->teid);
|
LOG_E(GTPU,"[%d] Received a incoming packet on unknown teid (%x) Dropping!\n", h, msgHdr->teid);
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return GTPNOK;
|
return GTPNOK;
|
||||||
}
|
}
|
||||||
@@ -717,9 +721,9 @@ static int Gtpv1uHandleEndMarker(int h,
|
|||||||
mode,
|
mode,
|
||||||
&sourceL2Id,
|
&sourceL2Id,
|
||||||
&destinationL2Id) )
|
&destinationL2Id) )
|
||||||
LOG_E(GTPU,"down layer refused incoming packet\n");
|
LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
|
||||||
|
|
||||||
LOG_D(GTPU,"Received END marker packet for: teid:%x\n", ntohl(msgHdr->teid));
|
LOG_D(GTPU,"[%d] Received END marker packet for: teid:%x\n", h, ntohl(msgHdr->teid));
|
||||||
return !GTPNOK;
|
return !GTPNOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -731,7 +735,7 @@ static int Gtpv1uHandleGpdu(int h,
|
|||||||
Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *) msgBuf;
|
Gtpv1uMsgHeaderT *msgHdr = (Gtpv1uMsgHeaderT *) msgBuf;
|
||||||
|
|
||||||
if ( msgHdr->version != 1 || msgHdr->PT != 1 ) {
|
if ( msgHdr->version != 1 || msgHdr->PT != 1 ) {
|
||||||
LOG_E(GTPU, "Received a packet that is not GTP header\n");
|
LOG_E(GTPU, "[%d] Received a packet that is not GTP header\n", h);
|
||||||
return GTPNOK;
|
return GTPNOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -741,7 +745,7 @@ static int Gtpv1uHandleGpdu(int h,
|
|||||||
auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid));
|
auto tunnel=inst->te2ue_mapping.find(ntohl(msgHdr->teid));
|
||||||
|
|
||||||
if ( tunnel == inst->te2ue_mapping.end() ) {
|
if ( tunnel == inst->te2ue_mapping.end() ) {
|
||||||
LOG_E(GTPU,"Received a incoming packet on unknown teid (%x) Dropping!\n", msgHdr->teid);
|
LOG_E(GTPU,"[%d] Received a incoming packet on unknown teid (%x) Dropping!\n", h, ntohl(msgHdr->teid));
|
||||||
pthread_mutex_unlock(&globGtp.gtp_lock);
|
pthread_mutex_unlock(&globGtp.gtp_lock);
|
||||||
return GTPNOK;
|
return GTPNOK;
|
||||||
}
|
}
|
||||||
@@ -784,9 +788,9 @@ static int Gtpv1uHandleGpdu(int h,
|
|||||||
mode,
|
mode,
|
||||||
&sourceL2Id,
|
&sourceL2Id,
|
||||||
&destinationL2Id) )
|
&destinationL2Id) )
|
||||||
LOG_E(GTPU,"down layer refused incoming packet\n");
|
LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h);
|
||||||
|
|
||||||
LOG_D(GTPU,"Received a %d bytes packet for: teid:%x\n",
|
LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h,
|
||||||
msgBufLen-offset,
|
msgBufLen-offset,
|
||||||
ntohl(msgHdr->teid));
|
ntohl(msgHdr->teid));
|
||||||
return !GTPNOK;
|
return !GTPNOK;
|
||||||
@@ -801,14 +805,14 @@ void gtpv1uReceiver(int h) {
|
|||||||
|
|
||||||
if ((udpDataLen = recvfrom(h, udpData, sizeof(udpData), 0,
|
if ((udpDataLen = recvfrom(h, udpData, sizeof(udpData), 0,
|
||||||
(struct sockaddr *)&addr, &from_len)) < 0) {
|
(struct sockaddr *)&addr, &from_len)) < 0) {
|
||||||
LOG_E(GTPU, "Recvfrom failed on %d (%s)\n", h, strerror(errno));
|
LOG_E(GTPU, "[%d] Recvfrom failed (%s)\n", h, strerror(errno));
|
||||||
return;
|
return;
|
||||||
} else if (udpDataLen == 0) {
|
} else if (udpDataLen == 0) {
|
||||||
LOG_W(GTPU, "Recvfrom returned 0\n");
|
LOG_W(GTPU, "[%d] Recvfrom returned 0\n", h);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
uint8_t msgType = *((uint8_t *)(udpData + 1));
|
uint8_t msgType = *((uint8_t *)(udpData + 1));
|
||||||
LOG_D(GTPU, "Received GTP data, msg type: %x\n", msgType);
|
LOG_D(GTPU, "[%d] Received GTP data, msg type: %x\n", h, msgType);
|
||||||
|
|
||||||
switch(msgType) {
|
switch(msgType) {
|
||||||
case GTP_ECHO_RSP:
|
case GTP_ECHO_RSP:
|
||||||
@@ -835,7 +839,7 @@ void gtpv1uReceiver(int h) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG_E(GTPU, "Received a GTP packet of unknown type: %d\n",msgType);
|
LOG_E(GTPU, "[%d] Received a GTP packet of unknown type: %d\n", h, msgType);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user