diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index 57738a3183..c22e6fabec 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -238,6 +238,26 @@ pipeline { } } } + stage ("5G L2 Simulators") { + when { expression {doMandatoryTests} } + steps { + script { + triggerSlaveJob ('RAN-L2-Sim-Test-5G', 'Test-L2-Sim-Container-5G') + } + } + post { + always { + script { + finalizeSlaveJob('RAN-L2-Sim-Test-5G') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } stage ("NSA B200 Sanity Check") { when { expression {doMandatoryTests} } steps { diff --git a/ci-scripts/as_ue/oai_ext_app.sh b/ci-scripts/as_ue/oai_ext_app.sh new file mode 100755 index 0000000000..727e2b5db2 --- /dev/null +++ b/ci-scripts/as_ue/oai_ext_app.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +ue_id="$1" # UE id +duration="$2" # Sim duration + +shift +shift + +function end +{ + exit 0 +} +trap end INT TERM + +echo "ip netns exec $ue_id $@ > /tmp/test_${ue_id}.log" +ip netns exec $ue_id $@ > /tmp/test_$ue_id.log + + diff --git a/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg new file mode 100644 index 0000000000..a9299b67e3 --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-3xue-noPing-SATest.cfg @@ -0,0 +1,172 @@ +/* UE simulator configuration */ + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 40 +#define UE_COUNT 3 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129 + + +log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", +log_filename: "/tmp/ue0.log", + +/* Enable remote API and Web interface */ +com_addr: "0.0.0.0:9002", + +include "rf_driver/1chan.cfg", + +/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: true, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + band: 78, + dl_nr_arfcn:621312, + ssb_nr_arfcn:621312, + + //band: 41, + //dl_nr_arfcn:517020, + //ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], +}], + + +/* Enable it to allow sim_events to be handled remotely */ +//rue_bind_addr: "127.0.10.11", + + + +ue_list: [ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 0, + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + }, /*end UE object 0*/ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 1, + "imsi": "208970100001128", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + }, /*end UE object 1*/ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 2, + "imsi": "208970100001129", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + } /*end UE object 2*/ + ],/*end UE list*/ +}/*end json*/ + diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg new file mode 100644 index 0000000000..3405f99a59 --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-multi-ue-1xPing-SATest.cfg @@ -0,0 +1,142 @@ +/* UE simulator configuration */ + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 40 +#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129 + + +log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", +log_filename: "/tmp/ue0.log", + +/* Enable remote API and Web interface */ +com_addr: "0.0.0.0:9002", + +include "rf_driver/1chan.cfg", + +/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: true, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + band: 78, + dl_nr_arfcn:621312, + ssb_nr_arfcn:621312, + + //band: 41, + //dl_nr_arfcn:517020, + //ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], +}], + + +/* Enable it to allow sim_events to be handled remotely */ +//rue_bind_addr: "127.0.10.11", + + + +ue_list: [ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 1, + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + }, /*end UE object 0*/ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 2, + "imsi": "208970100001128", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 15, + end_time: 25, + "args":["ping 192.168.70.136"], + "event":"ext_app" + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + } /*end UE object 1*/ + ],/*end UE list*/ +}/*end json*/ diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg new file mode 100644 index 0000000000..eaa9b894fc --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-multi-ue-2xPing-SATest.cfg @@ -0,0 +1,150 @@ +/* UE simulator configuration */ + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 40 +#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129 + + +log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", +log_filename: "/tmp/ue0.log", + +/* Enable remote API and Web interface */ +com_addr: "0.0.0.0:9002", + +include "rf_driver/1chan.cfg", + +/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: true, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + band: 78, + dl_nr_arfcn:621312, + ssb_nr_arfcn:621312, + + //band: 41, + //dl_nr_arfcn:517020, + //ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], +}], + + +/* Enable it to allow sim_events to be handled remotely */ +//rue_bind_addr: "127.0.10.11", + + + +ue_list: [ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 1, + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 15, + end_time: 25, + "args":["ping 192.168.70.136"], + "event":"ext_app" + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + }, /*end UE object 0*/ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 2, + "imsi": "208970100001128", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 15, + end_time: 25, + "args":["ping 192.168.70.136"], + "event":"ext_app" + }, + { + event: "power_off", + start_time: 30, + } + ] /*end sim events */ + } /*end UE object 1*/ + ],/*end UE list*/ +}/*end json*/ diff --git a/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg b/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg new file mode 100644 index 0000000000..9ebb3e01c5 --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-multi-ue-2xPingSeq-SATest.cfg @@ -0,0 +1,150 @@ +/* UE simulator configuration */ + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 40 +#define UE_COUNT 2 // number of simulated UEs 208970100001127, 208970100001128, 208970100001129 + + +log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", +log_filename: "/tmp/ue0.log", + +/* Enable remote API and Web interface */ +com_addr: "0.0.0.0:9002", + +include "rf_driver/1chan.cfg", + +/* If true, allow the simulation of several UEs at the same time and allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: true, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + band: 78, + dl_nr_arfcn:621312, + ssb_nr_arfcn:621312, + + //band: 41, + //dl_nr_arfcn:517020, + //ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], +}], + + +/* Enable it to allow sim_events to be handled remotely */ +//rue_bind_addr: "127.0.10.11", + + + +ue_list: [ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 1, + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 20, + end_time: 30, + "args":["ping 192.168.70.136"], + "event":"ext_app" + }, + { + event: "power_off", + start_time: 60, + } + ] /*end sim events */ + }, /*end UE object 0*/ + { + /* UE capabilities */ + /* USIM data */ + "ue_id" : 2, + "imsi": "208970100001128", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + sim_events: [ + { + event: "power_on", + start_time: 5, + }, + { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 40, + end_time: 50, + "args":["ping 192.168.70.136"], + "event":"ext_app" + }, + { + event: "power_off", + start_time: 60, + } + ] /*end sim events */ + } /*end UE object 1*/ + ],/*end UE list*/ +}/*end json*/ diff --git a/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg b/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg new file mode 100644 index 0000000000..ba22cbb233 --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-ue-Ping-SATest.cfg @@ -0,0 +1,113 @@ +/* UE simulator configuration */ + + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 40 + + + log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", + log_filename: "/tmp/ue1.log", + + /* Enable remote API and Web interface */ + com_addr: "0.0.0.0:9002", + + include "rf_driver/1chan.cfg", + + /* If true, allow the simulation of several UEs at the same time and + allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: false, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + band: 78, + dl_nr_arfcn:621312, + ssb_nr_arfcn:621312, + + //band: 41, + //dl_nr_arfcn:517020, + //ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], + }], + + + + + /* Enable it to allow sim_events to be handled remotely */ + //rue_bind_addr: "127.0.10.11", + + ue_list: [ + { + /* UE capabilities */ + + /* USIM data */ + + + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + + + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 66051, + }, + ], + + default_pdu_session_snssai: { + sst: 1, + sd: 66051, + }, + + + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + + sim_events: [{ + event: "power_on", + start_time: 5, + }, { + "tag": "ping", + "prog":"oai_ext_app.sh", + start_time: 15, + end_time: 25, + "args":["ping 192.168.70.136"], + "event":"ext_app" + + }, + { + event: "power_off", + start_time: 30, + }] + } + ], +} diff --git a/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg b/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg new file mode 100644 index 0000000000..841dafb746 --- /dev/null +++ b/ci-scripts/as_ue/oaicicd-ue-iperf-SATest.cfg @@ -0,0 +1,109 @@ +/* UE simulator configuration */ + + + +/* UE simulator configuration file version 2021-06-17 + * LTE / 5G Non StandAlone + * Copyright (C) 2019-2021 Amarisoft + */ +{ +#define N_ANTENNA_DL 1 +#define TDD 1 +#define CELL_BANDWIDTH 20 + + + log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,rrc.level=debug,rrc.max_size=1", + log_filename: "/tmp/ue0.log", + + /* Enable remote API and Web interface */ + com_addr: "0.0.0.0:9002", + + include "rf_driver/1chan.cfg", + + /* If true, allow the simulation of several UEs at the same time and + allow dynamic UE creation from remote API */ + +cell_groups: [{ + group_type: "nr", + multi_ue: false, + cells: [{ + rf_port: 0, + bandwidth: CELL_BANDWIDTH, +#if TDD == 1 + // band: 78, + // dl_nr_arfcn:621312, + // ssb_nr_arfcn:621312,*/ + + band: 41, + dl_nr_arfcn:517020, + ssb_nr_arfcn:516990, +#else + band: 7, + dl_nr_arfcn: 536020, + ssb_nr_arfcn: 535930, + ssb_subcarrier_spacing: 15, +#endif + subcarrier_spacing: 30, + n_antenna_dl: N_ANTENNA_DL, + n_antenna_ul: 1, + rx_to_tx_latency:2, + }], + }], + + + + + /* Enable it to allow sim_events to be handled remotely */ + //rue_bind_addr: "127.0.10.11", + + ue_list: [ + { + /* UE capabilities */ + + /* USIM data */ + + "imsi": "208970100001127", + "K": "fec86ba6eb707ed08905757b1bb44b8f", + "sim_algo":"milenage", + "op": "1006020f0a478bf6b699f15c062e42b3", + + + as_release: 15, + ue_category: "nr", + apn:"oai", + attach_pdn_type:"ipv4", + default_nssai: [ + { + sst: 1, + sd: 1, + }, + ], + + default_pdu_session_snssai: { + sst: 1, + sd: 1, + }, + + + /* Enable it to allow sim_events to be handled remotely */ + //rue_addr: "127.1.0.0", + + /* Enable it to create a TUN interface for each UE PDN */ + tun_setup_script: "ue-ifup", + + sim_events: [{ + event: "power_on", + start_time: 5, + }, { + event: "ext_app", + start_time: 15, + end_time: 25, + prog: "ext_app.sh", + args: ["iperf", " -c 172.21.10.5", " -u"," -b 1M"," -i 1"," -t 10"] + }, { + event: "power_off", + start_time: 30, + }] + } + ], +} diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml index 0a915740f2..89bda5fa92 100644 --- a/ci-scripts/ci_ueinfra.yaml +++ b/ci-scripts/ci_ueinfra.yaml @@ -39,6 +39,53 @@ nrmodule2_quectel: StartCommands : - sudo -S ip link set dev wwan1 mtu 1500 MTU : 1500 + +#single UE single ping +amarisoft_ue_1: + ID: amarisoft_ue_1 + State : enabled + Kind : amarisoft + #not required for AS config but needed for py script + WakeupScript : none + DetachScript : none + #end + Cmd : /root/NV17-12-21/ue/lteue + Config : /root/NV17-12-21/ue/config/oaicicd-ue-Ping-SATest.cfg + Duration : 60 + Ping : /tmp/test_ue1.log + UELog : /tmp/ue1.log + HostIPAddress : 192.168.18.89 + HostUsername : root + HostPassword : toor + HostSourceCodePath : /tmp + + +#an other scenario example +#notice : this will not work as such, only suggestion for multi ue scenario +amarisoft_ue_2: + ID: amarisoft_ue_2 + State : enabled + Kind : amarisoft + #not required for AS config but needed for py script + WakeupScript : none + DetachScript : none + #end + Cmd : /root/NV17-12-21/ue/lteue + Config : /root/NV17-12-21/ue/config/xxxxxxx.cfg #to be updated for an other scenario + Duration : 60 + Ping : + - /tmp/test_ue1.log #to be updated fo an other scenario + - /tmp/test_ue2.log #could be a list for a multi ue scenario + UELog : + - /tmp/ue1.log + - /tmp/ue1.log + HostIPAddress : 192.168.18.89 + HostUsername : root + HostPassword : toor + HostSourceCodePath : /tmp + + +#do not remove dummy: ID: '' State : '' diff --git a/ci-scripts/cls_amarisoft_ue.py b/ci-scripts/cls_amarisoft_ue.py new file mode 100644 index 0000000000..367bfaac3f --- /dev/null +++ b/ci-scripts/cls_amarisoft_ue.py @@ -0,0 +1,81 @@ +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# +# Required Python Version +# Python 3.x +# +#--------------------------------------------------------------------- + +#to use isfile +import os +import sys +import logging +#to create a SSH object locally in the methods +import sshconnection +#time.sleep +import time + + +import re +import subprocess + +from datetime import datetime + + +class AS_UE: + + def __init__(self,Module): + #create attributes as in the UE dictionary + for k, v in Module.items(): + setattr(self, k, v) + + + + +#-----------------$ +#PUBLIC Methods$ +#-----------------$ + + def WaitEndScenario(self): + logging.debug('waiting for scenario duration') + time.sleep(int(self.Duration)) + + def KillASUE(self): + mySSH = sshconnection.SSHConnection() + mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword) + mySSH.command('killall --signal SIGKILL lteue-avx2', '#', 5) + mySSH.close() + + def RunScenario(self): + mySSH = sshconnection.SSHConnection() + mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword) + + logging.debug("Deleting old artifacts :") + cmd='rm -rf ' + self.Ping + ' ' + self.UELog + mySSH.command(cmd,'#',5) + logging.debug("Running scenario :") + cmd='echo $USER; nohup '+self.Cmd + ' ' + self.Config + ' &' + mySSH.command(cmd,'#',5) + + mySSH.close() + + + diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index e24a0325c3..8092febe39 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -93,6 +93,7 @@ class Containerize(): self.allImagesSize = {} self.collectInfo = {} + self.deployedContainers = [] self.tsharkStarted = False self.pingContName = '' self.pingOptions = '' @@ -682,12 +683,28 @@ class Containerize(): cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a' count = 0 healthy = 0 + newContainers = [] while (count < 10): count += 1 containerStatus = [] deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30) healthy = 0 for state in deployStatus.split('\n'): + res = re.search('Name|----------', state) + if res is not None: + continue + if len(state) == 0: + continue + res = re.search('^(?P[a-zA-Z0-9\-\_]+) ', state) + if res is not None: + cName = res.group('container_name') + found = False + for alreadyDeployed in self.deployedContainers: + if cName == alreadyDeployed: + found = True + if not found: + newContainers.append(cName) + self.deployedContainers.append(cName) if re.search('Up \(healthy\)', state) is not None: healthy += 1 if re.search('rfsim4g-db-init.*Exit 0', state) is not None: @@ -698,16 +715,33 @@ class Containerize(): else: time.sleep(10) + imagesInfo = '' + for newCont in newContainers: + cmd = 'docker inspect -f "{{.Config.Image}}" ' + newCont + imageName = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30) + imageName = str(imageName).strip() + cmd = 'docker image inspect --format "{{.RepoTags}}\t{{.Size}}\t{{.Created}}" ' + imageName + imagesInfo += subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30) + + html_queue = SimpleQueue() + html_cell = '
\n'
+		for imageInfo in imagesInfo.split('\n'):
+			html_cell += imageInfo[:-11] + '\n'
+		html_cell += '\n'
+		for cState in containerStatus:
+			html_cell += cState + '\n'
+		html_cell += '
' + html_queue.put(html_cell) if count == 100 and healthy == self.nb_healthy[0]: if self.tsharkStarted == False: logging.debug('Starting tshark on public network') self.CaptureOnDockerNetworks() - HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlTestRowQueue('n/a', 'OK', 1, html_queue) for cState in containerStatus: logging.debug(cState) logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m') else: - HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK) + HTML.CreateHtmlTestRowQueue('Could not deploy in time', 'KO', 1, html_queue) for cState in containerStatus: logging.debug(cState) logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m') @@ -730,10 +764,12 @@ class Containerize(): # Excluding any traffic from NR-UE containers (192.168.71.150 and 192.168.71.151) # From the ext-dn, keeping only PING traffic cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not host 192.168.71.150 and not host 192.168.71.151 and not arp and not port 53 and not port 2152 and not port 2153)"' + elif re.search('5g_l2sim', self.yamlPath[0]) is not None: + cmd = 'sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)"' else: return for name in networkNames.split('\n'): - if re.search('rfsim', name) is not None: + if re.search('rfsim', name) is not None or re.search('l2sim', name) is not None: cmd += ' -i ' + name cmd += ' -w /tmp/capture_' ymlPath = self.yamlPath[0].split('/') @@ -785,7 +821,7 @@ class Containerize(): # Analyzing log file(s)! listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du'] for container in listOfPossibleRanContainers: - filenames = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log' + filenames = self.yamlPath[0] + '/*-oai-' + container + '.log' cmd = 'ls ' + filenames containerStatus = True try: @@ -808,7 +844,7 @@ class Containerize(): listOfPossibleUeContainers = ['lte-ue*', 'nr-ue*'] for container in listOfPossibleUeContainers: - filenames = self.yamlPath[0] + '/rfsim?g-oai-' + container + '.log' + filenames = self.yamlPath[0] + '/*-oai-' + container + '.log' cmd = 'ls ' + filenames containerStatus = True try: @@ -857,6 +893,7 @@ class Containerize(): logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m') return + self.deployedContainers = [] # Cleaning any created tmp volume cmd = 'docker volume prune --force || true' logging.debug(cmd) @@ -869,6 +906,40 @@ class Containerize(): HTML.CreateHtmlTestRow('n/a', 'KO', CONST.ALL_PROCESSES_OK) logging.info('\u001B[1m Undeploying OAI Object(s) FAIL\u001B[0m') + def StatsFromGenObject(self, HTML): + self.exitStatus = 0 + ymlPath = self.yamlPath[0].split('/') + logPath = '../cmake_targets/log/' + ymlPath[1] + + # if the containers are running, recover the logs! + cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all' + logging.debug(cmd) + deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30) + cmd = 'docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" ' + anyLogs = False + for state in deployStatus.split('\n'): + res = re.search('Name|----------', state) + if res is not None: + continue + if len(state) == 0: + continue + res = re.search('^(?P[a-zA-Z0-9\-\_]+) ', state) + if res is not None: + anyLogs = True + cmd += res.group('container_name') + ' ' + message = '' + if anyLogs: + logging.debug(cmd) + stats = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30) + for statLine in stats.split('\n'): + logging.debug(statLine) + message += statLine + '\n' + + html_queue = SimpleQueue() + html_cell = '
\n' + message + '
' + html_queue.put(html_cell) + HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue) + def PingFromContainer(self, HTML, RAN, UE): self.exitStatus = 0 ymlPath = self.yamlPath[0].split('/') diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py index 0865d4efb5..33910f1f9b 100644 --- a/ci-scripts/cls_oaicitest.py +++ b/ci-scripts/cls_oaicitest.py @@ -55,6 +55,7 @@ import constants as CONST import sshconnection import cls_module_ue +import cls_amarisoft_ue import cls_ci_ueinfra #class defining the multi Ue infrastrucure logging.getLogger("matplotlib").setLevel(logging.WARNING) @@ -419,49 +420,63 @@ class OaiCiTest(): for job in multi_jobs: job.join() HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) - else: #if an ID is specified, it is a module from the yaml infrastructure file - #RH - Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) - Module_UE.ue_trace=ue_trace - is_module=Module_UE.CheckCMProcess(EPC.Type) - if is_module: - Module_UE.EnableTrace() - time.sleep(5) + else: #if an ID is specified, it is a UE from the yaml infrastructure file + ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind'] + logging.debug("Detected UE Kind : " + ue_kind) - # Looping attach / detach / wait to be successful at least once - cnt = 0 - status = -1 - while cnt < 4: - Module_UE.Command("wup") - logging.debug("Waiting for IP address to be assigned") - time.sleep(20) - logging.debug("Retrieve IP address") - status=Module_UE.GetModuleIPAddress() - if status==0: - cnt = 10 - else: - cnt += 1 - Module_UE.Command("detach") + #case it is a quectel module (only 1 at a time supported at the moment) + if ue_kind == 'quectel': + Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) + Module_UE.ue_trace=ue_trace + is_module=Module_UE.CheckCMProcess(EPC.Type) + if is_module: + Module_UE.EnableTrace() + time.sleep(5) + + # Looping attach / detach / wait to be successful at least once + cnt = 0 + status = -1 + while cnt < 4: + Module_UE.Command("wup") + logging.debug("Waiting for IP address to be assigned") time.sleep(20) + logging.debug("Retrieve IP address") + status=Module_UE.GetModuleIPAddress() + if status==0: + cnt = 10 + else: + cnt += 1 + Module_UE.Command("detach") + time.sleep(20) - if cnt == 10 and status == 0: - HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK) - logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress) - #execute additional commands from yaml file after UE attach - SSH = sshconnection.SSHConnection() - SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword) - if hasattr(Module_UE,'StartCommands'): - for startcommand in Module_UE.StartCommands: - cmd = 'echo ' + Module_UE.HostPassword + ' | ' + startcommand - SSH.command(cmd,'\$',5) - SSH.close() - #check that the MTU is as expected / requested - Module_UE.CheckModuleMTU() - else: #status==-1 failed to retrieve IP address - HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE) - self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS) - return - + if cnt == 10 and status == 0: + HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK) + logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress) + #execute additional commands from yaml file after UE attach + SSH = sshconnection.SSHConnection() + SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword) + if hasattr(Module_UE,'StartCommands'): + for startcommand in Module_UE.StartCommands: + cmd = 'echo ' + Module_UE.HostPassword + ' | ' + startcommand + SSH.command(cmd,'\$',5) + SSH.close() + #check that the MTU is as expected / requested + Module_UE.CheckModuleMTU() + else: #status==-1 failed to retrieve IP address + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.UE_IP_ADDRESS_ISSUE) + self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS) + return + + #case it is a amarisoft ue (only 1 at a time supported at the moment) + elif ue_kind == 'amarisoft': + AS_UE = cls_amarisoft_ue.AS_UE(InfraUE.ci_ue_infra[self.ue_id]) + HTML.CreateHtmlTestRow(AS_UE.Config, 'OK', CONST.ALL_PROCESSES_OK) + AS_UE.RunScenario() + AS_UE.WaitEndScenario() + AS_UE.KillASUE() + + else: + logging.debug("Incorrect UE Kind was detected") def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE,InfraUE,CONTAINERS): @@ -1570,16 +1585,23 @@ class OaiCiTest(): SSH = sshconnection.SSHConnection() # Launch ping on the EPC side (true for ltebox and old open-air-cn) # But for OAI-Rel14-CUPS, we launch from python executor + ping_status = 0 launchFromEpc = True launchFromModule = False + launchFromASUE = False if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE): launchFromEpc = False #if module, ping from module to EPC if self.ue_id!='': - launchFromEpc = False - launchfromModule = True - - ping_time = re.findall("-c (\d+)",str(self.ping_args)) + if (re.match('amarisoft', self.ue_id, re.IGNORECASE)): + launchFromEpc = False + launchFromASUE = True + else: + launchFromEpc = False + launchFromModule = True + #no ping args for ASUE + if self.ping_args!='': + ping_time = re.findall("-c (\d+)",str(self.ping_args)) if launchFromEpc: SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password) @@ -1597,14 +1619,14 @@ class OaiCiTest(): #copy the ping log file to have it locally for analysis (ping stats) SSH.copyin(EPC.IPAddress, EPC.UserName, EPC.Password, EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '.') else: - if launchfromModule == False: + if (launchFromModule == False) and (launchFromASUE == False): #ping log file is on the python executor cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' > ping_' + self.testCase_id + '_' + device_id + '.log 2>&1' message = cmd + '\n' logging.debug(cmd) ret = subprocess.run(cmd, shell=True) ping_status = ret.returncode - #copy the ping log file to an other folder for log collection (source and destination are EPC) + #copy the ping log file to an other folder for log collection (source and desti elif (launchfromModule == True) and (launchfromASUE == False): #launch from Modulenation are EPC) SSH.copyout(EPC.IPAddress, EPC.UserName, EPC.Password, 'ping_' + self.testCase_id + '_' + device_id + '.log', EPC.SourceCodePath + '/scripts') #copy the ping log file to have it locally for analysis (ping stats) logging.debug(EPC.SourceCodePath + 'ping_' + self.testCase_id + '_' + device_id + '.log') @@ -1614,7 +1636,8 @@ class OaiCiTest(): #cat is executed on EPC SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5) ping_log_file='/scripts/ping_' + self.testCase_id + '_' + device_id + '.log' - else: #launch from Module + + elif (launchFromModule == True) and (launchFromASUE == False): #launch from Module SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword) #target address is different depending on EPC type if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE): @@ -1626,13 +1649,27 @@ class OaiCiTest(): #ping from module NIC rather than IP address to make sure round trip is over the air cmd = 'ping -I ' + Module_UE.UENetwork + ' ' + self.ping_args + ' ' + Target + ' > ping_' + self.testCase_id + '_' + self.ue_id + '.log 2>&1' SSH.command(cmd,'\$',int(ping_time[0])*1.5) + #copy the ping log file to have it locally for analysis (ping stats) SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'ping_' + self.testCase_id + '_' + self.ue_id + '.log', '.') #cat is executed locally SSH.command('cat ping_' + self.testCase_id + '_' + self.ue_id + '.log', '\$', 5) ping_log_file='ping_' + self.testCase_id + '_' + self.ue_id + '.log' - ping_status=0 + + elif (launchFromASUE == True): + #ping was already executed when running scenario + #we only need to retrieve ping log file, whose location is in the ci_ueinfra.yaml + logging.debug("Get logs from AS server : " + Module_UE.Ping + ", " + Module_UE.UELog) + SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, Module_UE.Ping, '.') + SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, Module_UE.UELog, '.') + logging.debug("Ping analysis from Amarisoft scenario") + path,ping_log_file = os.path.split(Module_UE.Ping) + SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword) + SSH.command('cat ' + Module_UE.Ping, '\#', 5) + + else: + ping_status=-1 # TIMEOUT CASE if ping_status < 0: @@ -1680,28 +1717,30 @@ class OaiCiTest(): #adding extra ping stats from local file #ping_log_file variable is defined above in this function, depending on device/ue - logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file) - ping_stat=GetPingTimeAnalysis(RAN,ping_log_file,self.ping_rttavg_threshold) ping_stat_msg='' - if (ping_stat!=-1) and (len(ping_stat)!=0): - ping_stat_msg+='Ping stats before removing largest value : \n' - ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_0'])) + 'ms \n' - ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_0'])) + 'ms \n' - ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_0'])) + 'ms \n' - ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_0'])) + 'ms \n' - ping_stat_msg+='Max Index : ' + str(ping_stat['max_loc']) + '\n' - ping_stat_msg+='Ping stats after removing largest value : \n' - ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_1'])) + 'ms \n' - ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_1'])) + 'ms \n' - ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_1'])) + 'ms \n' - ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_1'])) + 'ms \n' + if launchFromASUE == False : #skip in case of AS UE (for the moment) + logging.debug('Analyzing Ping log file : ' + os.getcwd() + '/' + ping_log_file) + ping_stat=GetPingTimeAnalysis(RAN,ping_log_file,self.ping_rttavg_threshold) + + if (ping_stat!=-1) and (len(ping_stat)!=0): + ping_stat_msg+='Ping stats before removing largest value : \n' + ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_0'])) + 'ms \n' + ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_0'])) + 'ms \n' + ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_0'])) + 'ms \n' + ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_0'])) + 'ms \n' + ping_stat_msg+='Max Index : ' + str(ping_stat['max_loc']) + '\n' + ping_stat_msg+='Ping stats after removing largest value : \n' + ping_stat_msg+='RTT(Min) : ' + str("{:.2f}".format(ping_stat['min_1'])) + 'ms \n' + ping_stat_msg+='RTT(Mean) : ' + str("{:.2f}".format(ping_stat['mean_1'])) + 'ms \n' + ping_stat_msg+='RTT(Median) : ' + str("{:.2f}".format(ping_stat['median_1'])) + 'ms \n' + ping_stat_msg+='RTT(Max) : ' + str("{:.2f}".format(ping_stat['max_1'])) + 'ms \n' #building html message qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg + '\n' + ping_stat_msg #checking packet loss compliance packetLossOK = True - if packetloss is not None: + if (packetloss is not None) : if float(packetloss) > float(self.ping_packetloss_threshold): qMsg += '\nPacket Loss too high' logging.debug('\u001B[1;37;41m Packet Loss too high; Target: '+ self.ping_packetloss_threshold + '%\u001B[0m') @@ -1729,6 +1768,7 @@ class OaiCiTest(): lock.release() SSH.close() except: + logging.debug('exit from Ping_Common except') os.kill(os.getppid(),signal.SIGUSR1) def PingNoS1_wrong_exit(self, qMsg,HTML): @@ -1856,11 +1896,21 @@ class OaiCiTest(): HTML.CreateHtmlTestRow(self.ping_args, 'KO', CONST.UE_IP_ADDRESS_ISSUE) self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS) return - else: - self.UEIPAddresses=[] - Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) - Module_UE.GetModuleIPAddress() - self.UEIPAddresses.append(Module_UE.UEIPAddress) + else: #if an ID is specified, it is a UE from the yaml infrastructure file + ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind'] + logging.debug("Detected UE Kind : " + ue_kind) + + if ue_kind == 'quectel': + self.UEIPAddresses=[] + Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) + Module_UE.GetModuleIPAddress() + self.UEIPAddresses.append(Module_UE.UEIPAddress) + elif ue_kind == 'amarisoft': + self.UEIPAddresses=['AS UE IP'] + Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) + else: + logging.debug("Incorrect UE Kind was detected") + logging.debug(self.UEIPAddresses) multi_jobs = [] i = 0 @@ -1871,6 +1921,7 @@ class OaiCiTest(): device_id = self.UEDevices[i] else: device_id = Module_UE.ID + "-" + Module_UE.Kind + logging.debug(device_id) p = Process(target = self.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,EPC,Module_UE,RAN,)) p.daemon = True p.start() @@ -3156,10 +3207,12 @@ class OaiCiTest(): nrFoundDCI = 0 nrCRCOK = 0 mbms_messages = 0 + nbPduSessAccept = 0 + nbPduDiscard = 0 HTML.htmlUEFailureMsg='' global_status = CONST.ALL_PROCESSES_OK for line in ue_log_file.readlines(): - result = re.search('nr_synchro_time', str(line)) + result = re.search('nr_synchro_time|Starting NR UE soft modem', str(line)) if result is not None: nrUEFlag = True if nrUEFlag: @@ -3172,6 +3225,15 @@ class OaiCiTest(): result = re.search('CRC OK', str(line)) if result is not None: nrCRCOK += 1 + result = re.search('Received PDU Session Establishment Accept', str(line)) + if result is not None: + nbPduSessAccept += 1 + result = re.search('warning: discard PDU, sn out of window', str(line)) + if result is not None: + nbPduDiscard += 1 + result = re.search('--nfapi 5 --node-number 2 --sa', str(line)) + if result is not None: + frequency_found = True result = re.search('Exiting OAI softmodem', str(line)) if result is not None: exitSignalReceived = True @@ -3302,21 +3364,29 @@ class OaiCiTest(): HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' if nrUEFlag: if nrDecodeMib > 0: - statMsg = 'UE showed ' + str(nrDecodeMib) + ' MIB decode message(s)' + statMsg = 'UE showed ' + str(nrDecodeMib) + ' "MIB decode" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' if nrFoundDCI > 0: - statMsg = 'UE showed ' + str(nrFoundDCI) + ' DCI found message(s)' + statMsg = 'UE showed ' + str(nrFoundDCI) + ' "DCI found" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' if nrCRCOK > 0: - statMsg = 'UE showed ' + str(nrCRCOK) + ' PDSCH decoding message(s)' + statMsg = 'UE showed ' + str(nrCRCOK) + ' "PDSCH decoding" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' if not frequency_found: statMsg = 'NR-UE could NOT synch!' logging.error('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' + if nbPduSessAccept > 0: + statMsg = 'UE showed ' + str(nbPduSessAccept) + ' "Received PDU Session Establishment Accept" message(s)' + logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') + HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' + if nbPduDiscard > 0: + statMsg = 'UE showed ' + str(nbPduDiscard) + ' "warning: discard PDU, sn out of window" message(s)' + logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') + HTML.htmlUEFailureMsg=HTML.htmlUEFailureMsg + statMsg + '\n' if uciStatMsgCount > 0: statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') @@ -3447,16 +3517,23 @@ class OaiCiTest(): job.join() HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) else: #if an ID is specified, it is a module from the yaml infrastructure file - Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) - Module_UE.ue_trace=ue_trace - Module_UE.Command("detach") - Module_UE.DisableTrace() - Module_UE.DisableCM() - archive_destination=Module_UE.LogCollect() - if Module_UE.ue_trace=='yes': - HTML.CreateHtmlTestRow('QLog at : '+archive_destination, 'OK', CONST.ALL_PROCESSES_OK) + ue_kind = InfraUE.ci_ue_infra[self.ue_id]['Kind'] + logging.debug("Detected UE Kind : " + ue_kind) + if ue_kind == 'quectel': + Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) + Module_UE.ue_trace=ue_trace + Module_UE.Command("detach") + Module_UE.DisableTrace() + Module_UE.DisableCM() + archive_destination=Module_UE.LogCollect() + if Module_UE.ue_trace=='yes': + HTML.CreateHtmlTestRow('QLog at : '+archive_destination, 'OK', CONST.ALL_PROCESSES_OK) + else: + HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK) + elif ue_kind == 'amarisoft': + HTML.CreateHtmlTestRow('AS UE is already terminated', 'OK', CONST.ALL_PROCESSES_OK) else: - HTML.CreateHtmlTestRow('QLog trace is disabled', 'OK', CONST.ALL_PROCESSES_OK) + logging.debug("Incorrect UE Kind was detected") def TerminateOAIUE(self,HTML,RAN,COTS_UE,EPC,InfraUE,CONTAINERS): SSH = sshconnection.SSHConnection() diff --git a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf index 480ba3952a..dfc9beda71 100644 --- a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf +++ b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf @@ -231,7 +231,7 @@ RUs = ( local_rf = "yes" nb_tx = 2 nb_rx = 2 - att_tx = 0 + att_tx = 10 att_rx = 5; bands = [38]; max_pdschReferenceSignalPower = -27; diff --git a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf index a98179197f..40f6f911b1 100644 --- a/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/episci_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -33,9 +33,6 @@ gNBs = ////////// Physical parameters: ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; - ul_prbblacklist = "51,52,53,54" min_rxtxtime = 6; pdcch_ConfigSIB1 = ( { @@ -73,15 +70,6 @@ gNBs = #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -136,19 +124,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf deleted file mode 100644 index 22ffb4cd3d..0000000000 --- a/ci-scripts/conf_files/episci/episci_nr-ue0.nfapi.conf +++ /dev/null @@ -1,45 +0,0 @@ -log_config = { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; -}; - -uicc0 = { -imsi = "208950000000031"; -key = "0c0a34601d4f07677303652c0462535b"; -opc= "63bfa50ee6523365ff14c1f45f88737d"; -dnn= "oai"; -nssai_sst=222; -nssai_sd=123; -} - -L1s = ( - { - num_cc = 1; - tr_n_preference = "nfapi"; - local_n_if_name = "ens3"; - remote_n_address = "127.0.0.1"; //Proxy IP - local_n_address = "127.0.0.1"; - local_n_portc = 50600; - remote_n_portc = 50601; - local_n_portd = 50610; - remote_n_portd = 50611; - } -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 90 - att_rx = 0; - bands = [7,38,42,43]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 125; - } -); diff --git a/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf deleted file mode 100644 index 3d1c008f23..0000000000 --- a/ci-scripts/conf_files/episci/episci_nr-ue1.nfapi.conf +++ /dev/null @@ -1,45 +0,0 @@ -log_config = { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; -}; - -uicc0 = { -imsi = "208950000000032"; -key = "0c0a34601d4f07677303652c0462535b"; -opc= "63bfa50ee6523365ff14c1f45f88737d"; -dnn= "oai"; -nssai_sst=222; -nssai_sd=123; -} - -L1s = ( - { - num_cc = 1; - tr_n_preference = "nfapi"; - local_n_if_name = "ens3"; - remote_n_address = "127.0.0.1"; //Proxy IP - local_n_address = "127.0.0.1"; - local_n_portc = 50600; - remote_n_portc = 50601; - local_n_portd = 50610; - remote_n_portd = 50611; - } -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 90 - att_rx = 0; - bands = [7,38,42,43]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 125; - } -); diff --git a/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf deleted file mode 100644 index 73c3292809..0000000000 --- a/ci-scripts/conf_files/episci/episci_nr-ue2.nfapi.conf +++ /dev/null @@ -1,45 +0,0 @@ -log_config = { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; -}; - -uicc0 = { -imsi = "208950000000033"; -key = "0c0a34601d4f07677303652c0462535b"; -opc= "63bfa50ee6523365ff14c1f45f88737d"; -dnn= "oai"; -nssai_sst=222; -nssai_sd=123; -} - -L1s = ( - { - num_cc = 1; - tr_n_preference = "nfapi"; - local_n_if_name = "ens3"; - remote_n_address = "127.0.0.1"; //Proxy IP - local_n_address = "127.0.0.1"; - local_n_portc = 50600; - remote_n_portc = 50601; - local_n_portd = 50610; - remote_n_portd = 50611; - } -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 90 - att_rx = 0; - bands = [7,38,42,43]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 125; - } -); diff --git a/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf b/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf deleted file mode 100644 index 1f8f7306c6..0000000000 --- a/ci-scripts/conf_files/episci/episci_nr-ue3.nfapi.conf +++ /dev/null @@ -1,45 +0,0 @@ -log_config = { - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; -}; - -uicc0 = { -imsi = "208950000000034"; -key = "0c0a34601d4f07677303652c0462535b"; -opc= "63bfa50ee6523365ff14c1f45f88737d"; -dnn= "oai"; -nssai_sst=222; -nssai_sd=123; -} - -L1s = ( - { - num_cc = 1; - tr_n_preference = "nfapi"; - local_n_if_name = "ens3"; - remote_n_address = "127.0.0.1"; //Proxy IP - local_n_address = "127.0.0.1"; - local_n_portc = 50600; - remote_n_portc = 50601; - local_n_portd = 50610; - remote_n_portd = 50611; - } -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 1 - nb_rx = 1 - att_tx = 90 - att_rx = 0; - bands = [7,38,42,43]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 125; - } -); diff --git a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf index 9b3f205a0f..eac0b74633 100644 --- a/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/episci_rcc.band78.tm1.106PRB.nfapi.conf @@ -22,9 +22,14 @@ gNBs = ////////// Physical parameters: ssb_SubcarrierOffset = 31; //0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; - + min_rxtxtime = 6; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 12; + searchSpaceZero = 0; + } + ); servingCellConfigCommon = ( { #spCellConfigCommon @@ -54,15 +59,6 @@ gNBs = #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 0; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -117,18 +113,6 @@ gNBs = # restrictedSetConfig # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf index 0597e96245..edcd4f06ff 100644 --- a/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/episci/proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -33,9 +33,6 @@ gNBs = ////////// Physical parameters: ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 1; - ul_prbblacklist = "51,52,53,54" min_rxtxtime = 6; pdcch_ConfigSIB1 = ( @@ -74,15 +71,6 @@ gNBs = #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; #for DL slot - initialDLBWPmappingType_0 = 0; #0=typeA,1=typeB - initialDLBWPstartSymbolAndLength_0 = 40; #this is SS=1,L=13 - - initialDLBWPk0_1 = 0; #for mixed slot - initialDLBWPmappingType_1 = 0; - initialDLBWPstartSymbolAndLength_1 = 57; #this is SS=1,L=5 #uplinkConfigCommon #frequencyInfoUL @@ -137,19 +125,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; # used for UL slot - initialULBWPmappingType_0 = 1 - initialULBWPstartSymbolAndLength_0 = 41; # this is SS=0 L=13 - - initialULBWPk2_1 = 6; # used for mixed slot - initialULBWPmappingType_1 = 1; - initialULBWPstartSymbolAndLength_1 = 52; # this is SS=10 L=4 - - initialULBWPk2_2 = 7; # used for Msg.3 during RA - initialULBWPmappingType_2 = 1; - initialULBWPstartSymbolAndLength_2 = 52; # this is SS=10 L=4 - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf index 3410104199..f61039ff17 100644 --- a/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf +++ b/ci-scripts/conf_files/episci/proxy_rcc.band78.tm1.106PRB.nfapi.conf @@ -22,7 +22,7 @@ gNBs = ////////// Physical parameters: ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; + min_rxtxtime = 6; servingCellConfigCommon = ( { @@ -53,29 +53,6 @@ gNBs = #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 12; initialDLBWPsearchSpaceZero = 0; - #pdsch-ConfigCommon - #pdschTimeDomainAllocationList (up to 16 entries) - initialDLBWPk0_0 = 0; - #initialULBWPmappingType - #0=typeA,1=typeB - initialDLBWPmappingType_0 = 0; - #this is SS=1,L=13 - initialDLBWPstartSymbolAndLength_0 = 40; - - initialDLBWPk0_1 = 0; - initialDLBWPmappingType_1 = 0; - #this is SS=2,L=12 - initialDLBWPstartSymbolAndLength_1 = 53; - - initialDLBWPk0_2 = 0; - initialDLBWPmappingType_2 = 0; - #this is SS=1,L=12 - initialDLBWPstartSymbolAndLength_2 = 54; - - initialDLBWPk0_3 = 0; - initialDLBWPmappingType_3 = 0; - #this is SS=1,L=5 - initialDLBWPstartSymbolAndLength_3 = 57; #uplinkConfigCommon #frequencyInfoUL @@ -130,22 +107,6 @@ gNBs = # 0=unrestricted, 1=restricted type A, 2=restricted type B restrictedSetConfig = 0, - # pusch-ConfigCommon (up to 16 elements) - initialULBWPk2_0 = 6; - initialULBWPmappingType_0 = 1 - # this is SS=0 L=11 - initialULBWPstartSymbolAndLength_0 = 55; - - initialULBWPk2_1 = 6; - initialULBWPmappingType_1 = 1; - # this is SS=0 L=12 - initialULBWPstartSymbolAndLength_1 = 69; - - initialULBWPk2_2 = 7; - initialULBWPmappingType_2 = 1; - # this is SS=10 L=4 - initialULBWPstartSymbolAndLength_2 = 52; - msg3_DeltaPreamble = 1; p0_NominalWithGrant =-90; diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf new file mode 100644 index 0000000000..0feb0bb811 --- /dev/null +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf @@ -0,0 +1,308 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_CU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({ + mcc = 208; + mnc = 97; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x1; // 0 false, else true + }, + { + sst = 1; + sd = 0x010203; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L + +# tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 2; + ul_prbblacklist = "51,52,53,54" + do_SRS = 1; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 + #absoluteFrequencySSB = 620640; + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; + # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 + #absoluteFrequencySSB = 634080; + # this is 3600.48 MHz + #absoluteFrequencySSB = 640032; + #dl_frequencyBand = 78; + # this is 3301.68 MHz + #dl_absoluteFrequencyPointA = 620112; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; + # this is 3502.56 MHz + #dl_absoluteFrequencyPointA = 633552; + # this is 3600.48 MHz + #dl_absoluteFrequencyPointA = 640032; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=106 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "CI_MME_IP_ADDR"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "em1"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "CI_GNB_IP_ADDR"; + GNB_INTERFACE_NAME_FOR_NGU = "em1"; + GNB_IPV4_ADDRESS_FOR_NGU = "CI_GNB_IP_ADDR"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; +# pusch_TargetSNRx10 = 200; +# pucch_TargetSNRx10 = 150; + ulsch_max_frame_inactivity = 0; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + thread_pool_size = 8; + prach_dtx_threshold = 120; +# pucch0_dtx_threshold = 150; +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ##beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + sf_extension = 0 + sdr_addrs = "mgmt_addr=192.168.18.252,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +#security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 +# ciphering_algorithms = ( "nea2" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 +# integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' +# drb_ciphering = "yes"; +# drb_integrity = "no"; +#}; + + log_config : + { + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + f1ap_log_level ="debug"; + }; diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py index 9ed9f06d8e..0fc37d4ead 100644 --- a/ci-scripts/epc.py +++ b/ci-scripts/epc.py @@ -66,6 +66,8 @@ class EPCManagement(): self.mmeConfFile = 'mme.conf' self.yamlPath = '' self.isMagmaUsed = False + self.cfgDeploy = '--type start-mini --fqdn yes --scenario 1 --capture /tmp/oai-cn5g-v1.3.pcap' #from xml, 'mini' is default normal for docker-network.py + self.cfgUnDeploy = '--type stop-mini --fqdn yes --scenario 1' #from xml, 'mini' is default normal for docker-network.py #----------------------------------------------------------- @@ -251,8 +253,8 @@ class EPCManagement(): logging.debug('Starting OAI CN5G') mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5) mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5) - mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5) - mySSH.command('./core-network.sh start nrf spgwu', '\$', 60) + mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) + mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60) time.sleep(2) mySSH.command('docker-compose -p 5gcn ps -a', '\$', 60) if mySSH.getBefore().count('Up (healthy)') != 6: @@ -530,8 +532,8 @@ class EPCManagement(): mySSH.command('docker logs ' + c + ' > ' + self.SourceCodePath + '/logs/' + c + '.log', '\$', 5) logging.debug('Terminating OAI CN5G') - mySSH.command('cd /opt/oai-cn5g-fed/docker-compose', '\$', 5) - mySSH.command('./core-network.sh stop nrf spgwu', '\$', 60) + mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) + mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60) mySSH.command('docker volume prune --force || true', '\$', 60) time.sleep(2) mySSH.command('tshark -r /tmp/oai-cn5g.pcap | egrep --colour=never "Tracking area update" ','\$', 30) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index aa7d512b3d..c838c3740d 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -376,6 +376,16 @@ def GetParametersFromXML(action): if (string_field is not None): EPC.yamlPath = string_field + elif action == 'Initialize_5GCN': + string_field = test.findtext('args') + if (string_field is not None): + EPC.cfgDeploy = string_field + + elif action == 'Terminate_5GCN': + string_field = test.findtext('args') + if (string_field is not None): + EPC.cfgUnDeploy = string_field + elif action == 'Deploy_Object' or action == 'Undeploy_Object': eNB_instance=test.findtext('eNB_instance') if (eNB_instance is None): @@ -391,7 +401,7 @@ def GetParametersFromXML(action): if (string_field is not None): CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field - elif action == 'DeployGenObject' or action == 'UndeployGenObject': + elif action == 'DeployGenObject' or action == 'UndeployGenObject' or action == 'StatsFromGenObject': string_field=test.findtext('yaml_path') if (string_field is not None): CONTAINERS.yamlPath[0] = string_field @@ -931,6 +941,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re CONTAINERS.IperfFromContainer(HTML, RAN) if CONTAINERS.exitStatus==1: RAN.prematureExit = True + elif action == 'StatsFromGenObject': + CONTAINERS.StatsFromGenObject(HTML) else: sys.exit('Invalid class (action) from xml') if RAN.prematureExit: diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py index f29ac405c2..287a0a3c09 100644 --- a/ci-scripts/ran.py +++ b/ci-scripts/ran.py @@ -677,13 +677,13 @@ class RANManagement(): # if T tracer was run with option 0 (no logs), analyze logs # from textlog, otherwise do normal analysis (e.g., option 2) result = re.search('T_stdout 0', str(self.Initialize_eNB_args)) - enbLogFile = self.eNBLogFiles[int(self.eNB_instance)] - raw_record_file = enbLogFile.replace('.log', '_record.raw') - replay_log_file = enbLogFile.replace('.log', '_replay.log') if (result is not None): logging.debug('\u001B[1m Replaying RAW record file\u001B[0m') mySSH.open(lIpAddr, lUserName, lPassWord) mySSH.command('cd ' + lSourcePath + '/common/utils/T/tracer/', '\$', 5) + enbLogFile = self.eNBLogFiles[int(self.eNB_instance)] + raw_record_file = enbLogFile.replace('.log', '_record.raw') + replay_log_file = enbLogFile.replace('.log', '_replay.log') extracted_txt_file = enbLogFile.replace('.log', '_extracted_messages.txt') extracted_log_file = enbLogFile.replace('.log', '_extracted_messages.log') mySSH.command('./extract_config -i ' + lSourcePath + '/cmake_targets/' + raw_record_file + ' > ' + lSourcePath + '/cmake_targets/' + extracted_txt_file, '\$', 5) @@ -706,8 +706,6 @@ class RANManagement(): mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*stats.log', '.') mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.pickle', '.') mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/*.png', '.') - mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+raw_record_file, '.') - mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/'+replay_log_file, '.') # copyin_res = mySSH.copyin(lIpAddr, lUserName, lPassWord, lSourcePath + '/cmake_targets/' + fileToAnalyze, '.') if (copyin_res == -1): @@ -723,9 +721,7 @@ class RANManagement(): mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrL1_stats.log', self.eNBSourceCodePath + '/cmake_targets/') mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './nrMAC_stats.log', self.eNBSourceCodePath + '/cmake_targets/') mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.pickle', self.eNBSourceCodePath + '/cmake_targets/') - mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/')#RH 21/02/2002 this does not work, there are more than 1 png file - mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+raw_record_file, self.eNBSourceCodePath + '/cmake_targets/') - mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword,'./'+replay_log_file, self.eNBSourceCodePath + '/cmake_targets/') + mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './gnb_stats_monitor.png', self.eNBSourceCodePath + '/cmake_targets/') # mySSH.copyout(self.eNBIPAddress, self.eNBUserName, self.eNBPassword, './' + fileToAnalyze, self.eNBSourceCodePath + '/cmake_targets/') logging.debug('\u001B[1m Analyzing ' + nodeB_prefix + 'NB logfile \u001B[0m ' + fileToAnalyze) @@ -826,6 +822,8 @@ class RANManagement(): RealTimeProcessingIssue = False DLRetxIssue = False ULRetxIssue = False + nrRrcRcfgComplete = 0 + harqFeedbackPast = 0 line_cnt=0 #log file line counter for line in enb_log_file.readlines(): @@ -1012,6 +1010,13 @@ class RANManagement(): #remove 1- all useless char before relevant info (ulsch or dlsch) 2- trailing char dlsch_ulsch_stats[ue_prefix+k]=re.sub(r'^.*\]\s+', r'' , line.rstrip()) + result = re.search('Received NR_RRCReconfigurationComplete from UE', str(line)) + if result is not None: + nrRrcRcfgComplete += 1 + result = re.search('HARQ feedback is in the past', str(line)) + if result is not None: + harqFeedbackPast += 1 + #count "problem receiving samples" msg result = re.search('\[PHY\]\s+problem receiving samples', str(line)) @@ -1099,6 +1104,14 @@ class RANManagement(): statMsg = nodeB_prefix + 'NB ran with TX Write thread enabled' logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') htmleNBFailureMsg += statMsg + '\n' + if nrRrcRcfgComplete > 0: + statMsg = nodeB_prefix + 'NB showed ' + str(nrRrcRcfgComplete) + ' "Received NR_RRCReconfigurationComplete from UE" message(s)' + logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') + htmleNBFailureMsg += statMsg + '\n' + if harqFeedbackPast > 0: + statMsg = nodeB_prefix + 'NB showed ' + str(harqFeedbackPast) + ' "HARQ feedback is in the past" message(s)' + logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') + htmleNBFailureMsg += statMsg + '\n' #FR1 NSA test : add new markers to make sure gNB is used if NSA_RAPROC_PUSCH_check: statMsg = '[RAPROC] PUSCH with TC_RNTI message check for ' + nodeB_prefix + 'NB : PASS ' diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh index 31ffa9d727..2472ffe3bc 100755 --- a/ci-scripts/runTestOnVM.sh +++ b/ci-scripts/runTestOnVM.sh @@ -1899,7 +1899,7 @@ function run_test_on_vm { CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_sa_test.log #last argument = 2 is to enable --sa for SA test for 106PRB start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 2 - if [ $NR_UE_SYNC -eq 0 ] + if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ] then echo "Problem w/ gNB and NR-UE not syncing" terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2 @@ -1939,6 +1939,12 @@ function run_test_on_vm { SA_106PRB_STATUS=0 fi done + #manage SYNC issue after try_cnt + if [ $SYNC_STATUS -ne 0 ] + then + echo "SA 106PRB test NOT OK, NOT SYNC'ED" + SA_106PRB_STATUS=-1 + fi ########### end SA test sleep 30 @@ -1982,7 +1988,7 @@ function run_test_on_vm { CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_sa_test.log #last argument = 3 is to enable --sa for SA test for 24PRB start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 3 - if [ $NR_UE_SYNC -eq 0 ] + if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ] then echo "Problem w/ gNB and NR-UE not syncing" terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2 @@ -2022,6 +2028,12 @@ function run_test_on_vm { SA_24PRB_STATUS=0 fi done + #manage SYNC issue after try_cnt + if [ $SYNC_STATUS -ne 0 ] + then + echo "SA 24PRB test NOT OK, NOT SYNC'ED" + SA_24PRB_STATUS=-1 + fi ########### end SA test sleep 30 @@ -2070,7 +2082,7 @@ function run_test_on_vm { CURRENT_NR_UE_LOG_FILE=tdd_${PRB}prb_${CN_CONFIG}_ue_ra_fr2_test.log #last argument = 1 is to enable --do-ra for RA test start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1 - if [ $NR_UE_SYNC -eq 0 ] + if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ] then echo "Problem w/ gNB and NR-UE not syncing" terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2 @@ -2110,6 +2122,12 @@ function run_test_on_vm { try_cnt=$((try_cnt+10)) fi done + #manage SYNC issue after try_cnt + if [ $SYNC_STATUS -ne 0 ] + then + echo "RA FR2 test NOT OK, NOT SYNC'ED" + RA_FR2_STATUS=-1 + fi ########### end RA FR2 test sleep 30 @@ -2172,7 +2190,7 @@ function run_test_on_vm { CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue_ra_test.log #last argument = 1 is to enable --do-ra for RA test start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 1 - if [ $NR_UE_SYNC -eq 0 ] + if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ] then echo "Problem w/ gNB and NR-UE not syncing" terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2 @@ -2212,6 +2230,13 @@ function run_test_on_vm { try_cnt=$((try_cnt+10)) fi done + #manage SYNC issue after try_cnt + if [ $SYNC_STATUS -ne 0 ] + then + echo "RA FR1 test NOT OK, NOT SYNC'ED" + RA_FR1_STATUS=-1 + fi + done ########### end RA test @@ -2253,7 +2278,7 @@ function run_test_on_vm { echo "############################################################" CURRENT_NR_UE_LOG_FILE=${TMODE}_${PRB}prb_${CN_CONFIG}_ue.log start_rf_sim_nr_ue $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $GNB_VM_IP_ADDR $CURRENT_NR_UE_LOG_FILE $PRB $FREQUENCY $S1_NOS1_CFG 0 - if [ $NR_UE_SYNC -eq 0 ] + if [ $GNB_SYNC -eq 0 ] || [ $NR_UE_SYNC -eq 0 ] then echo "Problem w/ gNB and NR-UE not syncing" terminate_enb_ue_basic_sim $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 2 @@ -2332,6 +2357,13 @@ function run_test_on_vm { try_cnt=$((try_cnt+10)) fi done + #manage SYNC issue after try_cnt + if [ $SYNC_STATUS -ne 0 ] + then + echo "PHY test NOT OK, NOT SYNC'ED" + IPERF_STATUS=-1 + fi + done ######### end of loop full_l2_sim_destroy @@ -2345,7 +2377,6 @@ function run_test_on_vm { if [ $SA_24PRB_STATUS -ne 0 ]; then NR_STATUS=-1; fi if [ $RA_FR2_STATUS -ne 0 ]; then NR_STATUS=-1; fi if [ $RA_FR1_STATUS -ne 0 ]; then NR_STATUS=-1; fi - if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi if [ $IPERF_STATUS -ne 0 ]; then NR_STATUS=-1; fi if [ $NR_STATUS -eq 0 ] diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py index d5b4a4c83e..dca3daa817 100644 --- a/ci-scripts/sshconnection.py +++ b/ci-scripts/sshconnection.py @@ -56,6 +56,7 @@ class SSHConnection(): self.picocom_closure = True def open(self, ipaddress, username, password): + prompt = "#" if username == "root" else "\$" count = 0 connect_status = False while count < 4: @@ -68,7 +69,7 @@ class SSHConnection(): self.sshresponse = self.ssh.expect(['password:', username + '@']) if self.sshresponse == 0: self.ssh.sendline(password) - self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + self.sshresponse = self.ssh.expect([prompt, 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) if self.sshresponse == 0: count = 10 connect_status = True @@ -76,7 +77,7 @@ class SSHConnection(): logging.debug('self.sshresponse = ' + str(self.sshresponse)) elif self.sshresponse == 1: self.ssh.sendline(password) - self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) + self.sshresponse = self.ssh.expect([prompt, 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT]) if self.sshresponse == 0: count = 10 connect_status = True @@ -84,7 +85,7 @@ class SSHConnection(): logging.debug('self.sshresponse = ' + str(self.sshresponse)) elif self.sshresponse == 2: # Checking if we are really on the remote client defined by its IP address - self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', '\$', 5) + self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:|inet "', prompt, 5) result = re.search(str(ipaddress), str(self.ssh.before)) if result is None: self.close() @@ -100,7 +101,7 @@ class SSHConnection(): time.sleep(1) count += 1 if connect_status: - self.command('unset HISTFILE', '\$', 5, silent=True) + self.command('unset HISTFILE', prompt, 5, silent=True) else: sys.exit('SSH Connection Failed') self.ipaddress = ipaddress diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index 9e33ee468d..d6f75191a8 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -46,3 +46,4 @@ - UndeployGenObject - PingFromContainer - IperfFromContainer + - StatsFromGenObject diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml new file mode 100644 index 0000000000..be6b789b6b --- /dev/null +++ b/ci-scripts/xml_files/container_5g_l2sim_tdd.xml @@ -0,0 +1,115 @@ + + + l2sim-5gnr-tdd + Testing 5G NR L2 sim - TDD gNB + wrench + 2 + + 100001 + 000000 + 000001 + 000002 + 000003 + 000011 + 200000 + 020001 + 020002 + 200001 + 100001 + + + + + DeployGenObject + Deploy MySql Database + yaml_files/5g_l2sim_tdd + mysql + 1 + + + + DeployGenObject + Deploy OAI 5G CoreNetwork + yaml_files/5g_l2sim_tdd + oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn + 6 + + + + DeployGenObject + Deploy OAI 5G gNB L2 sim SA + yaml_files/5g_l2sim_tdd + oai-gnb + 7 + + + + DeployGenObject + Deploy OAI 5G NR-UE L2 sim SA and Proxy + yaml_files/5g_l2sim_tdd + proxy oai-nr-ue0 + 9 + + + + IdleSleep + Sleep + 10 + + + + PingFromContainer + Ping ext-dn from NR-UE + l2sim-oai-nr-ue0 + -I oaitun_ue1 -c 20 192.168.72.135 + 5 + + + + PingFromContainer + Ping NR-UE from ext-dn + l2sim-oai-ext-dn + -c 20 12.1.1.2 + 5 + + + + UndeployGenObject + Undeploy all OAI 5G stack + yaml_files/5g_l2sim_tdd + + + + StatsFromGenObject + Statistics before Traffic Test + yaml_files/5g_l2sim_tdd + + + + StatsFromGenObject + Statistics after Traffic Test + yaml_files/5g_l2sim_tdd + + + diff --git a/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml b/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml new file mode 100644 index 0000000000..d3630cd905 --- /dev/null +++ b/ci-scripts/xml_files/container_5g_l2sim_tdd_down.xml @@ -0,0 +1,38 @@ + + + l2sim-5gnr-down + CleanUp 5G L2 sim - TDD gNB + trash + + 100002 + + + + + UndeployGenObject + Undeploy all OAI 5G stack + yaml_files/5g_l2sim_tdd + + + diff --git a/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml b/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml new file mode 100644 index 0000000000..194ed4e453 --- /dev/null +++ b/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml @@ -0,0 +1,87 @@ + + + TEST-SA-FR1-Tab1 + SA Ping DL UL with 1 AS UE + tasks + 1 + + 040000 + 000001 + 010000 + 000002 + 050000 + 080000 + + + + + Initialize_UE + Run AS UE Scenario + amarisoft_ue_1 + + + + + Initialize_eNB + Initialize gNB + -O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf --sa -q --usrp-tx-thread-config 1 --T_stdout 2 --log_config.global_log_options level,nocolor,time + 0 + 0 + nr + yes + yes + datalog_rt_stats.2x2.yaml + 192.168.18.252 + + + + Ping + Ping Log Analysis + amarisoft_ue_1 + 1 + + + + IdleSleep + Sleep + 60 + + + + IdleSleep + Sleep + 20 + + + + + Terminate_eNB + Terminate gNB + 0 + 0 + nr + + + + diff --git a/ci-scripts/xml_files/sa_cn5g_asue_closure.xml b/ci-scripts/xml_files/sa_cn5g_asue_closure.xml new file mode 100644 index 0000000000..b856134e36 --- /dev/null +++ b/ci-scripts/xml_files/sa_cn5g_asue_closure.xml @@ -0,0 +1,38 @@ + + + cn5g-closure + CN5G-Closure + log-out + +060000 + + + + + Terminate_5GCN + Terminate 5G Core + --type stop-mini-as-ue --fqdn yes --scenario 1 + + + diff --git a/ci-scripts/xml_files/sa_cn5g_asue_start.xml b/ci-scripts/xml_files/sa_cn5g_asue_start.xml new file mode 100644 index 0000000000..740022b1c9 --- /dev/null +++ b/ci-scripts/xml_files/sa_cn5g_asue_start.xml @@ -0,0 +1,39 @@ + + + cn5g-start-tab + CN5G-Start + log-in + + 000100 + + + + + + Initialize_5GCN + Initialize 5G Core + --type start-mini-as-ue --fqdn yes --scenario 1 --capture /tmp/oai-cn5g-v1.3.pcap + + + diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/README.md b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md new file mode 100644 index 0000000000..531f2406ef --- /dev/null +++ b/ci-scripts/yaml_files/5g_l2sim_tdd/README.md @@ -0,0 +1,355 @@ + + + + + +
+ + + + + + OAI Full Stack 5G-NR L2 simulation with containers and a proxy +
+ +This page is only valid for an `Ubuntu18` host. + +This tutorial is only valid once this file is merged into the `develop` branch. + +# 1. Retrieving the images on Docker-Hub # + +Currently the images are hosted under the user account `rdefosseoai`. + +This may change in the future. + +Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`. + +```bash +$ docker login +Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. +Username: +Password: +``` + +Now pull images. + +```bash +$ docker pull mysql:5.7 +$ docker pull rdefosseoai/oai-amf:latest +$ docker pull rdefosseoai/oai-nrf:latest +$ docker pull rdefosseoai/oai-smf:latest +$ docker pull rdefosseoai/oai-spgwu-tiny:latest + +$ docker pull rdefosseoai/oai-gnb:develop +$ docker pull rdefosseoai/oai-nr-ue:develop +$ docker pull rdefosseoai/proxy:latest +``` + +And **re-tag** them for tutorials' docker-compose file to work. + +```bash +$ docker image tag rdefosseoai/oai-amf:latest oai-amf:latest +$ docker image tag rdefosseoai/oai-nrf:latest oai-nrf:latest +$ docker image tag rdefosseoai/oai-smf:latest oai-smf:latest +$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest + +$ docker image tag rdefosseoai/oai-gnb:develop oai-gnb:develop +$ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop +$ docker image tag rdefosseoai/proxy:latest oai-lte-multi-ue-proxy:latest +``` + +```bash +$ docker logout +``` + +Note that the proxy image is based on the source available at [https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy](https://github.com/EpiSci/oai-lte-5g-multi-ue-proxy). + +At time of writing, the `latest` tag corresponded to `56cfdc046a5f96d5e67d42a2fc2bf6ba2fe58b41` commit. + +# 2. Deploy containers # + +**CAUTION: this SHALL be done in multiple steps.** + +**Just `docker-compose up -d` WILL NOT WORK!** + +All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_l2sim_tdd` folder. + +The `gNB`, `proxy` and `NR-UE` containers will be deployed in `host`-mode. It will use the host loopback interface to connect. + +```bash +sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up +``` + +## 2.1. Deploy OAI 5G Core Network ## + +```bash +$ cd ci-scripts/yaml_files/5g_l2sim_tdd +$ docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn +Creating network "l2sim-oai-public-net" with driver "bridge" +Creating network "l2sim-oai-traffic_net-net" with driver "bridge" +Creating l2sim-oai-nrf ... done +Creating l2sim-mysql ... done +Creating l2sim-oai-spgwu ... done +Creating l2sim-oai-amf ... done +Creating l2sim-oai-smf ... done +Creating l2sim-oai-ext-dn ... done +``` + +Wait for a bit. + +```bash +$ docker-compose ps -a + Name Command State Ports +------------------------------------------------------------------------------------------------- +l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp +l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp +l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy) +l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp +l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp +l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp +``` + +At this point, you can prepare a capture on the newly-created public docker bridges: + +```bash +$ ifconfig +... +l2sim-public: flags=4163 mtu 1500 + inet 192.168.71.129 netmask 255.255.255.192 broadcast 192.168.71.191 + inet6 fe80::42:c4ff:fe2b:3d38 prefixlen 64 scopeid 0x20 + ether 02:42:c4:2b:3d:38 txqueuelen 0 (Ethernet) + RX packets 4 bytes 112 (112.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 7 bytes 626 (626.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +l2sim-traffic: flags=4163 mtu 1500 + inet 192.168.72.129 netmask 255.255.255.192 broadcast 192.168.72.191 + inet6 fe80::42:b5ff:fed3:e732 prefixlen 64 scopeid 0x20 + ether 02:42:b5:d3:e7:32 txqueuelen 0 (Ethernet) + RX packets 2652 bytes 142335 (142.3 KB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 3999 bytes 23367972 (23.3 MB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +... + +$ sudo nohup tshark -f "(host 192.168.72.135 and icmp) or (not host 192.168.72.135 and not arp and not port 53 and not port 2152 and not port 2153)" -i l2sim-public -i l2sim-traffic -w /tmp/capture_5g_l2sim_tdd.pcap > /tmp/tshark.log 2>&1 & +``` + +## 2.2. Deploy OAI gNB in Standalone Mode as a VNF ## + +**CAUTION: To execute this 2nd step, the whole `CN5G` SHALL be in `healthy` state (especially the `mysql` container).** + +```bash +$ docker-compose up -d oai-gnb +l2sim-oai-nrf is up-to-date +l2sim-oai-spgwu is up-to-date +l2sim-oai-ext-dn is up-to-date +Creating l2sim-oai-gnb ... done +``` + +Wait for a bit. + +```bash +$ docker-compose ps -a + Name Command State Ports +------------------------------------------------------------------------------------------------- +l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp +l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp +l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy) +l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy) +l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp +l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp +l2sim-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-l2sim-vnf | 208, 99 | +[AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------| +... +``` + +## 2.3. Deploy OAI NR-UE and proxy + +```bash +$ docker-compose up -d proxy oai-nr-ue0 +l2sim-mysql is up-to-date +l2sim-oai-nrf is up-to-date +l2sim-oai-amf is up-to-date +l2sim-oai-smf is up-to-date +l2sim-oai-spgwu is up-to-date +l2sim-oai-ext-dn is up-to-date +l2sim-oai-gnb is up-to-date +Creating l2sim-oai-nr-ue ... done +Creating l2sim-proxy ... done +``` + +Wait for a bit. + +```bash +$ docker-compose ps -a + Name Command State Ports +------------------------------------------------------------------------------------------------- +l2sim-mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp +l2sim-oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp +l2sim-oai-ext-dn /bin/bash -c apt update; ... Up (healthy) +l2sim-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy) +l2sim-oai-nr-ue0 /opt/oai-nr-ue/bin/entrypo ... Up (healthy) +l2sim-oai-nrf /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp +l2sim-oai-smf /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp +l2sim-oai-spgwu /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp +l2sim-proxy /oai-lte-multi-ue-proxy/bi ... Up (healthy) + +$ docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}} {{.MemUsage}}\t{{.MemPerc}}" l2sim-mysql l2sim-oai-amf l2sim-oai-ext-dn l2sim-oai-gnb l2sim-oai-nr-ue0 l2sim-oai-nrf l2sim-oai-smf l2sim-oai-spgwu l2sim-proxy +CONTAINER CPU % MEM USAGE / LIMIT MEM % +l2sim-mysql 0.03% 206.7MiB / 62.54GiB 0.32% +l2sim-oai-amf 4.05% 29.49MiB / 62.54GiB 0.05% +l2sim-oai-ext-dn 0.00% 31.27MiB / 62.54GiB 0.05% +l2sim-oai-gnb 1.29% 1.853GiB / 62.54GiB 2.96% +l2sim-oai-nr-ue0 1.43% 350.8MiB / 62.54GiB 0.55% +l2sim-oai-nrf 0.21% 9.105MiB / 62.54GiB 0.01% +l2sim-oai-smf 3.24% 30.23MiB / 62.54GiB 0.05% +l2sim-oai-spgwu 0.00% 11.78MiB / 62.54GiB 0.02% +l2sim-proxy 6.97% 290.4MiB / 62.54GiB 0.45% +``` + +**CAUTION: As you can see the CPU usage is not that important compared to a 5G RF simulator equivalent.** + +But the CPU speed matters; I am running on a fast server: + +```bash +$ lscpu +Architecture: x86_64 +CPU(s): 16 +... +Model name: Intel(R) Xeon(R) Silver 4215R CPU @ 3.20GHz +``` + +I tried on a slower server with more CPUs and it did not work: + +```bash +oaici@orion:~$ lscpu +Architecture: x86_64 +CPU(s): 48 +... +Model name: Intel(R) Xeon(R) CPU E5-2658 v3 @ 2.20GHz +``` + +We will work on this issue. + + +Making sure the OAI UE is connected: + +```bash +$ docker exec -it l2sim-oai-nr-ue /bin/bash +root@bb4d400a832d:/opt/oai-nr-ue# ifconfig +eth0: flags=4163 mtu 1500 + inet 192.168.71.137 netmask 255.255.255.192 broadcast 192.168.71.191 + ether 02:42:c0:a8:47:89 txqueuelen 0 (Ethernet) + RX packets 224259 bytes 5821372018 (5.8 GB) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 235916 bytes 7848786376 (7.8 GB) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +lo: flags=73 mtu 65536 + inet 127.0.0.1 netmask 255.0.0.0 + loop txqueuelen 1000 (Local Loopback) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 + +oaitun_ue1: flags=4305 mtu 1500 + inet 12.1.1.2 netmask 255.255.255.0 destination 12.1.1.2 + unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) + RX packets 0 bytes 0 (0.0 B) + RX errors 0 dropped 0 overruns 0 frame 0 + TX packets 0 bytes 0 (0.0 B) + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 +``` + +# 3. Check traffic # + +## 3.1. Check your Internet connectivity ## + +You can also check with the `ext-dn` container (IP address is `192.168.72.135` in docker-compose) + +```bash +$ docker exec -it l2sim-oai-nr-ue /bin/bash +root@bb4d400a832d# ping -I oaitun_ue1 -c 20 192.168.72.135 +PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data. +64 bytes from 192.168.72.135: icmp_seq=1 ttl=63 time=65.1 ms +64 bytes from 192.168.72.135: icmp_seq=2 ttl=63 time=74.2 ms +... +64 bytes from 192.168.72.135: icmp_seq=19 ttl=63 time=25.0 ms +64 bytes from 192.168.72.135: icmp_seq=20 ttl=63 time=34.7 ms + +--- 192.168.72.135 ping statistics --- +20 packets transmitted, 20 received, 0% packet loss, time 19025ms +rtt min/avg/max/mdev = 16.413/120.639/209.673/57.159 ms +``` + +# 4. Un-deployment # + +```bash +$ docker-compose down +Stopping l2sim-oai-nr-ue2 ... done +Stopping l2sim-oai-nr-ue ... done +Stopping l2sim-oai-gnb ... done +Stopping l2sim-oai-ext-dn ... done +Stopping l2sim-oai-spgwu ... done +Stopping l2sim-oai-smf ... done +Stopping l2sim-oai-amf ... done +Stopping l2sim-oai-nrf ... done +Stopping l2sim-mysql ... done +Removing l2sim-oai-nr-ue2 ... done +Removing l2sim-oai-nr-ue ... done +Removing l2sim-oai-gnb ... done +Removing l2sim-oai-ext-dn ... done +Removing l2sim-oai-spgwu ... done +Removing l2sim-oai-smf ... done +Removing l2sim-oai-amf ... done +Removing l2sim-oai-nrf ... done +Removing l2sim-mysql ... done +Removing network l2sim-oai-public-net +Removing network l2sim-oai-traffic-net +``` + +# 5. Adapt the `docker-compose` to your environment # + +In the `SMF` section, provide your own DNS IP address: + +```yaml + DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129 +``` + +In the `gNB` section, provide your docker-host primary IP address and interface name: in our case `192.168.18.193` and `eno1`. + +```yaml + GNB_NGA_IF_NAME: eno1 + GNB_NGA_IP_ADDRESS: 192.168.18.193 + GNB_NGU_IF_NAME: eno1 + GNB_NGU_IP_ADDRESS: 192.168.18.193 +``` + +Same thing in the `nr-ue` section: + +```yaml + NR_UE_NFAPI_IF_NAME: eno1 +``` + +This tutorial is a first draft. This nFAPI feature and the proxy are still under development. + +At time of writing, we were able to run in `host-mode`, 1 `NR-UE` and just ping traffic. + +Later development will include: + + - deploying `gNB-VNF`, `proxy` and `UE` in isolated containers (with their own IP address) + - more UEs + - more traffic (`UDP` and `TCP`) diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml new file mode 100644 index 0000000000..c899f8cc7e --- /dev/null +++ b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml @@ -0,0 +1,322 @@ +version: '3.8' +services: + oai-nrf: + container_name: "l2sim-oai-nrf" + image: oai-nrf:latest + environment: + - NRF_INTERFACE_NAME_FOR_SBI=eth0 + - NRF_INTERFACE_PORT_FOR_SBI=80 + - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090 + - NRF_API_VERSION=v1 + - INSTANCE=0 + - PID_DIRECTORY=/var/run + networks: + public_net: + ipv4_address: 192.168.71.130 + volumes: + - ../5g_rfsimulator/nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + mysql: + container_name: "l2sim-mysql" + image: mysql:5.7 + volumes: + - ../5g_rfsimulator/oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql + - ../5g_rfsimulator/mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh + environment: + - TZ=Europe/Paris + - MYSQL_DATABASE=oai_db + - MYSQL_USER=test + - MYSQL_PASSWORD=test + - MYSQL_ROOT_PASSWORD=linux + healthcheck: + test: /bin/bash -c "/tmp/mysql-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.71.131 + oai-amf: + container_name: "l2sim-oai-amf" + image: oai-amf:latest + environment: + - TZ=Europe/paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - MCC=208 + - MNC=99 + - REGION_ID=128 + - AMF_SET_ID=1 + - SERVED_GUAMI_MCC_0=208 + - SERVED_GUAMI_MNC_0=99 + - SERVED_GUAMI_REGION_ID_0=128 + - SERVED_GUAMI_AMF_SET_ID_0=1 + - SERVED_GUAMI_MCC_1=460 + - SERVED_GUAMI_MNC_1=11 + - SERVED_GUAMI_REGION_ID_1=10 + - SERVED_GUAMI_AMF_SET_ID_1=1 + - PLMN_SUPPORT_MCC=208 + - PLMN_SUPPORT_MNC=99 + - PLMN_SUPPORT_TAC=0x0001 + - SST_0=1 + - SD_0=1 + - SST_1=1 + - SD_1=12 + - AMF_INTERFACE_NAME_FOR_NGAP=eth0 + - AMF_INTERFACE_NAME_FOR_N11=eth0 + - SMF_INSTANCE_ID_0=1 + - SMF_FQDN_0=oai-smf + - SMF_IPV4_ADDR_0=0.0.0.0 + - SMF_HTTP_VERSION_0=v1 + - SELECTED_0=true + - SMF_INSTANCE_ID_1=2 + - SMF_FQDN_1=oai-smf + - SMF_IPV4_ADDR_1=0.0.0.0 + - SMF_HTTP_VERSION_1=v1 + - SELECTED_1=false + - MYSQL_SERVER=192.168.71.131 + - MYSQL_USER=root + - MYSQL_PASS=linux + - MYSQL_DB=oai_db + - OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1 + - NRF_IPV4_ADDRESS=192.168.71.130 + - NRF_PORT=80 + - NF_REGISTRATION=yes + - SMF_SELECTION=yes + - USE_FQDN_DNS=yes + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - EXTERNAL_AUSF=no + - AUSF_IPV4_ADDRESS=0.0.0.0 + - AUSF_PORT=80 + - AUSF_API_VERSION=v1 + - AUSF_FQDN=localhost + depends_on: + - oai-nrf + - mysql + volumes: + - ../5g_rfsimulator/amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh" + interval: 10s + timeout: 15s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.71.132 + oai-smf: + container_name: "l2sim-oai-smf" + image: oai-smf:latest + environment: + - TZ=Europe/Paris + - INSTANCE=0 + - PID_DIRECTORY=/var/run + - SMF_INTERFACE_NAME_FOR_N4=eth0 + - SMF_INTERFACE_NAME_FOR_SBI=eth0 + - SMF_INTERFACE_PORT_FOR_SBI=80 + - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090 + - SMF_API_VERSION=v1 + - DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129 + - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4 + - AMF_IPV4_ADDRESS=0.0.0.0 + - AMF_PORT=80 + - AMF_API_VERSION=v1 + - AMF_FQDN=oai-amf + - UDM_IPV4_ADDRESS=127.0.0.1 + - UDM_PORT=80 + - UDM_API_VERSION=v1 + - UDM_FQDN=localhost + - UPF_IPV4_ADDRESS=192.168.71.134 + - UPF_FQDN_0=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.71.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - REGISTER_NRF=yes + - DISCOVER_UPF=yes + - USE_FQDN_DNS=yes + - DNN_NI0=oai + - DNN_NI2=oai.ipv4 + depends_on: + - oai-nrf + - oai-amf + volumes: + - ../5g_rfsimulator/smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.71.133 + oai-spgwu: + container_name: "l2sim-oai-spgwu" + image: oai-spgwu-tiny:latest + environment: + - TZ=Europe/Paris + - PID_DIRECTORY=/var/run + - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 + - SGW_INTERFACE_NAME_FOR_SX=eth0 + - PGW_INTERFACE_NAME_FOR_SGI=eth0 + - NETWORK_UE_NAT_OPTION=yes + - NETWORK_UE_IP=12.1.1.0/24 + - SPGWC0_IP_ADDRESS=192.168.71.133 + - BYPASS_UL_PFCP_RULES=no + - MCC=208 + - MNC=99 + - MNC03=099 + - TAC=1 + - GTP_EXTENSION_HEADER_PRESENT=yes + - GW_ID=1 + - REALM=openairinterface.org + - ENABLE_5G_FEATURES=yes + - REGISTER_NRF=yes + - USE_FQDN_NRF=yes + - UPF_FQDN_5G=oai-spgwu + - NRF_IPV4_ADDRESS=192.168.71.130 + - NRF_PORT=80 + - NRF_API_VERSION=v1 + - NRF_FQDN=oai-nrf + - NSSAI_SST_0=1 + - NSSAI_SD_0=1 + - DNN_0=oai + depends_on: + - oai-nrf + - oai-smf + cap_add: + - NET_ADMIN + - SYS_ADMIN + cap_drop: + - ALL + privileged: true + volumes: + - ../5g_rfsimulator/spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh + healthcheck: + test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh" + interval: 10s + timeout: 5s + retries: 5 + networks: + public_net: + ipv4_address: 192.168.71.134 + traffic_net: + ipv4_address: 192.168.72.134 + oai-ext-dn: + image: ubuntu:bionic + privileged: true + container_name: "l2sim-oai-ext-dn" + entrypoint: /bin/bash -c \ + "apt update; apt install -y procps iptables iproute2 iperf iputils-ping;"\ + "ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity" + depends_on: + - oai-spgwu + networks: + traffic_net: + ipv4_address: 192.168.72.135 + healthcheck: + test: /bin/bash -c "ping -c 2 192.168.72.134" + interval: 10s + timeout: 5s + retries: 5 + oai-gnb: + image: oai-gnb:develop + privileged: true + container_name: "l2sim-oai-gnb" + network_mode: "host" + environment: + TZ: Europe/Paris + USE_SA_NFAPI_VNF: 'yes' + GNB_NAME: gnb-l2sim-vnf + TAC: 1 + MCC: '208' + MNC: '99' + MNC_LENGTH: 2 + NSSAI_SST: 1 + NSSAI_SD0: 1 + NSSAI_SD1: 112233 + AMF_IP_ADDRESS: 192.168.71.132 + GNB_NGA_IF_NAME: eno1 + GNB_NGA_IP_ADDRESS: 192.168.18.193 + GNB_NGU_IF_NAME: eno1 + GNB_NGU_IP_ADDRESS: 192.168.18.193 + LOCAL_S_IF_NAME: 'lo:' + REMOTE_S_ADDRESS: 127.0.0.1 + LOCAL_S_ADDRESS: 127.0.0.2 + USE_ADDITIONAL_OPTIONS: --sa --nfapi 2 --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor + depends_on: + - oai-spgwu + - oai-amf + healthcheck: + test: /bin/bash -c "pgrep nr-softmodem" + interval: 10s + timeout: 5s + retries: 5 + + proxy: + image: oai-lte-multi-ue-proxy:latest + privileged: true + container_name: "l2sim-proxy" + network_mode: "host" + environment: + TZ: Europe/Paris + command: "/oai-lte-multi-ue-proxy/bin/proxy 1 --nr" + depends_on: + - oai-gnb + healthcheck: + test: /bin/bash -c "pgrep proxy" + interval: 10s + timeout: 5s + retries: 5 + + oai-nr-ue0: + image: oai-nr-ue:develop + privileged: true + container_name: "l2sim-oai-nr-ue0" + network_mode: "host" + environment: + TZ: Europe/Paris + USE_NFAPI: 'yes' + OPENAIR_DIR: /opt/oai-nr-ue + FULL_IMSI: '208990100001100' + FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f' + OPC: 'C42449363BBAD02B66D16BC975D77CC1' + DNN: oai + NSSAI_SST: 1 + NSSAI_SD: 1 + NR_UE_NFAPI_IF_NAME: eno1 + GNB_IP_ADDRESS: 127.0.0.1 + NR_UE_IP_ADDRESS: 127.0.0.1 + USE_ADDITIONAL_OPTIONS: --nokrnmod 1 --nfapi 5 --node-number 2 --sa --emulate-l1 --log_config.global_log_options level,time,thread_id,nocolor + volumes: + - ../../../openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results:/opt/oai-nr-ue/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results + depends_on: + - oai-gnb + - proxy + healthcheck: + test: /bin/bash -c "pgrep nr-uesoftmodem" + interval: 10s + timeout: 5s + retries: 5 + +networks: + public_net: + driver: bridge + name: l2sim-oai-public-net + ipam: + config: + - subnet: 192.168.71.128/26 + driver_opts: + com.docker.network.bridge.name: "l2sim-public" + traffic_net: + driver: bridge + name: l2sim-oai-traffic-net + ipam: + config: + - subnet: 192.168.72.128/26 + driver_opts: + com.docker.network.bridge.name: "l2sim-traffic" diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 721f78eceb..45e5db41e4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1781,7 +1781,8 @@ set(NR_PDCP_SRC ) set(NR_SDAP_SRC - ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_gnb.c + ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap.c + ${OPENAIR2_DIR}/SDAP/nr_sdap/nr_sdap_entity.c ) set(L2_SRC diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index 5b047c082d..8be3568034 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -478,6 +478,7 @@ int logInit (void) register_log_component("NAS","log",NAS); register_log_component("UDP","",UDP_); register_log_component("GTPU","",GTPU); + register_log_component("SDAP","",SDAP); register_log_component("S1AP","",S1AP); register_log_component("F1AP","",F1AP); register_log_component("M2AP","",M2AP); diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index 1fbf42f62d..89b9c5e94d 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -215,6 +215,7 @@ typedef enum { OCM, UDP_, GTPU, + SDAP, SPGW, S1AP, F1AP, diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index a8b919e525..b3c06d6be8 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -944,6 +944,27 @@ ID = LEGACY_GTPU_TRACE GROUP = ALL:LEGACY_GTPU:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log +ID = LEGACY_SDAP_INFO + DESC = SDAP legacy logs - info level + GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_INFO:LEGACY + FORMAT = string,log +ID = LEGACY_SDAP_ERROR + DESC = SDAP legacy logs - error level + GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_ERROR:LEGACY + FORMAT = string,log +ID = LEGACY_SDAP_WARNING + DESC = SDAP legacy logs - warning level + GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_WARNING:LEGACY + FORMAT = string,log +ID = LEGACY_SDAP_DEBUG + DESC = SDAP legacy logs - debug level + GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_DEBUG:LEGACY + FORMAT = string,log +ID = LEGACY_SDAP_TRACE + DESC = SDAP legacy logs - trace level + GROUP = ALL:LEGACY_SDAP:LEGACY_GROUP_TRACE:LEGACY + FORMAT = string,log + ID = LEGACY_TMR_INFO DESC = TMR legacy logs - info level GROUP = ALL:LEGACY_TMR:LEGACY_GROUP_INFO:LEGACY diff --git a/doc/FEATURE_SET.md b/doc/FEATURE_SET.md index eaa691d6ef..a289c6d17e 100644 --- a/doc/FEATURE_SET.md +++ b/doc/FEATURE_SET.md @@ -351,6 +351,14 @@ The following features are valid for the gNB and the 5G-NR UE. - Interfaces with RRC, RLC - Interfaces with gtp-u (data Tx/Rx over N3 and F1-U interfaces) +**gNB SDAP** +- Send/Receive operations according to 37.324 Rel.15 + - Establishment/Handling of SDAP entities. + - Transfer of User Plane Data + - Mapping between a QoS flow and a DRB for both DL and UL + - Marking QoS flow ID in both DL and UL packets + - Reflective QoS flow to DRB mapping for UL SDAP data PDUs + **gNB RRC** - NR RRC (38.331) Rel 16 messages using new asn1c - LTE RRC (36.331) also updated to Rel 15 @@ -400,6 +408,7 @@ The following features are valid for the gNB and the 5G-NR UE. - New gtp-u implementation supporting both N3 and F1-U interfaces according to 29.281 Rel.15 - Interfaces with RRC, F1AP for tunnel creation - Interfaces with PDCP and RLC for data send/receive at the CU and DU respectively (F1-U interface) + - Interface with SDAP for data send/receive, capture of GTP-U Optional Header, GTP-U Extension Header and PDU Session Container. # OpenAirInterface 5G-NR UE Feature Set # @@ -502,6 +511,13 @@ The following features are valid for the gNB and the 5G-NR UE. - Radio bearer establishment/handling and association with PDCP entities - Interfaces with RRC, RLC +**UE SDAP** +* Tx/Rx operations operations according to 37.324 Rel.15 + - Establishment/Handling of SDAP entities. + - Transfer of User Plane Data + - Reflective Mapping + - RRC Signaling Mapping + **UE RRC** * Integration of RRC messages and procedures supporting UE 5G SA connection according to 38.331 Rel.16 - RRCSetupRequest/RRCSetup/RRCSetupComplete diff --git a/doc/L2NFAPI.md b/doc/L2NFAPI.md index 5b8c0f546c..77f9e5cb78 100644 --- a/doc/L2NFAPI.md +++ b/doc/L2NFAPI.md @@ -46,6 +46,8 @@ This proxy allows to perform L2 nFAPI simulator for: * 5G-NSA * 5G-SA +Another tutorial for 5G SA mode with 1 User is available [here](../ci-scripts/yaml_files/5g_l2sim_tdd/README.md). + ---- [oai wiki home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home) diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2 index 498e6bedcf..dfb28cfd1d 100644 --- a/docker/Dockerfile.nrUE.rhel8.2 +++ b/docker/Dockerfile.nrUE.rhel8.2 @@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base FROM ran-build:latest AS nr-ue-build -RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh +RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \ + cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh #start from scratch for target executable FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue @@ -62,7 +63,10 @@ COPY --from=nr-ue-build \ ./ WORKDIR /opt/oai-nr-ue/etc -COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf . +COPY --from=nr-ue-build \ + /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \ + /oai-ran/docker/etc/nr-ue.nfapi.conf \ + ./ COPY --from=nr-ue-build \ /oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \ @@ -118,5 +122,5 @@ WORKDIR /opt/oai-nr-ue/etc COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* . WORKDIR /opt/oai-nr-ue -CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"] +CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"] ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"] diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18 index 0edfdd2160..9f68b947cd 100644 --- a/docker/Dockerfile.nrUE.ubuntu18 +++ b/docker/Dockerfile.nrUE.ubuntu18 @@ -29,7 +29,8 @@ FROM ran-base:latest AS nr-ue-base FROM ran-build:latest AS nr-ue-build -RUN cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh +RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/nr_ue_parameters.yaml && \ + cp /oai-ran/docker/scripts/nr_ue_entrypoint.sh /oai-ran/docker/scripts/entrypoint.sh #start from scratch for target executable FROM ubuntu:bionic as oai-nr-ue @@ -67,7 +68,10 @@ COPY --from=nr-ue-build \ ./ WORKDIR /opt/oai-nr-ue/etc -COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf . +COPY --from=nr-ue-build \ + /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf \ + /oai-ran/docker/etc/nr-ue.nfapi.conf \ + ./ COPY --from=nr-ue-build \ /oai-ran/cmake_targets/ran_build/build/liboai_eth_transpro.so \ @@ -106,5 +110,5 @@ RUN /bin/bash -c "ln -s /usr/local/lib/liboai_usrpdevif.so /usr/local/lib/liboai ldconfig WORKDIR /opt/oai-nr-ue -CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"] +CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue.conf"] ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"] diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py index 297c202a03..850bb535a5 100644 --- a/docker/scripts/generateTemplate.py +++ b/docker/scripts/generateTemplate.py @@ -23,6 +23,7 @@ #----------------------------------------------------------- # Import #----------------------------------------------------------- +import glob import re import yaml import os @@ -33,7 +34,8 @@ def main(): #read yaml input parameters f = open(f'{sys.argv[1]}',) data = yaml.full_load(f) - dir = os.listdir(f'{data[0]["paths"]["source_dir"]}') + initial_path = f'{data[0]["paths"]["source_dir"]}' + dir = glob.glob(initial_path + '/**/*.conf', recursive=True) #identify configs, read and replace corresponding values for config in data[1]["configurations"]: @@ -42,7 +44,10 @@ def main(): print('================================================') print('filePrefix = ' + filePrefix) print('outputfilename = ' + outputfilename) + found = False for inputfile in dir: + if found: + continue if inputfile.find(filePrefix) >=0: prefix_outputfile = {"cu.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "du.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', @@ -58,10 +63,13 @@ def main(): "gnb.sa.band66.fr1.106PRB.usrpn300.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_CU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "gNB_SA_DU.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', + "proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', + "proxy_nr-ue.nfapi.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "ue.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}', "ue_sim_ci": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}' } print('inputfile = ' + inputfile) + found = True if filePrefix in prefix_outputfile: outputfile1 = prefix_outputfile[filePrefix] @@ -69,7 +77,7 @@ def main(): if not os.path.exists(directory): os.makedirs(directory, exist_ok=True) - with open(f'{data[0]["paths"]["source_dir"]}{inputfile}', mode='r') as inputfile, \ + with open(f'{inputfile}', mode='r') as inputfile, \ open(outputfile1, mode='w') as outputfile: for line in inputfile: count = 0 diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index aec5c48050..dd6256609c 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -11,8 +11,9 @@ THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD} if [[ -v USE_NSA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_FDD_MONO ]]; then cp $PREFIX/etc/gnb.sa.fdd.conf $PREFIX/etc/gnb.conf; fi -if [[ -v USE_SA_CU ]]; then ln -s $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi +if [[ -v USE_SA_CU ]]; then cp $PREFIX/etc/gnb.sa.cu.conf $PREFIX/etc/gnb.conf; fi if [[ -v USE_SA_TDD_CU ]]; then cp $PREFIX/etc/gnb.sa.du.tdd.conf $PREFIX/etc/gnb.conf; fi +if [[ -v USE_SA_NFAPI_VNF ]]; then cp $PREFIX/etc/gnb.sa.nfapi.vnf.conf $PREFIX/etc/gnb.conf; fi # Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself. if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/gnb.conf; fi diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml index 8547d48e67..d5942f2c9b 100644 --- a/docker/scripts/gnb_parameters.yaml +++ b/docker/scripts/gnb_parameters.yaml @@ -202,3 +202,39 @@ - key: remote_n_portd env: "@F1_CU_D_PORT@" + - filePrefix: proxy_gnb.band78.sa.fr1.106PRB.usrpn310.conf + outputfilename: "gnb.sa.nfapi.vnf.conf" + config: + - key: Active_gNBs + env: "@GNB_NAME@" + - key: gNB_name + env: "@GNB_NAME@" + - key: mcc + env: "@MCC@" + - key: mnc + env: "@MNC@" + - key: mnc_length + env: "@MNC_LENGTH@" + - key: tracking_area_code + env: "@TAC@" + - key: sst + env: "@NSSAI_SST@" + - key: ipv4 + env: "@AMF_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NG_AMF + env: "@GNB_NGA_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NG_AMF + env: "@GNB_NGA_IP_ADDRESS@" + - key: GNB_INTERFACE_NAME_FOR_NGU + env: "@GNB_NGU_IF_NAME@" + - key: GNB_IPV4_ADDRESS_FOR_NGU + env: "@GNB_NGU_IP_ADDRESS@" + - key: parallel_config + env: "@THREAD_PARALLEL_CONFIG@" + - key: local_s_if_name + env: "@LOCAL_S_IF_NAME@" + - key: remote_s_address + env: "@REMOTE_S_ADDRESS@" + - key: local_s_address + env: "@LOCAL_S_ADDRESS@" + diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh index af2b8a8333..38b080a41b 100755 --- a/docker/scripts/nr_ue_entrypoint.sh +++ b/docker/scripts/nr_ue_entrypoint.sh @@ -5,12 +5,22 @@ set -euo pipefail PREFIX=/opt/oai-nr-ue # Based another env var, pick one template to use -#if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/ue.nfapi.conf $PREFIX/etc/ue.conf; fi +if [[ -v USE_NFAPI ]]; then cp $PREFIX/etc/nr-ue.nfapi.conf $PREFIX/etc/nr-ue.conf; fi +# Sometimes, the templates are not enough. We mount a conf file on $PREFIX/etc. It can be a template itself. +if [[ -v USE_VOLUMED_CONF ]]; then cp $PREFIX/etc/mounted.conf $PREFIX/etc/nr-ue.conf; fi +# if none, pick the default +if [ ! -f $PREFIX/etc/nr-ue.conf ]; then cp $PREFIX/etc/nr-ue-sim.conf $PREFIX/etc/nr-ue.conf; fi -# Only this template will be manipulated and the USIM one! -CONFIG_FILES=`ls $PREFIX/etc/ue.conf $PREFIX/etc/nr-ue-sim.conf || true` +# Only this template will be manipulated +CONFIG_FILES=`ls $PREFIX/etc/nr-ue.conf || true` for c in ${CONFIG_FILES}; do + # Sometimes templates have no pattern to be replaced. + if ! grep -oP '@[a-zA-Z0-9_]+@' ${c}; then + echo "Configuration is already set" + break + fi + # grep variable names (format: ${VAR}) from template to be rendered VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs) diff --git a/docker/scripts/nr_ue_parameters.yaml b/docker/scripts/nr_ue_parameters.yaml new file mode 100644 index 0000000000..afdba880e1 --- /dev/null +++ b/docker/scripts/nr_ue_parameters.yaml @@ -0,0 +1,49 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +--- +- paths: + source_dir: "ci-scripts/conf_files/" + dest_dir: docker/etc + +- configurations: + - filePrefix: proxy_nr-ue.nfapi.conf + outputfilename: "nr-ue.nfapi.conf" + config: + - key: imsi + env: "@FULL_IMSI@" + - key: key + env: "@FULL_KEY@" + - key: opc + env: "@OPC@" + - key: dnn + env: "@DNN@" + - key: nssai_sst + env: "@NSSAI_SST@" + - key: nssai_sd + env: "@NSSAI_SD@" + - key: remote_n_address + env: "@GNB_IP_ADDRESS@" + - key: local_n_address + env: "@NR_UE_IP_ADDRESS@" + - key: local_n_if_name + env: "@NR_UE_NFAPI_IF_NAME@" + diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 3cc71b8b3a..65b74a0218 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -19,7 +19,7 @@ * contact@openairinterface.org */ -#define _GNU_SOURCE +#define _GNU_SOURCE // For pthread_setname_np #include #include #include "executables/nr-uesoftmodem.h" @@ -239,84 +239,21 @@ static void L1_nsa_prach_procedures(frame_t frame, int slot, fapi_nr_ul_config_p LOG_D(NR_MAC, "We have successfully filled the rach_ind queue with the recently filled rach ind\n"); } -static bool sfn_slot_matcher(void *wanted, void *candidate) -{ - nfapi_p7_message_header_t *msg = candidate; - int sfn_sf = *(int*)wanted; - - switch (msg->message_id) - { - case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: - { - nfapi_nr_rach_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: - { - nfapi_nr_rx_data_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: - { - nfapi_nr_crc_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: - { - nfapi_nr_uci_indication_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: - { - nfapi_nr_dl_tti_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: - { - nfapi_nr_tx_data_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: - { - nfapi_nr_ul_dci_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; - } - - case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: - { - nfapi_nr_ul_tti_request_t *ind = candidate; - return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; - } - - default: - LOG_E(NR_MAC, "sfn_slot_match bad ID: %d\n", msg->message_id); - - } - - return false; -} - static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot) { nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); nfapi_nr_dl_tti_request_t *dl_tti_request = get_queue(&nr_dl_tti_req_queue); nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue); - LOG_D(NR_MAC, "Try to get a ul_tti_req for sfn/slot %d %d from queue with %lu items\n", - NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.active_harq_sfn_slot),NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.active_harq_sfn_slot), nr_ul_tti_req_queue.num_items); - nfapi_nr_ul_tti_request_t *ul_tti_request = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.active_harq_sfn_slot); - if (!ul_tti_request) - { - LOG_D(NR_MAC, "Try to get a ul_tti_req from seprate queue because dl_tti_req was late\n"); - ul_tti_request = unqueue_matching(&nr_wait_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.active_harq_sfn_slot); + for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { + LOG_D(NR_MAC, "Try to get a ul_tti_req by matching CRC active SFN %d/SLOT %d from queue with %lu items\n", + NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), + NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), nr_ul_tti_req_queue.num_items); + nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot); + if (ul_tti_request_crc && ul_tti_request_crc->n_pdus > 0) + { + check_and_process_dci(NULL, NULL, NULL, ul_tti_request_crc); + } } if (rach_ind && rach_ind->number_of_pdus > 0) @@ -333,24 +270,6 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot) free(rach_ind); nr_Msg1_transmitted(0, 0, NFAPI_SFNSLOT2SFN(sfn_slot), 0); } - if (crc_ind && crc_ind->number_crcs > 0) - { - NR_UL_IND_t UL_INFO = { - .crc_ind = *crc_ind, - }; - send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id); - free(crc_ind->crc_list); - free(crc_ind); - } - if (rx_ind && rx_ind->number_of_pdus > 0) - { - NR_UL_IND_t UL_INFO = { - .rx_ind = *rx_ind, - }; - send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id); - free(rx_ind->pdu_list); - free(rx_ind); - } if (dl_tti_request) { int dl_tti_sfn_slot = NFAPI_SFNSLOT2HEX(dl_tti_request->SFN, dl_tti_request->Slot); @@ -380,10 +299,6 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot) { check_and_process_dci(NULL, NULL, ul_dci_request, NULL); } - if (ul_tti_request && ul_tti_request->n_pdus > 0) - { - check_and_process_dci(NULL, NULL, NULL, ul_tti_request); - } } static void check_nr_prach(NR_UE_MAC_INST_t *mac, nr_uplink_indication_t *ul_info, NR_PRACH_RESOURCES_t *prach_resources) @@ -434,7 +349,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) reset_queue(&nr_tx_req_queue); reset_queue(&nr_ul_dci_req_queue); reset_queue(&nr_ul_tti_req_queue); - reset_queue(&nr_wait_ul_tti_req_queue); NR_PRACH_RESOURCES_t prach_resources; memset(&prach_resources, 0, sizeof(prach_resources)); @@ -443,6 +357,13 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) int last_sfn_slot = -1; uint16_t sfn_slot = 0; + module_id_t mod_id = 0; + NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); + for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) { + mac->nr_ue_emul_l1.harq[i].active = false; + mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot = -1; + } + while (!oai_exit) { if (sem_wait(&sfn_slot_semaphore) != 0) @@ -459,9 +380,11 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) } if (slot_ind) { sfn_slot = *slot_ind; + free_and_zero(slot_ind); } else if (ch_info) { sfn_slot = ch_info->sfn_slot; + free_and_zero(ch_info); } frame_t frame = NFAPI_SFNSLOT2SFN(sfn_slot); @@ -477,8 +400,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) LOG_D(NR_MAC, "The received sfn/slot [%d %d] from proxy\n", frame, slot); - module_id_t mod_id = 0; - NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); if (get_softmodem_params()->sa && mac->mib == NULL) { LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n"); @@ -533,8 +454,10 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) mac->scc_SIB->tdd_UL_DL_ConfigurationCommon, ul_info.slot_tx, mac->frame_type)) { - LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() from %s\n", ul_info.slot_tx, __FUNCTION__); - nr_ue_ul_indication(&ul_info); + LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() and nr_ue_pucch_scheduler() from %s\n", ul_info.slot_tx, __FUNCTION__); + nr_ue_scheduler(NULL, &ul_info); + nr_ue_prach_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id); + nr_ue_pucch_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id); check_nr_prach(mac, &ul_info, &prach_resources); } if (!IS_SOFTMODEM_NOS1 && get_softmodem_params()->sa) { @@ -544,10 +467,6 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) pdcp_run(&ctxt); } process_queued_nr_nfapi_msgs(mac, sfn_slot); - free(slot_ind); - slot_ind = NULL; - free(ch_info); - ch_info = NULL; } return NULL; } diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 23615b2c98..46fa515e0d 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -50,6 +50,7 @@ #include "LAYER2/MAC/mac_vars.h" #include "RRC/LTE/rrc_vars.h" #include "PHY_INTERFACE/phy_interface_vars.h" +#include "NR_IF_Module.h" #include "openair1/SIMULATION/TOOLS/sim.h" #ifdef SMBV @@ -156,6 +157,9 @@ uint32_t N_RB_DL = 106; */ uint8_t abstraction_flag=0; +nr_bler_struct nr_bler_data[NR_NUM_MCS]; + +static void init_bler_table(void); /*---------------------BMC: timespec helpers -----------------------------*/ @@ -250,7 +254,6 @@ void init_tpools(uint8_t nun_dlsch_threads) { free(params); init_dlsch_tpool( nun_dlsch_threads); } - static void get_options(void) { nrUE_params.ofdm_offset_divisor = 8; @@ -472,6 +475,7 @@ int main( int argc, char **argv ) { PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_NR_UE *)*MAX_NUM_CCs); if (get_softmodem_params()->emulate_l1) { RCconfig_nr_ue_L1(); + init_bler_table(); } if (get_softmodem_params()->do_ra) @@ -552,3 +556,56 @@ int main( int argc, char **argv ) { return 0; } + +// Read in each MCS file and build BLER-SINR-TB table +static void init_bler_table(void) { + memset(nr_bler_data, 0, sizeof(nr_bler_data)); + + const char *awgn_results_dir = getenv("AWGN_RESULTS_DIR"); + if (!awgn_results_dir) { + LOG_W(NR_MAC, "No $AWGN_RESULTS_DIR\n"); + return; + } + + for (unsigned int i = 0; i < NR_NUM_MCS; i++) { + char fName[1024]; + snprintf(fName, sizeof(fName), "%s/mcs%d_awgn_5G.csv", awgn_results_dir, i); + FILE *pFile = fopen(fName, "r"); + if (!pFile) { + LOG_E(NR_MAC, "%s: open %s: %s\n", __func__, fName, strerror(errno)); + continue; + } + size_t bufSize = 1024; + char * line = NULL; + char * token; + char * temp = NULL; + int nlines = 0; + while (getline(&line, &bufSize, pFile) > 0) { + if (!strncmp(line, "SNR", 3)) { + continue; + } + + if (nlines > NUM_SINR) { + LOG_E(NR_MAC, "BLER FILE ERROR - num lines greater than expected - file: %s\n", fName); + abort(); + } + + token = strtok_r(line, ";", &temp); + int ncols = 0; + while (token != NULL) { + if (ncols > NUM_BLER_COL) { + LOG_E(NR_MAC, "BLER FILE ERROR - num of cols greater than expected\n"); + abort(); + } + + nr_bler_data[i].bler_table[nlines][ncols] = strtof(token, NULL); + ncols++; + + token = strtok_r(NULL, ";", &temp); + } + nlines++; + } + nr_bler_data[i].length = nlines; + fclose(pFile); + } +} diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c index 44ee05940f..6bc5a736de 100644 --- a/nfapi/oai_integration/nfapi_vnf.c +++ b/nfapi/oai_integration/nfapi_vnf.c @@ -244,13 +244,13 @@ void oai_create_gnb(void) { if (RC.gNB == NULL) { RC.gNB = (PHY_VARS_gNB **) calloc(1, sizeof(PHY_VARS_gNB *)); - LOG_I(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB); + LOG_D(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB); } if (RC.gNB[0] == NULL) { RC.gNB[0] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB)); - LOG_I(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]); + LOG_D(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]); } PHY_VARS_gNB *gNB = RC.gNB[0]; @@ -491,7 +491,7 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) { L1_proc->frame_tx = (L1_proc->slot_rx > (19-slot_ahead)) ? (L1_proc->frame_rx+1)&1023 : L1_proc->frame_rx; L1_proc->slot_tx = (L1_proc->slot_rx + slot_ahead)%20; - //LOG_I(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx); + //LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx); //NFAPI_TRACE(NFAPI_TRACE_INFO, "\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx); // the thread can now be woken up if (pthread_cond_signal(&L1_proc->cond) != 0) { @@ -757,7 +757,7 @@ int phy_nr_rach_indication(nfapi_nr_rach_indication_t *ind) int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { - LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n", + LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n", __FUNCTION__,ind->sfn, ind->slot, ind->num_ucis); if(NFAPI_MODE == NFAPI_MODE_VNF) { @@ -787,12 +787,12 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) if (ind_pdu->harq) { uci_ind_pdu->harq = CALLOC(1, sizeof(*uci_ind_pdu->harq)); AssertFatal(uci_ind_pdu->harq != NULL, "Memory not allocated for uci_ind_pdu->harq in phy_nr_uci_indication."); - *uci_ind_pdu->harq = *ind_pdu->harq; + uci_ind_pdu->harq->harq_list = CALLOC(uci_ind_pdu->harq->num_harq, sizeof(*uci_ind_pdu->harq->harq_list)); AssertFatal(uci_ind_pdu->harq->harq_list != NULL, "Memory not allocated for uci_ind_pdu->harq->harq_list in phy_nr_uci_indication."); for (int j = 0; j < uci_ind_pdu->harq->num_harq; j++) - uci_ind_pdu->harq->harq_list[j].harq_value = ind_pdu->harq->harq_list[j].harq_value; + uci_ind_pdu->harq->harq_list[j].harq_value = ind_pdu->harq->harq_list[j].harq_value; } break; } @@ -800,21 +800,27 @@ int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: { nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_ind_pdu = &uci_ind->uci_list[i].pucch_pdu_format_2_3_4; nfapi_nr_uci_pucch_pdu_format_2_3_4_t *ind_pdu = &ind->uci_list[i].pucch_pdu_format_2_3_4; - - uci_ind_pdu->harq.harq_payload = CALLOC(1, sizeof(*uci_ind_pdu->harq.harq_payload)); - AssertFatal(uci_ind_pdu->harq.harq_payload != NULL, "Memory not allocated for uci_ind_pdu->harq.harq_payload in phy_nr_uci_indication."); - *uci_ind_pdu->harq.harq_payload = *ind_pdu->harq.harq_payload; - - - uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); - AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication."); - *uci_ind_pdu->csi_part1.csi_part1_payload = *ind_pdu->csi_part1.csi_part1_payload; - - - uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); - AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication."); - *uci_ind_pdu->csi_part2.csi_part2_payload = *ind_pdu->csi_part2.csi_part2_payload; - + *uci_ind_pdu = *ind_pdu; + if (ind_pdu->harq.harq_payload) { + uci_ind_pdu->harq.harq_payload = CALLOC(1, sizeof(*uci_ind_pdu->harq.harq_payload)); + AssertFatal(uci_ind_pdu->harq.harq_payload != NULL, "Memory not allocated for uci_ind_pdu->harq.harq_payload in phy_nr_uci_indication."); + *uci_ind_pdu->harq.harq_payload = *ind_pdu->harq.harq_payload; + } + if (ind_pdu->sr.sr_payload) { + uci_ind_pdu->sr.sr_payload = CALLOC(1, sizeof(*uci_ind_pdu->sr.sr_payload)); + AssertFatal(uci_ind_pdu->sr.sr_payload != NULL, "Memory not allocated for uci_ind_pdu->sr.sr_payload in phy_nr_uci_indication."); + *uci_ind_pdu->sr.sr_payload = *ind_pdu->sr.sr_payload; + } + if (ind_pdu->csi_part1.csi_part1_payload) { + uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); + AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication."); + *uci_ind_pdu->csi_part1.csi_part1_payload = *ind_pdu->csi_part1.csi_part1_payload; + } + if (ind_pdu->csi_part2.csi_part2_payload) { + uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); + AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication."); + *uci_ind_pdu->csi_part2.csi_part2_payload = *ind_pdu->csi_part2.csi_part2_payload; + } break; } } @@ -944,7 +950,7 @@ int phy_crc_indication(struct nfapi_vnf_p7_config *config, nfapi_crc_indication_ int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { - LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n", + LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u\n", __FUNCTION__,ind->sfn, ind->slot, ind->number_crcs); if(NFAPI_MODE == NFAPI_MODE_VNF) @@ -967,7 +973,7 @@ int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { crc_ind->crc_list[j].tb_crc_status = ind->crc_list[j].tb_crc_status; crc_ind->crc_list[j].timing_advance = ind->crc_list[j].timing_advance; crc_ind->crc_list[j].ul_cqi = ind->crc_list[j].ul_cqi; - LOG_I(NR_MAC, "Received crc_ind.harq_id = %d for %d index SFN SLot %u %u with rnti %x\n", + LOG_D(NR_MAC, "Received crc_ind.harq_id = %d for %d index SFN SLot %u %u with rnti %x\n", ind->crc_list[j].harq_id, j, ind->sfn, ind->slot, ind->crc_list[j].rnti); } if (!put_queue(&gnb_crc_ind_queue, crc_ind)) @@ -1063,7 +1069,7 @@ int phy_rx_indication(struct nfapi_vnf_p7_config *config, nfapi_rx_indication_t int phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { - LOG_I(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u, and pdu %p\n", + LOG_D(NR_MAC, "In %s() NFAPI SFN/SF: %d/%d number_of_pdus :%u, and pdu %p\n", __FUNCTION__,ind->sfn, ind->slot, ind->number_of_pdus, ind->pdu_list[0].pdu); if(NFAPI_MODE == NFAPI_MODE_VNF) @@ -1165,7 +1171,7 @@ static void analyze_cqi_pdus_for_duplicates(nfapi_cqi_indication_t *ind) { nfapi_cqi_indication_pdu_t *src_pdu = &ind->cqi_indication_body.cqi_pdu_list[i]; - LOG_I(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti, + LOG_D(MAC, "CQI_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti, src_pdu->ul_cqi_information.ul_cqi, src_pdu->ul_cqi_information.channel); for (int j = i + 1; j < num_cqis; j++) @@ -1887,7 +1893,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! dl_config_req->header.message_id = NFAPI_DL_CONFIG_REQUEST; - LOG_I(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__, + LOG_D(PHY, "[VNF] %s() DL_CONFIG_REQ sfn_sf:%d_%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_config_req->dl_config_request_body.number_pdu); if (dl_config_req->dl_config_request_body.number_pdu > 0) { @@ -1898,7 +1904,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { { uint16_t dl_rnti = dl_config_req->dl_config_request_body.dl_config_pdu_list[i].dlsch_pdu.dlsch_pdu_rel8.rnti; uint16_t numPDUs = dl_config_req->dl_config_request_body.number_pdu; - LOG_I(MAC, "(OAI eNB) Sending dl_config_req at VNF during Frame: %d and Subframe: %d," + LOG_D(MAC, "(OAI eNB) Sending dl_config_req at VNF during Frame: %d and Subframe: %d," " with a RNTI value of: %x and with number of PDUs: %u\n", NFAPI_SFNSF2SFN(dl_config_req->sfn_sf),NFAPI_SFNSF2SF(dl_config_req->sfn_sf), dl_rnti, numPDUs); } @@ -1919,8 +1925,7 @@ int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { - //LOG_I(PHY, "sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot); - //printf("\nEntering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot); + LOG_D(NR_PHY, "Entering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n", dl_config_req->SFN, dl_config_req->Slot); nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST; dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! @@ -1939,6 +1944,7 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req) { + LOG_D(NR_PHY, "Entering oai_nfapi_nr_tx_data_req sfn:%d,slot:%d\n", tx_data_req->SFN, tx_data_req->Slot); nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; tx_data_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! tx_data_req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST; @@ -2056,7 +2062,7 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { { uint8_t pdu_type = pdu_list[i].pdu_type; - LOG_I(MAC, "ul_config_req num_pdus: %u pdu_number: %d pdu_type: %u SFN.SF: %d.%d\n", + LOG_D(MAC, "ul_config_req num_pdus: %u pdu_number: %d pdu_type: %u SFN.SF: %d.%d\n", num_pdus, i, pdu_type, ul_config_req->sfn_sf >> 4, ul_config_req->sfn_sf & 15); if (pdu_type != NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) diff --git a/nfapi/open-nFAPI/nfapi/inc/nfapi.h b/nfapi/open-nFAPI/nfapi/inc/nfapi.h index 0f09efa78a..c1f423a8db 100644 --- a/nfapi/open-nFAPI/nfapi/inc/nfapi.h +++ b/nfapi/open-nFAPI/nfapi/inc/nfapi.h @@ -44,13 +44,21 @@ uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end); uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end); uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end); uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end); -uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end); +uint32_t pullarray32(uint8_t **values_to_pull, + uint32_t out[], + uint32_t max_num_values_to_pull, + uint32_t num_values_to_pull, + uint8_t *out_end); uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end); uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); -uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); +uint32_t pusharray32(const uint32_t *values_to_push, + uint32_t max_num_values_to_push, + uint32_t num_values_to_push, + uint8_t **out, + uint8_t *out_end); uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); typedef uint8_t (*pack_array_elem_fn)(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end); diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c index 2783781e2c..09c0229db0 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c @@ -1,783 +1,855 @@ -/* - * Copyright (c) 2001-2016, Cisco Systems, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * Neither the name of the Cisco Systems, Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - - -// Fundamental routines - -uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 1) { - pOut[0] = in; - (*out)+=1; - return 1; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 1) { - pOut[0] = in; - (*out)+=1; - return 1; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 2) { - pOut[0] = (in & 0xFF00) >> 8; - pOut[1] = (in & 0xFF); - (*out)+=2; - return 2; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 2) { - pOut[0] = (in & 0xFF00) >> 8; - pOut[1] = (in & 0xFF); - (*out)+=2; - return 2; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 4) { - pOut[0] = (in & 0xFF000000) >> 24; - pOut[1] = (in & 0xFF0000) >> 16; - pOut[2] = (in & 0xFF00) >> 8; - pOut[3] = (in & 0xFF); - (*out)+=4; - return 4; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) { - uint8_t *pOut = *out; - - if((end - pOut) >= 4) { - pOut[0] = (in & 0xFF000000) >> 24; - pOut[1] = (in & 0xFF0000) >> 16; - pOut[2] = (in & 0xFF00) >> 8; - pOut[3] = (in & 0xFF); - (*out)+=4; - return 4; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >= 1 ) { - *out = *pIn; - (*in)+=1; - return 1; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >= 1 ) { - *out = *pIn; - (*in)+=1; - return 1; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >=2 ) { - *out = ((pIn[0]) << 8) | pIn[1]; - (*in)+=2; - return 2; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >=2 ) { - *out = ((pIn[0]) << 8) | pIn[1]; - (*in)+=2; - return 2; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >=4 ) { - *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; - (*in)+=4; - return 4; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) { - uint8_t *pIn = *in; - - if((end - pIn) >=4 ) { - *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; - (*in)+=4; - return 4; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -/* -inline void pusharray16(uint8_t **, uint16_t, uint32_t len) -{ -} -*/ - -uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*in)) >= sizeof(uint16_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!pull16(in, &out[idx], end)) - return 0; - } - - return sizeof(uint16_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*in)) >= sizeof(uint16_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!pulls16(in, &out[idx], end)) - return 0; - } - - return sizeof(uint16_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*out)) >= sizeof(uint16_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!push16(in[idx], out, end)) - return 0; - } - - return sizeof(uint16_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*out)) >= sizeof(uint16_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - pushs16(in[idx], out, end); - } - - return sizeof(uint16_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*in)) >= sizeof(uint32_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!pull32(in, &out[idx], end)) - return 0; - } - - return sizeof(uint32_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*in)) >= sizeof(uint32_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!pulls32(in, &out[idx], end)) - return 0; - } - - return sizeof(uint32_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*out)) >= sizeof(uint32_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - if(!push32(in[idx], out, end)) - return 0; - } - - return sizeof(uint32_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*out)) >= sizeof(uint32_t) * len) { - uint32_t idx; - - for(idx = 0; idx < len; ++idx) { - pushs32(in[idx], out, end); - } - - return sizeof(uint32_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} -uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*in)) >= sizeof(uint8_t) * len) { - memcpy(out, (*in), len); - (*in)+=len; - return sizeof(uint8_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { - if(len == 0) - return 1; - - if(len > max_len) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); - return 0; - } - - if((end - (*out)) >= sizeof(uint8_t) * len) { - memcpy((*out), in, len); - (*out)+=len; - return sizeof(uint8_t) * len; - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); - return 0; - } -} - -uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) { - if(count > max_count) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); - return 0; - } - - uint16_t i = 0; - - for(i = 0; i < count; ++i) { - if((fn)(array, ppwritepackedmsg, end) == 0) - return 0; - - array += array_element_size; - } - - return 1; -} - -uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) { - if(count > max_count) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); - return 0; - } - - uint16_t i = 0; - - for(i = 0; i < count; ++i) { - if((fn)(array, ppReadPackedMsg, end) == 0) - return 0; - - array += array_element_size; - } - - return 1; -} - - -uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) { - if(ve != 0 && config != 0) { - if(config->pack_vendor_extension_tlv) { - uint8_t *pStartOfTlv = *ppWritePackedMsg; - - if(pack_tl(ve, ppWritePackedMsg, end) == 0) - return 0; - - uint8_t *pStartOfValue = *ppWritePackedMsg; - - if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) - return 0; - - ve->length = (*ppWritePackedMsg) - pStartOfValue; - pack_tl(ve, &pStartOfTlv, end); - return 1; - } - } - - return 1; -} - -uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) { - if(ve_tlv != 0 && config != 0) { - if(config->unpack_vendor_extension_tlv) { - return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config); - } - } - - return 1; -} - -uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) { - if(ve != 0 && config != 0) { - if(config->pack_vendor_extension_tlv) { - uint8_t *pStartOfTlv = *ppWritePackedMsg; - - if(pack_tl(ve, ppWritePackedMsg, end) == 0) - return 0; - - uint8_t *pStartOfValue = *ppWritePackedMsg; - - if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) - return 0; - - ve->length = (*ppWritePackedMsg) - pStartOfValue; - pack_tl(ve, &pStartOfTlv, end); - return 1; - } - } - - return 1; -} - -int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) { - if(ve_tlv != 0 && config != 0) { - if(config->unpack_vendor_extension_tlv) { - return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config); - } - } - - return 1; -} - - -uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) { - return (push16(tl->tag, ppWritePackedMsg, end) && - push16(tl->length, ppWritePackedMsg, end)); -} - -uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) { - return (pull16(ppReadPackedMsg, &tl->tag, end) && - pull16(ppReadPackedMsg, &tl->length, end)); -} - -int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) { - nfapi_tl_t generic_tl; - uint8_t numBadTags = 0; - uint16_t idx = 0; - - while ((uint8_t *)(*ppReadPackedMsg) < end) { - // unpack the tl and process the values accordingly - if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) - return 0; - - uint8_t tagMatch = 0; - uint8_t *pStartOfValue = *ppReadPackedMsg; - - for(idx = 0; idx < size; ++idx) { - if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list - tagMatch = 1; - nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv); - tl->tag = generic_tl.tag; - tl->length = generic_tl.length; - int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end); - - if(result == 0) { - return 0; - } - - // check if the length was right; - if(tl->length != (*ppReadPackedMsg - pStartOfValue)) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); - } - } - } - - if(tagMatch == 0) { - if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && - generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) { - int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); - - if(result == 0) { - // got tot the end. - return 0; - } else if(result < 0) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag); - - if (++numBadTags > MAX_BAD_TAG) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); - return 0; - } - - if((end - *ppReadPackedMsg) >= generic_tl.length) { - // Advance past the unknown TLV - (*ppReadPackedMsg) += generic_tl.length; - } else { - // go to the end - return 0; - } - } - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); - - if (++numBadTags > MAX_BAD_TAG) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); - return 0; - } - - if((end - *ppReadPackedMsg) >= generic_tl.length) { - // Advance past the unknown TLV - (*ppReadPackedMsg) += generic_tl.length; - } else { - // go to the end - return 0; - } - } - } - } - - return 1; -} -int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) { - nfapi_tl_t generic_tl; - uint8_t numBadTags = 0; - uint16_t idx = 0; - - while ((uint8_t *)(*ppReadPackedMsg) < end) { - // unpack the tl and process the values accordingly - if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) - return 0; - - uint8_t tagMatch = 0; - uint8_t *pStartOfValue = *ppReadPackedMsg; - - for(idx = 0; idx < size; ++idx) { - if(unpack_fns[idx].tag == generic_tl.tag) { - tagMatch = 1; - nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv); - tl->tag = generic_tl.tag; - tl->length = generic_tl.length; - int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config); - - if(result == 0) { - return 0; - } - - // check if the length was right; - if(tl->length != (*ppReadPackedMsg - pStartOfValue)) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); - } - } - } - - if(tagMatch == 0) { - if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && - generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) { - int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); - - if(result == 0) { - // got to end - return 0; - } else if(result < 0) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); - - if (++numBadTags > MAX_BAD_TAG) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); - return -1; - } - - if((end - *ppReadPackedMsg) >= generic_tl.length) { - // Advance past the unknown TLV - (*ppReadPackedMsg) += generic_tl.length; - } else { - // got ot the dn - return 0; - } - } - } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); - - if (++numBadTags > MAX_BAD_TAG) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); - return -1; - } - - if((end - *ppReadPackedMsg) >= generic_tl.length) { - // Advance past the unknown TLV - (*ppReadPackedMsg) += generic_tl.length; - } else { - // got ot the dn - return 0; - } - } - } - } - - return 1; -} - -// This intermediate function deals with calculating the length of the value -// and writing into the tlv header. -uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) { - nfapi_tl_t *tl = (nfapi_tl_t *)tlv; - - // If the tag is defined - if(tl->tag == tag) { - uint8_t *pStartOfTlv = *ppWritePackedMsg; - - // write a dumy tlv header - if(pack_tl(tl, ppWritePackedMsg, end) == 0) - return 0; - - // Record the start of the value - uint8_t *pStartOfValue = *ppWritePackedMsg; - - // pack the tlv value - if(fn(tlv, ppWritePackedMsg, end) == 0) - return 0; - - // calculate the length of the value and rewrite the tl header - tl->length = (*ppWritePackedMsg) - pStartOfValue; - // rewrite the header with the correct length - pack_tl(tl, &pStartOfTlv, end); - } else { - if(tl->tag != 0) { - NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); - } else { - //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); - } - } - - return 1; -} - -const char *nfapi_error_code_to_str(nfapi_error_code_e value) { - switch(value) { - case NFAPI_MSG_OK: - return "NFAPI_MSG_OK"; - - case NFAPI_MSG_INVALID_STATE: - return "NFAPI_MSG_INVALID_STATE"; - - case NFAPI_MSG_INVALID_CONFIG: - return "NFAPI_MSG_INVALID_CONFIG"; - - case NFAPI_SFN_OUT_OF_SYNC: - return "NFAPI_SFN_OUT_OF_SYNC"; - - case NFAPI_MSG_SUBFRAME_ERR: - return "NFAPI_MSG_SUBFRAME_ERR"; - - case NFAPI_MSG_BCH_MISSING: - return "NFAPI_MSG_BCH_MISSING"; - - case NFAPI_MSG_INVALID_SFN: - return "NFAPI_MSG_INVALID_SFN"; - - case NFAPI_MSG_HI_ERR: - return "NFAPI_MSG_HI_ERR"; - - case NFAPI_MSG_TX_ERR: - return "NFAPI_MSG_TX_ERR"; - - default: - return "UNKNOWN"; - } -} +/* + * Copyright (c) 2001-2016, Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// What to do when an error happens (e.g., a push or pull fails) +static inline void on_error() +{ + // show the call stack + int fd = STDERR_FILENO; + static const char msg[] = "---stack trace---\n"; + __attribute__((unused)) int r = + write(fd, msg, sizeof(msg) - 1); + void *buffer[100]; + int nptrs = backtrace(buffer, sizeof(buffer) / sizeof(buffer[0])); + backtrace_symbols_fd(buffer, nptrs, fd); + + //abort(); +} + +// Fundamental routines + +uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 1) { + pOut[0] = in; + (*out)+=1; + return 1; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 1) { + pOut[0] = in; + (*out)+=1; + return 1; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 2) { + pOut[0] = (in & 0xFF00) >> 8; + pOut[1] = (in & 0xFF); + (*out)+=2; + return 2; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 2) { + pOut[0] = (in & 0xFF00) >> 8; + pOut[1] = (in & 0xFF); + (*out)+=2; + return 2; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 4) { + pOut[0] = (in & 0xFF000000) >> 24; + pOut[1] = (in & 0xFF0000) >> 16; + pOut[2] = (in & 0xFF00) >> 8; + pOut[3] = (in & 0xFF); + (*out)+=4; + return 4; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) { + uint8_t *pOut = *out; + + if((end - pOut) >= 4) { + pOut[0] = (in & 0xFF000000) >> 24; + pOut[1] = (in & 0xFF0000) >> 16; + pOut[2] = (in & 0xFF00) >> 8; + pOut[3] = (in & 0xFF); + (*out)+=4; + return 4; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >= 1 ) { + *out = *pIn; + (*in)+=1; + return 1; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >= 1 ) { + *out = *pIn; + (*in)+=1; + return 1; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >=2 ) { + *out = ((pIn[0]) << 8) | pIn[1]; + (*in)+=2; + return 2; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >=2 ) { + *out = ((pIn[0]) << 8) | pIn[1]; + (*in)+=2; + return 2; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >=4 ) { + *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; + (*in)+=4; + return 4; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) { + uint8_t *pIn = *in; + + if((end - pIn) >=4 ) { + *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; + (*in)+=4; + return 4; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +/* +inline void pusharray16(uint8_t **, uint16_t, uint32_t len) +{ +} +*/ + +uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*in)) >= sizeof(uint16_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if(!pull16(in, &out[idx], end)) + return 0; + } + + return sizeof(uint16_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*in)) >= sizeof(uint16_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if(!pulls16(in, &out[idx], end)) + return 0; + } + + return sizeof(uint16_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*out)) >= sizeof(uint16_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if(!push16(in[idx], out, end)) + return 0; + } + + return sizeof(uint16_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*out)) >= sizeof(uint16_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if (!pushs16(in[idx], out, end)) + return 0; + } + + return sizeof(uint16_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pullarray32(uint8_t **values_to_pull, + uint32_t out[], + uint32_t max_num_values_to_pull, + uint32_t num_values_to_pull, + uint8_t *out_end) { + if (num_values_to_pull == 0) + + return 1; + + if (num_values_to_pull > max_num_values_to_pull) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", + __FUNCTION__, num_values_to_pull, max_num_values_to_pull); + on_error(); + return 0; + } + + if ((out_end - (*values_to_pull)) >= sizeof(uint32_t) * num_values_to_pull) { + uint32_t idx; + + for (idx = 0; idx < num_values_to_pull; ++idx) { + if (!pull32(values_to_pull, &out[idx], out_end)) + return 0; + } + + return sizeof(uint32_t) * num_values_to_pull; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*in)) >= sizeof(uint32_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if(!pulls32(in, &out[idx], end)) + return 0; + } + + return sizeof(uint32_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pusharray32(const uint32_t *values_to_push, + uint32_t max_num_values_to_push, + uint32_t num_values_to_push, + uint8_t **out, + uint8_t *out_end) { + if (num_values_to_push == 0) + return 1; + + if (num_values_to_push > max_num_values_to_push) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", + __FUNCTION__, num_values_to_push, max_num_values_to_push); + on_error(); + return 0; + } + + if ((out_end - (*out)) >= sizeof(uint32_t) * num_values_to_push) { + uint32_t idx; + + for (idx = 0; idx < num_values_to_push; ++idx) { + if (!push32(values_to_push[idx], out, out_end)) + return 0; + } + + return sizeof(uint32_t) * num_values_to_push; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*out)) >= sizeof(uint32_t) * len) { + uint32_t idx; + + for(idx = 0; idx < len; ++idx) { + if (!pushs32(in[idx], out, end)) + return 0; + } + + return sizeof(uint32_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} +uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*in)) >= sizeof(uint8_t) * len) { + memcpy(out, (*in), len); + (*in)+=len; + return sizeof(uint8_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) { + if(len == 0) + return 1; + + if(len > max_len) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + on_error(); + return 0; + } + + if((end - (*out)) >= sizeof(uint8_t) * len) { + memcpy((*out), in, len); + (*out)+=len; + return sizeof(uint8_t) * len; + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + on_error(); + return 0; + } +} + +uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) { + if(count > max_count) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); + on_error(); + return 0; + } + + uint16_t i = 0; + + for(i = 0; i < count; ++i) { + if((fn)(array, ppwritepackedmsg, end) == 0) + return 0; + + array += array_element_size; + } + + return 1; +} + +uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) { + if(count > max_count) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); + on_error(); + return 0; + } + + uint16_t i = 0; + + for(i = 0; i < count; ++i) { + if((fn)(array, ppReadPackedMsg, end) == 0) + return 0; + + array += array_element_size; + } + + return 1; +} + + +uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) { + if(ve != 0 && config != 0) { + if(config->pack_vendor_extension_tlv) { + uint8_t *pStartOfTlv = *ppWritePackedMsg; + + if(pack_tl(ve, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t *pStartOfValue = *ppWritePackedMsg; + + if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) + return 0; + + ve->length = (*ppWritePackedMsg) - pStartOfValue; + pack_tl(ve, &pStartOfTlv, end); + return 1; + } + } + + return 1; +} + +uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) { + if(ve_tlv != 0 && config != 0) { + if(config->unpack_vendor_extension_tlv) { + return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config); + } + } + + return 1; +} + +uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) { + if(ve != 0 && config != 0) { + if(config->pack_vendor_extension_tlv) { + uint8_t *pStartOfTlv = *ppWritePackedMsg; + + if(pack_tl(ve, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t *pStartOfValue = *ppWritePackedMsg; + + if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) + return 0; + + ve->length = (*ppWritePackedMsg) - pStartOfValue; + pack_tl(ve, &pStartOfTlv, end); + return 1; + } + } + + return 1; +} + +int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) { + if(ve_tlv != 0 && config != 0) { + if(config->unpack_vendor_extension_tlv) { + return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config); + } + } + + return 1; +} + + +uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) { + return (push16(tl->tag, ppWritePackedMsg, end) && + push16(tl->length, ppWritePackedMsg, end)); +} + +uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) { + return (pull16(ppReadPackedMsg, &tl->tag, end) && + pull16(ppReadPackedMsg, &tl->length, end)); +} + +int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) { + nfapi_tl_t generic_tl; + uint8_t numBadTags = 0; + uint16_t idx = 0; + + while ((uint8_t *)(*ppReadPackedMsg) < end) { + // unpack the tl and process the values accordingly + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + uint8_t tagMatch = 0; + uint8_t *pStartOfValue = *ppReadPackedMsg; + + for(idx = 0; idx < size; ++idx) { + if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list + tagMatch = 1; + nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv); + tl->tag = generic_tl.tag; + tl->length = generic_tl.length; + int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end); + + if(result == 0) { + return 0; + } + + // check if the length was right; + if(tl->length != (*ppReadPackedMsg - pStartOfValue)) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); + on_error(); + } + } + } + + if(tagMatch == 0) { + if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && + generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) { + int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); + + if(result == 0) { + // got tot the end. + return 0; + } else if(result < 0) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag); + on_error(); + + if (++numBadTags > MAX_BAD_TAG) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + on_error(); + return 0; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } else { + // go to the end + return 0; + } + } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + on_error(); + + if (++numBadTags > MAX_BAD_TAG) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + on_error(); + return 0; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } else { + // go to the end + return 0; + } + } + } + } + + return 1; +} +int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) { + nfapi_tl_t generic_tl; + uint8_t numBadTags = 0; + uint16_t idx = 0; + + while ((uint8_t *)(*ppReadPackedMsg) < end) { + // unpack the tl and process the values accordingly + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + uint8_t tagMatch = 0; + uint8_t *pStartOfValue = *ppReadPackedMsg; + + for(idx = 0; idx < size; ++idx) { + if(unpack_fns[idx].tag == generic_tl.tag) { + tagMatch = 1; + nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv); + tl->tag = generic_tl.tag; + tl->length = generic_tl.length; + int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config); + + if(result == 0) { + return 0; + } + + // check if the length was right; + if(tl->length != (*ppReadPackedMsg - pStartOfValue)) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %ld\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); + on_error(); + } + } + } + + if(tagMatch == 0) { + if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && + generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) { + int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); + + if(result == 0) { + // got to end + return 0; + } else if(result < 0) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + on_error(); + + if (++numBadTags > MAX_BAD_TAG) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + on_error(); + return -1; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } else { + // got ot the dn + return 0; + } + } + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + on_error(); + + if (++numBadTags > MAX_BAD_TAG) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + on_error(); + return -1; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } else { + // got ot the dn + return 0; + } + } + } + } + + return 1; +} + +// This intermediate function deals with calculating the length of the value +// and writing into the tlv header. +uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) { + nfapi_tl_t *tl = (nfapi_tl_t *)tlv; + + // If the tag is defined + if(tl->tag == tag) { + uint8_t *pStartOfTlv = *ppWritePackedMsg; + + // write a dumy tlv header + if(pack_tl(tl, ppWritePackedMsg, end) == 0) + return 0; + + // Record the start of the value + uint8_t *pStartOfValue = *ppWritePackedMsg; + + // pack the tlv value + if(fn(tlv, ppWritePackedMsg, end) == 0) + return 0; + + // calculate the length of the value and rewrite the tl header + tl->length = (*ppWritePackedMsg) - pStartOfValue; + // rewrite the header with the correct length + pack_tl(tl, &pStartOfTlv, end); + } else { + if(tl->tag != 0) { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); + } else { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); + } + } + + return 1; +} + +const char *nfapi_error_code_to_str(nfapi_error_code_e value) { + switch(value) { + case NFAPI_MSG_OK: + return "NFAPI_MSG_OK"; + + case NFAPI_MSG_INVALID_STATE: + return "NFAPI_MSG_INVALID_STATE"; + + case NFAPI_MSG_INVALID_CONFIG: + return "NFAPI_MSG_INVALID_CONFIG"; + + case NFAPI_SFN_OUT_OF_SYNC: + return "NFAPI_SFN_OUT_OF_SYNC"; + + case NFAPI_MSG_SUBFRAME_ERR: + return "NFAPI_MSG_SUBFRAME_ERR"; + + case NFAPI_MSG_BCH_MISSING: + return "NFAPI_MSG_BCH_MISSING"; + + case NFAPI_MSG_INVALID_SFN: + return "NFAPI_MSG_INVALID_SFN"; + + case NFAPI_MSG_HI_ERR: + return "NFAPI_MSG_HI_ERR"; + + case NFAPI_MSG_TX_ERR: + return "NFAPI_MSG_TX_ERR"; + + default: + return "UNKNOWN"; + } +} diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c index 0e43c803e7..3adde23e7d 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -1048,7 +1048,7 @@ static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t push8(srs_pdu->comb_offset, ppWritePackedMsg, end) && push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) && push8(srs_pdu->frequency_position, ppWritePackedMsg, end) && - push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) && + push16(srs_pdu->frequency_shift, ppWritePackedMsg, end) && push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) && push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) && push8(srs_pdu->resource_type, ppWritePackedMsg, end) && @@ -1583,13 +1583,19 @@ static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePac static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) { nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg; - if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) && - push16(pNfapiMsg->Slot, ppWritePackedMsg, end) && - push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) && - push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) && - push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) && - push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) && - push8(pNfapiMsg->n_group, ppWritePackedMsg, end) )) + if (!push16(pNfapiMsg->SFN, ppWritePackedMsg, end)) + return 0; + if (!push16(pNfapiMsg->Slot, ppWritePackedMsg, end)) + return 0; + if (!push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end)) + return 0; + if (!push8(pNfapiMsg->n_group, ppWritePackedMsg, end)) + return 0; + if (!push8(pNfapiMsg->rach_present, ppWritePackedMsg, end)) + return 0; + if (!push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end)) + return 0; + if (!push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end)) return 0; for(int i=0; in_pdus; i++) { @@ -1893,15 +1899,23 @@ static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg switch(value->TLVs[i].tag) { case 0: { - if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end)) + if (!pusharray32(value->TLVs[i].value.direct, sizeof(value->TLVs[i].value.direct) / sizeof(uint32_t), + value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n", + __FUNCTION__, __LINE__, value->TLVs[i].length); return 0; + } break; } case 1: { - if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end)) + if (!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length / sizeof(uint32_t), + value->TLVs[i].length / sizeof(uint32_t), ppWritePackedMsg, end)) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s():%d. value->TLVs[i].length %d \n", + __FUNCTION__, __LINE__, value->TLVs[i].length); return 0; + } break; } @@ -3008,10 +3022,8 @@ return 1; //RX DATA INDICATION -static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +static uint8_t pack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) { - nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv; - if(!(push32(value->handle, ppWritePackedMsg, end) && push16(value->rnti, ppWritePackedMsg, end) && push8(value->harq_id, ppWritePackedMsg, end) && @@ -3041,7 +3053,7 @@ static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, for (int i = 0; i < pNfapiMsg->number_of_pdus; i++) { - if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end)) + if(!pack_nr_rx_data_indication_body(&(pNfapiMsg->pdu_list[i]), ppWritePackedMsg, end)) return 0; } @@ -3089,10 +3101,8 @@ return 1; //SRS INDICATION -static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +static uint8_t pack_nr_srs_indication_body(nfapi_nr_srs_indication_pdu_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) { - nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv; - if(!(push32(value->handle, ppWritePackedMsg, end) && push16(value->rnti, ppWritePackedMsg, end) && push16(value->timing_advance, ppWritePackedMsg, end) && @@ -3104,8 +3114,7 @@ static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg return 0; for(int i = 0; i < value->reported_symbol_list->num_rbs; i++) { - if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end) - )) + if (!push8(value->reported_symbol_list->rb_list[i].rb_snr, ppWritePackedMsg, end)) return 0; } return 1; @@ -3181,32 +3190,36 @@ return 1; static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) { nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv; - if(!(push8(value->pduBitmap, ppWritePackedMsg, end) && - push32(value->handle, ppWritePackedMsg, end) && - push16(value->rnti, ppWritePackedMsg, end) && - push8(value->pucch_format, ppWritePackedMsg, end) && - push8(value->ul_cqi, ppWritePackedMsg, end) && - push16(value->timing_advance, ppWritePackedMsg, end) && - push16(value->rssi, ppWritePackedMsg, end) - )) - return 0; + if (!push8(value->pduBitmap, ppWritePackedMsg, end)) + return 0; + if (!push32(value->handle, ppWritePackedMsg, end)) + return 0; + if (!push16(value->rnti, ppWritePackedMsg, end)) + return 0; + if (!push8(value->pucch_format, ppWritePackedMsg, end)) + return 0; + if (!push8(value->ul_cqi, ppWritePackedMsg, end)) + return 0; + if (!push16(value->timing_advance, ppWritePackedMsg, end)) + return 0; + if (!push16(value->rssi, ppWritePackedMsg, end)) + return 0; if (value->pduBitmap & 0x01) { //SR - if (!(push8(value->sr->sr_indication, ppWritePackedMsg, end) && - push8(value->sr->sr_confidence_level, ppWritePackedMsg, end) - )) - return 0; + if (!push8(value->sr->sr_indication, ppWritePackedMsg, end)) + return 0; + if (!push8(value->sr->sr_confidence_level, ppWritePackedMsg, end)) + return 0; } if (((value->pduBitmap >> 1) & 0x01)) { //HARQ - if (!(push8(value->harq->num_harq, ppWritePackedMsg, end) && - push8(value->harq->harq_confidence_level, ppWritePackedMsg, end) - )) + if (!push8(value->harq->num_harq, ppWritePackedMsg, end)) + return 0; + if (!push8(value->harq->harq_confidence_level, ppWritePackedMsg, end)) return 0; for (int i = 0; i < value->harq->num_harq; i++) { - if (!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end) - )) - return 0; + if (!push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)) + return 0; } } @@ -3216,57 +3229,79 @@ static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) { nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv; - if(!(push8(value->pduBitmap, ppWritePackedMsg, end) && - push32(value->handle, ppWritePackedMsg, end) && - push16(value->rnti, ppWritePackedMsg, end) && - push8(value->pucch_format, ppWritePackedMsg, end) && - push8(value->ul_cqi, ppWritePackedMsg, end) && - push16(value->timing_advance, ppWritePackedMsg, end) && - push16(value->rssi, ppWritePackedMsg, end) - )) - return 0; + if (!push8(value->pduBitmap, ppWritePackedMsg, end)) + return 0; + if (!push32(value->handle, ppWritePackedMsg, end)) + return 0; + if (!push16(value->rnti, ppWritePackedMsg, end)) + return 0; + if (!push8(value->pucch_format, ppWritePackedMsg, end)) + return 0; + if (!push8(value->ul_cqi, ppWritePackedMsg, end)) + return 0; + if (!push16(value->timing_advance, ppWritePackedMsg, end)) + return 0; + if (!push16(value->rssi, ppWritePackedMsg, end)) + return 0; if (value->pduBitmap & 0x01) { //SR - if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) && - pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end) - )) - return 0; - } - - if (((value->pduBitmap >> 1) & 0x01)) { //HARQ - if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) && - push8(value->harq.harq_bit_len, ppWritePackedMsg, end) && - pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end) - )) + if (!push16(value->sr.sr_bit_len, ppWritePackedMsg, end)) + return 0; + if (!pusharray8(value->sr.sr_payload, + (int)((value->sr.sr_bit_len / 8) + 1), + (int)((value->sr.sr_bit_len / 8) + 1), + ppWritePackedMsg, + end)) return 0; } - if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1 - if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) && - push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) && - pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end) - )) + if ((value->pduBitmap >> 1) & 0x01) { //HARQ + if (!push8(value->harq.harq_crc, ppWritePackedMsg, end)) + return 0; + if (!push16(value->harq.harq_bit_len, ppWritePackedMsg, end)) + return 0; + if (!pusharray8(value->harq.harq_payload, + (int)((value->harq.harq_bit_len / 8) + 1), + (int)((value->harq.harq_bit_len / 8) + 1), + ppWritePackedMsg, + end)) return 0; } - if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2 - if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) && - push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) && - pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end) - )) + if ((value->pduBitmap >> 2) & 0x01) { //CSI-1 + if (!push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end)) + return 0; + if (!push16(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end)) + return 0; + if (!pusharray8(value->csi_part1.csi_part1_payload, + (int)((value->csi_part1.csi_part1_bit_len / 8) + 1), + (int)((value->csi_part1.csi_part1_bit_len / 8) + 1), + ppWritePackedMsg, + end)) + return 0; + } + + if ((value->pduBitmap >> 3) & 0x01) { //CSI-2 + if (!push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end)) + return 0; + if (!push16(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end)) + return 0; + if (!pusharray8(value->csi_part2.csi_part2_payload, + (int)((value->csi_part2.csi_part2_bit_len / 8) + 1), + (int)((value->csi_part2.csi_part2_bit_len / 8) + 1), + ppWritePackedMsg, + end)) return 0; } return 1; } -static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +static uint8_t pack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppWritePackedMsg, uint8_t *end) { - nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv; - - if(!(push16(value->pdu_type, ppWritePackedMsg, end) && - push16(value->pdu_size, ppWritePackedMsg, end) - )) + if (!push16(value->pdu_type, ppWritePackedMsg, end)) + return 0; + if (!push16(value->pdu_size, ppWritePackedMsg, end)) return 0; switch (value->pdu_type) { @@ -3290,13 +3325,14 @@ static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uin { nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg; - if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) && - push16(pNfapiMsg->slot , ppWritePackedMsg, end) && - push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end) - )) + if (!push16(pNfapiMsg->sfn , ppWritePackedMsg, end)) + return 0; + if (!push16(pNfapiMsg->slot , ppWritePackedMsg, end)) + return 0; + if (!push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)) return 0; - for(int i=0; inum_ucis;i++) + for (int i = 0; i < pNfapiMsg->num_ucis; i++) { if (!pack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppWritePackedMsg, end)) return 0; @@ -4620,14 +4656,19 @@ static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_ static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) { nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg; - if (!( - pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) && - pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) && - pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) && - pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) && - pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) && - pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) && - pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) )) + if (!pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end)) + return 0; + if (!pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end)) + return 0; + if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end)) + return 0; + if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end)) + return 0; + if (!pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end)) + return 0; + if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end)) + return 0; + if (!pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end)) return 0; for(int i=0; i< pNfapiMsg->n_pdus; i++) { @@ -5510,14 +5551,18 @@ static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t switch(pNfapiMsg->TLVs[i].tag) { case 0: { - if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end)) + if (!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, + sizeof(pNfapiMsg->TLVs[i].value.direct) / sizeof(uint32_t), + pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end)) return 0; break; } case 1: { - if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end)) + if (!pullarray32(ppReadPackedMsg,pNfapiMsg->TLVs[i].value.ptr, + pNfapiMsg->TLVs[i].length / sizeof(uint32_t), + pNfapiMsg->TLVs[i].length / sizeof(uint32_t), end)) return 0; break; @@ -5671,7 +5716,7 @@ static uint8_t unpack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t* value, return 0; uint16_t length = value->pdu_length; - value->pdu = nfapi_p7_allocate(length, config); + value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * length, config); if (pullarray8(ppReadPackedMsg, value->pdu, length, length, end) == 0) { @@ -5752,10 +5797,8 @@ return 1; //SRS INDICATION -static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +static uint8_t unpack_nr_srs_indication_body(nfapi_nr_srs_indication_pdu_t* value, uint8_t **ppReadPackedMsg, uint8_t *end) { - nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv; - if(!(pull32(ppReadPackedMsg, &value->handle, end) && pull16(ppReadPackedMsg, &value->rnti, end) && pull16(ppReadPackedMsg, &value->timing_advance, end) && @@ -5767,17 +5810,14 @@ static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMs return 0; for(int i = 0; i < value->reported_symbol_list->num_rbs; i++) { - if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end) - )) + if (!pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list[i].rb_snr, end)) return 0; } return 1; } -static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_srs_indication_t *pNfapiMsg, nfapi_p7_codec_config_t* config) { - nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg; - if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) && pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) && pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end) @@ -5786,7 +5826,7 @@ static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, for(int i=0; inumber_of_pdus;i++) { - if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end)) + if (!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list[i], ppReadPackedMsg, end)) return 0; } @@ -5907,58 +5947,111 @@ static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t *valu } -static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) { - nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv; +static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value, + uint8_t **ppReadPackedMsg, + uint8_t *end, + nfapi_p7_codec_config_t *config) { + + if (!pull8(ppReadPackedMsg, &value->pduBitmap, end)) + return 0; + if (!pull32(ppReadPackedMsg, &value->handle, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->rnti, end)) + return 0; + if (!pull8(ppReadPackedMsg, &value->pucch_format, end)) + return 0; + if (!pull8(ppReadPackedMsg, &value->ul_cqi, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->timing_advance, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->rssi, end)) + return 0; - if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) && - pull32(ppReadPackedMsg, &value->handle, end) && - pull16(ppReadPackedMsg, &value->rnti, end) && - pull8(ppReadPackedMsg, &value->pucch_format, end) && - pull8(ppReadPackedMsg, &value->ul_cqi, end) && - pull16(ppReadPackedMsg, &value->timing_advance, end) && - pull16(ppReadPackedMsg, &value->rssi, end) - )) - return 0; if (value->pduBitmap & 0x01) { //SR - if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end))) + if (!pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)) return 0; - value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8))); - - if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end))) - return 0; - } - - if (((value->pduBitmap >> 1) & 0x01)) { //HARQ - if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) && - (pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end))) + value->sr.sr_payload = nfapi_p7_allocate(sizeof(*value->sr.sr_payload) * + (int)((value->sr.sr_bit_len / 8) + 1), + config); + if (value->sr.sr_payload == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->sr.sr_payload\n", __FUNCTION__); return 0; + } - value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 ))); - - if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end))) + if (!pullarray8(ppReadPackedMsg, value->sr.sr_payload, + (int)((value->sr.sr_bit_len / 8) + 1), + (int)((value->sr.sr_bit_len / 8) + 1), + end)) return 0; } - if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1 - if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) && - (pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end))) + if ((value->pduBitmap >> 1) & 0x01) { //HARQ + if (!pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)) return 0; - value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8))); + value->harq.harq_payload = nfapi_p7_allocate(sizeof(*value->harq.harq_payload) * + (int)((value->harq.harq_bit_len / 8) + 1), + config); + if (value->harq.harq_payload == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->harq.harq_payload\n", __FUNCTION__); + return 0; + } -// if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end))) -// return 0; + if (!pullarray8(ppReadPackedMsg, value->harq.harq_payload, + (int)((value->harq.harq_bit_len / 8) + 1), + (int)((value->harq.harq_bit_len / 8) + 1), + end)) + return 0; } - if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2 - if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) && - (pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end))) + if ((value->pduBitmap >> 2) & 0x01) { //CSI-1 + if (!pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)) return 0; - value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 ))); + value->csi_part1.csi_part1_payload = nfapi_p7_allocate(sizeof(*value->csi_part1.csi_part1_payload) * + (int)((value->csi_part1.csi_part1_bit_len / 8) + 1), + config); + if (value->csi_part1.csi_part1_payload == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part1.csi_part1_payload\n", + __FUNCTION__); + return 0; + } - if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end))) + if (!pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, + (int)((value->csi_part1.csi_part1_bit_len / 8) + 1), + (int)((value->csi_part1.csi_part1_bit_len / 8) + 1), + end)) + return 0; + } + + if ((value->pduBitmap >> 3) & 0x01) { //CSI-2 + if (!pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)) + return 0; + + value->csi_part2.csi_part2_payload = nfapi_p7_allocate(sizeof(*value->csi_part2.csi_part2_payload) * + (int)((value->csi_part2.csi_part2_bit_len / 8) + 1), + config); + if (value->csi_part2.csi_part2_payload == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate value->csi_part2.csi_part2_payload\n", + __FUNCTION__); + return 0; + } + + if (!pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, + (int)((value->csi_part2.csi_part2_bit_len / 8) + 1), + (int)((value->csi_part2.csi_part2_bit_len / 8) + 1), + end)) return 0; } @@ -5970,9 +6063,9 @@ static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t *value, uint8_t *end, nfapi_p7_codec_config_t *config) { - if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) && - pull16(ppReadPackedMsg, &value->pdu_size, end) - )) + if (!pull16(ppReadPackedMsg, &value->pdu_type, end)) + return 0; + if (!pull16(ppReadPackedMsg, &value->pdu_size, end)) return 0; switch (value->pdu_type) { @@ -5988,7 +6081,7 @@ static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t *value, } case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: { nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4; - if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end)) + if (!unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end, config)) return 0; break; } @@ -6004,17 +6097,18 @@ static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, { nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg; - if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) && - pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) && - pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end) - )) - return 0; + if (!pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end)) + return 0; + if (!pull16(ppReadPackedMsg, &pNfapiMsg->slot , end)) + return 0; + if (!pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)) + return 0; pNfapiMsg->uci_list = nfapi_p7_allocate(sizeof(*pNfapiMsg->uci_list) * pNfapiMsg->num_ucis, config); for (int i = 0; i < pNfapiMsg->num_ucis; i++) { - if(!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config)) - return 0; + if (!unpack_nr_uci_indication_body(&pNfapiMsg->uci_list[i], ppReadPackedMsg, end, config)) + return 0; } return 1; diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c index 2ac59dd7be..e4b4bef848 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c @@ -1473,7 +1473,7 @@ void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf } else { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling NR SLOT Indication\n", __FUNCTION__); + NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling NR SLOT Indication\n", __FUNCTION__); if(vnf_p7->_public.nr_slot_indication) { (vnf_p7->_public.nr_slot_indication)(&ind); @@ -2574,32 +2574,28 @@ int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7) // resize the buffer if we have a large segment if(header.message_length > vnf_p7->rx_message_buffer_size) { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length); vnf_p7->rx_message_buffer = realloc(vnf_p7->rx_message_buffer, header.message_length); vnf_p7->rx_message_buffer_size = header.message_length; } // read the segment - recvfrom_result = recvfrom(vnf_p7->socket, vnf_p7->rx_message_buffer, header.message_length, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size); + recvfrom_result = recvfrom(vnf_p7->socket, vnf_p7->rx_message_buffer, header.message_length, MSG_WAITALL | MSG_TRUNC, (struct sockaddr*)&remote_addr, &remote_addr_size); + NFAPI_TRACE(NFAPI_TRACE_INFO, "recvfrom_result = %d from %s():%d\n", recvfrom_result, __FUNCTION__, __LINE__); // todo : how to handle incomplete readfroms, need some sort of buffer/select - if(recvfrom_result == 0) - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "recvfrom returned 0\n"); - } - else if(recvfrom_result != -1 && recvfrom_result != header.message_length) - { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "Received unexpected number of bytes %d %d\n", recvfrom_result, header.message_length); - - recvfrom_result += recvfrom(vnf_p7->socket, &vnf_p7->rx_message_buffer[recvfrom_result], header.message_length - recvfrom_result, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size); - - } - - - if(recvfrom_result > 0) + if (recvfrom_result > 0) { + if (recvfrom_result != header.message_length) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "(%d) Received unexpected number of bytes. %d != %d", + __LINE__, recvfrom_result, header.message_length); + break; + } + NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling vnf_nr_handle_p7_message from %d\n", __LINE__); vnf_handle_p7_message(vnf_p7->rx_message_buffer, recvfrom_result, vnf_p7); + return 0; } else { diff --git a/oaienv b/oaienv index f8ef707c12..bb24469703 100644 --- a/oaienv +++ b/oaienv @@ -1,6 +1,7 @@ export OPENAIR_HOME=$(pwd) export OPENAIR_DIR=$(pwd) +export AWGN_RESULTS_DIR=$OPENAIR_DIR/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results export OPENAIR1_DIR=$OPENAIR_HOME/openair1 export OPENAIR2_DIR=$OPENAIR_HOME/openair2 export OPENAIR3_DIR=$OPENAIR_HOME/openair3 diff --git a/openair1/PHY/CODING/TESTBENCH/ldpctest.c b/openair1/PHY/CODING/TESTBENCH/ldpctest.c index 41b2d4fe84..841a31fd85 100644 --- a/openair1/PHY/CODING/TESTBENCH/ldpctest.c +++ b/openair1/PHY/CODING/TESTBENCH/ldpctest.c @@ -31,6 +31,7 @@ #include "openair1/PHY/CODING/nrLDPC_decoder_LYC/nrLDPC_decoder_LYC.h" #include "openair1/PHY/defs_nr_common.h" #include "coding_unitary_defs.h" +#include "common/utils/LOG/log.h" #define MAX_BLOCK_LENGTH 8448 @@ -79,16 +80,19 @@ char quantize8bit(double D,double x) } typedef struct { - double n_iter_mean; - double n_iter_std; - int n_iter_max; + double n_iter_mean[400]; + double n_iter_std[400]; + int n_iter_max[400]; + double snr[400]; + double ber[400]; + double bler[400]; } n_iter_stats_t; nrLDPC_encoderfunc_t encoder_orig; short lift_size[51]= {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,20,22,24,26,28,30,32,36,40,44,48,52,56,60,64,72,80,88,96,104,112,120,128,144,160,176,192,208,224,240,256,288,320,352,384}; -int test_ldpc(short No_iteration, +int test_ldpc(short max_iterations, int nom_rate, int denom_rate, double SNR, @@ -102,8 +106,8 @@ int test_ldpc(short No_iteration, unsigned int *crc_misses, time_stats_t *time_optim, time_stats_t *time_decoder, - n_iter_stats_t *dec_iter - ) + n_iter_stats_t *dec_iter, + int nsnr) { //clock initiate //time_stats_t time,time_optim,tinput,tprep,tparity,toutput, time_decoder; @@ -126,7 +130,6 @@ int test_ldpc(short No_iteration, //double channel_output[68 * 384]; double modulated_input[MAX_NUM_DLSCH_SEGMENTS][68 * 384] = { 0 }; char channel_output_fixed[MAX_NUM_DLSCH_SEGMENTS][68 * 384] = { 0 }; - unsigned int i,j,trial=0; short BG=0,nrows=0;//,ncols; int no_punctured_columns,removed_bit; int i1,Zc,Kb=0; @@ -137,12 +140,9 @@ int test_ldpc(short No_iteration, int code_rate_vec[8] = {15, 13, 25, 12, 23, 34, 56, 89}; //double code_rate_actual_vec[8] = {0.2, 0.33333, 0.4, 0.5, 0.66667, 0.73333, 0.81481, 0.88}; - t_nrLDPC_dec_params decParams; - t_nrLDPC_procBuf nrLDPC_procBuf; - t_nrLDPC_procBuf* p_nrLDPC_procBuf = &nrLDPC_procBuf; - + t_nrLDPC_dec_params decParams[MAX_NUM_DLSCH_SEGMENTS]={0}; + t_nrLDPC_time_stats decoder_profiler = {0}; - t_nrLDPC_time_stats* p_decoder_profiler =&decoder_profiler ; int32_t n_iter = 0; @@ -152,7 +152,7 @@ int test_ldpc(short No_iteration, *crc_misses=0; // generate input block - for(j=0;j>3; i++) - { - //printf("block_length>>3: %d \n",block_length>>3); - /// printf("i: %d \n",i); - ///printf("estimated_output[%d]: %d \n",i,estimated_output[i]); - ///printf("test_input[0][%d]: %d \n",i,test_input[0][i]); - if (estimated_output[j][i] != test_input[j][i]) - { - //////printf("error pos %d (%d, %d)\n\n",i,estimated_output[i],test_input[0][i]); - segment_bler = segment_bler + 1; - break; } - } + +#ifdef DEBUG_CODER + printf("\n"); + exit(-1); +#endif - for (i=0; i>(i&7); unsigned char inputbit = (test_input[j][i/8]&(1<<(i&7)))>>(i&7); // Further correct for multiple segments @@ -412,40 +377,33 @@ int test_ldpc(short No_iteration, *errors_bit = (*errors_bit) + 1; } - //if (*errors == 1000) - //break; + n_iter_mean += n_iter; + n_iter_std += pow(n_iter-1,2); - n_iter_mean = n_iter_mean + n_iter; - n_iter_std = n_iter_std + pow(n_iter-1,2); + if ( n_iter > n_iter_max ) + n_iter_max = n_iter; - if ( n_iter > n_iter_max ) - n_iter_max = n_iter; - - } // end segments + } // end segments if (segment_bler != 0) - *errors = (*errors) + 1; + *errors = (*errors) + 1; } - /*else if (trial==0) - printf("decoder is not supported\n");*/ } - dec_iter->n_iter_mean = n_iter_mean/(double)ntrials/(double)n_segments - 1; - dec_iter->n_iter_std = sqrt(n_iter_std/(double)ntrials/(double)n_segments - pow(n_iter_mean/(double)ntrials/(double)n_segments - 1,2)); - dec_iter->n_iter_max = n_iter_max -1; + dec_iter->n_iter_mean[nsnr] = n_iter_mean/(double)ntrials/(double)n_segments - 1; + dec_iter->n_iter_std[nsnr] = sqrt(n_iter_std/(double)ntrials/(double)n_segments - pow(n_iter_mean/(double)ntrials/(double)n_segments - 1,2)); + dec_iter->n_iter_max[nsnr] = n_iter_max -1; *errors_bit_uncoded = *errors_bit_uncoded / (double)((Kb+nrows-no_punctured_columns-2) * Zc-removed_bit); - for(j=0;j 1280, 2401 -> 2560 char *ldpc_version=NULL; /* version of the ldpc decoder library to use (XXX suffix to use when loading libldpc_XXX.so */ - short No_iteration=5; + short max_iterations=5; int n_segments=1; //double rate=0.333; @@ -486,7 +444,7 @@ int main(int argc, char *argv[]) unsigned char qbits=8; unsigned int decoded_errors[10000]; // initiate the size of matrix equivalent to size of SNR int c,i=0, i1 = 0; - int loglvl=OAILOG_WARNING; + int n_trials = 1; double SNR_step = 0.1; @@ -494,14 +452,11 @@ int main(int argc, char *argv[]) int test_uncoded= 0; time_stats_t time_optim[10], time_decoder[10]; - n_iter_stats_t dec_iter[3]; + n_iter_stats_t dec_iter; short BG=0,Zc,Kb=0; - if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) { - exit_fun(" Error, configuration module init failed\n"); - } // must be done before specific options parsing to prevent errasing them - - while ((c = getopt (argc, argv, "q:r:s:S:l:L:G:n:d:i:t:u:hv:")) != -1) + + while ((c = getopt (argc, argv, "q:r:s:S:l:G:n:d:i:t:u:hv:")) != -1) switch (c) { case 'q': @@ -519,10 +474,6 @@ int main(int argc, char *argv[]) case 'l': block_length = atoi(optarg); break; - - case 'L': - loglvl = atoi(optarg); - break; case 'G': ldpc_version="_cuda"; @@ -545,7 +496,7 @@ int main(int argc, char *argv[]) break; case 'i': - No_iteration = atoi(optarg); + max_iterations = atoi(optarg); break; case 'u': @@ -560,11 +511,10 @@ int main(int argc, char *argv[]) printf("BG1 (blocklength > 3840): 1/3, 2/3, 22/25 (8/9) \n"); printf("BG2 (blocklength <= 3840): 1/5, 1/3, 2/3 \n\n"); printf("-h This message\n"); - printf("-L \n"); printf("-q Quantization bits, Default: 8\n"); printf("-r Nominator rate, (1, 2, 22), Default: 1\n"); printf("-d Denominator rate, (3, 5, 25), Default: 1\n"); - printf("-l Block length (l > 3840 -> BG1, rest BG2 ), Default: 8448\n"); + printf("-l Block length (l > 3840 -> BG1, rest BG2 ), Default: 8448\n"); printf("-G give 1 to run cuda for LDPC, Default: 0\n"); printf("-n Number of simulation trials, Default: 1\n"); //printf("-M MCS2 for TB 2\n"); @@ -583,8 +533,6 @@ int main(int argc, char *argv[]) printf("n_trials %d: \n", n_trials); printf("SNR0 %f: \n", SNR0); - logInit(); - set_glog(loglvl); if (ldpc_version != NULL) load_nrLDPClib(ldpc_version); @@ -632,7 +580,7 @@ int main(int argc, char *argv[]) } char fname[200]; - sprintf(fname,"ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, No_iteration); + sprintf(fname,"ldpctest_BG_%d_Zc_%d_rate_%d-%d_block_length_%d_maxit_%d.txt",BG,Zc,nom_rate,denom_rate,block_length, max_iterations); FILE *fd=fopen(fname,"w"); AssertFatal(fd!=NULL,"cannot open %s\n",fname); @@ -647,7 +595,7 @@ int main(int argc, char *argv[]) else SNR_lin = pow(10,SNR/10.0)*nom_rate/denom_rate; printf("Linear SNR: %f\n", SNR_lin); - decoded_errors[i]=test_ldpc(No_iteration, + decoded_errors[i]=test_ldpc(max_iterations, nom_rate, denom_rate, SNR_lin, // noise standard deviation @@ -661,14 +609,18 @@ int main(int argc, char *argv[]) &crc_misses, time_optim, time_decoder, - dec_iter); + &dec_iter, + i); - printf("SNR %f, BLER %f (%u/%d)\n", SNR, (float)decoded_errors[i]/(float)n_trials, decoded_errors[i], n_trials); - printf("SNR %f, BER %f (%u/%d)\n", SNR, (float)errors_bit/(float)n_trials/(float)block_length/(double)n_segments, decoded_errors[i], n_trials); + dec_iter.snr[i] = SNR; + dec_iter.ber[i] = (float)errors_bit/(float)n_trials/(float)block_length/(double)n_segments; + dec_iter.bler[i] = (float)decoded_errors[i]/(float)n_trials; + printf("SNR %f, BLER %f (%u/%d)\n", SNR, dec_iter.bler[i], decoded_errors[i], n_trials); + printf("SNR %f, BER %f (%u/%d)\n", SNR, dec_iter.ber[i], decoded_errors[i], n_trials); printf("SNR %f, Uncoded BER %f (%u/%d)\n",SNR, errors_bit_uncoded/(float)n_trials/(double)n_segments, decoded_errors[i], n_trials); - printf("SNR %f, Mean iterations: %f\n",SNR, dec_iter->n_iter_mean); - printf("SNR %f, Std iterations: %f\n",SNR, dec_iter->n_iter_std); - printf("SNR %f, Max iterations: %d\n",SNR, dec_iter->n_iter_max); + printf("SNR %f, Mean iterations: %f\n",SNR, dec_iter.n_iter_mean[i]); + printf("SNR %f, Std iterations: %f\n",SNR, dec_iter.n_iter_std[i]); + printf("SNR %f, Max iterations: %d\n",SNR, dec_iter.n_iter_max[i]); printf("\n"); printf("Encoding time mean: %15.3f us\n",(double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz()); printf("Encoding time std: %15.3f us\n",sqrt((double)time_optim->diff_square/time_optim->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_optim->diff/time_optim->trials/1000.0/get_cpu_freq_GHz(),2))); @@ -689,16 +641,20 @@ int main(int argc, char *argv[]) (double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(), sqrt((double)time_decoder->diff_square/time_decoder->trials/pow(1000,2)/pow(get_cpu_freq_GHz(),2)-pow((double)time_decoder->diff/time_decoder->trials/1000.0/get_cpu_freq_GHz(),2)), (double)time_decoder->max/1000.0/get_cpu_freq_GHz(), - dec_iter->n_iter_mean, - dec_iter->n_iter_std, - dec_iter->n_iter_max + dec_iter.n_iter_mean[i], + dec_iter.n_iter_std[i], + dec_iter.n_iter_max[i] ); - if (decoded_errors[i] == 0) break; - i=i+1; + if (decoded_errors[i-1] == 0) break; + } fclose(fd); + LOG_M("ldpctestStats.m","SNR",&dec_iter.snr[0],i,1,7); + LOG_MM("ldpctestStats.m","BLER",&dec_iter.bler[0],i,1,7); + LOG_MM("ldpctestStats.m","BER",&dec_iter.ber[0],i,1,7); + LOG_MM("ldpctestStats.m","meanIter",&dec_iter.n_iter_mean[0],i,1,7); loader_reset(); logTerm(); diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h index 878150a9a8..91f552f935 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_bnProc.h @@ -37,17 +37,12 @@ \param p_lut Pointer to decoder LUTs \param Z Lifting size */ -static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, int8_t* bnProcBuf, int8_t* bnProcBufRes, int8_t* llrProcBuf, int8_t* llrRes, uint16_t Z) { const uint8_t* lut_numBnInBnGroups = p_lut->numBnInBnGroups; const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr; - int8_t* bnProcBuf = p_procBuf->bnProcBuf; - int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; - int8_t* llrRes = p_procBuf->llrRes; - int8_t* llrProcBuf = p_procBuf->llrProcBuf; - __m128i* p_bnProcBuf; __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; @@ -1681,7 +1676,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc \param p_lut Pointer to decoder LUTs \param Z Lifting size */ -static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, int8_t* bnProcBuf, int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z) { // BN Processing calculating the values to send back to the CNs for next iteration // bnProcBufRes contains the sum of all edges to each BN at the start of each group @@ -1690,10 +1685,6 @@ static inline void nrLDPC_bnProc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBu const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr; - int8_t* bnProcBuf = p_procBuf->bnProcBuf; - int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; - int8_t* llrRes = p_procBuf->llrRes; - __m256i* p_bnProcBuf; __m256i* p_bnProcBufRes; __m256i* p_llrRes; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h index db9d6e4119..6d82fe5f11 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_cnProc.h @@ -37,14 +37,11 @@ \param p_procBuf Pointer to processing buffers \param Z Lifting size */ -static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - __m256i* p_cnProcBuf; __m256i* p_cnProcBufRes; @@ -372,14 +369,11 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr \param p_lut Pointer to decoder LUTs \param Z Lifting size */ -static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - __m256i* p_cnProcBuf; __m256i* p_cnProcBufRes; @@ -871,14 +865,11 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr \param Z Lifting size \return 32-bit parity check indicator */ -static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - __m256i* p_cnProcBuf; __m256i* p_cnProcBufRes; @@ -1506,14 +1497,11 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf \param Z Lifting size \return 32-bit parity check indicator */ -static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - __m256i* p_cnProcBuf; __m256i* p_cnProcBufRes; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index 166cd9a5a3..bf0f401e97 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -45,22 +45,22 @@ #include "nrLDPC_tools/nrLDPC_debug.h" #endif -static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler); +static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler); +int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type); void nrLDPC_initcall(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out) { } -int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) +int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_time_stats* p_profiler) { uint32_t numLLR; uint32_t numIter = 0; t_nrLDPC_lut lut; t_nrLDPC_lut* p_lut = &lut; - //printf("p_procBuf->cnProcBuf = %p\n", p_procBuf->cnProcBuf); // Initialize decoder core(s) with correct LUTs numLLR = nrLDPC_init(p_decParams, p_lut); // Launch LDPC decoder core for one segment - numIter = nrLDPC_decoder_core(p_llr, p_out, p_procBuf, numLLR, p_lut, p_decParams, p_profiler); + numIter = nrLDPC_decoder_core(p_llr, p_out, numLLR, p_lut, p_decParams, p_profiler); return numIter; } @@ -74,13 +74,20 @@ int32_t nrLDPC_decod(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_ \param p_decParams LDPC decoder parameters \param p_profiler LDPC profiler statistics */ -static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler) +static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_t numLLR, t_nrLDPC_lut* p_lut, t_nrLDPC_dec_params* p_decParams, t_nrLDPC_time_stats* p_profiler) { uint16_t Z = p_decParams->Z; uint8_t BG = p_decParams->BG; uint8_t numMaxIter = p_decParams->numMaxIter; e_nrLDPC_outMode outMode = p_decParams->outMode; + int8_t cnProcBuf[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; + int8_t cnProcBufRes[NR_LDPC_SIZE_CN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; + int8_t bnProcBuf[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; + int8_t bnProcBufRes[NR_LDPC_SIZE_BN_PROC_BUF] __attribute__ ((aligned(32))) = {0}; + int8_t llrRes[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; + int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; + int8_t llrOut[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))) = {0}; // Minimum number of iterations is 1 // 0 iterations means hard-decision on input LLRs uint32_t i = 1; @@ -95,9 +102,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP else { // Use LLR processing buffer as temporary output buffer - p_llrOut = p_procBuf->llrProcBuf; - // Clear llrProcBuf - memset(p_llrOut,0, NR_LDPC_MAX_NUM_LLR*sizeof(int8_t)); + p_llrOut = llrOut; } @@ -105,14 +110,14 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->llr2llrProcBuf); #endif - nrLDPC_llr2llrProcBuf(p_lut, p_llr, p_procBuf, Z, BG); + nrLDPC_llr2llrProcBuf(p_lut, p_llr, llrProcBuf, Z, BG); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->llr2llrProcBuf); #endif #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_LLR_PROC); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_PROC, llrProcBuf); #endif #ifdef NR_LDPC_PROFILER_DETAIL @@ -120,11 +125,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z); + nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, cnProcBuf, Z); } else { - nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, p_procBuf, Z); + nrLDPC_llr2CnProcBuf_BG2(p_lut, p_llr, cnProcBuf, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->llr2CnProcBuf); @@ -132,7 +137,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_CN_PROC); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf); #endif // First iteration @@ -143,11 +148,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z); + nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); } else { - nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z); + nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); @@ -155,7 +160,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_CN_PROC_RES); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, cnProcBufRes); #endif #ifdef NR_LDPC_PROFILER_DETAIL @@ -163,11 +168,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z); + nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); } else { - nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z); + nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cn2bnProcBuf); @@ -175,34 +180,34 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_BN_PROC); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, bnProcBuf); #endif // BN processing #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProcPc); #endif - nrLDPC_bnProcPc(p_lut, p_procBuf, Z); + nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProcPc); #endif #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_LLR_RES); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, llrRes); #endif #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif - nrLDPC_bnProc(p_lut, p_procBuf, Z); + nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProc); #endif #ifdef NR_LDPC_DEBUG_MODE nrLDPC_debug_initBuffer2File(nrLDPC_buffers_BN_PROC_RES); - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, bnProcBufRes); #endif // BN results to CN processing buffer @@ -211,18 +216,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z); + nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); } else { - nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z); + nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bn2cnProcBuf); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf); #endif // Parity Check not necessary here since it will fail @@ -242,18 +247,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z); + nrLDPC_cnProc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); } else { - nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z); + nrLDPC_cnProc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, cnProcBufRes); #endif // Send CN results back to BNs @@ -262,43 +267,43 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z); + nrLDPC_cn2bnProcBuf_BG1(p_lut, cnProcBufRes, bnProcBuf, Z); } else { - nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z); + nrLDPC_cn2bnProcBuf_BG2(p_lut, cnProcBufRes, bnProcBuf, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cn2bnProcBuf); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, bnProcBuf); #endif // BN Processing #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProcPc); #endif - nrLDPC_bnProcPc(p_lut, p_procBuf, Z); + nrLDPC_bnProcPc(p_lut, bnProcBuf, bnProcBufRes, llrProcBuf, llrRes, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProcPc); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, llrRes); #endif #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif - nrLDPC_bnProc(p_lut, p_procBuf, Z); + nrLDPC_bnProc(p_lut, bnProcBuf, bnProcBufRes, llrRes, Z); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProc); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, bnProcBufRes); #endif // BN results to CN processing buffer @@ -307,18 +312,18 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z); + nrLDPC_bn2cnProcBuf_BG1(p_lut, bnProcBufRes, cnProcBuf, Z); } else { - nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z); + nrLDPC_bn2cnProcBuf_BG2(p_lut, bnProcBufRes, cnProcBuf, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bn2cnProcBuf); #endif #ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf); + nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, cnProcBuf); #endif // Parity Check @@ -328,123 +333,11 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - pcRes = nrLDPC_cnProcPc_BG1(p_lut, p_procBuf, Z); + pcRes = nrLDPC_cnProcPc_BG1(p_lut, cnProcBuf, cnProcBufRes, Z); } else { - pcRes = nrLDPC_cnProcPc_BG2(p_lut, p_procBuf, Z); - } -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->cnProcPc); -#endif -#endif - } - - // Last iteration - if ( (i < numMaxIter) && (pcRes != 0) ) - { - // Increase iteration counter - i++; - - // CN processing -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->cnProc); -#endif - if (BG == 1) - { - nrLDPC_cnProc_BG1(p_lut, p_procBuf, Z); - } - else - { - nrLDPC_cnProc_BG2(p_lut, p_procBuf, Z); - } -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->cnProc); -#endif - -#ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC_RES, p_procBuf); -#endif - - // Send CN results back to BNs -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->cn2bnProcBuf); -#endif - if (BG == 1) - { - nrLDPC_cn2bnProcBuf_BG1(p_lut, p_procBuf, Z); - } - else - { - nrLDPC_cn2bnProcBuf_BG2(p_lut, p_procBuf, Z); - } -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->cn2bnProcBuf); -#endif - -#ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC, p_procBuf); -#endif - - // BN Processing -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->bnProcPc); -#endif - nrLDPC_bnProcPc(p_lut, p_procBuf, Z); -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->bnProcPc); -#endif - -#ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_LLR_RES, p_procBuf); -#endif - - // If parity check not enabled, no need to send the BN proc results - // back to CNs -#ifdef NR_LDPC_ENABLE_PARITY_CHECK -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->bnProc); -#endif - nrLDPC_bnProc(p_lut, p_procBuf, Z); -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->bnProc); -#endif - -#ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_BN_PROC_RES, p_procBuf); -#endif - - // BN results to CN processing buffer -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->bn2cnProcBuf); -#endif - if (BG == 1) - { - nrLDPC_bn2cnProcBuf_BG1(p_lut, p_procBuf, Z); - } - else - { - nrLDPC_bn2cnProcBuf_BG2(p_lut, p_procBuf, Z); - } -#ifdef NR_LDPC_PROFILER_DETAIL - stop_meas(&p_profiler->bn2cnProcBuf); -#endif - -#ifdef NR_LDPC_DEBUG_MODE - nrLDPC_debug_writeBuffer2File(nrLDPC_buffers_CN_PROC, p_procBuf); -#endif - - // Parity Check -#ifdef NR_LDPC_PROFILER_DETAIL - start_meas(&p_profiler->cnProcPc); -#endif - if (BG == 1) - { - pcRes = nrLDPC_cnProcPc_BG1(p_lut, p_procBuf, Z); - } - else - { - pcRes = nrLDPC_cnProcPc_BG2(p_lut, p_procBuf, Z); + pcRes = nrLDPC_cnProcPc_BG2(p_lut, cnProcBuf, cnProcBufRes, Z); } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProcPc); @@ -466,7 +359,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->llrRes2llrOut); #endif - nrLDPC_llrRes2llrOut(p_lut, p_llrOut, p_procBuf, Z, BG); + nrLDPC_llrRes2llrOut(p_lut, p_llrOut, llrRes, Z, BG); #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->llrRes2llrOut); #endif diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h deleted file mode 100644 index f08549130e..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*!\file nrLDPC_init_mem.h - * \brief Defines the function to initialize the LDPC decoder and sets correct LUTs. - * \author Sebastian Wagner (TCL Communications) Email: - * \date 07-12-2018 - * \version 1.0 - * \note - * \warning - */ - -#ifndef __NR_LDPC_INIT_MEM__H__ -#define __NR_LDPC_INIT_MEM__H__ - -#include -#include "nrLDPC_types.h" - -/** - \brief Allocates 32 byte aligned memory and initializes to zero - \param size Input size in bytes - \return Pointer to memory -*/ -static inline void* malloc32_clear(size_t size) -{ - void* ptr = (void*) memalign(32, size+32); - memset(ptr, 0, size); - return ptr; -} - -/** - \brief Allocates and initializes the internal decoder processing buffers - \param p_decParams Pointer to decoder parameters - \param p_lut Pointer to decoder LUTs - \return Number of LLR values -*/ -static inline t_nrLDPC_procBuf* nrLDPC_init_mem(void) -{ - t_nrLDPC_procBuf* p_procBuf = (t_nrLDPC_procBuf*) malloc32_clear(sizeof(t_nrLDPC_procBuf)); - - if (p_procBuf) - { - p_procBuf->cnProcBuf = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t)); - p_procBuf->cnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_CN_PROC_BUF*sizeof(int8_t)); - p_procBuf->bnProcBuf = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t)); - p_procBuf->bnProcBufRes = (int8_t*) malloc32_clear(NR_LDPC_SIZE_BN_PROC_BUF*sizeof(int8_t)); - p_procBuf->llrRes = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR *sizeof(int8_t)); - p_procBuf->llrProcBuf = (int8_t*) malloc32_clear(NR_LDPC_MAX_NUM_LLR *sizeof(int8_t)); - } - - return(p_procBuf); -} - -static inline void nrLDPC_free_mem(t_nrLDPC_procBuf* p_procBuf) -{ - free(p_procBuf->cnProcBuf); - free(p_procBuf->cnProcBufRes); - free(p_procBuf->bnProcBuf); - free(p_procBuf->bnProcBufRes); - free(p_procBuf->llrRes); - free(p_procBuf->llrProcBuf); - - free(p_procBuf); -} -#endif diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h index b76750459d..7f514d5cfa 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h @@ -97,7 +97,7 @@ static inline void *nrLDPC_circ_memcpy(int8_t *str1, const int8_t *str2, uint16_ \param Z Lifting size \param BG Base graph */ -static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z, uint8_t BG) +static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* llrProcBuf, uint16_t Z, uint8_t BG) { uint32_t i; const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0]; @@ -109,7 +109,6 @@ static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrL const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; uint32_t idxBn; - int8_t* llrProcBuf = p_procBuf->llrProcBuf; // Copy LLRs connected to 1 CN if (numBn2CnG1 > 0) @@ -133,7 +132,7 @@ static inline void nrLDPC_llr2llrProcBuf(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrL \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* cnProcBuf, uint16_t Z) { const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->circShift[0]; const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1]; @@ -158,7 +157,6 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_ const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; uint32_t i; uint32_t j; @@ -342,7 +340,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_ \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* cnProcBuf, uint16_t Z) { const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG2_R15[0]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[0]]) p_lut->circShift[0]; const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG2_R15[1]] = (const uint16_t(*)[lut_numCnInCnGroups_BG2_R15[1]]) p_lut->circShift[1]; @@ -361,7 +359,6 @@ static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_ const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; uint32_t i; uint32_t j; @@ -478,7 +475,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* llr, t_ \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBufRes, int8_t* bnProcBuf, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; @@ -504,9 +501,6 @@ static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - int8_t* bnProcBuf = p_procBuf->bnProcBuf; - int8_t* p_cnProcBufRes; uint32_t bitOffsetInGroup; uint32_t i; @@ -621,7 +615,7 @@ static inline void nrLDPC_cn2bnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBufRes, int8_t* bnProcBuf, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; @@ -655,9 +649,6 @@ static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7]; const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8]; - int8_t* cnProcBufRes = p_procBuf->cnProcBufRes; - int8_t* bnProcBuf = p_procBuf->bnProcBuf; - int8_t* p_cnProcBufRes; uint32_t bitOffsetInGroup; uint32_t i; @@ -819,7 +810,7 @@ static inline void nrLDPC_cn2bnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, int8_t* bnProcBufRes, int8_t* cnProcBuf, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; @@ -845,9 +836,6 @@ static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf const uint8_t (*lut_bnPosBnProcBuf_CNG8) [lut_numCnInCnGroups[4]] = (const uint8_t(*)[lut_numCnInCnGroups[4]]) p_lut->bnPosBnProcBuf[4]; const uint8_t (*lut_bnPosBnProcBuf_CNG10) [lut_numCnInCnGroups[5]] = (const uint8_t(*)[lut_numCnInCnGroups[5]]) p_lut->bnPosBnProcBuf[5]; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; - int8_t* p_cnProcBuf; uint32_t bitOffsetInGroup; uint32_t i; @@ -961,7 +949,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf \param p_procBuf Pointer to the processing buffers \param Z Lifting size */ -static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) +static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* bnProcBufRes, int8_t* cnProcBuf, uint16_t Z) { const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = p_lut->startAddrCnGroups; @@ -995,9 +983,6 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf const uint8_t (*lut_bnPosBnProcBuf_CNG10)[lut_numCnInCnGroups[7]] = (const uint8_t(*)[lut_numCnInCnGroups[7]]) p_lut->bnPosBnProcBuf[7]; const uint8_t (*lut_bnPosBnProcBuf_CNG19)[lut_numCnInCnGroups[8]] = (const uint8_t(*)[lut_numCnInCnGroups[8]]) p_lut->bnPosBnProcBuf[8]; - int8_t* cnProcBuf = p_procBuf->cnProcBuf; - int8_t* bnProcBufRes = p_procBuf->bnProcBufRes; - int8_t* p_cnProcBuf; uint32_t bitOffsetInGroup; uint32_t i; @@ -1157,7 +1142,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf \param Z Lifting size \param BG Base graph */ -static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z, uint8_t BG) +static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, int8_t* llrRes, uint16_t Z, uint8_t BG) { uint32_t i; const uint8_t numBn2CnG1 = p_lut->numBnInBnGroups[0]; @@ -1168,7 +1153,6 @@ static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, t_n const uint16_t* lut_llr2llrProcBufAddr = p_lut->llr2llrProcBufAddr; const uint8_t* lut_llr2llrProcBufBnPos = p_lut->llr2llrProcBufBnPos; - int8_t* llrRes = p_procBuf->llrRes; int8_t* p_llrOut = &llrOut[0]; uint32_t idxBn; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h index e4dcb56edd..41c0a474a4 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h @@ -87,38 +87,38 @@ static inline void nrLDPC_initFile(const char* fileName) \brief Writes data of predefined buffers to file \param buffer Enum of buffer name to write */ -static inline void nrLDPC_debug_writeBuffer2File(e_nrLDPC_buffers buffer, t_nrLDPC_procBuf* p_procBuf) +static inline void nrLDPC_debug_writeBuffer2File(e_nrLDPC_buffers buffer, int8_t* p_buffer) { switch (buffer) { case nrLDPC_buffers_LLR_PROC: { - nrLDPC_writeFile("llrProcBuf.txt", p_procBuf->llrProcBuf, NR_LDPC_MAX_NUM_LLR); + nrLDPC_writeFile("llrProcBuf.txt", p_buffer, NR_LDPC_MAX_NUM_LLR); break; } case nrLDPC_buffers_CN_PROC: { - nrLDPC_writeFile("cnProcBuf.txt", p_procBuf->cnProcBuf, NR_LDPC_SIZE_CN_PROC_BUF); + nrLDPC_writeFile("cnProcBuf.txt", p_buffer, NR_LDPC_SIZE_CN_PROC_BUF); break; } case nrLDPC_buffers_CN_PROC_RES: { - nrLDPC_writeFile("cnProcBufRes.txt", p_procBuf->cnProcBufRes, NR_LDPC_SIZE_CN_PROC_BUF); + nrLDPC_writeFile("cnProcBufRes.txt", p_buffer, NR_LDPC_SIZE_CN_PROC_BUF); break; } case nrLDPC_buffers_BN_PROC: { - nrLDPC_writeFile("bnProcBuf.txt", p_procBuf->bnProcBuf, NR_LDPC_SIZE_BN_PROC_BUF); + nrLDPC_writeFile("bnProcBuf.txt", p_buffer, NR_LDPC_SIZE_BN_PROC_BUF); break; } case nrLDPC_buffers_BN_PROC_RES: { - nrLDPC_writeFile("bnProcBufRes.txt", p_procBuf->bnProcBufRes, NR_LDPC_SIZE_BN_PROC_BUF); + nrLDPC_writeFile("bnProcBufRes.txt", p_buffer, NR_LDPC_SIZE_BN_PROC_BUF); break; } case nrLDPC_buffers_LLR_RES: { - nrLDPC_writeFile("llrRes.txt", p_procBuf->llrRes, NR_LDPC_MAX_NUM_LLR); + nrLDPC_writeFile("llrRes.txt", p_buffer, NR_LDPC_MAX_NUM_LLR); break; } } diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index a6fb44cb0d..0c9c78c3ac 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -71,5 +71,5 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho \param p_llrOut Output vector \param p_profiler LDPC profiler statistics */ -typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params *, int8_t *, int8_t *, t_nrLDPC_procBuf *, t_nrLDPC_time_stats * ); +typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_time_stats* ); #endif diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h index b75b38fc76..b358119408 100644 --- a/openair1/PHY/CODING/nrLDPC_extern.h +++ b/openair1/PHY/CODING/nrLDPC_extern.h @@ -34,5 +34,4 @@ extern nrLDPC_initcallfunc_t nrLDPC_initcall; extern nrLDPC_decoderfunc_t nrLDPC_decoder; extern nrLDPC_encoderfunc_t nrLDPC_encoder; // inline functions: -#include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h" #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 49c1b898cc..bfbd696d9b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -76,8 +76,6 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr, uint16_t N_RB_UL) free_and_zero(ulsch->harq_processes[i]->c[r]); free_and_zero(ulsch->harq_processes[i]->d[r]); free_and_zero(ulsch->harq_processes[i]->w[r]); - nrLDPC_free_mem(ulsch->harq_processes[i]->p_nrLDPC_procBuf[r]); - ulsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL; } free_and_zero(ulsch->harq_processes[i]); ulsch->harq_processes[i] = NULL; @@ -101,22 +99,21 @@ NR_gNB_ULSCH_t *new_gNB_ulsch(uint8_t max_ldpc_iterations, uint16_t N_RB_UL) uint32_t ulsch_bytes = a_segments*1056; // allocated bytes per segment ulsch = (NR_gNB_ULSCH_t *)malloc16_clear(sizeof(NR_gNB_ULSCH_t)); - + ulsch->max_ldpc_iterations = max_ldpc_iterations; ulsch->Mlimit = 4; - + for (i=0; iharq_processes[i] = (NR_UL_gNB_HARQ_t *)malloc16_clear(sizeof(NR_UL_gNB_HARQ_t)); ulsch->harq_processes[i]->b = (uint8_t*)malloc16_clear(ulsch_bytes); for (r=0; rharq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); ulsch->harq_processes[i]->c[r] = (uint8_t*)malloc16_clear(8448*sizeof(uint8_t)); ulsch->harq_processes[i]->d[r] = (int16_t*)malloc16_clear((68*384)*sizeof(int16_t)); ulsch->harq_processes[i]->w[r] = (int16_t*)malloc16_clear((3*(6144+64))*sizeof(int16_t)); } } - + return(ulsch); } @@ -360,7 +357,6 @@ void nr_processULSegment(void* arg) { no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, (int8_t*)&pl[0], llrProcBuf, - ulsch_harq->p_nrLDPC_procBuf[r], p_procTime); if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) { diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c index f4f183793f..045197adc1 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c @@ -36,7 +36,8 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, module_id_t gNB_id, - const int estimateSz, struct complex16 dl_ch_estimates_time[][estimateSz], + const int estimateSz, + struct complex16 dl_ch_estimates_time[][estimateSz], uint8_t frame, uint8_t subframe, unsigned char clear, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 30836ded01..55deb686ad 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -197,9 +197,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - int estimateSz, - struct complex16 dl_ch_estimates [][estimateSz], - struct complex16 dl_ch_estimates_time [][estimateSz], + int estimateSz, + struct complex16 dl_ch_estimates [][estimateSz], + struct complex16 dl_ch_estimates_time [][ue->frame_parms.ofdm_symbol_size], UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, unsigned char Ns, @@ -320,7 +320,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; - memset(dl_ch,0,sizeof(*dl_ch)*(ue->frame_parms.ofdm_symbol_size)); + memset(dl_ch,0,sizeof(struct complex16)*(ue->frame_parms.ofdm_symbol_size)); #ifdef DEBUG_CH printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); @@ -387,10 +387,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, // in 2nd symbol, skip middle REs (48 with DMRS, 144 for SSS, and another 48 with DMRS) if (dmrss == 1 && pilot_cnt == 12) { - pilot_cnt=48; - re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; - dl_ch += 288; + pilot_cnt=48; + re_offset = (re_offset+144) % ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + dl_ch += 288; } ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -452,10 +452,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, (int16_t*) &dl_ch_estimates[aarx][ch_offset], (int16_t*) dl_ch_estimates_time[aarx], 1); -} -} + } + } + if (dmrss == 2) UEscopeCopy(ue, pbchDlChEstimateTime, (void*)dl_ch_estimates_time, sizeof(struct complex16), ue->frame_parms.nb_antennas_rx, idftsizeidx); + return(0); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 8bdd83087a..ebe077d635 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -104,11 +104,9 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr, uint16_t N_RB_DL) { dlsch->harq_processes[i]->c[r] = NULL; free16(dlsch->harq_processes[i]->d[r],5*8448); dlsch->harq_processes[i]->d[r] = NULL; - nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]); } free16(dlsch->harq_processes[i]->c,a_segments); free16(dlsch->harq_processes[i]->d,a_segments); - free16(dlsch->harq_processes[i]->p_nrLDPC_procBuf,a_segments); free16(dlsch->harq_processes[i],sizeof(NR_DL_UE_HARQ_t)); dlsch->harq_processes[i] = NULL; @@ -161,9 +159,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint dlsch->harq_processes[i]->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *)); dlsch->harq_processes[i]->d = (int16_t **)malloc16(a_segments*sizeof(int16_t *)); - dlsch->harq_processes[i]->p_nrLDPC_procBuf = (t_nrLDPC_procBuf **)malloc16(a_segments*sizeof(t_nrLDPC_procBuf *)); for (int r=0; rharq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056); dlsch->harq_processes[i]->d[r] = (int16_t *)malloc16(5*8448*sizeof(int16_t)); if (dlsch->harq_processes[i]->c[r]) @@ -301,132 +297,128 @@ void nr_processDLSegment(void* arg) { t_nrLDPC_time_stats procTime = {0}; t_nrLDPC_time_stats* p_procTime = &procTime ; - t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf; + int16_t w[5*8448]; + memset(w,0,(5*8448)*sizeof(short)); + start_meas(&rdata->ts_deinterleave); - int16_t w[5*8448]; - memset(w,0,(5*8448)*sizeof(short)); + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN); + nr_deinterleaving_ldpc(E, + Qm, + w, // [hna] w is e + dlsch_llr+r_offset); + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT); + stop_meas(&rdata->ts_deinterleave); - start_meas(&rdata->ts_deinterleave); + start_meas(&rdata->ts_rate_unmatch); + /* LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", + harq_pid,r, G,E,harq_process->F, + Kr*3, + harq_process->TBS, + Qm, + harq_process->nb_rb, + harq_process->Nl, + harq_process->rvidx, + harq_process->round); */ + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN); - nr_deinterleaving_ldpc(E, - Qm, - w, // [hna] w is e - dlsch_llr+r_offset); - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT); - stop_meas(&rdata->ts_deinterleave); - - start_meas(&rdata->ts_rate_unmatch); - /* LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", - harq_pid,r, G,E,harq_process->F, - Kr*3, - harq_process->TBS, - Qm, - harq_process->nb_rb, - harq_process->Nl, - harq_process->rvidx, - harq_process->round); */ - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); - - if (nr_rate_matching_ldpc_rx(Ilbrm, - Tbslbrm, - p_decoderParms->BG, - p_decoderParms->Z, - harq_process->d[r], - w, - harq_process->C, - harq_process->rvidx, - (harq_process->first_rx==1)?1:0, - E, - harq_process->F, - Kr-harq_process->F-2*(p_decoderParms->Z))==-1) { - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT); - stop_meas(&rdata->ts_rate_unmatch); - LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); - rdata->decodeIterations = dlsch->max_ldpc_iterations + 1; - return; - } + if (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decoderParms->BG, + p_decoderParms->Z, + harq_process->d[r], + w, + harq_process->C, + harq_process->rvidx, + (harq_process->first_rx==1)?1:0, + E, + harq_process->F, + Kr-harq_process->F-2*(p_decoderParms->Z))==-1) { + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT); stop_meas(&rdata->ts_rate_unmatch); + LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); + rdata->decodeIterations = dlsch->max_ldpc_iterations + 1; + return; + } + stop_meas(&rdata->ts_rate_unmatch); - r_offset += E; + r_offset += E; - if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) { - LOG_D(PHY,"decoder input(segment %u) :",r); + if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) { + LOG_D(PHY,"decoder input(segment %u) :",r); - for (int i=0; id[r][i]); + for (int i=0; id[r][i]); - LOG_D(PHY,"\n"); + LOG_D(PHY,"\n"); + } + + memset(harq_process->c[r],0,Kr_bytes); + + if (harq_process->C == 1) { + if (A > NR_MAX_PDSCH_TBS) + crc_type = CRC24_A; + else + crc_type = CRC16; + + length_dec = harq_process->B; + } else { + crc_type = CRC24_B; + length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; + } + + { + start_meas(&rdata->ts_ldpc_decode); + //set first 2*Z_c bits to zeros + memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); + //set Filler bits + memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); + //Move coded bits before filler bits + memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); + //skip filler bits + memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); + + //Saturate coded bits before decoding into 8 bits values + for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); } - memset(harq_process->c[r],0,Kr_bytes); + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN); + p_decoderParms->block_length=length_dec; + nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf); + no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, + (int8_t *)&pl[0], + llrProcBuf, + p_procTime); + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT); - if (harq_process->C == 1) { - if (A > NR_MAX_PDSCH_TBS) - crc_type = CRC24_A; - else - crc_type = CRC16; + // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int + if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) { + LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r); - length_dec = harq_process->B; + if (r==0) { + for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]); + } + + //Temporary hack + no_iteration_ldpc = dlsch->max_ldpc_iterations; + rdata->decodeIterations = no_iteration_ldpc; } else { - crc_type = CRC24_B; - length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; + LOG_D(PHY,"CRC NOT OK\n\033[0m"); } - { - start_meas(&rdata->ts_ldpc_decode); - //set first 2*Z_c bits to zeros - memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); - //set Filler bits - memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); - //Move coded bits before filler bits - memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); - //skip filler bits - memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); + nb_total_decod++; - //Saturate coded bits before decoding into 8 bits values - for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { - pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); - } - - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN); - p_decoderParms->block_length=length_dec; - nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf); - no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, - (int8_t *)&pl[0], - llrProcBuf, - p_nrLDPC_procBuf[r], - p_procTime); - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT); - - // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int - if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) { - LOG_D(PHY,"Segment %u CRC OK\n",r); - - if (r==0) { - for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]); - } - - //Temporary hack - no_iteration_ldpc = dlsch->max_ldpc_iterations; - rdata->decodeIterations = no_iteration_ldpc; - } else { - LOG_D(PHY,"CRC NOT OK\n"); - } - - nb_total_decod++; - - if (no_iteration_ldpc > dlsch->max_ldpc_iterations) { - nb_error_decod++; - } - - for (int m=0; m < Kr>>3; m ++) { - harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; - } - - stop_meas(&rdata->ts_ldpc_decode); + if (no_iteration_ldpc > dlsch->max_ldpc_iterations) { + nb_error_decod++; } + + for (int m=0; m < Kr>>3; m ++) { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + stop_meas(&rdata->ts_ldpc_decode); + } } uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index ac918b4f3e..a48bc1b58d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -146,23 +146,26 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini start_meas(&ue->dlsch_channel_estimation_stats); // computing channel estimation for selected best ssb - const int estimateSz=7*2*frame_parms->ofdm_symbol_size; + const int estimateSz = frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size; __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[frame_parms->nb_antennas_rx][estimateSz]; - __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size]; + for(int i=pbch_initial_symbol; ii_ssb,temp_ptr->n_hf); + stop_meas(&ue->dlsch_channel_estimation_stats); fapiPbch_t result; ret = nr_rx_pbch(ue, proc, - estimateSz, dl_ch_estimates, - ue->pbch_vars[0], + estimateSz, + dl_ch_estimates, + ue->pbch_vars[0], frame_parms, 0, temp_ptr->i_ssb, SISO, - &result); + &result); temp_ptr=temp_ptr->next_ssb; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h index f76119250f..e479271a5c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h @@ -196,8 +196,6 @@ typedef struct { uint8_t rvidx; /// MIMO mode for this DLSCH MIMO_nrmode_t mimo_mode; - /// LDPC processing buffers - t_nrLDPC_procBuf **p_nrLDPC_procBuf; /// Number of code segments uint32_t C; /// Number of bits in code segments diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 9be2d0208d..4350688e5c 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -280,8 +280,6 @@ typedef struct { uint32_t C; /// Pointers to code blocks after LDPC coding (38.212 V15.4.0 section 5.3.2) int16_t *d[MAX_NUM_NR_ULSCH_SEGMENTS]; - /// LDPC processing buffer - t_nrLDPC_procBuf* p_nrLDPC_procBuf[MAX_NUM_NR_ULSCH_SEGMENTS]; /// LDPC lifting size (38.212 V15.4.0 table 5.3.2-1) uint32_t Z; /// code blocks after bit selection in rate matching for LDPC code (38.212 V15.4.0 section 5.4.2.1) diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index a206d1c614..257b727258 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -36,10 +36,11 @@ #include "fapi_nr_ue_l1.h" #include "harq_nr.h" //#include "PHY/phy_vars_nr_ue.h" - +#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h" #include "PHY/defs_nr_UE.h" #include "PHY/impl_defs_nr.h" #include "utils.h" +#include "openair2/PHY_INTERFACE/queue_t.h" extern PHY_VARS_NR_UE ***PHY_vars_UE_g; @@ -49,8 +50,64 @@ queue_t nr_rx_ind_queue; queue_t nr_crc_ind_queue; queue_t nr_uci_ind_queue; -int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response) { +static void fill_uci_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4, + fapi_nr_ul_config_pucch_pdu *pucch_pdu) +{ + memset(pdu_2_3_4, 0, sizeof(*pdu_2_3_4)); + pdu_2_3_4->handle = 0; + pdu_2_3_4->rnti = pucch_pdu->rnti; + pdu_2_3_4->pucch_format = 2; + pdu_2_3_4->ul_cqi = 255; + pdu_2_3_4->timing_advance = 0; + pdu_2_3_4->rssi = 0; + // TODO: Eventually check 38.212:Sect.631 to know when to use csi_part2, for now only using csi_part1 + pdu_2_3_4->pduBitmap = 4; + pdu_2_3_4->csi_part1.csi_part1_bit_len = pucch_pdu->nr_of_symbols; + int csi_part1_byte_len = (int)((pdu_2_3_4->csi_part1.csi_part1_bit_len / 8) + 1); + AssertFatal(!pdu_2_3_4->csi_part1.csi_part1_payload, "pdu_2_3_4->csi_part1.csi_part1_payload != NULL\n"); + pdu_2_3_4->csi_part1.csi_part1_payload = CALLOC(csi_part1_byte_len, + sizeof(pdu_2_3_4->csi_part1.csi_part1_payload)); + for (int k = 0; k < csi_part1_byte_len; k++) + { + pdu_2_3_4->csi_part1.csi_part1_payload[k] = (pucch_pdu->payload >> (k * 8)) & 0xff; + } + pdu_2_3_4->csi_part1.csi_part1_crc = 0; +} +static void free_uci_inds(nfapi_nr_uci_indication_t *uci_ind) +{ + for (int k = 0; k < uci_ind->num_ucis; k++) + { + if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE) + { + nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[k].pucch_pdu_format_0_1; + free(pdu_0_1->sr); + pdu_0_1->sr = NULL; + if (pdu_0_1->harq) + { + free(pdu_0_1->harq->harq_list); + pdu_0_1->harq->harq_list = NULL; + } + free(pdu_0_1->harq); + pdu_0_1->harq = NULL; + } + if (uci_ind->uci_list[k].pdu_type == NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE) + { + nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[k].pucch_pdu_format_2_3_4; + free(pdu_2_3_4->sr.sr_payload); + pdu_2_3_4->sr.sr_payload = NULL; + free(pdu_2_3_4->harq.harq_payload); + pdu_2_3_4->harq.harq_payload = NULL; + } + } + free(uci_ind->uci_list); + uci_ind->uci_list = NULL; + free(uci_ind); + uci_ind = NULL; +} + +int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response) { + NR_UE_MAC_INST_t *mac = get_mac_inst(0); if(scheduled_response != NULL) { if (scheduled_response->ul_config != NULL) @@ -60,7 +117,7 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response "Too many ul_config pdus %d", ul_config->number_pdus); for (int i = 0; i < ul_config->number_pdus; ++i) { - LOG_I(PHY, "In %s: processing type %d PDU of %d total UL PDUs (ul_config %p) \n", + LOG_D(NR_PHY, "In %s: processing type %d PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, ul_config->ul_config_list[i].pdu_type, ul_config->number_pdus, ul_config); uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type; @@ -95,10 +152,6 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response abstracting L1. */ rx_ind->pdu_list[j].timing_advance = 31; rx_ind->pdu_list[j].ul_cqi = 255; - char buffer[1024]; - hexdump(rx_ind->pdu_list[j].pdu, rx_ind->pdu_list[j].pdu_length, buffer, sizeof(buffer)); - LOG_D(NR_MAC, "Hexdump of pdu %s before queuing rx_ind\n", - buffer); } crc_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION; @@ -118,6 +171,11 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response crc_ind->crc_list[j].tb_crc_status = 0; crc_ind->crc_list[j].timing_advance = 31; crc_ind->crc_list[j].ul_cqi = 255; + AssertFatal(mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot == -1, + "We did not send an active CRC when we should have!\n"); + mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot = NFAPI_SFNSLOT2HEX(crc_ind->sfn, crc_ind->slot); + LOG_D(NR_MAC, "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d] with mcs_index in ul_cqi -> %d\n", + scheduled_response->frame, scheduled_response->slot, crc_ind->sfn, crc_ind->slot,pusch_config_pdu->mcs_index); } if (!put_queue(&nr_rx_ind_queue, rx_ind)) @@ -150,28 +208,7 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response break; } - default: - LOG_I(NR_MAC, "Unknown ul_config->pdu_type %d\n", pdu_type); - break; - } - } - scheduled_response->ul_config->number_pdus = 0; - } - - if (scheduled_response->dl_config != NULL) - { - fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config; - AssertFatal(dl_config->number_pdus < sizeof(dl_config->dl_config_list) / sizeof(dl_config->dl_config_list[0]), - "Too many dl_config pdus %d", dl_config->number_pdus); - for (int i = 0; i < dl_config->number_pdus; ++i) - { - LOG_D(PHY, "In %s: processing %s PDU of %d total DL PDUs (dl_config %p) \n", - __FUNCTION__, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus, dl_config); - - uint8_t pdu_type = dl_config->dl_config_list[i].pdu_type; - switch (pdu_type) - { - case (FAPI_NR_DL_CONFIG_TYPE_DLSCH): + case FAPI_NR_UL_CONFIG_TYPE_PUCCH: { nfapi_nr_uci_indication_t *uci_ind = CALLOC(1, sizeof(*uci_ind)); uci_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION; @@ -181,35 +218,70 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response uci_ind->uci_list = CALLOC(uci_ind->num_ucis, sizeof(*uci_ind->uci_list)); for (int j = 0; j < uci_ind->num_ucis; j++) { - nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1; - uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE; - uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_0_1_t); - memset(pdu_0_1, 0, sizeof(*pdu_0_1)); - pdu_0_1->handle = 0; - pdu_0_1->rnti = dl_config->dl_config_list[i].dlsch_config_pdu.rnti; - pdu_0_1->pucch_format = 1; - pdu_0_1->ul_cqi = 255; - pdu_0_1->timing_advance = 0; - pdu_0_1->rssi = 0; + LOG_D(NR_MAC, "ul_config->ul_config_list[%d].pucch_config_pdu.n_bit = %d\n", i, ul_config->ul_config_list[i].pucch_config_pdu.n_bit); + if (ul_config->ul_config_list[i].pucch_config_pdu.n_bit > 3 && mac->nr_ue_emul_l1.num_csi_reports > 0) + { + uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE; + uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_2_3_4_t); + nfapi_nr_uci_pucch_pdu_format_2_3_4_t *pdu_2_3_4 = &uci_ind->uci_list[j].pucch_pdu_format_2_3_4; + fill_uci_2_3_4(pdu_2_3_4, &ul_config->ul_config_list[i].pucch_config_pdu); + } + else + { + nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1; + uci_ind->uci_list[j].pdu_type = NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE; + uci_ind->uci_list[j].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_0_1_t); + memset(pdu_0_1, 0, sizeof(*pdu_0_1)); + pdu_0_1->handle = 0; + pdu_0_1->rnti = ul_config->ul_config_list[i].pucch_config_pdu.rnti; + pdu_0_1->pucch_format = 1; + pdu_0_1->ul_cqi = 255; + pdu_0_1->timing_advance = 0; + pdu_0_1->rssi = 0; + + if (mac->nr_ue_emul_l1.num_harqs > 0) { + int harq_index = 0; + pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR + pdu_0_1->harq = CALLOC(1, sizeof(*pdu_0_1->harq)); + pdu_0_1->harq->num_harq = mac->nr_ue_emul_l1.num_harqs; + pdu_0_1->harq->harq_confidence_level = 0; + pdu_0_1->harq->harq_list = CALLOC(pdu_0_1->harq->num_harq, sizeof(*pdu_0_1->harq->harq_list)); + int harq_pid = -1; + for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) + { + if (mac->nr_ue_emul_l1.harq[k].active && + mac->nr_ue_emul_l1.harq[k].active_dl_harq_sfn == uci_ind->sfn && + mac->nr_ue_emul_l1.harq[k].active_dl_harq_slot == uci_ind->slot) + { + mac->nr_ue_emul_l1.harq[k].active = false; + harq_pid = k; + AssertFatal(harq_index < pdu_0_1->harq->num_harq, "Invalid harq_index %d\n", harq_index); + pdu_0_1->harq->harq_list[harq_index].harq_value = !mac->dl_harq_info[k].ack; + harq_index++; + } + } + AssertFatal(harq_pid != -1, "No active harq_pid, sfn_slot = %u.%u", uci_ind->sfn, uci_ind->slot); + } + } } - LOG_I(NR_PHY, "In %s: Filled queue uci_ind which was filled by dlconfig.\n" - "uci_num %d, SFN/SLOT: [%d, %d]\n", - __FUNCTION__, uci_ind->num_ucis, uci_ind->sfn, uci_ind->slot); - - if (!put_queue(&nr_uci_ind_queue, uci_ind)) - { - LOG_E(NR_MAC, "Put_queue failed for uci_ind\n"); - free(uci_ind->uci_list); - free(uci_ind); - } + LOG_D(NR_PHY, "Sending UCI with %d PDUs in sfn.slot %d/%d\n", + uci_ind->num_ucis, uci_ind->sfn, uci_ind->slot); + NR_UL_IND_t ul_info = { + .uci_ind = *uci_ind, + }; + send_nsa_standalone_msg(&ul_info, uci_ind->header.message_id); + free_uci_inds(uci_ind); break; } + + default: + LOG_W(NR_MAC, "Unknown ul_config->pdu_type %d\n", pdu_type); + break; } } - dl_config->number_pdus = 0; + scheduled_response->ul_config->number_pdus = 0; } - } return 0; } diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index ddddcd09e2..d8b866d8ee 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1405,9 +1405,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, if (slot_ssb) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PBCH, VCD_FUNCTION_IN); LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_slot_rx); - const int estimateSz=7*2*sizeof(int)*fp->ofdm_symbol_size; + + const int estimateSz = fp->symbols_per_slot * fp->ofdm_symbol_size; __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates[fp->nb_antennas_rx][estimateSz]; - __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][estimateSz]; + __attribute__ ((aligned(32))) struct complex16 dl_ch_estimates_time[fp->nb_antennas_rx][fp->ofdm_symbol_size]; + for (int i=1; i<4; i++) { nr_slot_fep(ue, @@ -1415,7 +1417,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, (ue->symbol_offset+i)%(fp->symbols_per_slot), nr_slot_rx); - start_meas(&ue->dlsch_channel_estimation_stats); nr_pbch_channel_estimation(ue, estimateSz, dl_ch_estimates, dl_ch_estimates_time,proc,gNB_id,nr_slot_rx,(ue->symbol_offset+i)%(fp->symbols_per_slot),i-1,(fp->ssb_index)&7,fp->half_frame_bit); stop_meas(&ue->dlsch_channel_estimation_stats); @@ -1433,7 +1434,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, nr_adjust_synch_ue(fp, ue, gNB_id, - estimateSz, dl_ch_estimates_time, + fp->ofdm_symbol_size, + dl_ch_estimates_time, frame_rx, nr_slot_rx, 0, diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv new file mode 100644 index 0000000000..11771acc87 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs28.csv @@ -0,0 +1,21 @@ +SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err +16.000000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.100000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.200000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.300000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0 +16.400000;27;15840;0.704000;4999;5002;0;0;0;0;0;0;0 +16.500000;27;15840;0.704000;4981;5002;0;0;0;0;0;0;0 +16.600000;27;15840;0.704000;4887;5002;0;0;0;0;0;0;0 +16.700000;27;15840;0.704000;4688;5002;0;0;0;0;0;0;0 +16.800000;27;15840;0.704000;4176;5002;0;0;0;0;0;0;0 +16.900000;27;15840;0.704000;3340;5002;0;0;0;0;0;0;0 +17.000000;27;15840;0.704000;2386;5002;0;0;0;0;0;0;0 +17.100000;27;15840;0.704000;1510;5002;0;0;0;0;0;0;0 +17.200000;27;15840;0.704000;1000;5552;0;0;0;0;0;0;0 +17.300000;27;15840;0.704000;926;10000;0;0;0;0;0;0;0 +17.400000;27;15840;0.704000;516;10000;0;0;0;0;0;0;0 +17.500000;27;15840;0.704000;287;10000;0;0;0;0;0;0;0 +17.600000;27;15840;0.704000;198;10000;0;0;0;0;0;0;0 +17.700000;27;15840;0.704000;135;10000;0;0;0;0;0;0;0 +17.800000;27;15840;0.704000;102;10000;0;0;0;0;0;0;0 +17.900000;27;15840;0.704000;94;10000;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv new file mode 100644 index 0000000000..ae7824fe1e --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs0_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.9;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.8;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.7;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.6;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.5;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3.1;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.9;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.8;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.7;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.6;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.5;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.4;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.3;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2.1;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-2;0;1864;0.2344;1500;1500;0;0;0;0;0;0;0 +-1.9;0;1864;0.2344;1499;1500;0;0;0;0;0;0;0 +-1.8;0;1864;0.2344;1499;1500;0;0;0;0;0;0;0 +-1.7;0;1864;0.2344;1498;1500;0;0;0;0;0;0;0 +-1.6;0;1864;0.2344;1498;1500;0;0;0;0;0;0;0 +-1.5;0;1864;0.2344;1497;1500;0;0;0;0;0;0;0 +-1.4;0;1864;0.2344;1445;1500;0;0;0;0;0;0;0 +-1.3;0;1864;0.2344;1394;1500;0;0;0;0;0;0;0 +-1.2;0;1864;0.2344;1346;1500;0;0;0;0;0;0;0 +-1.1;0;1864;0.2344;1299;1500;0;0;0;0;0;0;0 +-1;0;1864;0.2344;1253;1500;0;0;0;0;0;0;0 +-0.9;0;1864;0.2344;980;1500;0;0;0;0;0;0;0 +-0.8;0;1864;0.2344;767;1500;0;0;0;0;0;0;0 +-0.7;0;1864;0.2344;600;1500;0;0;0;0;0;0;0 +-0.6;0;1864;0.2344;469;1500;0;0;0;0;0;0;0 +-0.5;0;1864;0.2344;367;1500;0;0;0;0;0;0;0 +-0.4;0;1864;0.2344;215;1500;0;0;0;0;0;0;0 +-0.3;0;1864;0.2344;126;1500;0;0;0;0;0;0;0 +-0.2;0;1864;0.2344;74;1500;0;0;0;0;0;0;0 +-0.1;0;1864;0.2344;43;1500;0;0;0;0;0;0;0 +0;0;1864;0.2344;26;1500;0;0;0;0;0;0;0 +0.1;0;1864;0.2344;12;1500;0;0;0;0;0;0;0 +0.2;0;1864;0.2344;5;1500;0;0;0;0;0;0;0 +0.3;0;1864;0.2344;2;1500;0;0;0;0;0;0;0 +0.4;0;1864;0.2344;1;1500;0;0;0;0;0;0;0 +0.5;0;1864;0.2344;1;1500;0;0;0;0;0;0;0 +0.6;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +0.7;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +0.8;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +0.9;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.1;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.2;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.3;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.4;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.5;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.6;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.7;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.8;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +1.9;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 +2;0;1864;0.2344;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv new file mode 100644 index 0000000000..8d1ff3ebb6 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs10_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.1;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.2;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.6;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.7;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.8;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +3.9;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.1;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.2;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.3;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.4;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.6;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.7;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.8;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +4.9;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +5;10;10504;1.3281;1500;1500;0;0;0;0;0;0;0 +5.1;10;10504;1.3281;1454;1500;0;0;0;0;0;0;0 +5.2;10;10504;1.3281;1410;1500;0;0;0;0;0;0;0 +5.3;10;10504;1.3281;1367;1500;0;0;0;0;0;0;0 +5.4;10;10504;1.3281;1325;1500;0;0;0;0;0;0;0 +5.5;10;10504;1.3281;1285;1500;0;0;0;0;0;0;0 +5.6;10;10504;1.3281;1026;1500;0;0;0;0;0;0;0 +5.7;10;10504;1.3281;819;1500;0;0;0;0;0;0;0 +5.8;10;10504;1.3281;654;1500;0;0;0;0;0;0;0 +5.9;10;10504;1.3281;522;1500;0;0;0;0;0;0;0 +6;10;10504;1.3281;417;1500;0;0;0;0;0;0;0 +6.1;10;10504;1.3281;309;1500;0;0;0;0;0;0;0 +6.2;10;10504;1.3281;229;1500;0;0;0;0;0;0;0 +6.3;10;10504;1.3281;169;1500;0;0;0;0;0;0;0 +6.4;10;10504;1.3281;125;1500;0;0;0;0;0;0;0 +6.5;10;10504;1.3281;93;1500;0;0;0;0;0;0;0 +6.6;10;10504;1.3281;64;1500;0;0;0;0;0;0;0 +6.7;10;10504;1.3281;44;1500;0;0;0;0;0;0;0 +6.8;10;10504;1.3281;31;1500;0;0;0;0;0;0;0 +6.9;10;10504;1.3281;21;1500;0;0;0;0;0;0;0 +7;10;10504;1.3281;15;1500;0;0;0;0;0;0;0 +7.1;10;10504;1.3281;7;1500;0;0;0;0;0;0;0 +7.2;10;10504;1.3281;3;1500;0;0;0;0;0;0;0 +7.3;10;10504;1.3281;1;1500;0;0;0;0;0;0;0 +7.4;10;10504;1.3281;1;1500;0;0;0;0;0;0;0 +7.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +7.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +7.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +7.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +7.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +8.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +9.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +10.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.1;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.2;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.3;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.4;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.5;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.6;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.7;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.8;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +11.9;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 +12;10;10504;1.3281;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv new file mode 100644 index 0000000000..e581ab2ff1 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs11_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.6;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.7;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.8;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +3.9;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.6;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.7;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.8;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +4.9;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.1;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.2;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.3;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.4;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.5;11;11784;1.4766;1500;1500;0;0;0;0;0;0;0 +5.6;11;11784;1.4766;1494;1500;0;0;0;0;0;0;0 +5.7;11;11784;1.4766;1489;1500;0;0;0;0;0;0;0 +5.8;11;11784;1.4766;1483;1500;0;0;0;0;0;0;0 +5.9;11;11784;1.4766;1477;1500;0;0;0;0;0;0;0 +6;11;11784;1.4766;1472;1500;0;0;0;0;0;0;0 +6.1;11;11784;1.4766;1367;1500;0;0;0;0;0;0;0 +6.2;11;11784;1.4766;1269;1500;0;0;0;0;0;0;0 +6.3;11;11784;1.4766;1179;1500;0;0;0;0;0;0;0 +6.4;11;11784;1.4766;1095;1500;0;0;0;0;0;0;0 +6.5;11;11784;1.4766;1016;1500;0;0;0;0;0;0;0 +6.6;11;11784;1.4766;762;1500;0;0;0;0;0;0;0 +6.7;11;11784;1.4766;571;1500;0;0;0;0;0;0;0 +6.8;11;11784;1.4766;428;1500;0;0;0;0;0;0;0 +6.9;11;11784;1.4766;320;1500;0;0;0;0;0;0;0 +7;11;11784;1.4766;240;1500;0;0;0;0;0;0;0 +7.1;11;11784;1.4766;169;1500;0;0;0;0;0;0;0 +7.2;11;11784;1.4766;119;1500;0;0;0;0;0;0;0 +7.3;11;11784;1.4766;83;1500;0;0;0;0;0;0;0 +7.4;11;11784;1.4766;59;1500;0;0;0;0;0;0;0 +7.5;11;11784;1.4766;41;1500;0;0;0;0;0;0;0 +7.6;11;11784;1.4766;24;1500;0;0;0;0;0;0;0 +7.7;11;11784;1.4766;14;1500;0;0;0;0;0;0;0 +7.8;11;11784;1.4766;8;1500;0;0;0;0;0;0;0 +7.9;11;11784;1.4766;5;1500;0;0;0;0;0;0;0 +8;11;11784;1.4766;3;1500;0;0;0;0;0;0;0 +8.1;11;11784;1.4766;1;1500;0;0;0;0;0;0;0 +8.2;11;11784;1.4766;1;1500;0;0;0;0;0;0;0 +8.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +8.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +9.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +10.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.1;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.2;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.3;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.4;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.5;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.6;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.7;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.8;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +11.9;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 +12;11;11784;1.4766;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv new file mode 100644 index 0000000000..08825dec27 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs12_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +3.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +4.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.7;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.8;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +5.9;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.1;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.2;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.3;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.4;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.5;12;13576;1.6953;1500;1500;0;0;0;0;0;0;0 +6.6;12;13576;1.6953;1498;1500;0;0;0;0;0;0;0 +6.7;12;13576;1.6953;1495;1500;0;0;0;0;0;0;0 +6.8;12;13576;1.6953;1493;1500;0;0;0;0;0;0;0 +6.9;12;13576;1.6953;1491;1500;0;0;0;0;0;0;0 +7;12;13576;1.6953;1488;1500;0;0;0;0;0;0;0 +7.1;12;13576;1.6953;1357;1500;0;0;0;0;0;0;0 +7.2;12;13576;1.6953;1238;1500;0;0;0;0;0;0;0 +7.3;12;13576;1.6953;1129;1500;0;0;0;0;0;0;0 +7.4;12;13576;1.6953;1029;1500;0;0;0;0;0;0;0 +7.5;12;13576;1.6953;939;1500;0;0;0;0;0;0;0 +7.6;12;13576;1.6953;632;1500;0;0;0;0;0;0;0 +7.7;12;13576;1.6953;425;1500;0;0;0;0;0;0;0 +7.8;12;13576;1.6953;286;1500;0;0;0;0;0;0;0 +7.9;12;13576;1.6953;193;1500;0;0;0;0;0;0;0 +8;12;13576;1.6953;130;1500;0;0;0;0;0;0;0 +8.1;12;13576;1.6953;91;1500;0;0;0;0;0;0;0 +8.2;12;13576;1.6953;64;1500;0;0;0;0;0;0;0 +8.3;12;13576;1.6953;45;1500;0;0;0;0;0;0;0 +8.4;12;13576;1.6953;32;1500;0;0;0;0;0;0;0 +8.5;12;13576;1.6953;23;1500;0;0;0;0;0;0;0 +8.6;12;13576;1.6953;12;1500;0;0;0;0;0;0;0 +8.7;12;13576;1.6953;6;1500;0;0;0;0;0;0;0 +8.8;12;13576;1.6953;3;1500;0;0;0;0;0;0;0 +8.9;12;13576;1.6953;2;1500;0;0;0;0;0;0;0 +9;12;13576;1.6953;1;1500;0;0;0;0;0;0;0 +9.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +9.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +10.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.1;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.2;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.3;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.4;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.5;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.6;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.7;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.8;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +11.9;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 +12;12;13576;1.6953;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv new file mode 100644 index 0000000000..ef85933aaf --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs13_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +7;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.1;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.2;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.3;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.4;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.5;13;15112;1.9141;1500;1500;0;0;0;0;0;0;0 +7.6;13;15112;1.9141;1444;1500;0;0;0;0;0;0;0 +7.7;13;15112;1.9141;1391;1500;0;0;0;0;0;0;0 +7.8;13;15112;1.9141;1340;1500;0;0;0;0;0;0;0 +7.9;13;15112;1.9141;1290;1500;0;0;0;0;0;0;0 +8;13;15112;1.9141;1243;1500;0;0;0;0;0;0;0 +8.1;13;15112;1.9141;878;1500;0;0;0;0;0;0;0 +8.2;13;15112;1.9141;620;1500;0;0;0;0;0;0;0 +8.3;13;15112;1.9141;438;1500;0;0;0;0;0;0;0 +8.4;13;15112;1.9141;309;1500;0;0;0;0;0;0;0 +8.5;13;15112;1.9141;219;1500;0;0;0;0;0;0;0 +8.6;13;15112;1.9141;173;1500;0;0;0;0;0;0;0 +8.7;13;15112;1.9141;137;1500;0;0;0;0;0;0;0 +8.8;13;15112;1.9141;109;1500;0;0;0;0;0;0;0 +8.9;13;15112;1.9141;86;1500;0;0;0;0;0;0;0 +9;13;15112;1.9141;68;1500;0;0;0;0;0;0;0 +9.1;13;15112;1.9141;47;1500;0;0;0;0;0;0;0 +9.2;13;15112;1.9141;33;1500;0;0;0;0;0;0;0 +9.3;13;15112;1.9141;23;1500;0;0;0;0;0;0;0 +9.4;13;15112;1.9141;16;1500;0;0;0;0;0;0;0 +9.5;13;15112;1.9141;11;1500;0;0;0;0;0;0;0 +9.6;13;15112;1.9141;5;1500;0;0;0;0;0;0;0 +9.7;13;15112;1.9141;2;1500;0;0;0;0;0;0;0 +9.8;13;15112;1.9141;1;1500;0;0;0;0;0;0;0 +9.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +10.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +11.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +12.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.1;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.2;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.3;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.4;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.5;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.6;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.7;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.8;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +13.9;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 +14;13;15112;1.9141;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv new file mode 100644 index 0000000000..0667105011 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs14_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +7;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.1;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.2;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.3;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.4;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.5;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.6;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.7;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.8;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +7.9;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.1;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.2;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.3;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.4;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.5;14;17424;2.1602;1500;1500;0;0;0;0;0;0;0 +8.6;14;17424;2.1602;1497;1500;0;0;0;0;0;0;0 +8.7;14;17424;2.1602;1493;1500;0;0;0;0;0;0;0 +8.8;14;17424;2.1602;1490;1500;0;0;0;0;0;0;0 +8.9;14;17424;2.1602;1487;1500;0;0;0;0;0;0;0 +9;14;17424;2.1602;1484;1500;0;0;0;0;0;0;0 +9.1;14;17424;2.1602;1291;1500;0;0;0;0;0;0;0 +9.2;14;17424;2.1602;1123;1500;0;0;0;0;0;0;0 +9.3;14;17424;2.1602;977;1500;0;0;0;0;0;0;0 +9.4;14;17424;2.1602;850;1500;0;0;0;0;0;0;0 +9.5;14;17424;2.1602;739;1500;0;0;0;0;0;0;0 +9.6;14;17424;2.1602;508;1500;0;0;0;0;0;0;0 +9.7;14;17424;2.1602;349;1500;0;0;0;0;0;0;0 +9.8;14;17424;2.1602;239;1500;0;0;0;0;0;0;0 +9.9;14;17424;2.1602;164;1500;0;0;0;0;0;0;0 +10;14;17424;2.1602;113;1500;0;0;0;0;0;0;0 +10.1;14;17424;2.1602;85;1500;0;0;0;0;0;0;0 +10.2;14;17424;2.1602;63;1500;0;0;0;0;0;0;0 +10.3;14;17424;2.1602;47;1500;0;0;0;0;0;0;0 +10.4;14;17424;2.1602;35;1500;0;0;0;0;0;0;0 +10.5;14;17424;2.1602;27;1500;0;0;0;0;0;0;0 +10.6;14;17424;2.1602;12;1500;0;0;0;0;0;0;0 +10.7;14;17424;2.1602;6;1500;0;0;0;0;0;0;0 +10.8;14;17424;2.1602;3;1500;0;0;0;0;0;0;0 +10.9;14;17424;2.1602;1;1500;0;0;0;0;0;0;0 +11;14;17424;2.1602;1;1500;0;0;0;0;0;0;0 +11.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +11.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +12.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.1;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.2;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.3;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.4;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.5;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.6;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.7;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.8;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +13.9;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 +14;14;17424;2.1602;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv new file mode 100644 index 0000000000..460d156d78 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs15_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.2;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.3;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.4;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.5;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.6;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +7.9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.2;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.3;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.4;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.5;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.6;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.7;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.8;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +8.9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +9;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +9.1;15;18960;2.4063;1500;1500;0;0;0;0;0;0;0 +9.2;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0 +9.3;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0 +9.4;15;18960;2.4063;1499;1500;0;0;0;0;0;0;0 +9.5;15;18960;2.4063;1498;1500;0;0;0;0;0;0;0 +9.6;15;18960;2.4063;1377;1500;0;0;0;0;0;0;0 +9.7;15;18960;2.4063;1265;1500;0;0;0;0;0;0;0 +9.8;15;18960;2.4063;1163;1500;0;0;0;0;0;0;0 +9.9;15;18960;2.4063;1069;1500;0;0;0;0;0;0;0 +10;15;18960;2.4063;982;1500;0;0;0;0;0;0;0 +10.1;15;18960;2.4063;664;1500;0;0;0;0;0;0;0 +10.2;15;18960;2.4063;450;1500;0;0;0;0;0;0;0 +10.3;15;18960;2.4063;304;1500;0;0;0;0;0;0;0 +10.4;15;18960;2.4063;206;1500;0;0;0;0;0;0;0 +10.5;15;18960;2.4063;139;1500;0;0;0;0;0;0;0 +10.6;15;18960;2.4063;113;1500;0;0;0;0;0;0;0 +10.7;15;18960;2.4063;92;1500;0;0;0;0;0;0;0 +10.8;15;18960;2.4063;75;1500;0;0;0;0;0;0;0 +10.9;15;18960;2.4063;61;1500;0;0;0;0;0;0;0 +11;15;18960;2.4063;50;1500;0;0;0;0;0;0;0 +11.1;15;18960;2.4063;29;1500;0;0;0;0;0;0;0 +11.2;15;18960;2.4063;17;1500;0;0;0;0;0;0;0 +11.3;15;18960;2.4063;10;1500;0;0;0;0;0;0;0 +11.4;15;18960;2.4063;6;1500;0;0;0;0;0;0;0 +11.5;15;18960;2.4063;3;1500;0;0;0;0;0;0;0 +11.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +11.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +11.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +11.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.1;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.2;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.3;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.4;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.5;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +12.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.1;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.2;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.3;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.4;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.5;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.6;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.7;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.8;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +13.9;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 +14;15;18960;2.4063;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv new file mode 100644 index 0000000000..4f122de8c1 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs16_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +7.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +8.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.1;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.2;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.3;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.4;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.5;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.6;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.7;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.8;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +9.9;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +10;16;20496;2.5703;1500;1500;0;0;0;0;0;0;0 +10.1;16;20496;2.5703;1424;1500;0;0;0;0;0;0;0 +10.2;16;20496;2.5703;1352;1500;0;0;0;0;0;0;0 +10.3;16;20496;2.5703;1283;1500;0;0;0;0;0;0;0 +10.4;16;20496;2.5703;1218;1500;0;0;0;0;0;0;0 +10.5;16;20496;2.5703;1157;1500;0;0;0;0;0;0;0 +10.6;16;20496;2.5703;775;1500;0;0;0;0;0;0;0 +10.7;16;20496;2.5703;519;1500;0;0;0;0;0;0;0 +10.8;16;20496;2.5703;348;1500;0;0;0;0;0;0;0 +10.9;16;20496;2.5703;233;1500;0;0;0;0;0;0;0 +11;16;20496;2.5703;156;1500;0;0;0;0;0;0;0 +11.1;16;20496;2.5703;132;1500;0;0;0;0;0;0;0 +11.2;16;20496;2.5703;111;1500;0;0;0;0;0;0;0 +11.3;16;20496;2.5703;94;1500;0;0;0;0;0;0;0 +11.4;16;20496;2.5703;79;1500;0;0;0;0;0;0;0 +11.5;16;20496;2.5703;67;1500;0;0;0;0;0;0;0 +11.6;16;20496;2.5703;44;1500;0;0;0;0;0;0;0 +11.7;16;20496;2.5703;29;1500;0;0;0;0;0;0;0 +11.8;16;20496;2.5703;19;1500;0;0;0;0;0;0;0 +11.9;16;20496;2.5703;12;1500;0;0;0;0;0;0;0 +12;16;20496;2.5703;8;1500;0;0;0;0;0;0;0 +12.1;16;20496;2.5703;4;1500;0;0;0;0;0;0;0 +12.2;16;20496;2.5703;2;1500;0;0;0;0;0;0;0 +12.3;16;20496;2.5703;1;1500;0;0;0;0;0;0;0 +12.4;16;20496;2.5703;1;1500;0;0;0;0;0;0;0 +12.5;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +12.6;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +12.7;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +12.8;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +12.9;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.1;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.2;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.3;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.4;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.5;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.6;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.7;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.8;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +13.9;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 +14;16;20496;2.5703;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv new file mode 100644 index 0000000000..3254f76eb9 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs17_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +10;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.1;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.2;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.3;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.4;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.5;17;20496;2.5664;1500;1500;0;0;0;0;0;0;0 +10.6;17;20496;2.5664;1498;1500;0;0;0;0;0;0;0 +10.7;17;20496;2.5664;1496;1500;0;0;0;0;0;0;0 +10.8;17;20496;2.5664;1494;1500;0;0;0;0;0;0;0 +10.9;17;20496;2.5664;1493;1500;0;0;0;0;0;0;0 +11;17;20496;2.5664;1491;1500;0;0;0;0;0;0;0 +11.1;17;20496;2.5664;1336;1500;0;0;0;0;0;0;0 +11.2;17;20496;2.5664;1197;1500;0;0;0;0;0;0;0 +11.3;17;20496;2.5664;1072;1500;0;0;0;0;0;0;0 +11.4;17;20496;2.5664;961;1500;0;0;0;0;0;0;0 +11.5;17;20496;2.5664;861;1500;0;0;0;0;0;0;0 +11.6;17;20496;2.5664;603;1500;0;0;0;0;0;0;0 +11.7;17;20496;2.5664;423;1500;0;0;0;0;0;0;0 +11.8;17;20496;2.5664;296;1500;0;0;0;0;0;0;0 +11.9;17;20496;2.5664;208;1500;0;0;0;0;0;0;0 +12;17;20496;2.5664;146;1500;0;0;0;0;0;0;0 +12.1;17;20496;2.5664;125;1500;0;0;0;0;0;0;0 +12.2;17;20496;2.5664;107;1500;0;0;0;0;0;0;0 +12.3;17;20496;2.5664;92;1500;0;0;0;0;0;0;0 +12.4;17;20496;2.5664;79;1500;0;0;0;0;0;0;0 +12.5;17;20496;2.5664;68;1500;0;0;0;0;0;0;0 +12.6;17;20496;2.5664;50;1500;0;0;0;0;0;0;0 +12.7;17;20496;2.5664;37;1500;0;0;0;0;0;0;0 +12.8;17;20496;2.5664;28;1500;0;0;0;0;0;0;0 +12.9;17;20496;2.5664;20;1500;0;0;0;0;0;0;0 +13;17;20496;2.5664;15;1500;0;0;0;0;0;0;0 +13.1;17;20496;2.5664;9;1500;0;0;0;0;0;0;0 +13.2;17;20496;2.5664;5;1500;0;0;0;0;0;0;0 +13.3;17;20496;2.5664;3;1500;0;0;0;0;0;0;0 +13.4;17;20496;2.5664;2;1500;0;0;0;0;0;0;0 +13.5;17;20496;2.5664;1;1500;0;0;0;0;0;0;0 +13.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +13.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +13.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +13.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +14.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +15.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.1;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.2;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.3;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.4;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.5;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.6;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.7;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.8;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +16.9;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 +17;17;20496;2.5664;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv new file mode 100644 index 0000000000..67ede60066 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs18_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +10;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.1;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.2;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.3;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.4;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.5;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.6;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.7;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.8;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +10.9;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +11;18;21504;2.7305;1500;1500;0;0;0;0;0;0;0 +11.1;18;21504;2.7305;1499;1500;0;0;0;0;0;0;0 +11.2;18;21504;2.7305;1499;1500;0;0;0;0;0;0;0 +11.3;18;21504;2.7305;1498;1500;0;0;0;0;0;0;0 +11.4;18;21504;2.7305;1498;1500;0;0;0;0;0;0;0 +11.5;18;21504;2.7305;1497;1500;0;0;0;0;0;0;0 +11.6;18;21504;2.7305;1399;1500;0;0;0;0;0;0;0 +11.7;18;21504;2.7305;1307;1500;0;0;0;0;0;0;0 +11.8;18;21504;2.7305;1221;1500;0;0;0;0;0;0;0 +11.9;18;21504;2.7305;1141;1500;0;0;0;0;0;0;0 +12;18;21504;2.7305;1066;1500;0;0;0;0;0;0;0 +12.1;18;21504;2.7305;788;1500;0;0;0;0;0;0;0 +12.2;18;21504;2.7305;582;1500;0;0;0;0;0;0;0 +12.3;18;21504;2.7305;431;1500;0;0;0;0;0;0;0 +12.4;18;21504;2.7305;318;1500;0;0;0;0;0;0;0 +12.5;18;21504;2.7305;235;1500;0;0;0;0;0;0;0 +12.6;18;21504;2.7305;185;1500;0;0;0;0;0;0;0 +12.7;18;21504;2.7305;146;1500;0;0;0;0;0;0;0 +12.8;18;21504;2.7305;115;1500;0;0;0;0;0;0;0 +12.9;18;21504;2.7305;90;1500;0;0;0;0;0;0;0 +13;18;21504;2.7305;71;1500;0;0;0;0;0;0;0 +13.1;18;21504;2.7305;50;1500;0;0;0;0;0;0;0 +13.2;18;21504;2.7305;35;1500;0;0;0;0;0;0;0 +13.3;18;21504;2.7305;25;1500;0;0;0;0;0;0;0 +13.4;18;21504;2.7305;18;1500;0;0;0;0;0;0;0 +13.5;18;21504;2.7305;12;1500;0;0;0;0;0;0;0 +13.6;18;21504;2.7305;7;1500;0;0;0;0;0;0;0 +13.7;18;21504;2.7305;3;1500;0;0;0;0;0;0;0 +13.8;18;21504;2.7305;2;1500;0;0;0;0;0;0;0 +13.9;18;21504;2.7305;1;1500;0;0;0;0;0;0;0 +14;18;21504;2.7305;1;1500;0;0;0;0;0;0;0 +14.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +14.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +15.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.1;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.2;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.3;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.4;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.5;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.6;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.7;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.8;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +16.9;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 +17;18;21504;2.7305;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv new file mode 100644 index 0000000000..3d18bd7987 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs19_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +10;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.1;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.2;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.3;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.4;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.5;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.6;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.7;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.8;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +10.9;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.1;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.2;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.3;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.4;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.5;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.6;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.7;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.8;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +11.9;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +12;19;24072;3.0293;1500;1500;0;0;0;0;0;0;0 +12.1;19;24072;3.0293;1499;1500;0;0;0;0;0;0;0 +12.2;19;24072;3.0293;1499;1500;0;0;0;0;0;0;0 +12.3;19;24072;3.0293;1498;1500;0;0;0;0;0;0;0 +12.4;19;24072;3.0293;1497;1500;0;0;0;0;0;0;0 +12.5;19;24072;3.0293;1497;1500;0;0;0;0;0;0;0 +12.6;19;24072;3.0293;1389;1500;0;0;0;0;0;0;0 +12.7;19;24072;3.0293;1290;1500;0;0;0;0;0;0;0 +12.8;19;24072;3.0293;1197;1500;0;0;0;0;0;0;0 +12.9;19;24072;3.0293;1111;1500;0;0;0;0;0;0;0 +13;19;24072;3.0293;1032;1500;0;0;0;0;0;0;0 +13.1;19;24072;3.0293;746;1500;0;0;0;0;0;0;0 +13.2;19;24072;3.0293;539;1500;0;0;0;0;0;0;0 +13.3;19;24072;3.0293;390;1500;0;0;0;0;0;0;0 +13.4;19;24072;3.0293;282;1500;0;0;0;0;0;0;0 +13.5;19;24072;3.0293;204;1500;0;0;0;0;0;0;0 +13.6;19;24072;3.0293;166;1500;0;0;0;0;0;0;0 +13.7;19;24072;3.0293;135;1500;0;0;0;0;0;0;0 +13.8;19;24072;3.0293;110;1500;0;0;0;0;0;0;0 +13.9;19;24072;3.0293;89;1500;0;0;0;0;0;0;0 +14;19;24072;3.0293;73;1500;0;0;0;0;0;0;0 +14.1;19;24072;3.0293;54;1500;0;0;0;0;0;0;0 +14.2;19;24072;3.0293;41;1500;0;0;0;0;0;0;0 +14.3;19;24072;3.0293;30;1500;0;0;0;0;0;0;0 +14.4;19;24072;3.0293;23;1500;0;0;0;0;0;0;0 +14.5;19;24072;3.0293;17;1500;0;0;0;0;0;0;0 +14.6;19;24072;3.0293;9;1500;0;0;0;0;0;0;0 +14.7;19;24072;3.0293;5;1500;0;0;0;0;0;0;0 +14.8;19;24072;3.0293;3;1500;0;0;0;0;0;0;0 +14.9;19;24072;3.0293;2;1500;0;0;0;0;0;0;0 +15;19;24072;3.0293;1;1500;0;0;0;0;0;0;0 +15.1;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.2;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.3;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.4;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.5;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.6;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.7;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.8;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +15.9;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.1;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.2;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.3;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.4;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.5;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.6;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.7;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.8;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +16.9;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 +17;19;24072;3.0293;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv new file mode 100644 index 0000000000..ccb17b0d1c --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs1_awgn_5G.csv @@ -0,0 +1,27 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-4;1;2472;0.3066;1500;1500;0;0;0;0;0;0;0 +-3.9;1;2472;0.3066;1497;1500;0;0;0;0;0;0;0 +-3.8;1;2472;0.3066;1494;1500;0;0;0;0;0;0;0 +-3.7;1;2472;0.3066;1490;1500;0;0;0;0;0;0;0 +-3.6;1;2472;0.3066;1487;1500;0;0;0;0;0;0;0 +-3.5;1;2472;0.3066;1484;1500;0;0;0;0;0;0;0 +-3.4;1;2472;0.3066;1386;1500;0;0;0;0;0;0;0 +-3.3;1;2472;0.3066;1295;1500;0;0;0;0;0;0;0 +-3.2;1;2472;0.3066;1209;1500;0;0;0;0;0;0;0 +-3.1;1;2472;0.3066;1130;1500;0;0;0;0;0;0;0 +-3;1;2472;0.3066;1055;1500;0;0;0;0;0;0;0 +-2.9;1;2472;0.3066;863;1500;0;0;0;0;0;0;0 +-2.8;1;2472;0.3066;706;1500;0;0;0;0;0;0;0 +-2.7;1;2472;0.3066;577;1500;0;0;0;0;0;0;0 +-2.6;1;2472;0.3066;472;1500;0;0;0;0;0;0;0 +-2.5;1;2472;0.3066;386;1500;0;0;0;0;0;0;0 +-2.4;1;2472;0.3066;215;1500;0;0;0;0;0;0;0 +-2.3;1;2472;0.3066;120;1500;0;0;0;0;0;0;0 +-2.2;1;2472;0.3066;67;1500;0;0;0;0;0;0;0 +-2.1;1;2472;0.3066;37;1500;0;0;0;0;0;0;0 +-2;1;2472;0.3066;21;1500;0;0;0;0;0;0;0 +-1.9;1;2472;0.3066;9;1500;0;0;0;0;0;0;0 +-1.8;1;2472;0.3066;4;1500;0;0;0;0;0;0;0 +-1.7;1;2472;0.3066;2;1500;0;0;0;0;0;0;0 +-1.6;1;2472;0.3066;1;1500;0;0;0;0;0;0;0 +-1.5;1;2472;0.3066;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv new file mode 100644 index 0000000000..69d0055395 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs20_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +10;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +10.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +11.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.1;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.2;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.3;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.4;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.5;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.6;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.7;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.8;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +12.9;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +13;20;26632;3.3223;1500;1500;0;0;0;0;0;0;0 +13.1;20;26632;3.3223;1499;1500;0;0;0;0;0;0;0 +13.2;20;26632;3.3223;1499;1500;0;0;0;0;0;0;0 +13.3;20;26632;3.3223;1498;1500;0;0;0;0;0;0;0 +13.4;20;26632;3.3223;1498;1500;0;0;0;0;0;0;0 +13.5;20;26632;3.3223;1497;1500;0;0;0;0;0;0;0 +13.6;20;26632;3.3223;1390;1500;0;0;0;0;0;0;0 +13.7;20;26632;3.3223;1291;1500;0;0;0;0;0;0;0 +13.8;20;26632;3.3223;1199;1500;0;0;0;0;0;0;0 +13.9;20;26632;3.3223;1113;1500;0;0;0;0;0;0;0 +14;20;26632;3.3223;1034;1500;0;0;0;0;0;0;0 +14.1;20;26632;3.3223;745;1500;0;0;0;0;0;0;0 +14.2;20;26632;3.3223;537;1500;0;0;0;0;0;0;0 +14.3;20;26632;3.3223;387;1500;0;0;0;0;0;0;0 +14.4;20;26632;3.3223;279;1500;0;0;0;0;0;0;0 +14.5;20;26632;3.3223;201;1500;0;0;0;0;0;0;0 +14.6;20;26632;3.3223;161;1500;0;0;0;0;0;0;0 +14.7;20;26632;3.3223;129;1500;0;0;0;0;0;0;0 +14.8;20;26632;3.3223;104;1500;0;0;0;0;0;0;0 +14.9;20;26632;3.3223;83;1500;0;0;0;0;0;0;0 +15;20;26632;3.3223;67;1500;0;0;0;0;0;0;0 +15.1;20;26632;3.3223;45;1500;0;0;0;0;0;0;0 +15.2;20;26632;3.3223;30;1500;0;0;0;0;0;0;0 +15.3;20;26632;3.3223;20;1500;0;0;0;0;0;0;0 +15.4;20;26632;3.3223;13;1500;0;0;0;0;0;0;0 +15.5;20;26632;3.3223;9;1500;0;0;0;0;0;0;0 +15.6;20;26632;3.3223;4;1500;0;0;0;0;0;0;0 +15.7;20;26632;3.3223;1;1500;0;0;0;0;0;0;0 +15.8;20;26632;3.3223;1;1500;0;0;0;0;0;0;0 +15.9;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.1;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.2;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.3;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.4;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.5;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.6;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.7;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.8;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +16.9;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 +17;20;26632;3.3223;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv new file mode 100644 index 0000000000..2a5a691afb --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs21_awgn_5G.csv @@ -0,0 +1,72 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +10;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +10.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +11.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +12.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.1;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.2;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.3;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.4;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.5;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.6;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.7;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.8;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +13.9;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +14;21;28680;3.6094;1500;1500;0;0;0;0;0;0;0 +14.1;21;28680;3.6094;1472;1500;0;0;0;0;0;0;0 +14.2;21;28680;3.6094;1444;1500;0;0;0;0;0;0;0 +14.3;21;28680;3.6094;1417;1500;0;0;0;0;0;0;0 +14.4;21;28680;3.6094;1390;1500;0;0;0;0;0;0;0 +14.5;21;28680;3.6094;1364;1500;0;0;0;0;0;0;0 +14.6;21;28680;3.6094;1040;1500;0;0;0;0;0;0;0 +14.7;21;28680;3.6094;793;1500;0;0;0;0;0;0;0 +14.8;21;28680;3.6094;605;1500;0;0;0;0;0;0;0 +14.9;21;28680;3.6094;461;1500;0;0;0;0;0;0;0 +15;21;28680;3.6094;351;1500;0;0;0;0;0;0;0 +15.1;21;28680;3.6094;265;1500;0;0;0;0;0;0;0 +15.2;21;28680;3.6094;199;1500;0;0;0;0;0;0;0 +15.3;21;28680;3.6094;150;1500;0;0;0;0;0;0;0 +15.4;21;28680;3.6094;113;1500;0;0;0;0;0;0;0 +15.5;21;28680;3.6094;85;1500;0;0;0;0;0;0;0 +15.6;21;28680;3.6094;79;1500;0;0;0;0;0;0;0 +15.7;21;28680;3.6094;73;1500;0;0;0;0;0;0;0 +15.8;21;28680;3.6094;67;1500;0;0;0;0;0;0;0 +15.9;21;28680;3.6094;62;1500;0;0;0;0;0;0;0 +16;21;28680;3.6094;57;1500;0;0;0;0;0;0;0 +16.1;21;28680;3.6094;37;1500;0;0;0;0;0;0;0 +16.2;21;28680;3.6094;23;1500;0;0;0;0;0;0;0 +16.3;21;28680;3.6094;15;1500;0;0;0;0;0;0;0 +16.4;21;28680;3.6094;10;1500;0;0;0;0;0;0;0 +16.5;21;28680;3.6094;6;1500;0;0;0;0;0;0;0 +16.6;21;28680;3.6094;3;1500;0;0;0;0;0;0;0 +16.7;21;28680;3.6094;1;1500;0;0;0;0;0;0;0 +16.8;21;28680;3.6094;1;1500;0;0;0;0;0;0;0 +16.9;21;28680;3.6094;0;1500;0;0;0;0;0;0;0 +17;21;28680;3.6094;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv new file mode 100644 index 0000000000..10a4241376 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs22_awgn_5G.csv @@ -0,0 +1,52 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +14;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.1;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.2;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.3;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.4;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.5;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.6;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.7;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.8;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +14.9;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +15;22;31240;3.9023;1500;1500;0;0;0;0;0;0;0 +15.1;22;31240;3.9023;1421;1500;0;0;0;0;0;0;0 +15.2;22;31240;3.9023;1347;1500;0;0;0;0;0;0;0 +15.3;22;31240;3.9023;1276;1500;0;0;0;0;0;0;0 +15.4;22;31240;3.9023;1209;1500;0;0;0;0;0;0;0 +15.5;22;31240;3.9023;1146;1500;0;0;0;0;0;0;0 +15.6;22;31240;3.9023;807;1500;0;0;0;0;0;0;0 +15.7;22;31240;3.9023;569;1500;0;0;0;0;0;0;0 +15.8;22;31240;3.9023;400;1500;0;0;0;0;0;0;0 +15.9;22;31240;3.9023;282;1500;0;0;0;0;0;0;0 +16;22;31240;3.9023;199;1500;0;0;0;0;0;0;0 +16.1;22;31240;3.9023;165;1500;0;0;0;0;0;0;0 +16.2;22;31240;3.9023;137;1500;0;0;0;0;0;0;0 +16.3;22;31240;3.9023;114;1500;0;0;0;0;0;0;0 +16.4;22;31240;3.9023;94;1500;0;0;0;0;0;0;0 +16.5;22;31240;3.9023;78;1500;0;0;0;0;0;0;0 +16.6;22;31240;3.9023;74;1500;0;0;0;0;0;0;0 +16.7;22;31240;3.9023;69;1500;0;0;0;0;0;0;0 +16.8;22;31240;3.9023;65;1500;0;0;0;0;0;0;0 +16.9;22;31240;3.9023;61;1500;0;0;0;0;0;0;0 +17;22;31240;3.9023;58;1500;0;0;0;0;0;0;0 +17.1;22;31240;3.9023;36;1500;0;0;0;0;0;0;0 +17.2;22;31240;3.9023;23;1500;0;0;0;0;0;0;0 +17.3;22;31240;3.9023;15;1500;0;0;0;0;0;0;0 +17.4;22;31240;3.9023;9;1500;0;0;0;0;0;0;0 +17.5;22;31240;3.9023;6;1500;0;0;0;0;0;0;0 +17.6;22;31240;3.9023;3;1500;0;0;0;0;0;0;0 +17.7;22;31240;3.9023;1;1500;0;0;0;0;0;0;0 +17.8;22;31240;3.9023;1;1500;0;0;0;0;0;0;0 +17.9;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.1;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.2;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.3;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.4;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.5;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.6;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.7;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.8;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +18.9;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 +19;22;31240;3.9023;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv new file mode 100644 index 0000000000..07e9e257ff --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs23_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +15;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.1;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.2;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.3;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.4;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.5;23;33816;4.2129;1500;1500;0;0;0;0;0;0;0 +15.6;23;33816;4.2129;1499;1500;0;0;0;0;0;0;0 +15.7;23;33816;4.2129;1499;1500;0;0;0;0;0;0;0 +15.8;23;33816;4.2129;1498;1500;0;0;0;0;0;0;0 +15.9;23;33816;4.2129;1498;1500;0;0;0;0;0;0;0 +16;23;33816;4.2129;1497;1500;0;0;0;0;0;0;0 +16.1;23;33816;4.2129;1360;1500;0;0;0;0;0;0;0 +16.2;23;33816;4.2129;1236;1500;0;0;0;0;0;0;0 +16.3;23;33816;4.2129;1123;1500;0;0;0;0;0;0;0 +16.4;23;33816;4.2129;1020;1500;0;0;0;0;0;0;0 +16.5;23;33816;4.2129;927;1500;0;0;0;0;0;0;0 +16.6;23;33816;4.2129;630;1500;0;0;0;0;0;0;0 +16.7;23;33816;4.2129;428;1500;0;0;0;0;0;0;0 +16.8;23;33816;4.2129;291;1500;0;0;0;0;0;0;0 +16.9;23;33816;4.2129;198;1500;0;0;0;0;0;0;0 +17;23;33816;4.2129;135;1500;0;0;0;0;0;0;0 +17.1;23;33816;4.2129;120;1500;0;0;0;0;0;0;0 +17.2;23;33816;4.2129;108;1500;0;0;0;0;0;0;0 +17.3;23;33816;4.2129;96;1500;0;0;0;0;0;0;0 +17.4;23;33816;4.2129;86;1500;0;0;0;0;0;0;0 +17.5;23;33816;4.2129;77;1500;0;0;0;0;0;0;0 +17.6;23;33816;4.2129;70;1500;0;0;0;0;0;0;0 +17.7;23;33816;4.2129;63;1500;0;0;0;0;0;0;0 +17.8;23;33816;4.2129;57;1500;0;0;0;0;0;0;0 +17.9;23;33816;4.2129;52;1500;0;0;0;0;0;0;0 +18;23;33816;4.2129;47;1500;0;0;0;0;0;0;0 +18.1;23;33816;4.2129;28;1500;0;0;0;0;0;0;0 +18.2;23;33816;4.2129;16;1500;0;0;0;0;0;0;0 +18.3;23;33816;4.2129;9;1500;0;0;0;0;0;0;0 +18.4;23;33816;4.2129;6;1500;0;0;0;0;0;0;0 +18.5;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +18.6;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +18.7;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +18.8;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +18.9;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +19;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +19.1;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +19.2;23;33816;4.2129;4;1500;0;0;0;0;0;0;0 +19.3;23;33816;4.2129;5;1500;0;0;0;0;0;0;0 +19.4;23;33816;4.2129;6;1500;0;0;0;0;0;0;0 +19.5;23;33816;4.2129;8;1500;0;0;0;0;0;0;0 +19.6;23;33816;4.2129;6;1500;0;0;0;0;0;0;0 +19.7;23;33816;4.2129;4;1500;0;0;0;0;0;0;0 +19.8;23;33816;4.2129;3;1500;0;0;0;0;0;0;0 +19.9;23;33816;4.2129;2;1500;0;0;0;0;0;0;0 +20;23;33816;4.2129;2;1500;0;0;0;0;0;0;0 +20.1;23;33816;4.2129;1;1500;0;0;0;0;0;0;0 +20.2;23;33816;4.2129;1;1500;0;0;0;0;0;0;0 +20.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +20.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +21.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +22.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.1;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.2;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.3;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.4;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.5;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.6;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.7;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.8;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +23.9;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 +24;23;33816;4.2129;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv new file mode 100644 index 0000000000..6eac0f3f7d --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs24_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +15;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.1;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.2;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.3;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.4;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.5;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.6;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.7;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.8;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +15.9;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.1;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.2;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.3;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.4;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.5;24;35856;4.5234;1500;1500;0;0;0;0;0;0;0 +16.6;24;35856;4.5234;1474;1500;0;0;0;0;0;0;0 +16.7;24;35856;4.5234;1449;1500;0;0;0;0;0;0;0 +16.8;24;35856;4.5234;1424;1500;0;0;0;0;0;0;0 +16.9;24;35856;4.5234;1400;1500;0;0;0;0;0;0;0 +17;24;35856;4.5234;1376;1500;0;0;0;0;0;0;0 +17.1;24;35856;4.5234;1016;1500;0;0;0;0;0;0;0 +17.2;24;35856;4.5234;751;1500;0;0;0;0;0;0;0 +17.3;24;35856;4.5234;554;1500;0;0;0;0;0;0;0 +17.4;24;35856;4.5234;410;1500;0;0;0;0;0;0;0 +17.5;24;35856;4.5234;303;1500;0;0;0;0;0;0;0 +17.6;24;35856;4.5234;232;1500;0;0;0;0;0;0;0 +17.7;24;35856;4.5234;177;1500;0;0;0;0;0;0;0 +17.8;24;35856;4.5234;136;1500;0;0;0;0;0;0;0 +17.9;24;35856;4.5234;104;1500;0;0;0;0;0;0;0 +18;24;35856;4.5234;80;1500;0;0;0;0;0;0;0 +18.1;24;35856;4.5234;79;1500;0;0;0;0;0;0;0 +18.2;24;35856;4.5234;78;1500;0;0;0;0;0;0;0 +18.3;24;35856;4.5234;77;1500;0;0;0;0;0;0;0 +18.4;24;35856;4.5234;76;1500;0;0;0;0;0;0;0 +18.5;24;35856;4.5234;75;1500;0;0;0;0;0;0;0 +18.6;24;35856;4.5234;59;1500;0;0;0;0;0;0;0 +18.7;24;35856;4.5234;46;1500;0;0;0;0;0;0;0 +18.8;24;35856;4.5234;36;1500;0;0;0;0;0;0;0 +18.9;24;35856;4.5234;28;1500;0;0;0;0;0;0;0 +19;24;35856;4.5234;22;1500;0;0;0;0;0;0;0 +19.1;24;35856;4.5234;21;1500;0;0;0;0;0;0;0 +19.2;24;35856;4.5234;20;1500;0;0;0;0;0;0;0 +19.3;24;35856;4.5234;20;1500;0;0;0;0;0;0;0 +19.4;24;35856;4.5234;19;1500;0;0;0;0;0;0;0 +19.5;24;35856;4.5234;18;1500;0;0;0;0;0;0;0 +19.6;24;35856;4.5234;22;1500;0;0;0;0;0;0;0 +19.7;24;35856;4.5234;26;1500;0;0;0;0;0;0;0 +19.8;24;35856;4.5234;31;1500;0;0;0;0;0;0;0 +19.9;24;35856;4.5234;36;1500;0;0;0;0;0;0;0 +20;24;35856;4.5234;43;1500;0;0;0;0;0;0;0 +20.1;24;35856;4.5234;35;1500;0;0;0;0;0;0;0 +20.2;24;35856;4.5234;29;1500;0;0;0;0;0;0;0 +20.3;24;35856;4.5234;23;1500;0;0;0;0;0;0;0 +20.4;24;35856;4.5234;19;1500;0;0;0;0;0;0;0 +20.5;24;35856;4.5234;15;1500;0;0;0;0;0;0;0 +20.6;24;35856;4.5234;8;1500;0;0;0;0;0;0;0 +20.7;24;35856;4.5234;4;1500;0;0;0;0;0;0;0 +20.8;24;35856;4.5234;2;1500;0;0;0;0;0;0;0 +20.9;24;35856;4.5234;1;1500;0;0;0;0;0;0;0 +21;24;35856;4.5234;1;1500;0;0;0;0;0;0;0 +21.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +21.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +22.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.1;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.2;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.3;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.4;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.5;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.6;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.7;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.8;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +23.9;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 +24;24;35856;4.5234;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv new file mode 100644 index 0000000000..6f158f5bdc --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs25_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +15;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.1;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.2;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.3;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.4;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.5;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.6;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.7;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.8;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +15.9;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.1;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.2;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.3;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.4;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.5;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.6;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.7;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.8;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +16.9;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +17;25;37896;4.8164;1500;1500;0;0;0;0;0;0;0 +17.1;25;37896;4.8164;1493;1500;0;0;0;0;0;0;0 +17.2;25;37896;4.8164;1486;1500;0;0;0;0;0;0;0 +17.3;25;37896;4.8164;1478;1500;0;0;0;0;0;0;0 +17.4;25;37896;4.8164;1471;1500;0;0;0;0;0;0;0 +17.5;25;37896;4.8164;1464;1500;0;0;0;0;0;0;0 +17.6;25;37896;4.8164;1138;1500;0;0;0;0;0;0;0 +17.7;25;37896;4.8164;885;1500;0;0;0;0;0;0;0 +17.8;25;37896;4.8164;688;1500;0;0;0;0;0;0;0 +17.9;25;37896;4.8164;535;1500;0;0;0;0;0;0;0 +18;25;37896;4.8164;416;1500;0;0;0;0;0;0;0 +18.1;25;37896;4.8164;302;1500;0;0;0;0;0;0;0 +18.2;25;37896;4.8164;219;1500;0;0;0;0;0;0;0 +18.3;25;37896;4.8164;159;1500;0;0;0;0;0;0;0 +18.4;25;37896;4.8164;115;1500;0;0;0;0;0;0;0 +18.5;25;37896;4.8164;84;1500;0;0;0;0;0;0;0 +18.6;25;37896;4.8164;89;1500;0;0;0;0;0;0;0 +18.7;25;37896;4.8164;94;1500;0;0;0;0;0;0;0 +18.8;25;37896;4.8164;100;1500;0;0;0;0;0;0;0 +18.9;25;37896;4.8164;106;1500;0;0;0;0;0;0;0 +19;25;37896;4.8164;113;1500;0;0;0;0;0;0;0 +19.1;25;37896;4.8164;110;1500;0;0;0;0;0;0;0 +19.2;25;37896;4.8164;108;1500;0;0;0;0;0;0;0 +19.3;25;37896;4.8164;105;1500;0;0;0;0;0;0;0 +19.4;25;37896;4.8164;103;1500;0;0;0;0;0;0;0 +19.5;25;37896;4.8164;101;1500;0;0;0;0;0;0;0 +19.6;25;37896;4.8164;89;1500;0;0;0;0;0;0;0 +19.7;25;37896;4.8164;79;1500;0;0;0;0;0;0;0 +19.8;25;37896;4.8164;71;1500;0;0;0;0;0;0;0 +19.9;25;37896;4.8164;63;1500;0;0;0;0;0;0;0 +20;25;37896;4.8164;56;1500;0;0;0;0;0;0;0 +20.1;25;37896;4.8164;58;1500;0;0;0;0;0;0;0 +20.2;25;37896;4.8164;61;1500;0;0;0;0;0;0;0 +20.3;25;37896;4.8164;64;1500;0;0;0;0;0;0;0 +20.4;25;37896;4.8164;67;1500;0;0;0;0;0;0;0 +20.5;25;37896;4.8164;71;1500;0;0;0;0;0;0;0 +20.6;25;37896;4.8164;64;1500;0;0;0;0;0;0;0 +20.7;25;37896;4.8164;58;1500;0;0;0;0;0;0;0 +20.8;25;37896;4.8164;52;1500;0;0;0;0;0;0;0 +20.9;25;37896;4.8164;47;1500;0;0;0;0;0;0;0 +21;25;37896;4.8164;43;1500;0;0;0;0;0;0;0 +21.1;25;37896;4.8164;27;1500;0;0;0;0;0;0;0 +21.2;25;37896;4.8164;17;1500;0;0;0;0;0;0;0 +21.3;25;37896;4.8164;10;1500;0;0;0;0;0;0;0 +21.4;25;37896;4.8164;6;1500;0;0;0;0;0;0;0 +21.5;25;37896;4.8164;4;1500;0;0;0;0;0;0;0 +21.6;25;37896;4.8164;2;1500;0;0;0;0;0;0;0 +21.7;25;37896;4.8164;1;1500;0;0;0;0;0;0;0 +21.8;25;37896;4.8164;1;1500;0;0;0;0;0;0;0 +21.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.1;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.2;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.3;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.4;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.5;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.6;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.7;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.8;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +22.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.1;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.2;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.3;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.4;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.5;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.6;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.7;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.8;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +23.9;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 +24;25;37896;4.8164;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv new file mode 100644 index 0000000000..94d779fb21 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs26_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +15;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +15.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +16.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.1;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.2;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.3;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.4;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.5;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.6;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.7;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.8;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +17.9;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +18;26;40976;5.1152;1500;1500;0;0;0;0;0;0;0 +18.1;26;40976;5.1152;1496;1500;0;0;0;0;0;0;0 +18.2;26;40976;5.1152;1492;1500;0;0;0;0;0;0;0 +18.3;26;40976;5.1152;1487;1500;0;0;0;0;0;0;0 +18.4;26;40976;5.1152;1483;1500;0;0;0;0;0;0;0 +18.5;26;40976;5.1152;1479;1500;0;0;0;0;0;0;0 +18.6;26;40976;5.1152;1188;1500;0;0;0;0;0;0;0 +18.7;26;40976;5.1152;954;1500;0;0;0;0;0;0;0 +18.8;26;40976;5.1152;766;1500;0;0;0;0;0;0;0 +18.9;26;40976;5.1152;615;1500;0;0;0;0;0;0;0 +19;26;40976;5.1152;494;1500;0;0;0;0;0;0;0 +19.1;26;40976;5.1152;478;1500;0;0;0;0;0;0;0 +19.2;26;40976;5.1152;462;1500;0;0;0;0;0;0;0 +19.3;26;40976;5.1152;447;1500;0;0;0;0;0;0;0 +19.4;26;40976;5.1152;433;1500;0;0;0;0;0;0;0 +19.5;26;40976;5.1152;419;1500;0;0;0;0;0;0;0 +19.6;26;40976;5.1152;491;1500;0;0;0;0;0;0;0 +19.7;26;40976;5.1152;577;1500;0;0;0;0;0;0;0 +19.8;26;40976;5.1152;677;1500;0;0;0;0;0;0;0 +19.9;26;40976;5.1152;795;1500;0;0;0;0;0;0;0 +20;26;40976;5.1152;934;1500;0;0;0;0;0;0;0 +20.1;26;40976;5.1152;799;1500;0;0;0;0;0;0;0 +20.2;26;40976;5.1152;684;1500;0;0;0;0;0;0;0 +20.3;26;40976;5.1152;586;1500;0;0;0;0;0;0;0 +20.4;26;40976;5.1152;502;1500;0;0;0;0;0;0;0 +20.5;26;40976;5.1152;429;1500;0;0;0;0;0;0;0 +20.6;26;40976;5.1152;315;1500;0;0;0;0;0;0;0 +20.7;26;40976;5.1152;231;1500;0;0;0;0;0;0;0 +20.8;26;40976;5.1152;169;1500;0;0;0;0;0;0;0 +20.9;26;40976;5.1152;124;1500;0;0;0;0;0;0;0 +21;26;40976;5.1152;91;1500;0;0;0;0;0;0;0 +21.1;26;40976;5.1152;87;1500;0;0;0;0;0;0;0 +21.2;26;40976;5.1152;84;1500;0;0;0;0;0;0;0 +21.3;26;40976;5.1152;81;1500;0;0;0;0;0;0;0 +21.4;26;40976;5.1152;78;1500;0;0;0;0;0;0;0 +21.5;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +21.6;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +21.7;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +21.8;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +21.9;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +22;26;40976;5.1152;75;1500;0;0;0;0;0;0;0 +22.1;26;40976;5.1152;73;1500;0;0;0;0;0;0;0 +22.2;26;40976;5.1152;72;1500;0;0;0;0;0;0;0 +22.3;26;40976;5.1152;70;1500;0;0;0;0;0;0;0 +22.4;26;40976;5.1152;68;1500;0;0;0;0;0;0;0 +22.5;26;40976;5.1152;67;1500;0;0;0;0;0;0;0 +22.6;26;40976;5.1152;53;1500;0;0;0;0;0;0;0 +22.7;26;40976;5.1152;42;1500;0;0;0;0;0;0;0 +22.8;26;40976;5.1152;33;1500;0;0;0;0;0;0;0 +22.9;26;40976;5.1152;26;1500;0;0;0;0;0;0;0 +23;26;40976;5.1152;21;1500;0;0;0;0;0;0;0 +23.1;26;40976;5.1152;11;1500;0;0;0;0;0;0;0 +23.2;26;40976;5.1152;6;1500;0;0;0;0;0;0;0 +23.3;26;40976;5.1152;3;1500;0;0;0;0;0;0;0 +23.4;26;40976;5.1152;2;1500;0;0;0;0;0;0;0 +23.5;26;40976;5.1152;1;1500;0;0;0;0;0;0;0 +23.6;26;40976;5.1152;1;1500;0;0;0;0;0;0;0 +23.7;26;40976;5.1152;0;1500;0;0;0;0;0;0;0 +23.8;26;40976;5.1152;0;1500;0;0;0;0;0;0;0 +23.9;26;40976;5.1152;0;1500;0;0;0;0;0;0;0 +24;26;40976;5.1152;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv new file mode 100644 index 0000000000..5f25579439 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs27_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +18;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.1;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.2;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.3;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.4;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.5;27;42016;5.332;1500;1500;0;0;0;0;0;0;0 +18.6;27;42016;5.332;1465;1500;0;0;0;0;0;0;0 +18.7;27;42016;5.332;1430;1500;0;0;0;0;0;0;0 +18.8;27;42016;5.332;1397;1500;0;0;0;0;0;0;0 +18.9;27;42016;5.332;1364;1500;0;0;0;0;0;0;0 +19;27;42016;5.332;1332;1500;0;0;0;0;0;0;0 +19.1;27;42016;5.332;1092;1500;0;0;0;0;0;0;0 +19.2;27;42016;5.332;896;1500;0;0;0;0;0;0;0 +19.3;27;42016;5.332;735;1500;0;0;0;0;0;0;0 +19.4;27;42016;5.332;603;1500;0;0;0;0;0;0;0 +19.5;27;42016;5.332;494;1500;0;0;0;0;0;0;0 +19.6;27;42016;5.332;572;1500;0;0;0;0;0;0;0 +19.7;27;42016;5.332;662;1500;0;0;0;0;0;0;0 +19.8;27;42016;5.332;766;1500;0;0;0;0;0;0;0 +19.9;27;42016;5.332;886;1500;0;0;0;0;0;0;0 +20;27;42016;5.332;1025;1500;0;0;0;0;0;0;0 +20.1;27;42016;5.332;1041;1500;0;0;0;0;0;0;0 +20.2;27;42016;5.332;1058;1500;0;0;0;0;0;0;0 +20.3;27;42016;5.332;1074;1500;0;0;0;0;0;0;0 +20.4;27;42016;5.332;1091;1500;0;0;0;0;0;0;0 +20.5;27;42016;5.332;1109;1500;0;0;0;0;0;0;0 +20.6;27;42016;5.332;811;1500;0;0;0;0;0;0;0 +20.7;27;42016;5.332;594;1500;0;0;0;0;0;0;0 +20.8;27;42016;5.332;434;1500;0;0;0;0;0;0;0 +20.9;27;42016;5.332;318;1500;0;0;0;0;0;0;0 +21;27;42016;5.332;233;1500;0;0;0;0;0;0;0 +21.1;27;42016;5.332;187;1500;0;0;0;0;0;0;0 +21.2;27;42016;5.332;150;1500;0;0;0;0;0;0;0 +21.3;27;42016;5.332;121;1500;0;0;0;0;0;0;0 +21.4;27;42016;5.332;97;1500;0;0;0;0;0;0;0 +21.5;27;42016;5.332;78;1500;0;0;0;0;0;0;0 +21.6;27;42016;5.332;78;1500;0;0;0;0;0;0;0 +21.7;27;42016;5.332;77;1500;0;0;0;0;0;0;0 +21.8;27;42016;5.332;76;1500;0;0;0;0;0;0;0 +21.9;27;42016;5.332;76;1500;0;0;0;0;0;0;0 +22;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.1;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.2;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.3;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.4;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.5;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.6;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.7;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.8;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +22.9;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +23;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +23.1;27;42016;5.332;75;1500;0;0;0;0;0;0;0 +23.2;27;42016;5.332;74;1500;0;0;0;0;0;0;0 +23.3;27;42016;5.332;74;1500;0;0;0;0;0;0;0 +23.4;27;42016;5.332;74;1500;0;0;0;0;0;0;0 +23.5;27;42016;5.332;74;1500;0;0;0;0;0;0;0 +23.6;27;42016;5.332;68;1500;0;0;0;0;0;0;0 +23.7;27;42016;5.332;63;1500;0;0;0;0;0;0;0 +23.8;27;42016;5.332;59;1500;0;0;0;0;0;0;0 +23.9;27;42016;5.332;55;1500;0;0;0;0;0;0;0 +24;27;42016;5.332;51;1500;0;0;0;0;0;0;0 +24.1;27;42016;5.332;38;1500;0;0;0;0;0;0;0 +24.2;27;42016;5.332;29;1500;0;0;0;0;0;0;0 +24.3;27;42016;5.332;21;1500;0;0;0;0;0;0;0 +24.4;27;42016;5.332;16;1500;0;0;0;0;0;0;0 +24.5;27;42016;5.332;12;1500;0;0;0;0;0;0;0 +24.6;27;42016;5.332;7;1500;0;0;0;0;0;0;0 +24.7;27;42016;5.332;4;1500;0;0;0;0;0;0;0 +24.8;27;42016;5.332;3;1500;0;0;0;0;0;0;0 +24.9;27;42016;5.332;2;1500;0;0;0;0;0;0;0 +25;27;42016;5.332;1;1500;0;0;0;0;0;0;0 +25.1;27;42016;5.332;1;1500;0;0;0;0;0;0;0 +25.2;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.3;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.4;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.5;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.6;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.7;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.8;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +25.9;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.1;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.2;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.3;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.4;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.5;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.6;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.7;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.8;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +26.9;27;42016;5.332;0;1500;0;0;0;0;0;0;0 +27;27;42016;5.332;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv new file mode 100644 index 0000000000..edf6ef2e2c --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs28_awgn_5G.csv @@ -0,0 +1,92 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +18;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.1;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.2;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.3;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.4;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.5;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.6;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.7;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.8;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +18.9;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +19;28;44040;5.547;1500;1500;0;0;0;0;0;0;0 +19.1;28;44040;5.547;1499;1500;0;0;0;0;0;0;0 +19.2;28;44040;5.547;1498;1500;0;0;0;0;0;0;0 +19.3;28;44040;5.547;1498;1500;0;0;0;0;0;0;0 +19.4;28;44040;5.547;1497;1500;0;0;0;0;0;0;0 +19.5;28;44040;5.547;1496;1500;0;0;0;0;0;0;0 +19.6;28;44040;5.547;1429;1500;0;0;0;0;0;0;0 +19.7;28;44040;5.547;1366;1500;0;0;0;0;0;0;0 +19.8;28;44040;5.547;1305;1500;0;0;0;0;0;0;0 +19.9;28;44040;5.547;1247;1500;0;0;0;0;0;0;0 +20;28;44040;5.547;1191;1500;0;0;0;0;0;0;0 +20.1;28;44040;5.547;1234;1500;0;0;0;0;0;0;0 +20.2;28;44040;5.547;1279;1500;0;0;0;0;0;0;0 +20.3;28;44040;5.547;1325;1500;0;0;0;0;0;0;0 +20.4;28;44040;5.547;1373;1500;0;0;0;0;0;0;0 +20.5;28;44040;5.547;1423;1500;0;0;0;0;0;0;0 +20.6;28;44040;5.547;1426;1500;0;0;0;0;0;0;0 +20.7;28;44040;5.547;1429;1500;0;0;0;0;0;0;0 +20.8;28;44040;5.547;1432;1500;0;0;0;0;0;0;0 +20.9;28;44040;5.547;1435;1500;0;0;0;0;0;0;0 +21;28;44040;5.547;1438;1500;0;0;0;0;0;0;0 +21.1;28;44040;5.547;1207;1500;0;0;0;0;0;0;0 +21.2;28;44040;5.547;1014;1500;0;0;0;0;0;0;0 +21.3;28;44040;5.547;851;1500;0;0;0;0;0;0;0 +21.4;28;44040;5.547;715;1500;0;0;0;0;0;0;0 +21.5;28;44040;5.547;600;1500;0;0;0;0;0;0;0 +21.6;28;44040;5.547;418;1500;0;0;0;0;0;0;0 +21.7;28;44040;5.547;290;1500;0;0;0;0;0;0;0 +21.8;28;44040;5.547;202;1500;0;0;0;0;0;0;0 +21.9;28;44040;5.547;140;1500;0;0;0;0;0;0;0 +22;28;44040;5.547;98;1500;0;0;0;0;0;0;0 +22.1;28;44040;5.547;93;1500;0;0;0;0;0;0;0 +22.2;28;44040;5.547;88;1500;0;0;0;0;0;0;0 +22.3;28;44040;5.547;83;1500;0;0;0;0;0;0;0 +22.4;28;44040;5.547;79;1500;0;0;0;0;0;0;0 +22.5;28;44040;5.547;75;1500;0;0;0;0;0;0;0 +22.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +22.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +22.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +22.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +23.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +24.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +25.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.1;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.2;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.3;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.4;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.5;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.6;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.7;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.8;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +26.9;28;44040;5.547;0;1500;0;0;0;0;0;0;0 +27;28;44040;5.547;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv new file mode 100644 index 0000000000..2fbb6a20b9 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs2_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3.1;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.4;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.3;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2.1;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-2;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.9;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.8;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.7;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.6;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.5;2;2976;0.377;1500;1500;0;0;0;0;0;0;0 +-1.4;2;2976;0.377;1486;1500;0;0;0;0;0;0;0 +-1.3;2;2976;0.377;1473;1500;0;0;0;0;0;0;0 +-1.2;2;2976;0.377;1459;1500;0;0;0;0;0;0;0 +-1.1;2;2976;0.377;1446;1500;0;0;0;0;0;0;0 +-1;2;2976;0.377;1432;1500;0;0;0;0;0;0;0 +-0.9;2;2976;0.377;1149;1500;0;0;0;0;0;0;0 +-0.8;2;2976;0.377;921;1500;0;0;0;0;0;0;0 +-0.7;2;2976;0.377;738;1500;0;0;0;0;0;0;0 +-0.6;2;2976;0.377;592;1500;0;0;0;0;0;0;0 +-0.5;2;2976;0.377;475;1500;0;0;0;0;0;0;0 +-0.4;2;2976;0.377;292;1500;0;0;0;0;0;0;0 +-0.3;2;2976;0.377;179;1500;0;0;0;0;0;0;0 +-0.2;2;2976;0.377;110;1500;0;0;0;0;0;0;0 +-0.1;2;2976;0.377;68;1500;0;0;0;0;0;0;0 +0;2;2976;0.377;42;1500;0;0;0;0;0;0;0 +0.1;2;2976;0.377;22;1500;0;0;0;0;0;0;0 +0.2;2;2976;0.377;11;1500;0;0;0;0;0;0;0 +0.3;2;2976;0.377;6;1500;0;0;0;0;0;0;0 +0.4;2;2976;0.377;3;1500;0;0;0;0;0;0;0 +0.5;2;2976;0.377;2;1500;0;0;0;0;0;0;0 +0.6;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +0.7;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +0.8;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +0.9;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.1;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.2;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.3;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.4;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.5;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.6;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.7;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.8;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +1.9;2;2976;0.377;0;1500;0;0;0;0;0;0;0 +2;2;2976;0.377;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv new file mode 100644 index 0000000000..531c1548b0 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs3_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.9;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.8;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.7;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.6;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.5;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.4;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.3;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.2;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1.1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-1;3;3912;0.4902;1500;1500;0;0;0;0;0;0;0 +-0.9;3;3912;0.4902;1499;1500;0;0;0;0;0;0;0 +-0.8;3;3912;0.4902;1498;1500;0;0;0;0;0;0;0 +-0.7;3;3912;0.4902;1496;1500;0;0;0;0;0;0;0 +-0.6;3;3912;0.4902;1495;1500;0;0;0;0;0;0;0 +-0.5;3;3912;0.4902;1494;1500;0;0;0;0;0;0;0 +-0.4;3;3912;0.4902;1322;1500;0;0;0;0;0;0;0 +-0.3;3;3912;0.4902;1169;1500;0;0;0;0;0;0;0 +-0.2;3;3912;0.4902;1034;1500;0;0;0;0;0;0;0 +-0.1;3;3912;0.4902;915;1500;0;0;0;0;0;0;0 +0;3;3912;0.4902;809;1500;0;0;0;0;0;0;0 +0.1;3;3912;0.4902;504;1500;0;0;0;0;0;0;0 +0.2;3;3912;0.4902;314;1500;0;0;0;0;0;0;0 +0.3;3;3912;0.4902;196;1500;0;0;0;0;0;0;0 +0.4;3;3912;0.4902;122;1500;0;0;0;0;0;0;0 +0.5;3;3912;0.4902;76;1500;0;0;0;0;0;0;0 +0.6;3;3912;0.4902;37;1500;0;0;0;0;0;0;0 +0.7;3;3912;0.4902;18;1500;0;0;0;0;0;0;0 +0.8;3;3912;0.4902;9;1500;0;0;0;0;0;0;0 +0.9;3;3912;0.4902;4;1500;0;0;0;0;0;0;0 +1;3;3912;0.4902;2;1500;0;0;0;0;0;0;0 +1.1;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.2;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.3;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.4;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.5;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.6;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.7;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.8;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +1.9;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 +2;3;3912;0.4902;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv new file mode 100644 index 0000000000..033c81afaf --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs4_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;4;4736;0.6016;1500;1500;0;0;0;0;0;0;0 +-0.9;4;4736;0.6016;1499;1500;0;0;0;0;0;0;0 +-0.8;4;4736;0.6016;1498;1500;0;0;0;0;0;0;0 +-0.7;4;4736;0.6016;1496;1500;0;0;0;0;0;0;0 +-0.6;4;4736;0.6016;1495;1500;0;0;0;0;0;0;0 +-0.5;4;4736;0.6016;1494;1500;0;0;0;0;0;0;0 +-0.4;4;4736;0.6016;1322;1500;0;0;0;0;0;0;0 +-0.3;4;4736;0.6016;1169;1500;0;0;0;0;0;0;0 +-0.2;4;4736;0.6016;1034;1500;0;0;0;0;0;0;0 +-0.1;4;4736;0.6016;915;1500;0;0;0;0;0;0;0 +0;4;4736;0.6016;809;1500;0;0;0;0;0;0;0 +0.1;4;4736;0.6016;504;1500;0;0;0;0;0;0;0 +0.2;4;4736;0.6016;314;1500;0;0;0;0;0;0;0 +0.3;4;4736;0.6016;196;1500;0;0;0;0;0;0;0 +0.4;4;4736;0.6016;122;1500;0;0;0;0;0;0;0 +0.5;4;4736;0.6016;76;1500;0;0;0;0;0;0;0 +0.6;4;4736;0.6016;37;1500;0;0;0;0;0;0;0 +0.7;4;4736;0.6016;18;1500;0;0;0;0;0;0;0 +0.8;4;4736;0.6016;9;1500;0;0;0;0;0;0;0 +0.9;4;4736;0.6016;4;1500;0;0;0;0;0;0;0 +1;4;4736;0.6016;2;1500;0;0;0;0;0;0;0 +1.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +1.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +2.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +3.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.1;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.2;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.3;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.4;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.6;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.7;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.8;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +4.9;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 +5;4;4736;0.6016;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv new file mode 100644 index 0000000000..f741966016 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs5_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.9;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.8;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.7;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.6;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.5;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.4;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.3;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.2;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +-0.1;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +0;5;5888;0.7402;1500;1500;0;0;0;0;0;0;0 +0.1;5;5888;0.7402;1499;1500;0;0;0;0;0;0;0 +0.2;5;5888;0.7402;1499;1500;0;0;0;0;0;0;0 +0.3;5;5888;0.7402;1498;1500;0;0;0;0;0;0;0 +0.4;5;5888;0.7402;1498;1500;0;0;0;0;0;0;0 +0.5;5;5888;0.7402;1497;1500;0;0;0;0;0;0;0 +0.6;5;5888;0.7402;1323;1500;0;0;0;0;0;0;0 +0.7;5;5888;0.7402;1170;1500;0;0;0;0;0;0;0 +0.8;5;5888;0.7402;1034;1500;0;0;0;0;0;0;0 +0.9;5;5888;0.7402;914;1500;0;0;0;0;0;0;0 +1;5;5888;0.7402;808;1500;0;0;0;0;0;0;0 +1.1;5;5888;0.7402;513;1500;0;0;0;0;0;0;0 +1.2;5;5888;0.7402;326;1500;0;0;0;0;0;0;0 +1.3;5;5888;0.7402;207;1500;0;0;0;0;0;0;0 +1.4;5;5888;0.7402;131;1500;0;0;0;0;0;0;0 +1.5;5;5888;0.7402;83;1500;0;0;0;0;0;0;0 +1.6;5;5888;0.7402;48;1500;0;0;0;0;0;0;0 +1.7;5;5888;0.7402;28;1500;0;0;0;0;0;0;0 +1.8;5;5888;0.7402;16;1500;0;0;0;0;0;0;0 +1.9;5;5888;0.7402;9;1500;0;0;0;0;0;0;0 +2;5;5888;0.7402;5;1500;0;0;0;0;0;0;0 +2.1;5;5888;0.7402;2;1500;0;0;0;0;0;0;0 +2.2;5;5888;0.7402;1;1500;0;0;0;0;0;0;0 +2.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +2.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.1;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.2;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +3.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.1;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.2;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.3;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.4;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.6;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.7;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.8;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +4.9;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 +5;5;5888;0.7402;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv new file mode 100644 index 0000000000..350c53d695 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs6_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.9;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.8;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.7;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.6;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.5;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.4;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.3;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.2;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +-0.1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.2;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.3;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.4;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.5;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.6;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.7;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.8;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +0.9;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +1;6;6912;0.877;1500;1500;0;0;0;0;0;0;0 +1.1;6;6912;0.877;1493;1500;0;0;0;0;0;0;0 +1.2;6;6912;0.877;1487;1500;0;0;0;0;0;0;0 +1.3;6;6912;0.877;1480;1500;0;0;0;0;0;0;0 +1.4;6;6912;0.877;1473;1500;0;0;0;0;0;0;0 +1.5;6;6912;0.877;1467;1500;0;0;0;0;0;0;0 +1.6;6;6912;0.877;1117;1500;0;0;0;0;0;0;0 +1.7;6;6912;0.877;850;1500;0;0;0;0;0;0;0 +1.8;6;6912;0.877;648;1500;0;0;0;0;0;0;0 +1.9;6;6912;0.877;493;1500;0;0;0;0;0;0;0 +2;6;6912;0.877;376;1500;0;0;0;0;0;0;0 +2.1;6;6912;0.877;254;1500;0;0;0;0;0;0;0 +2.2;6;6912;0.877;172;1500;0;0;0;0;0;0;0 +2.3;6;6912;0.877;116;1500;0;0;0;0;0;0;0 +2.4;6;6912;0.877;79;1500;0;0;0;0;0;0;0 +2.5;6;6912;0.877;53;1500;0;0;0;0;0;0;0 +2.6;6;6912;0.877;32;1500;0;0;0;0;0;0;0 +2.7;6;6912;0.877;19;1500;0;0;0;0;0;0;0 +2.8;6;6912;0.877;11;1500;0;0;0;0;0;0;0 +2.9;6;6912;0.877;7;1500;0;0;0;0;0;0;0 +3;6;6912;0.877;4;1500;0;0;0;0;0;0;0 +3.1;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.2;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.3;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.4;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.5;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.6;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.7;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.8;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +3.9;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.1;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.2;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.3;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.4;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.5;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.6;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.7;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.8;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +4.9;6;6912;0.877;0;1500;0;0;0;0;0;0;0 +5;6;6912;0.877;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv new file mode 100644 index 0000000000..9bd689cf0e --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs7_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +-0.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +0.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.1;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.3;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.4;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.5;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.6;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.7;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.8;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +1.9;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +2;7;8912;1.0273;1500;1500;0;0;0;0;0;0;0 +2.1;7;8912;1.0273;1492;1500;0;0;0;0;0;0;0 +2.2;7;8912;1.0273;1484;1500;0;0;0;0;0;0;0 +2.3;7;8912;1.0273;1477;1500;0;0;0;0;0;0;0 +2.4;7;8912;1.0273;1469;1500;0;0;0;0;0;0;0 +2.5;7;8912;1.0273;1462;1500;0;0;0;0;0;0;0 +2.6;7;8912;1.0273;1159;1500;0;0;0;0;0;0;0 +2.7;7;8912;1.0273;919;1500;0;0;0;0;0;0;0 +2.8;7;8912;1.0273;729;1500;0;0;0;0;0;0;0 +2.9;7;8912;1.0273;578;1500;0;0;0;0;0;0;0 +3;7;8912;1.0273;458;1500;0;0;0;0;0;0;0 +3.1;7;8912;1.0273;319;1500;0;0;0;0;0;0;0 +3.2;7;8912;1.0273;222;1500;0;0;0;0;0;0;0 +3.3;7;8912;1.0273;155;1500;0;0;0;0;0;0;0 +3.4;7;8912;1.0273;108;1500;0;0;0;0;0;0;0 +3.5;7;8912;1.0273;75;1500;0;0;0;0;0;0;0 +3.6;7;8912;1.0273;48;1500;0;0;0;0;0;0;0 +3.7;7;8912;1.0273;30;1500;0;0;0;0;0;0;0 +3.8;7;8912;1.0273;19;1500;0;0;0;0;0;0;0 +3.9;7;8912;1.0273;12;1500;0;0;0;0;0;0;0 +4;7;8912;1.0273;8;1500;0;0;0;0;0;0;0 +4.1;7;8912;1.0273;4;1500;0;0;0;0;0;0;0 +4.2;7;8912;1.0273;2;1500;0;0;0;0;0;0;0 +4.3;7;8912;1.0273;1;1500;0;0;0;0;0;0;0 +4.4;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +4.5;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +4.6;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +4.7;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +4.8;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +4.9;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 +5;7;8912;1.0273;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv new file mode 100644 index 0000000000..470cce69ae --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs8_awgn_5G.csv @@ -0,0 +1,62 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +-0.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +0.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +1.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.1;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.2;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.4;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.5;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.6;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.7;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.8;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +2.9;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +3;8;9224;1.1758;1500;1500;0;0;0;0;0;0;0 +3.1;8;9224;1.1758;1464;1500;0;0;0;0;0;0;0 +3.2;8;9224;1.1758;1429;1500;0;0;0;0;0;0;0 +3.3;8;9224;1.1758;1394;1500;0;0;0;0;0;0;0 +3.4;8;9224;1.1758;1361;1500;0;0;0;0;0;0;0 +3.5;8;9224;1.1758;1328;1500;0;0;0;0;0;0;0 +3.6;8;9224;1.1758;973;1500;0;0;0;0;0;0;0 +3.7;8;9224;1.1758;713;1500;0;0;0;0;0;0;0 +3.8;8;9224;1.1758;522;1500;0;0;0;0;0;0;0 +3.9;8;9224;1.1758;382;1500;0;0;0;0;0;0;0 +4;8;9224;1.1758;280;1500;0;0;0;0;0;0;0 +4.1;8;9224;1.1758;190;1500;0;0;0;0;0;0;0 +4.2;8;9224;1.1758;129;1500;0;0;0;0;0;0;0 +4.3;8;9224;1.1758;87;1500;0;0;0;0;0;0;0 +4.4;8;9224;1.1758;59;1500;0;0;0;0;0;0;0 +4.5;8;9224;1.1758;40;1500;0;0;0;0;0;0;0 +4.6;8;9224;1.1758;20;1500;0;0;0;0;0;0;0 +4.7;8;9224;1.1758;10;1500;0;0;0;0;0;0;0 +4.8;8;9224;1.1758;5;1500;0;0;0;0;0;0;0 +4.9;8;9224;1.1758;2;1500;0;0;0;0;0;0;0 +5;8;9224;1.1758;1;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv new file mode 100644 index 0000000000..2ba438ea49 --- /dev/null +++ b/openair1/SIMULATION/NR_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/mcs9_awgn_5G.csv @@ -0,0 +1,64 @@ +SNR;MCS;TBS;rate;err0;trials0;err1;trials1;err2;trials2;err3;trials3;dci_err +-1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +-0.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +0.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +1.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.7;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.8;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +2.9;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.1;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.2;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.3;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.4;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.5;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.6;9;10504;1.3262;1500;1500;0;0;0;0;0;0;0 +3.7;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0 +3.8;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0 +3.9;9;10504;1.3262;1499;1500;0;0;0;0;0;0;0 +4;9;10504;1.3262;1498;1500;0;0;0;0;0;0;0 +4.1;9;10504;1.3262;1339;1500;0;0;0;0;0;0;0 +4.2;9;10504;1.3262;1196;1500;0;0;0;0;0;0;0 +4.3;9;10504;1.3262;1068;1500;0;0;0;0;0;0;0 +4.4;9;10504;1.3262;955;1500;0;0;0;0;0;0;0 +4.5;9;10504;1.3262;853;1500;0;0;0;0;0;0;0 +4.6;9;10504;1.3262;552;1500;0;0;0;0;0;0;0 +4.7;9;10504;1.3262;357;1500;0;0;0;0;0;0;0 +4.8;9;10504;1.3262;231;1500;0;0;0;0;0;0;0 +4.9;9;10504;1.3262;149;1500;0;0;0;0;0;0;0 +5;9;10504;1.3262;96;1500;0;0;0;0;0;0;0 +5.1;9;10504;1.3262;0;1500;0;0;0;0;0;0;0 +5.2;9;10504;1.3262;0;1500;0;0;0;0;0;0;0 diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 494c4e8e1d..8f6a453ee5 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -239,6 +239,8 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP, return 0; } +nr_bler_struct nr_bler_data[NR_NUM_MCS]; + void processSlotTX(void *arg) {} //nFAPI P7 dummy functions to avoid linking errors diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index bc4f4a0b60..f255ab5337 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -223,6 +223,8 @@ nrUE_params_t *get_nrUE_params(void) { return &nrUE_params; } +nr_bler_struct nr_bler_data[NR_NUM_MCS]; + void processSlotTX(void *arg) {} int main(int argc, char **argv){ diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index ddb3d52b9c..2646e5da58 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -221,6 +221,8 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP, return 0; } +nr_bler_struct nr_bler_data[NR_NUM_MCS]; + //nFAPI P7 dummy functions int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0); } diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h index c24291de64..67300da308 100644 --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -233,6 +233,7 @@ typedef uint8_t pdusessionid_t; //----------------------------------------------------------------------------- // may be ITTI not enabled, but type instance is useful also for OTG, typedef intptr_t instance_t; + typedef struct protocol_ctxt_s { module_id_t module_id; /*!< \brief Virtualized module identifier */ eNB_flag_t enb_flag; /*!< \brief Flag to indicate eNB (1) or UE (0) */ diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 6b41970735..ac70dee092 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -427,6 +427,7 @@ typedef struct NRRrcConfigurationReq_s { bool force_256qam_off; int pusch_TargetSNRx10; int pucch_TargetSNRx10; + bool enable_sdap; } gNB_RrcConfigurationReq; typedef struct NRDuDlReq_s { diff --git a/openair2/F1AP/dummy_enb.c b/openair2/F1AP/dummy_enb.c index d54f9b8df7..9085fdb57c 100644 --- a/openair2/F1AP/dummy_enb.c +++ b/openair2/F1AP/dummy_enb.c @@ -32,16 +32,18 @@ void apply_macrlc_config(gNB_RRC_INST *rrc, abort(); } -boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id - ) { +boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi, + const int pdusession_id) { abort(); } diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 503e04ecb9..434a2896de 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -1192,7 +1192,9 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { LOG_I(RRC, "256 QAM: %s\n", NRRRC_CONFIGURATION_REQ (msg_p).force_256qam_off ? "force off" : "may be on"); NRRRC_CONFIGURATION_REQ (msg_p).scc = scc; NRRRC_CONFIGURATION_REQ (msg_p).scd = scd; - + NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap = *GNBParamList.paramarray[i][GNB_ENABLE_SDAP_IDX].iptr; + LOG_I(GNB_APP, "SDAP layer is %s\n", NRRRC_CONFIGURATION_REQ (msg_p).enable_sdap ? "enabled" : "disabled"); + }// }//End for (k=0; k configuration, &NRRRC_CONFIGURATION_REQ(msg_p), sizeof(NRRRC_CONFIGURATION_REQ(msg_p))); diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index e1d3d93d0b..eb6b2bdccd 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -125,7 +125,8 @@ typedef enum { #define GNB_CONFIG_STRING_MINRXTXTIME "min_rxtxtime" #define GNB_CONFIG_STRING_ULPRBBLACKLIST "ul_prbblacklist" #define GNB_CONFIG_STRING_FORCE256QAMOFF "force_256qam_off" - +#define GNB_CONFIG_STRING_ENABLE_SDAP "enable_sdap" +#define GNB_CONFIG_HLP_STRING_ENABLE_SDAP "enable the SDAP layer\n" #define GNB_CONFIG_HLP_FORCE256QAMOFF "suppress activation of 256 QAM despite UE support" @@ -159,7 +160,8 @@ typedef enum { {GNB_CONFIG_STRING_NRCELLID, NULL, 0, u64ptr:NULL, defint64val:1, TYPE_UINT64, 0}, \ {GNB_CONFIG_STRING_MINRXTXTIME, NULL, 0, iptr:NULL, defintval:2, TYPE_INT, 0}, \ {GNB_CONFIG_STRING_ULPRBBLACKLIST, NULL, 0, strptr:NULL, defstrval:"", TYPE_STRING, 0}, \ -{GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0} \ +{GNB_CONFIG_STRING_FORCE256QAMOFF, GNB_CONFIG_HLP_FORCE256QAMOFF, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0}, \ +{GNB_CONFIG_STRING_ENABLE_SDAP, GNB_CONFIG_HLP_STRING_ENABLE_SDAP, PARAMFLAG_BOOL, iptr:NULL, defintval:0, TYPE_INT, 0}, \ } #define GNB_GNB_ID_IDX 0 @@ -188,6 +190,7 @@ typedef enum { #define GNB_MINRXTXTIME_IDX 23 #define GNB_ULPRBBLACKLIST_IDX 24 #define GNB_FORCE256QAMOFF_IDX 25 +#define GNB_ENABLE_SDAP_IDX 26 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD} #define GNBPARAMS_CHECK { \ diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h index ba3128923f..9dd03ddcf6 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h @@ -39,6 +39,7 @@ #include #include "NR_SubcarrierSpacing.h" +#include "openair1/SCHED_NR_UE/harq_nr.h" #define NR_SHORT_BSR_TABLE_SIZE 32 #define NR_LONG_BSR_TABLE_SIZE 256 @@ -264,14 +265,29 @@ typedef struct { uint8_t nbits; } dci_field_t; +typedef struct { + /* The active harq sfn/slot field was created to save the + scheduled SFN/Slot transmission for the ACK/NAK. If we + do not save it, then we have to calculate it again as the + NRUE MAC layer already does in get_downlink_ack(). */ + int active_dl_harq_sfn; + int active_dl_harq_slot; + int active_ul_harq_sfn_slot; + bool active; +} emul_l1_harq_t; + typedef struct { bool expected_sib; - bool index_has_sib[16]; + bool index_has_sib[NR_MAX_HARQ_PROCESSES]; bool expected_rar; - bool index_has_rar[16]; + bool index_has_rar[NR_MAX_HARQ_PROCESSES]; bool expected_dci; - bool index_has_dci[16]; - int active_harq_sfn_slot; + bool index_has_dci[NR_MAX_HARQ_PROCESSES]; + emul_l1_harq_t harq[NR_MAX_HARQ_PROCESSES]; + int active_uci_sfn_slot; + int num_srs; + int num_harqs; + int num_csi_reports; } nr_emulated_l1_t; typedef struct { diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index ad86b1385d..fc2c2d2c8b 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -432,7 +432,7 @@ typedef struct { // Defined for abstracted mode nr_downlink_indication_t dl_info; - NR_UE_HARQ_STATUS_t dl_harq_info[16]; + NR_UE_HARQ_STATUS_t dl_harq_info[NR_MAX_HARQ_PROCESSES]; nr_emulated_l1_t nr_ue_emul_l1; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index c57736990c..fd94ea577e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -1368,10 +1368,18 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, // FIXME k0 != 0 currently not taken into consideration current_harq->dl_frame = frame; current_harq->dl_slot = slot; - mac->nr_ue_emul_l1.active_harq_sfn_slot = NFAPI_SFNSLOT2HEX(frame, (slot + data_toul_fb)); + if (get_softmodem_params()->emulate_l1) { + int scs = get_softmodem_params()->numerology; + int slots_per_frame = nr_slots_per_frame[scs]; + slot += data_toul_fb; + if (slot >= slots_per_frame) { + frame = (frame + 1) % 1024; + slot %= slots_per_frame; + } + } LOG_D(NR_PHY,"Setting harq_status for harq_id %d, dl %d.%d, sched ul %d.%d\n", - harq_id, frame, slot, frame, (slot + data_toul_fb)); + harq_id, current_harq->dl_frame, current_harq->dl_slot, frame, slot); } @@ -1853,7 +1861,8 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) { mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) { - if (uci_size <= 2) { + // PUCCH with format0 can be up to 3 bits (2 ack/nacks + 1 sr is 3 max bits) + if (uci_size <= 3) { pucch_resource_set_id = 0; return (pucch_resource_set_id); break; @@ -2054,11 +2063,17 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, sched_frame = current_harq->dl_frame; if (sched_slot>=slots_per_frame){ sched_slot %= slots_per_frame; - sched_frame++; + sched_frame = (sched_frame + 1) % 1024; } + AssertFatal(sched_slot < slots_per_frame, "sched_slot was calculated incorrect %d\n", sched_slot); LOG_D(PHY,"HARQ pid %d is active for %d.%d (dl_slot %d, feedback_to_ul %d, is_common %d\n",dl_harq_pid, sched_frame,sched_slot,current_harq->dl_slot,current_harq->feedback_to_ul,current_harq->is_common); /* check if current tx slot should transmit downlink acknowlegment */ if (sched_frame == frame && sched_slot == slot) { + if (get_softmodem_params()->emulate_l1) { + mac->nr_ue_emul_l1.harq[dl_harq_pid].active = true; + mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_sfn = frame; + mac->nr_ue_emul_l1.harq[dl_harq_pid].active_dl_harq_slot = slot; + } if (current_harq->dai > NR_DL_MAX_DAI) { LOG_E(MAC,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index bc9895ac2e..7f4f57c359 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1079,6 +1079,10 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) mac->if_module->scheduled_response(&scheduled_response); } + else + { + dl_config->number_pdus = 0; + } } } else if (ul_info) { @@ -2251,26 +2255,27 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in int O_CSI = 0; int N_UCI = 0; - PUCCH_sched_t *pucch = calloc(1,sizeof(*pucch)); - pucch->resource_indicator = -1; - pucch->initial_pucch_id = -1; + PUCCH_sched_t pucch = { + .resource_indicator = -1, + .initial_pucch_id = -1 + }; uint16_t rnti = mac->crnti; //FIXME not sure this is valid for all pucch instances // SR - if(trigger_periodic_scheduling_request(mac, pucch, frameP, slotP)) { + if (trigger_periodic_scheduling_request(mac, &pucch, frameP, slotP)) { O_SR = 1; /* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */ - pucch->sr_payload = nr_ue_get_SR(module_idP, + pucch.sr_payload = nr_ue_get_SR(module_idP, frameP, slotP); } // CSI if (mac->ra.ra_state == RA_SUCCEEDED || get_softmodem_params()->phy_test == 1) - O_CSI = nr_get_csi_measurements(mac, frameP, slotP, pucch); + O_CSI = nr_get_csi_measurements(mac, frameP, slotP, &pucch); // ACKNACK - O_ACK = get_downlink_ack(mac, frameP, slotP, pucch); + O_ACK = get_downlink_ack(mac, frameP, slotP, &pucch); NR_BWP_Id_t bwp_id = mac->UL_BWP_Id; NR_PUCCH_Config_t *pucch_Config = NULL; @@ -2300,35 +2305,39 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, in pucch_Config->format2 && (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)) { O_CSI = 0; - pucch->csi_part1_payload = 0; - pucch->csi_part2_payload = 0; + pucch.csi_part1_payload = 0; + pucch.csi_part2_payload = 0; } N_UCI = O_SR + O_ACK + O_CSI; + mac->nr_ue_emul_l1.num_srs = O_SR; + mac->nr_ue_emul_l1.num_harqs = O_ACK; + mac->nr_ue_emul_l1.num_csi_reports = O_CSI; // do no transmit pucch if only SR scheduled and it is negative - if ((O_ACK + O_CSI) == 0 && pucch->sr_payload == 0) + if ((O_ACK + O_CSI) == 0 && pucch.sr_payload == 0) return; if (N_UCI > 0) { LOG_D(NR_MAC,"%d.%d configure pucch, O_SR %d, O_ACK %d, O_CSI %d\n",frameP,slotP,O_SR,O_ACK,O_CSI); - pucch->resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI); - select_pucch_resource(mac, pucch); + pucch.resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI); + select_pucch_resource(mac, &pucch); fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); pthread_mutex_lock(&ul_config->mutex_ul_config); AssertFatal(ul_config->number_pdusnumber_pdus %d out of bounds\n",ul_config->number_pdus); fapi_nr_ul_config_pucch_pdu *pucch_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pucch_config_pdu; fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH); + mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP); pthread_mutex_unlock(&ul_config->mutex_ul_config); nr_ue_configure_pucch(mac, slotP, rnti, - pucch, + &pucch, pucch_pdu, O_SR, O_ACK, O_CSI); - LOG_D(NR_MAC,"Configuring pucch, is_common = %d\n",pucch->is_common); + LOG_D(NR_MAC, "Configuring pucch, is_common = %d\n", pucch.is_common); nr_scheduled_response_t scheduled_response; fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id); if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index f8baf7d632..ca197b224d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -300,6 +300,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP (RA_sfn_index + slot_index) * N_t_slot * fdm + td_index * fdm + fdm_index; if((prach_occasion_id < cc->total_prach_occasions) && (td_index == 0)){ + AssertFatal(UL_tti_req->n_pdus < sizeof(UL_tti_req->pdus_list) / sizeof(UL_tti_req->pdus_list[0]), + "Invalid UL_tti_req->n_pdus %d\n", UL_tti_req->n_pdus); UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE; UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_prach_pdu_t); @@ -803,6 +805,9 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t future_ul_tti_req->Slot, sched_frame, sched_slot); + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t); nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c index a2b27357dd..bf2af3b388 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c @@ -85,7 +85,9 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int module_id, int CC_id, int void nr_fill_nfapi_srs(int module_id, int CC_id, int UE_id, sub_frame_t slot, NR_SRS_Resource_t *srs_resource) { nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot]; - + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_srs_pdu_t); nfapi_nr_srs_pdu_t *srs_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].srs_pdu; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index 9f2b35e9ac..e21d1e50f7 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -56,6 +56,9 @@ void nr_fill_nfapi_pucch(module_id_t mod_id, future_ul_tti_req->Slot, pucch->frame, pucch->ul_slot); + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t); nfapi_nr_pucch_pdu_t *pucch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pucch_pdu; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index a60bd9abb5..9273c38de3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -279,9 +279,18 @@ int nr_process_mac_pdu(module_id_t module_idP, case UL_SCH_LCID_L_TRUNCATED_BSR: //38.321 section 6.1.3.1 //variable length + /* Several checks have been added to this function to + ensure that the casting of the pduP is possible. There seems + to be a partial PDU at the end of this buffer, so here + we gracefully ignore that by returning 0. See: + https://gitlab.eurecom.fr/oai/openairinterface5g/-/issues/534 */ + if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT)) + return 0; mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L; mac_subheader_len = 2; if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ + if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG)) + return 0; mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; mac_subheader_len = 3; } @@ -358,9 +367,13 @@ int nr_process_mac_pdu(module_id_t module_idP, case UL_SCH_LCID_MULTI_ENTRY_PHR_1_OCT: //38.321 section 6.1.3.9 // varialbe length + if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT)) + return 0; mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L; mac_subheader_len = 2; if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ + if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG)) + return 0; mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; mac_subheader_len = 3; } @@ -370,9 +383,13 @@ int nr_process_mac_pdu(module_id_t module_idP, case UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT: //38.321 section 6.1.3.9 // varialbe length + if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT)) + return 0; mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L; mac_subheader_len = 2; if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ + if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG)) + return 0; mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; mac_subheader_len = 3; } @@ -386,8 +403,12 @@ int nr_process_mac_pdu(module_id_t module_idP, case UL_SCH_LCID_SRB1: case UL_SCH_LCID_SRB2: + if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT)) + return 0; if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){ //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; + if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG)) + return 0; mac_subheader_len = 3; mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8) | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff); @@ -471,8 +492,12 @@ int nr_process_mac_pdu(module_id_t module_idP, case UL_SCH_LCID_DTCH: // check if LCID is valid at current time. + if (pdu_len < sizeof(NR_MAC_SUBHEADER_SHORT)) + return 0; if (((NR_MAC_SUBHEADER_SHORT *)pduP)->F) { // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8; + if (pdu_len < sizeof(NR_MAC_SUBHEADER_LONG)) + return 0; mac_subheader_len = 3; mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L1 & 0x7f) << 8) | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pduP)->L2 & 0xff); @@ -1777,6 +1802,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) future_ul_tti_req->Slot, sched_pusch->frame, sched_pusch->slot); + AssertFatal(future_ul_tti_req->n_pdus < + sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]), + "Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus); future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE; future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t); nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu; diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c index 62aa101a50..c20871f6c0 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.c @@ -51,7 +51,12 @@ static void nr_pdcp_entity_recv_pdu(nr_pdcp_entity_t *entity, if (entity->type != NR_PDCP_SRB && !(buffer[0] & 0x80)) { LOG_E(PDCP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__); - exit(1); + /* TODO: This is something of a hack. The most significant bit + in buffer[0] should be 1 if the packet is a data packet. We are + processing malformed data packets if the most significant bit + is 0. Rather than exit(1), this hack allows us to continue for now. + We need to investigate why this hack is neccessary. */ + buffer[0] |= 128; } if (entity->sn_size == 12) { @@ -368,8 +373,8 @@ nr_pdcp_entity_t *new_nr_pdcp_entity( ret->set_security = nr_pdcp_entity_set_security; ret->set_time = nr_pdcp_entity_set_time; - ret->delete = nr_pdcp_entity_delete; - + ret->delete_entity = nr_pdcp_entity_delete; + ret->deliver_sdu = deliver_sdu; ret->deliver_sdu_data = deliver_sdu_data; diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h index fbcc2b96cd..49e9c4142b 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h @@ -39,7 +39,7 @@ typedef struct nr_pdcp_entity_t { void (*recv_pdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size); void (*recv_sdu)(struct nr_pdcp_entity_t *entity, char *buffer, int size, int sdu_id); - void (*delete)(struct nr_pdcp_entity_t *entity); + void (*delete_entity)(struct nr_pdcp_entity_t *entity); /* set_security: pass -1 to integrity_algorithm / ciphering_algorithm * to keep the current algorithm diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index 7d1e2f4931..74ca77a9c5 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -36,7 +36,7 @@ #include "pdcp.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include -#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h" +#include "openair2/SDAP/nr_sdap/nr_sdap.h" #define TODO do { \ printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \ @@ -438,9 +438,13 @@ static void *enb_tun_read_thread(void *_) ctxt.rnti = rnti; - pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, + uint8_t qfi = 7; + boolean_t rqi = 0; + int pdusession_id = 10; + + sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, - PDCP_TRANSMISSION_MODE_DATA, NULL, NULL); + PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, rqi, pdusession_id); } return NULL; @@ -481,9 +485,13 @@ static void *ue_tun_read_thread(void *_) ctxt.rnti = rnti; - pdcp_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, + boolean_t dc = SDAP_HDR_UL_DATA_PDU; + uint8_t qfi = 7; + int pdusession_id = 10; + + sdap_data_req(&ctxt, SRB_FLAG_NO, rb_id, RLC_MUI_UNDEFINED, RLC_SDU_CONFIRM_NO, len, (unsigned char *)rx_buf, - PDCP_TRANSMISSION_MODE_DATA, NULL, NULL); + PDCP_TRANSMISSION_MODE_DATA, NULL, NULL, qfi, dc, pdusession_id); } return NULL; @@ -607,28 +615,20 @@ uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id) static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity, char *buf, int size) { - extern int nas_sock_fd[]; - int len; nr_pdcp_ue_t *ue = _ue; - MessageDef *message_p; - uint8_t *gtpu_buffer_p; int rb_id; int i; if (IS_SOFTMODEM_NOS1 || UE_NAS_USE_TUN) { - LOG_D(PDCP, "IP packet received, to be sent to TUN interface"); - - if(entity->has_sdapDLheader){ - size -= SDAP_HDR_LENGTH; - len = write(nas_sock_fd[0], &buf[SDAP_HDR_LENGTH], size); - } else { - len = write(nas_sock_fd[0], buf, size); - } - - if (len != size) { - LOG_E(PDCP, "%s:%d:%s: fatal error %d: %s\n", __FILE__, __LINE__, __FUNCTION__, errno, strerror(errno)); - } - + LOG_D(PDCP, "IP packet received with size %d, to be sent to SDAP interface, UE rnti: %d\n", size, ue->rnti); + sdap_data_ind(entity->rb_id, + entity->is_gnb, + entity->has_sdap, + entity->has_sdapULheader, + entity->pdusession_id, + ue->rnti, + buf, + size); } else{ for (i = 0; i < 5; i++) { @@ -644,31 +644,16 @@ static void deliver_sdu_drb(void *_ue, nr_pdcp_entity_t *entity, rb_found: { - int offset=0; - if (entity->has_sdap == 1 && entity->has_sdapULheader == 1) - offset = 1; // this is the offset of the SDAP header in bytes - - message_p = itti_alloc_new_message_sized(TASK_PDCP_ENB, 0, - GTPV1U_GNB_TUNNEL_DATA_REQ, - sizeof(gtpv1u_gnb_tunnel_data_req_t) + size - + GTPU_HEADER_OVERHEAD_MAX - offset); - AssertFatal(message_p != NULL, "OUT OF MEMORY"); - - gtpv1u_gnb_tunnel_data_req_t *req=>PV1U_GNB_TUNNEL_DATA_REQ(message_p); - gtpu_buffer_p = (uint8_t*)(req+1); - memcpy(gtpu_buffer_p+GTPU_HEADER_OVERHEAD_MAX, buf+offset, size-offset); - req->buffer = gtpu_buffer_p; - req->length = size-offset; - req->offset = GTPU_HEADER_OVERHEAD_MAX; - req->rnti = ue->rnti; - req->pdusession_id = entity->pdusession_id; - if (offset==1) { - LOG_I(PDCP, "%s() (drb %d) SDAP header %2x\n",__func__, rb_id, buf[0]); - sdap_gnb_ul_header_handler(buf[0]); // Handler for the UL gNB SDAP Header - } - LOG_D(PDCP, "%s() (drb %d) sending message to gtp size %d\n", __func__, rb_id, size-offset); - itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); - } + LOG_D(PDCP, "%s() (drb %d) sending message to SDAP size %d\n", __func__, rb_id, size); + sdap_data_ind(rb_id, + ue->drb[rb_id-1]->is_gnb, + ue->drb[rb_id-1]->has_sdap, + ue->drb[rb_id-1]->has_sdapULheader, + ue->drb[rb_id-1]->pdusession_id, + ue->rnti, + buf, + size); + } } } @@ -967,6 +952,9 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, int has_sdap = 0; int has_sdapULheader=0; int has_sdapDLheader=0; + boolean_t is_sdap_DefaultDRB = false; + NR_QFI_t *mappedQFIs2Add = NULL; + uint8_t mappedQFIs2AddCount=0; if (s->cnAssociation->present == NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity) pdusession_id = s->cnAssociation->choice.eps_BearerIdentity; else { @@ -975,9 +963,13 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, exit(-1); } pdusession_id = s->cnAssociation->choice.sdap_Config->pdu_Session; - has_sdap = 1; has_sdapULheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderUL == NR_SDAP_Config__sdap_HeaderUL_present ? 1 : 0; has_sdapDLheader = s->cnAssociation->choice.sdap_Config->sdap_HeaderDL == NR_SDAP_Config__sdap_HeaderDL_present ? 1 : 0; + has_sdap = has_sdapULheader | has_sdapDLheader; + is_sdap_DefaultDRB = s->cnAssociation->choice.sdap_Config->defaultDRB == true ? 1 : 0; + mappedQFIs2Add = (NR_QFI_t*)s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.array[0]; + mappedQFIs2AddCount = s->cnAssociation->choice.sdap_Config->mappedQoS_FlowsToAdd->list.count; + LOG_D(SDAP, "Captured mappedQoS_FlowsToAdd from RRC: %ld \n", *mappedQFIs2Add); } /* TODO(?): accept different UL and DL SN sizes? */ if (sn_size_ul != sn_size_dl) { @@ -1009,6 +1001,15 @@ static void add_drb_am(int is_gnb, int rnti, struct NR_DRB_ToAddMod *s, nr_pdcp_ue_add_drb_pdcp_entity(ue, drb_id, pdcp_drb); LOG_D(PDCP, "%s:%d:%s: added drb %d to ue rnti %x\n", __FILE__, __LINE__, __FUNCTION__, drb_id, rnti); + + new_nr_sdap_entity(has_sdap, + rnti, + pdusession_id, + is_sdap_DefaultDRB, + drb_id, + mappedQFIs2Add, + mappedQFIs2AddCount); + LOG_D(SDAP, "Added SDAP entity to ue rnti %x with pdusession_id %d\n", rnti, pdusession_id); } nr_pdcp_manager_unlock(nr_pdcp_ue_manager); } @@ -1140,7 +1141,7 @@ void nr_DRB_preconfiguration(uint16_t crnti) NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod)); drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation)); drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity; - drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 5; + drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 10; drb_ToAddMod->drb_Identity = 1; drb_ToAddMod->reestablishPDCP = NULL; drb_ToAddMod->recoverPDCP = NULL; @@ -1450,3 +1451,10 @@ void nr_pdcp_tick(int frame, int subframe) nr_pdcp_wakeup_timer_thread(nr_pdcp_current_time); } } + +/* + * For the SDAP API + */ +nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager(){ + return nr_pdcp_ue_manager; +} diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c index 160c5ebb22..1f21593c63 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.c @@ -127,11 +127,11 @@ void nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager_t *_m, int rnti) for (j = 0; j < 2; j++) if (ue->srb[j] != NULL) - ue->srb[j]->delete(ue->srb[j]); + ue->srb[j]->delete_entity(ue->srb[j]); for (j = 0; j < 5; j++) if (ue->drb[j] != NULL) - ue->drb[j]->delete(ue->drb[j]); + ue->drb[j]->delete_entity(ue->drb[j]); free(ue); diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index f7323010cb..26c60fbb9b 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -42,6 +42,7 @@ #include "SCHED_NR_UE/fapi_nr_ue_l1.h" #include "executables/softmodem-common.h" #include "openair2/RRC/NR_UE/rrc_proto.h" +#include "openair2/RRC/NR_UE/rrc_vars.h" #include "openair2/GNB_APP/L1_nr_paramdef.h" #include "openair2/GNB_APP/gnb_paramdef.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" @@ -64,7 +65,17 @@ queue_t nr_dl_tti_req_queue; queue_t nr_tx_req_queue; queue_t nr_ul_dci_req_queue; queue_t nr_ul_tti_req_queue; -queue_t nr_wait_ul_tti_req_queue; + +static slot_rnti_mcs_s slot_rnti_mcs[NUM_NFAPI_SLOT]; + +//static int get_mcs_from_sinr(float sinr); +//static int get_cqi_from_mcs(void); +static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int sf, int index); +//static bool did_drop_transport_block(int slot, uint16_t rnti); +static float get_bler_val(uint8_t mcs, int sinr); +static bool should_drop_transport_block(int slot, uint16_t rnti); +static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request); +static inline bool is_channel_modeling(void); void nrue_init_standalone_socket(int tx_port, int rx_port) { @@ -98,7 +109,7 @@ void nrue_init_standalone_socket(int tx_port, int rx_port) } assert(ue_tx_sock_descriptor == -1); ue_tx_sock_descriptor = sd; - LOG_D(NR_RRC, "Successfully set up tx_socket in %s.\n", __FUNCTION__); + LOG_T(NR_RRC, "Successfully set up tx_socket in %s.\n", __FUNCTION__); } { @@ -124,9 +135,9 @@ void nrue_init_standalone_socket(int tx_port, int rx_port) } assert(ue_rx_sock_descriptor == -1); ue_rx_sock_descriptor = sd; - LOG_D(NR_RRC, "Successfully set up rx_socket in %s.\n", __FUNCTION__); + LOG_T(NR_RRC, "Successfully set up rx_socket in %s.\n", __FUNCTION__); } - LOG_I(NR_RRC, "NRUE standalone socket info: tx_port %d rx_port %d on %s.\n", + LOG_D(NR_RRC, "NRUE standalone socket info: tx_port %d rx_port %d on %s.\n", tx_port, rx_port, stub_eth_params.remote_addr); } @@ -137,7 +148,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: { char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_D(NR_MAC, "RACH header id :%d", UL_INFO->rach_ind.header.message_id); + LOG_T(NR_MAC, "RACH header id :%d\n", UL_INFO->rach_ind.header.message_id); int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rach_ind, buffer, sizeof(buffer), NULL); if (encoded_size <= 0) { @@ -145,7 +156,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) return; } - LOG_I(NR_MAC, "NR_RACH_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, + LOG_D(NR_MAC, "NR_RACH_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, UL_INFO->rach_ind.sfn, UL_INFO->rach_ind.slot, UL_INFO->rach_ind.number_of_pdus); if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) { @@ -157,7 +168,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: { char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_D(NR_MAC, "RX header id :%d", UL_INFO->rx_ind.header.message_id); + LOG_T(NR_MAC, "RX header id :%d\n", UL_INFO->rx_ind.header.message_id); int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->rx_ind, buffer, sizeof(buffer), NULL); if (encoded_size <= 0) { @@ -165,7 +176,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) return; } - LOG_I(NR_MAC, "NR_RX_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, + LOG_D(NR_MAC, "NR_RX_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, UL_INFO->rx_ind.sfn, UL_INFO->rx_ind.slot, UL_INFO->rx_ind.number_of_pdus); if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) { @@ -177,7 +188,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: { char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_D(NR_MAC, "CRC header id :%d", UL_INFO->crc_ind.header.message_id); + LOG_T(NR_MAC, "CRC header id :%d\n", UL_INFO->crc_ind.header.message_id); int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->crc_ind, buffer, sizeof(buffer), NULL); if (encoded_size <= 0) { @@ -185,7 +196,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) return; } - LOG_I(NR_MAC, "NR_CRC_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, + LOG_D(NR_MAC, "NR_CRC_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, UL_INFO->crc_ind.sfn, UL_INFO->crc_ind.slot, UL_INFO->crc_ind.number_crcs); if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) { @@ -197,7 +208,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: { char buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; - LOG_I(NR_MAC, "UCI header id :%d", UL_INFO->uci_ind.header.message_id); + LOG_D(NR_MAC, "UCI header id :%d\n", UL_INFO->uci_ind.header.message_id); int encoded_size = nfapi_nr_p7_message_pack(&UL_INFO->uci_ind, buffer, sizeof(buffer), NULL); if (encoded_size <= 0) { @@ -205,7 +216,7 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) return; } - LOG_I(NR_MAC, "NR_UCI_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, + LOG_D(NR_MAC, "NR_UCI_IND sent to Proxy, Size: %d Frame %d Slot %d Num PDUS %d\n", encoded_size, UL_INFO->uci_ind.sfn, UL_INFO->uci_ind.slot, UL_INFO->uci_ind.num_ucis); if (send(ue_tx_sock_descriptor, buffer, encoded_size, 0) < 0) { @@ -221,18 +232,83 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id) } } +bool sfn_slot_matcher(void *wanted, void *candidate) +{ + nfapi_p7_message_header_t *msg = candidate; + int sfn_sf = *(int*)wanted; + + switch (msg->message_id) + { + case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: + { + nfapi_nr_rach_indication_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: + { + nfapi_nr_rx_data_indication_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: + { + nfapi_nr_crc_indication_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: + { + nfapi_nr_uci_indication_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: + { + nfapi_nr_dl_tti_request_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: + { + nfapi_nr_tx_data_request_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: + { + nfapi_nr_ul_dci_request_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + } + + case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: + { + nfapi_nr_ul_tti_request_t *ind = candidate; + return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot; + } + + default: + LOG_E(NR_MAC, "sfn_slot_match bad ID: %d\n", msg->message_id); + + } + + return false; +} + static void fill_dl_info_with_pdcch(fapi_nr_dci_indication_t *dci, nfapi_nr_dl_dci_pdu_t *rx_dci, int idx) { int num_bytes = (rx_dci->PayloadSizeBits + 7) / 8; - LOG_I(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d, num_bytes %d\n", + LOG_D(NR_PHY, "[%d, %d] PDCCH DCI (Payload) for rnti %x with PayloadSizeBits %d, num_bytes %d\n", dci->SFN, dci->slot, rx_dci->RNTI, rx_dci->PayloadSizeBits, num_bytes); for (int k = 0; k < num_bytes; k++) { - LOG_I(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, rx_dci->Payload[k]); + LOG_D(NR_MAC, "PDCCH DCI PDU payload[%d] = %d\n", k, rx_dci->Payload[k]); dci->dci_list[idx].payloadBits[k] = rx_dci->Payload[k]; } dci->dci_list[idx].payloadSize = rx_dci->PayloadSizeBits; dci->dci_list[idx].rnti = rx_dci->RNTI; + dci->dci_list[idx].n_CCE = rx_dci->CceIndex; + dci->dci_list[idx].N_CCE = rx_dci->AggregationLevel; dci->number_of_dcis = idx + 1; } @@ -242,7 +318,7 @@ static void fill_mib_in_rx_ind(nfapi_nr_dl_tti_request_pdu_t *pdu_list, fapi_nr_ "pdu_index (%d) is greater than rx_indication_body size!\n", pdu_idx); AssertFatal(pdu_idx == rx_ind->number_pdus, "Invalid pdu_idx %d!\n", pdu_idx); - LOG_D(NR_MAC, "Recevied an SSB and are filling rx_ind with the MIB!\n"); + LOG_T(NR_MAC, "Recevied an SSB and are filling rx_ind with the MIB!\n"); nfapi_nr_dl_tti_ssb_pdu_rel15_t *ssb_pdu = &pdu_list->ssb_pdu.ssb_pdu_rel15; rx_ind->rx_indication_body[pdu_idx].ssb_pdu.cell_id = ssb_pdu->PhysCellId; @@ -311,13 +387,13 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) { - LOG_I(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x\n", + LOG_D(NR_PHY, "[%d, %d] PDSCH PDU for rnti %x\n", dl_tti_request->SFN, dl_tti_request->Slot, pdu_list->pdsch_pdu.pdsch_pdu_rel15.rnti); } if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) { - LOG_I(NR_PHY, "[%d, %d] PDCCH DCI PDU (Format for incoming PDSCH PDU)\n", + LOG_D(NR_PHY, "[%d, %d] PDCCH DCI PDU (Format for incoming PDSCH PDU)\n", dl_tti_request->SFN, dl_tti_request->Slot); uint16_t num_dcis = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci; if (num_dcis > 0) @@ -342,19 +418,19 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ { mac->nr_ue_emul_l1.expected_sib = true; mac->nr_ue_emul_l1.index_has_sib[j] = true; - LOG_D(NR_MAC, "Setting index_has_sib[%d] = true\n", j); + LOG_T(NR_MAC, "Setting index_has_sib[%d] = true\n", j); } else if (dci_pdu_list->RNTI == mac->ra.ra_rnti) { mac->nr_ue_emul_l1.expected_rar = true; mac->nr_ue_emul_l1.index_has_rar[j] = true; - LOG_D(NR_MAC, "Setting index_has_rar[%d] = true\n", j); + LOG_T(NR_MAC, "Setting index_has_rar[%d] = true\n", j); } else { mac->nr_ue_emul_l1.expected_dci = true; mac->nr_ue_emul_l1.index_has_dci[j] = true; - LOG_D(NR_MAC, "Setting index_has_dci[%d] = true\n", j); + LOG_T(NR_MAC, "Setting index_has_dci[%d] = true\n", j); } pdu_idx++; } @@ -388,13 +464,14 @@ static void copy_dl_tti_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_ static void fill_rx_ind(nfapi_nr_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_ind, int pdu_idx, int pdu_type) { + NR_UE_MAC_INST_t *mac = get_mac_inst(0); AssertFatal(pdu_list->num_TLV < sizeof(pdu_list->TLVs) / sizeof(pdu_list->TLVs[0]), "Num TLVs exceeds TLV array size"); int length = 0; for (int j = 0; j < pdu_list->num_TLV; j++) { length += pdu_list->TLVs[j].length; } - LOG_I(NR_PHY, "%s: num_tlv %d and length %d, pdu index %d\n", + LOG_D(NR_PHY, "%s: num_tlv %d and length %d, pdu index %d\n", __FUNCTION__, pdu_list->num_TLV, length, pdu_idx); uint8_t *pdu = malloc(length); AssertFatal(pdu != NULL, "%s: Out of memory in malloc", __FUNCTION__); @@ -409,7 +486,12 @@ static void fill_rx_ind(nfapi_nr_pdu_t *pdu_list, fapi_nr_rx_indication_t *rx_in memcpy(pdu, ptr, pdu_list->TLVs[j].length); pdu += pdu_list->TLVs[j].length; } - rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.ack_nack = 1; + bool ack_nack = true; + if (mac->ra.ra_state >= RA_SUCCEEDED && should_drop_transport_block(rx_ind->slot, mac->crnti)) + { + ack_nack = false; + } + rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.ack_nack = ack_nack; rx_ind->rx_indication_body[pdu_idx].pdsch_pdu.pdu_length = length; rx_ind->rx_indication_body[pdu_idx].pdu_type = pdu_type; @@ -455,7 +537,7 @@ static void copy_tx_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi } else { - LOG_D(NR_MAC, "mac->nr_ue_emul_l1.index_has_dci[%d] = 0, so this index contained a DCI for a different UE\n", i); + LOG_T(NR_MAC, "mac->nr_ue_emul_l1.index_has_dci[%d] = 0, so this index contained a DCI for a different UE\n", i); } } @@ -476,7 +558,7 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n { nfapi_nr_ul_dci_request_pdus_t *pdu_list = &ul_dci_req->ul_dci_pdu_list[i]; AssertFatal(pdu_list->PDUType == 0, "ul_dci_req pdu type != PUCCH"); - LOG_I(NR_PHY, "[%d %d] PUCCH PDU in ul_dci for rnti %x and numDLDCI = %d\n", + LOG_D(NR_PHY, "[%d %d] PUCCH PDU in ul_dci for rnti %x and numDLDCI = %d\n", ul_dci_req->SFN, ul_dci_req->Slot, pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu->RNTI, pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci); uint16_t num_dci = pdu_list->pdcch_pdu.pdcch_pdu_rel15.numDlDci; @@ -495,7 +577,7 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n nfapi_nr_dl_dci_pdu_t *dci_pdu_list = &pdu_list->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[j]; if (dci_pdu_list->RNTI != mac->crnti) { - LOG_D(NR_MAC, "dci_pdu_list->RNTI (%x) != mac->crnti (%x)\n", dci_pdu_list->RNTI, mac->crnti); + LOG_T(NR_MAC, "dci_pdu_list->RNTI (%x) != mac->crnti (%x)\n", dci_pdu_list->RNTI, mac->crnti); continue; } fill_dl_info_with_pdcch(dl_info->dci_ind, dci_pdu_list, pdu_idx); @@ -507,148 +589,59 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n dl_info->slot = ul_dci_req->Slot; } -static nfapi_nr_uci_indication_t *multiplex_uci_ind(NR_UE_MAC_INST_t *mac, int num_active_harqs) +static bool send_crc_ind_and_rx_ind(int sfn_slot) { - AssertFatal(num_active_harqs >= 0, "Invalid value for num_active_harqs %d\n", num_active_harqs); - if (num_active_harqs == 0) - { - return NULL; - } - if (num_active_harqs != nr_uci_ind_queue.num_items) - { - LOG_I(NR_MAC, "The number of active harqs %d doesn't match the number of UCIs in the queue %lu\n", - num_active_harqs, nr_uci_ind_queue.num_items); - return NULL; - } + bool sent_crc_rx = true; - nfapi_nr_uci_indication_t *uci_ind = MALLOC(sizeof(*uci_ind)); - uci_ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION; - uci_ind->sfn = NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.active_harq_sfn_slot); - uci_ind->slot = NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.active_harq_sfn_slot); - uci_ind->num_ucis = num_active_harqs; - uci_ind->uci_list = CALLOC(uci_ind->num_ucis, sizeof(*uci_ind->uci_list)); - for (int i = 0; i < num_active_harqs; i++) - { - nfapi_nr_uci_indication_t *queued_uci_ind = get_queue(&nr_uci_ind_queue); - AssertFatal(queued_uci_ind, "There was not a UCI in the queue!\n"); - nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[i].pucch_pdu_format_0_1; + nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); + nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot); - /* In openair1/SCHED_NR_UE/fapi_nr_ue_l1.c nr_ue_schedule_response_stub(), the - number of UCIs is hard coded to 1. This is why we always use index 0 of the - queued UCI indication to fill the new multiplexed UCI indication */ - AssertFatal(queued_uci_ind->num_ucis == 1, "The number of UCIs from de-queueud UCI is not 1, its %d\n", - queued_uci_ind->num_ucis); - uci_ind->uci_list[i].pdu_type = queued_uci_ind->uci_list[0].pdu_type; - uci_ind->uci_list[i].pdu_size = queued_uci_ind->uci_list[0].pdu_size; - - nfapi_nr_uci_pucch_pdu_format_0_1_t *queued_pdu_0_1 = &queued_uci_ind->uci_list[0].pucch_pdu_format_0_1; - pdu_0_1->handle = queued_pdu_0_1->handle; - pdu_0_1->rnti = queued_pdu_0_1->rnti; - pdu_0_1->pucch_format = queued_pdu_0_1->pucch_format; - pdu_0_1->ul_cqi = queued_pdu_0_1->ul_cqi; - pdu_0_1->timing_advance = queued_pdu_0_1->timing_advance; - pdu_0_1->rssi = queued_pdu_0_1->rssi; - free(queued_uci_ind->uci_list); - queued_uci_ind->uci_list = NULL; - free(queued_uci_ind); - queued_uci_ind = NULL; + if (crc_ind && crc_ind->number_crcs > 0) + { + NR_UE_MAC_INST_t *mac = get_mac_inst(0); + for (int i = 0; i < crc_ind->number_crcs; i++) { + int harq_pid = crc_ind->crc_list[i].harq_id; + LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn_slot\n", harq_pid); + mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn_slot = -1; } - return uci_ind; + NR_UL_IND_t UL_INFO = { + .crc_ind = *crc_ind, + }; + send_nsa_standalone_msg(&UL_INFO, crc_ind->header.message_id); + free(crc_ind->crc_list); + free(crc_ind); + } + if (rx_ind && rx_ind->number_of_pdus > 0) + { + NR_UL_IND_t UL_INFO = { + .rx_ind = *rx_ind, + }; + send_nsa_standalone_msg(&UL_INFO, rx_ind->header.message_id); + free(rx_ind->pdu_list); + free(rx_ind); + } + else + { + sent_crc_rx = false; + } + return sent_crc_rx; } static void copy_ul_tti_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_tti_request_t *ul_tti_req) { - NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id); int num_pdus = ul_tti_req->n_pdus; + int sfn_slot = NFAPI_SFNSLOT2HEX(ul_tti_req->SFN, ul_tti_req->Slot); AssertFatal(num_pdus >= 0, "Invalid ul_tti_request number of PDUS\n"); AssertFatal(num_pdus <= sizeof(ul_tti_req->pdus_list) / sizeof(ul_tti_req->pdus_list[0]), "Too many pdus %d in ul_tti_req\n", num_pdus); - - bool sent_uci = false; - for (int i = 0; i < num_pdus; i++) + if (!send_crc_ind_and_rx_ind(sfn_slot)) { - nfapi_nr_ul_tti_request_number_of_pdus_t *pdu_list = &ul_tti_req->pdus_list[i]; - LOG_D(NR_PHY, "This is the pdu type %d and rnti %x and SR flag %d and harq_pdu_len %d in in ul_tti_req\n", - pdu_list->pdu_type, ul_tti_req->pdus_list[i].pucch_pdu.rnti, pdu_list->pucch_pdu.sr_flag, pdu_list->pucch_pdu.bit_len_harq); - if (pdu_list->pdu_type == NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE && pdu_list->pucch_pdu.rnti == mac->crnti) - { - AssertFatal(nr_uci_ind_queue.num_items >= 0, "Invalid num_items in UCI_ind queue %lu\n", - nr_uci_ind_queue.num_items); - int num_active_harqs = pdu_list->pucch_pdu.bit_len_harq; - LOG_I(NR_MAC, "The number of active harqs %d from ul_tti_req\n", num_active_harqs); - nfapi_nr_uci_indication_t *uci_ind = multiplex_uci_ind(mac, num_active_harqs); - - if (uci_ind && uci_ind->num_ucis > 0) - { - LOG_D(NR_MAC, "This is the SFN/SF [%d, %d] and RNTI %x of the UCI ind. ul_tti_req.pdu[%d]->rnti = %x \n", - uci_ind->sfn, uci_ind->slot, uci_ind->uci_list[0].pucch_pdu_format_0_1.rnti, i, ul_tti_req->pdus_list[i].pucch_pdu.rnti); - uci_ind->sfn = ul_tti_req->SFN; - uci_ind->slot = ul_tti_req->Slot; - for (int j = 0; j < uci_ind->num_ucis; j++) - { - nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[j].pucch_pdu_format_0_1; - if (pdu_list->pucch_pdu.sr_flag) - { - LOG_D(NR_MAC, "We have the SR flag in pdu i %d\n", i); - pdu_0_1->pduBitmap = 1; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR - pdu_0_1->sr = CALLOC(1, sizeof(*pdu_0_1->sr)); - pdu_0_1->sr->sr_confidence_level = 0; - pdu_0_1->sr->sr_indication = 1; - } - if (pdu_list->pucch_pdu.bit_len_harq > 0) - { - LOG_D(NR_MAC, "We have the Harq len bits %d\n", pdu_list->pucch_pdu.bit_len_harq); - pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR - pdu_0_1->harq = CALLOC(1, sizeof(*pdu_0_1->harq)); - pdu_0_1->harq->num_harq = 1; - pdu_0_1->harq->harq_confidence_level = 0; - pdu_0_1->harq->harq_list = CALLOC(pdu_0_1->harq->num_harq, sizeof(*pdu_0_1->harq->harq_list)); - for (int k = 0; k < pdu_0_1->harq->num_harq; k++) - { - pdu_0_1->harq->harq_list[k].harq_value = 0; - } - } - } - LOG_I(NR_MAC, "We have dequeued the previously filled uci_ind and updated the snf/slot to %d/%d.\n", - uci_ind->sfn, uci_ind->slot); - NR_UL_IND_t UL_INFO = { - .uci_ind = *uci_ind, - }; - send_nsa_standalone_msg(&UL_INFO, uci_ind->header.message_id); - sent_uci = true; - - for (int k = 0; k < uci_ind->num_ucis; k++) - { - nfapi_nr_uci_pucch_pdu_format_0_1_t *pdu_0_1 = &uci_ind->uci_list[k].pucch_pdu_format_0_1; - if (pdu_list->pucch_pdu.sr_flag) - { - free(pdu_0_1->sr); - pdu_0_1->sr = NULL; - } - if (pdu_list->pucch_pdu.bit_len_harq > 1) - { - free(pdu_0_1->harq->harq_list); - pdu_0_1->harq->harq_list = NULL; - free(pdu_0_1->harq); - pdu_0_1->harq = NULL; - } - } - free(uci_ind->uci_list); - uci_ind->uci_list = NULL; - free(uci_ind); - uci_ind = NULL; - } - } - } - if (!sent_uci) - { - LOG_E(NR_MAC, "UCI ind not sent\n"); + LOG_T(NR_MAC, "CRC_RX ind not sent\n"); if (!put_queue(&nr_ul_tti_req_queue, ul_tti_req)) { LOG_E(NR_PHY, "put_queue failed for ul_tti_req.\n"); - free(ul_tti_req); - ul_tti_req = NULL; } + return; } } @@ -663,13 +656,13 @@ static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_ "Too many dl_config pdus %d", dl_config->number_pdus); for (int i = 0; i < dl_config->number_pdus; i++) { - LOG_I(PHY, "In %s: filling DCI with a total of %d total DL PDUs (dl_config %p) \n", + LOG_D(PHY, "In %s: filling DCI with a total of %d total DL PDUs (dl_config %p) \n", __FUNCTION__, dl_config->number_pdus, dl_config); fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15_dci = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15; int num_dci_options = rel15_dci->num_dci_options; if (num_dci_options <= 0) { - LOG_I(NR_MAC, "num_dci_opts = %d for pdu[%d] in dl_config_list\n", rel15_dci->num_dci_options, i); + LOG_D(NR_MAC, "num_dci_opts = %d for pdu[%d] in dl_config_list\n", rel15_dci->num_dci_options, i); } AssertFatal(num_dci_options <= sizeof(rel15_dci->dci_length_options) / sizeof(rel15_dci->dci_length_options[0]), "num_dci_options %d > dci_length_options array\n", num_dci_options); @@ -683,17 +676,15 @@ static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_ "dl_config->number_pdus %d > dci_ind->dci_list array\n", num_dcis); for (int k = 0; k < num_dcis; k++) { - LOG_I(NR_PHY, "Received len %d, length options[%d] %d, format assigned %d, format options[%d] %d\n", + LOG_T(NR_PHY, "Received len %d, length options[%d] %d, format assigned %d, format options[%d] %d\n", dl_ind->dci_ind->dci_list[k].payloadSize, j, rel15_dci->dci_length_options[j], dl_ind->dci_ind->dci_list[k].dci_format, j, rel15_dci->dci_format_options[j]); if (rel15_dci->dci_length_options[j] == dl_ind->dci_ind->dci_list[k].payloadSize) { dl_ind->dci_ind->dci_list[k].dci_format = rel15_dci->dci_format_options[j]; + LOG_D(NR_PHY, "format assigned dl_ind->dci_ind->dci_list[k].dci_format %d\n", + dl_ind->dci_ind->dci_list[k].dci_format); } - int CCEind = rel15_dci->CCE[j]; - int L = rel15_dci->L[j]; - dl_ind->dci_ind->dci_list[k].n_CCE = CCEind; - dl_ind->dci_ind->dci_list[k].N_CCE = L; } } } @@ -714,41 +705,52 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, { frame = dl_tti_request->SFN; slot = dl_tti_request->Slot; - LOG_I(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot); + LOG_D(NR_PHY, "[%d, %d] dl_tti_request\n", frame, slot); copy_dl_tti_req_to_dl_info(&mac->dl_info, dl_tti_request); + free_and_zero(dl_tti_request); } /* This checks if the previously recevied DCI matches our current RNTI value. The assumption is that if the DCI matches our RNTI, then the incoming tx_data_request is also destined for the current UE. If the RAR hasn't been processed yet, we do not want to be filtering the tx_data_requests. */ - if (tx_data_request && (mac->nr_ue_emul_l1.expected_sib || - mac->nr_ue_emul_l1.expected_rar || - mac->nr_ue_emul_l1.expected_dci)) + if (tx_data_request) { - frame = tx_data_request->SFN; - slot = tx_data_request->Slot; - LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot); - copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request); + if (mac->nr_ue_emul_l1.expected_sib || + mac->nr_ue_emul_l1.expected_rar || + mac->nr_ue_emul_l1.expected_dci) + { + frame = tx_data_request->SFN; + slot = tx_data_request->Slot; + LOG_I(NR_PHY, "[%d, %d] PDSCH in tx_request\n", frame, slot); + copy_tx_data_req_to_dl_info(&mac->dl_info, tx_data_request); + } + else + { + LOG_D(NR_MAC, "Unexpected tx_data_req\n"); + } + free_and_zero(tx_data_request); } else if (ul_dci_request) { frame = ul_dci_request->SFN; slot = ul_dci_request->Slot; - LOG_I(NR_PHY, "[%d, %d] ul_dci_request\n", frame, slot); + LOG_D(NR_PHY, "[%d, %d] ul_dci_request\n", frame, slot); copy_ul_dci_data_req_to_dl_info(&mac->dl_info, ul_dci_request); + free_and_zero(ul_dci_request); } else if (ul_tti_request) { frame = ul_tti_request->SFN; slot = ul_tti_request->Slot; - LOG_I(NR_PHY, "[%d, %d] ul_tti_request\n", frame, slot); + LOG_T(NR_PHY, "[%d, %d] ul_tti_request\n", frame, slot); copy_ul_tti_data_req_to_dl_info(&mac->dl_info, ul_tti_request); + free_and_zero(ul_tti_request); } else { if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); - LOG_E(NR_MAC, "Error! All indications were NULL\n"); + LOG_T(NR_MAC, "All indications were NULL in %s\n", __FUNCTION__); return; } @@ -756,6 +758,7 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, NR_UL_TIME_ALIGNMENT_t ul_time_alignment; memset(&ul_time_alignment, 0, sizeof(ul_time_alignment)); fill_dci_from_dl_config(&mac->dl_info, &mac->dl_config_request); + nr_ue_scheduler(&mac->dl_info, NULL); nr_ue_dl_indication(&mac->dl_info, &ul_time_alignment); if (pthread_mutex_unlock(&mac->mutex_dl_info)) abort(); @@ -776,8 +779,11 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, mac->scc->tdd_UL_DL_ConfigurationCommon : mac->scc_SIB->tdd_UL_DL_ConfigurationCommon, ul_info.slot_tx, - mac->frame_type)) - nr_ue_ul_indication(&ul_info); + mac->frame_type) && mac->ra.ra_state != RA_SUCCEEDED) + { + nr_ue_scheduler(NULL, &ul_info); + nr_ue_prach_scheduler(ul_info.module_id, ul_info.frame_tx, ul_info.slot_tx, ul_info.thread_id); + } } } @@ -790,19 +796,19 @@ void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request) LOG_E(NR_PHY, "%s: dl_tti_request number of PDUS <= 0\n", __FUNCTION__); abort(); } - LOG_D(NR_PHY, "%s: dl_tti_request number of PDUS: %d\n", __FUNCTION__, num_pdus); + LOG_T(NR_PHY, "%s: dl_tti_request number of PDUS: %d\n", __FUNCTION__, num_pdus); for (int i = 0; i < num_pdus; i++) { nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; if (pdu_list->PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) { - LOG_D(NR_PHY, "Cell_id: %d, the ssb_block_idx %d, sc_offset: %d and payload %d\n", + LOG_T(NR_PHY, "Cell_id: %d, the ssb_block_idx %d, sc_offset: %d and payload %d\n", pdu_list->ssb_pdu.ssb_pdu_rel15.PhysCellId, pdu_list->ssb_pdu.ssb_pdu_rel15.SsbBlockIndex, pdu_list->ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset, pdu_list->ssb_pdu.ssb_pdu_rel15.bchPayload); pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp = 60; - LOG_D(NR_RRC, "Setting pdulist[%d].ssbRsrp to %d\n", i, pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp); + LOG_T(NR_RRC, "Setting pdulist[%d].ssbRsrp to %d\n", i, pdu_list->ssb_pdu.ssb_pdu_rel15.ssbRsrp); } } @@ -820,7 +826,7 @@ void save_nr_measurement_info(nfapi_nr_dl_tti_request_t *dl_tti_request) static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_header_t header) { - + NR_UE_MAC_INST_t *mac = get_mac_inst(0); switch (header.message_id) { case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: @@ -832,8 +838,12 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea LOG_E(NR_PHY, "Message dl_tti_request failed to unpack\n"); break; } - LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message in sfn/slot %d %d. \n", + LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message in sfn/slot %d %d. \n", dl_tti_request->SFN, dl_tti_request->Slot); + + if (is_channel_modeling()) + save_pdsch_pdu_for_crnti(dl_tti_request); + if (!put_queue(&nr_dl_tti_req_queue, dl_tti_request)) { LOG_E(NR_PHY, "put_queue failed for dl_tti_request.\n"); @@ -852,7 +862,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea LOG_E(NR_PHY, "Message tx_data_request failed to unpack\n"); break; } - LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message in SFN/slot %d %d. \n", + LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST message in SFN/slot %d %d. \n", tx_data_request->SFN, tx_data_request->Slot); if (!put_queue(&nr_tx_req_queue, tx_data_request)) { @@ -872,7 +882,7 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea LOG_E(NR_PHY, "Message ul_dci_request failed to unpack\n"); break; } - LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message in SFN/slot %d %d. \n", + LOG_D(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST message in SFN/slot %d %d. \n", ul_dci_request->SFN, ul_dci_request->Slot); if (!put_queue(&nr_ul_dci_req_queue, ul_dci_request)) { @@ -892,30 +902,30 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea LOG_E(NR_PHY, "Message ul_tti_request failed to unpack\n"); break; } - LOG_I(NR_PHY, "Received an NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message in SFN/slot %d %d.\n", - ul_tti_request->SFN, ul_tti_request->Slot); - if (nr_uci_ind_queue.num_items > 0) //TODO: In the future UL_TTIs can be for ULSCH and SRS. - { - LOG_D(NR_MAC, "We added UL_TTI_REQ to queue for sfn slot %d %d\n", - ul_tti_request->SFN, ul_tti_request->Slot); - if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request)) - { - LOG_E(NR_PHY, "put_queue failed for ul_tti_request.\n"); - free(ul_tti_request); - ul_tti_request = NULL; + /* We are filtering UL_TTI_REQs below. We only care about UL_TTI_REQs that + will trigger sending a ul_harq (CRC/RX pair). This UL_TTI_REQ will have + NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE. If we have not yet completed the CBRA/ + CFRA procedure, we need to queue all UL_TTI_REQs. */ + for (int i = 0; i < ul_tti_request->n_pdus; i++) { + if (ul_tti_request->pdus_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE && + mac->ra.ra_state >= RA_SUCCEEDED) { + if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request)) + { + LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n"); + nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request); + free(evicted_ul_tti_req); + } + break; + } + else if (mac->ra.ra_state < RA_SUCCEEDED) { + if (!put_queue(&nr_ul_tti_req_queue, ul_tti_request)) + { + LOG_D(NR_PHY, "put_queue failed for ul_tti_request, calling put_queue_replace.\n"); + nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_ul_tti_req_queue, ul_tti_request); + free(evicted_ul_tti_req); + } + break; } - } - /* TODO: This indicates that dl_tti_req was late or never arrived. If there are - not any prepared uci indications, the NRUE likely never had time to - populate the message is the dl_tti_req came in late and we received a - ul_tti_req immediately after the dl_tti_request. This is an attempt to - mitigate proxy timing issues. */ - else if (nr_uci_ind_queue.num_items == 0) - { - LOG_D(NR_MAC, "We added UL_TTI_REQ to queue for sfn slot %d %d\n", - ul_tti_request->SFN, ul_tti_request->Slot); - nfapi_nr_ul_tti_request_t *evicted_ul_tti_req = put_queue_replace(&nr_wait_ul_tti_req_queue, ul_tti_request); - free(evicted_ul_tti_req); } break; } @@ -928,6 +938,46 @@ static void enqueue_nr_nfapi_msg(void *buffer, ssize_t len, nfapi_p7_message_hea return; } +static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request) +{ + int count_sent = 0; + NR_UE_MAC_INST_t *mac = get_mac_inst(0); + int number_of_pdu = dl_tti_request->dl_tti_request_body.nPDUs; + if (number_of_pdu <= 0) + { + LOG_E(NR_MAC, "%s: dl_tti_request pdu size <= 0\n", __FUNCTION__); + abort(); + } + + for (int i = 0; i < number_of_pdu; i++) + { + const nfapi_nr_dl_tti_request_pdu_t *pdu_list = &dl_tti_request->dl_tti_request_body.dl_tti_pdu_list[i]; + + if (pdu_list->PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) + { + const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu = &pdu_list->pdsch_pdu.pdsch_pdu_rel15; + if (pdsch_pdu->rnti == mac->crnti && mac->ra.ra_state == RA_SUCCEEDED) + { + read_channel_param(pdsch_pdu, dl_tti_request->Slot, count_sent); + count_sent++; + LOG_T(NR_MAC, "pdsch_pdu->rnti %x mac->crnti %x mac->ra.ra_state %d count_sent %d\n", + pdsch_pdu->rnti, mac->crnti, mac->ra.ra_state, count_sent); + } + } + } +} + +static uint16_t get_message_id(const uint8_t *buffer, ssize_t len) +{ + if (len < 4) + return 0; + + // Unpack 2 bytes message_id from buffer. + uint16_t v; + memcpy(&v, buffer + 2, sizeof(v)); + return ntohs(v); +} + void *nrue_standalone_pnf_task(void *context) { struct sockaddr_in server_address; @@ -957,7 +1007,7 @@ void *nrue_standalone_pnf_task(void *context) uint16_t *sfn_slot = CALLOC(1, sizeof(*sfn_slot)); memcpy(sfn_slot, buffer, sizeof(*sfn_slot)); - LOG_I(NR_PHY, "Received from proxy sfn %d slot %d\n", + LOG_D(NR_PHY, "Received from proxy sfn %d slot %d\n", NFAPI_SFNSLOT2SFN(*sfn_slot), NFAPI_SFNSLOT2SLOT(*sfn_slot)); if (!put_queue(&nr_sfn_slot_queue, sfn_slot)) @@ -971,13 +1021,22 @@ void *nrue_standalone_pnf_task(void *context) abort(); } } - else if (len == sizeof(nr_phy_channel_params_t)) + else if (get_message_id((const uint8_t *)buffer, len) == 0x0FFF) // 0x0FFF : channel info identifier. { nr_phy_channel_params_t *ch_info = CALLOC(1, sizeof(*ch_info)); memcpy(ch_info, buffer, sizeof(*ch_info)); - LOG_D(NR_PHY, "Received_SINR = %f, sfn:slot %d:%d\n", - ch_info->sinr, NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)); + if (ch_info->nb_of_sinrs > 1) + LOG_W(NR_PHY, "Expecting at most one SINR.\n"); + + // TODO: Update sinr field of slot_rnti_mcs to be array. + for (int i = 0; i < ch_info->nb_of_sinrs; ++i) + { + slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].sinr = ch_info->sinr[i]; + + LOG_T(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n", + i, ch_info->sinr[i], NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)); + } if (!put_queue(&nr_chan_param_queue, ch_info)) { @@ -1037,7 +1096,10 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t // L2 Abstraction Layer // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){ - + /* L1 assigns harq_pid, but in emulated L1 mode we need to assign + the harq_pid based on the saved global g_harq_pid. Because we are + emulating L1, no antenna measurements are conducted to calculate + a harq_pid, therefore we must set it here. */ if (get_softmodem_params()->emulate_l1) dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid = g_harq_pid; @@ -1058,7 +1120,7 @@ void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nac if (current_harq->active) { current_harq->ack = ack_nack; current_harq->ack_received = true; - LOG_D(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack); + LOG_T(PHY,"Updating harq_status for harq_id %d,ack/nak %d\n",harq_pid,current_harq->ack); } else { //shouldn't get here @@ -1066,7 +1128,6 @@ void update_harq_status(module_id_t module_id, uint8_t harq_pid, uint8_t ack_nac } } - int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){ NR_UE_L2_STATE_t ret; @@ -1081,7 +1142,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){ ret = nr_ue_scheduler(NULL, ul_info); } else - LOG_D(NR_MAC, "In %s():%d not calling scheduler. sched mode = %d and mac->ra.ra_state = %d\n", + LOG_T(NR_MAC, "In %s():%d not calling scheduler. sched mode = %d and mac->ra.ra_state = %d\n", __FUNCTION__, __LINE__, ul_info->ue_sched_mode, mac->ra.ra_state); NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon = mac->scc != NULL ? mac->scc->tdd_UL_DL_ConfigurationCommon : mac->scc_SIB->tdd_UL_DL_ConfigurationCommon; @@ -1121,9 +1182,9 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ } else { // UL indication after reception of DCI or DL PDU if (dl_info && dl_info->dci_ind && dl_info->dci_ind->number_of_dcis) { - LOG_D(MAC,"[L2][IF MODULE][DL INDICATION][DCI_IND]\n"); + LOG_T(MAC,"[L2][IF MODULE][DL INDICATION][DCI_IND]\n"); for (int i = 0; i < dl_info->dci_ind->number_of_dcis; i++) { - LOG_D(MAC,">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d\n",i,dl_info->dci_ind->number_of_dcis); + LOG_T(MAC,">>>NR_IF_Module i=%d, dl_info->dci_ind->number_of_dcis=%d\n",i,dl_info->dci_ind->number_of_dcis); nr_scheduled_response_t scheduled_response; int8_t ret = handle_dci(dl_info->module_id, dl_info->cc_id, @@ -1136,12 +1197,12 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ /* The check below filters out UL_DCIs (format 7) which are being processed as DL_DCIs. */ if (dci_index->dci_format == 7 && mac->ra.ra_state == RA_SUCCEEDED) { - LOG_D(NR_MAC, "We are filtering a UL_DCI to prevent it from being treated like a DL_DCI\n"); + LOG_T(NR_MAC, "We are filtering a UL_DCI to prevent it from being treated like a DL_DCI\n"); break; } dci_pdu_rel15_t *def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dci_index->dci_format]; g_harq_pid = def_dci_pdu_rel15->harq_pid; - LOG_D(NR_MAC, "Setting harq_pid = %d and dci_index = %d (based on format)\n", g_harq_pid, dci_index->dci_format); + LOG_T(NR_MAC, "Setting harq_pid = %d and dci_index = %d (based on format)\n", g_harq_pid, dci_index->dci_format); ret_mask |= (ret << FAPI_NR_DCI_IND); if (ret >= 0) { @@ -1160,7 +1221,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ for (int i=0; irx_ind->number_pdus; ++i) { - LOG_D(MAC, "In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", + LOG_T(MAC, "In %s sending DL indication to MAC. 1 PDU type %d of %d total number of PDUs \n", __FUNCTION__, dl_info->rx_ind->rx_indication_body[i].pdu_type, dl_info->rx_ind->number_pdus); @@ -1244,7 +1305,7 @@ int nr_ue_dcireq(nr_dcireq_t *dcireq) { dl_config->sfn = UE_mac->dl_config_request.sfn; dl_config->slot = UE_mac->dl_config_request.slot; - LOG_D(PHY, "Entering UE DCI configuration frame %d slot %d \n", dcireq->frame, dcireq->slot); + LOG_T(PHY, "Entering UE DCI configuration frame %d slot %d \n", dcireq->frame, dcireq->slot); ue_dci_configuration(UE_mac, dl_config, dcireq->frame, dcireq->slot); @@ -1279,3 +1340,245 @@ void RCconfig_nr_ue_L1(void) { } } } + +/* +static int get_mcs_from_sinr(float sinr) +{ + if (sinr < (nr_bler_data[0].bler_table[0][0])) + { + LOG_D(NR_MAC, "The SINR found is smaller than first MCS table\n"); + return 0; + } + + if (sinr > (nr_bler_data[NR_NUM_MCS-1].bler_table[nr_bler_data[NR_NUM_MCS-1].length - 1][0])) + { + LOG_D(NR_MAC, "The SINR found is larger than last MCS table\n"); + return NR_NUM_MCS-1; + } + + for (int n = NR_NUM_MCS-1; n >= 0; n--) + { + CHECK_INDEX(nr_bler_data, n); + float largest_sinr = (nr_bler_data[n].bler_table[nr_bler_data[n].length - 1][0]); + float smallest_sinr = (nr_bler_data[n].bler_table[0][0]); + if (sinr < largest_sinr && sinr > smallest_sinr) + { + LOG_D(NR_MAC, "The SINR found in MCS %d table\n", n); + return n; + } + } + LOG_E(NR_MAC, "Unable to get an MCS value.\n"); + abort(); +} +*/ + +/* +static int get_cqi_from_mcs(void) +{ + static const int mcs_to_cqi[] = {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15}; + assert(NUM_ELEMENTS(mcs_to_cqi) == NR_NUM_MCS); + int slot = 0; + while (slot < NUM_NFAPI_SLOT) + { + if (slot_rnti_mcs[slot].latest) + { + int num_pdus = slot_rnti_mcs[slot].num_pdus; + if (num_pdus <= 0) + { + LOG_E(NR_MAC, "%s: slot_rnti_mcs[%d].num_pdus = 0\n", __FUNCTION__, slot); + abort(); + } + + CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus); + int mcs = get_mcs_from_sinr(slot_rnti_mcs[slot].sinr); + CHECK_INDEX(mcs_to_cqi, mcs); + int cqi = mcs_to_cqi[mcs]; + LOG_D(NR_MAC, "SINR: %f -> MCS: %d -> CQI: %d\n", slot_rnti_mcs[slot].sinr, mcs, cqi); + return cqi; + } + slot++; + } + LOG_E(NR_MAC, "Unable to get CQI value because no MCS found\n"); + abort(); +} +*/ + +static void read_channel_param(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t * pdu, int slot, int index) +{ + if (pdu == NULL) + { + LOG_E(NR_MAC,"PDU NULL\n"); + abort(); + } + + /* This function is executed for every pdsch pdu type in a dl_tti_request. We save + the assocaited MCS and RNTI value for each. The 'index' passed in is a count of + how many times we have called this function for a particular dl_tti_request. It + allows us to save MCS/RNTI data in correct indicies when multiple pdsch pdu's are received.*/ + for (int i = 0; i < NUM_NFAPI_SLOT; i++) + { + slot_rnti_mcs[i].latest = false; + } + + CHECK_INDEX(slot_rnti_mcs[slot].rnti, index); + CHECK_INDEX(slot_rnti_mcs[slot].mcs, index); + CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, index); + slot_rnti_mcs[slot].rnti[index] = pdu->rnti; + slot_rnti_mcs[slot].mcs[index] = pdu->mcsIndex[0]; + slot_rnti_mcs[slot].rvIndex[index] = pdu->rvIndex[0]; + slot_rnti_mcs[slot].drop_flag[index] = false; + slot_rnti_mcs[slot].num_pdus = index+1; //index starts at 0 so we incrament to get num of pdus + slot_rnti_mcs[slot].latest = true; + LOG_D(NR_MAC, "Adding MCS %d and RNTI %x for slot_rnti_mcs[%d]\n", slot_rnti_mcs[slot].mcs[index], slot_rnti_mcs[slot].rnti[index], slot); + + return; +} + +/* +static bool did_drop_transport_block(int slot, uint16_t rnti) +{ + int num_pdus = slot_rnti_mcs[slot].num_pdus; + if (num_pdus <= 0) + { + LOG_E(MAC, "Problem, the PDU size is <= 0. We dropped this packet\n"); + return true; + } + CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus); + CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus); + for (int n = 0; n < num_pdus; n++) + { + if (slot_rnti_mcs[slot].rnti[n] == rnti && slot_rnti_mcs[slot].drop_flag[n]) + { + return true; + } + } + return false; +} +*/ + +static float get_bler_val(uint8_t mcs, int sinr) +{ + // 4th col = dropped packets, 5th col = total packets + float bler_val = 0.0; + CHECK_INDEX(nr_bler_data, mcs); + LOG_D(NR_MAC, "sinr %d min %d max %d\n", sinr, + (int)(nr_bler_data[mcs].bler_table[0][0] * 10), + (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10) + ); + + if (sinr < (int)(nr_bler_data[mcs].bler_table[0][0] * 10)) + { + LOG_D(NR_MAC, "MCS %d table. SINR is smaller than lowest SINR, bler_val is set based on lowest SINR in table\n", mcs); + bler_val = nr_bler_data[mcs].bler_table[0][4] / nr_bler_data[mcs].bler_table[0][5]; + return bler_val; + } + if (sinr > (int)(nr_bler_data[mcs].bler_table[nr_bler_data[mcs].length - 1][0] * 10)) + { + LOG_D(NR_MAC, "MCS %d table. SINR is greater than largest SINR. bler_val is set based on largest SINR in table\n", mcs); + bler_val = nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][4] / nr_bler_data[mcs].bler_table[(nr_bler_data[mcs].length - 1)][5]; + return bler_val; + } + // Loop through bler table to find sinr_index + for (int i = 0; i < nr_bler_data[mcs].length; i++) + { + int temp_sinr = (int)(nr_bler_data[mcs].bler_table[i][0] * 10); + if (temp_sinr == sinr) + { + bler_val = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; + return bler_val; + } + // Linear interpolation when SINR is between indices + if (temp_sinr > sinr) + { + float bler_val1 = nr_bler_data[mcs].bler_table[i - 1][4] / nr_bler_data[mcs].bler_table[i - 1][5]; + float bler_val2 = nr_bler_data[mcs].bler_table[i][4] / nr_bler_data[mcs].bler_table[i][5]; + LOG_D(NR_MAC, "sinr %d min %f max %f\n", sinr, bler_val1, bler_val2); + return ((bler_val1 + bler_val2) / 2); + } + } + LOG_E(NR_MAC, "NO SINR INDEX FOUND!\n"); + abort(); + +} + +static inline bool is_channel_modeling(void) +{ + /* TODO: For now we enable channel modeling based on the node_number. + Replace with a command line option to enable/disable channel modeling. + The LTE UE will crash when channel modeling is conducted for NSA + mode. It does not crash for LTE mode. We have not implemented channel + modeling for NSA mode yet. For now, we ensure only do do channel modeling + in LTE/NR mode. */ + return get_softmodem_params()->node_number == 0 && !get_softmodem_params()->nsa; +} + +static bool should_drop_transport_block(int slot, uint16_t rnti) +{ + if (!is_channel_modeling()) + { + return false; + } + + /* We want to avoid dropping setup messages because this would be pathological. */ + NR_UE_MAC_INST_t *mac = get_mac_inst(0); + if (mac->ra.ra_state < RA_SUCCEEDED) + { + LOG_D(NR_MAC, "Not dropping because MAC state: %d", mac->ra.ra_state); + return false; + } + + /* Get block error rate (bler_val) from table based on every saved + MCS and SINR to be used as the cutoff rate for dropping packets. + Generate random uniform vairable to compare against bler_val. */ + int num_pdus = slot_rnti_mcs[slot].num_pdus; + assert(slot < 20 && slot >= 0); + LOG_D(NR_MAC, "rnti: %x num_pdus %d state %d slot %u sinr %f\n", + rnti, num_pdus, mac->ra.ra_state, slot, slot_rnti_mcs[slot].sinr); + assert(num_pdus > 0); + CHECK_INDEX(slot_rnti_mcs[slot].rnti, num_pdus); + CHECK_INDEX(slot_rnti_mcs[slot].mcs, num_pdus); + CHECK_INDEX(slot_rnti_mcs[slot].drop_flag, num_pdus); + int n = 0; + uint8_t mcs = 99; + for (n = 0; n < num_pdus; n++) + { + if (slot_rnti_mcs[slot].rnti[n] == rnti) + { + mcs = slot_rnti_mcs[slot].mcs[n]; + } + if (mcs != 99) + { + /* Use MCS to get the bler value. Since there can be multiple MCS + values for a particular slot, we verify that all PDUs are not + flagged for drop before returning. If even one is flagged for drop + we return immediately because we drop the entire packet. */ + + LOG_D(NR_MAC, "rnti: %x mcs %u slot %u sinr %f\n", + slot_rnti_mcs[slot].rnti[n], mcs, slot, slot_rnti_mcs[slot].sinr); + + float bler_val; + if (slot_rnti_mcs[slot].rvIndex[n] != 0) + bler_val = 0; + else + bler_val = get_bler_val(mcs, ((int)(slot_rnti_mcs[slot].sinr * 10))); + double drop_cutoff = ((double) rand() / (RAND_MAX)); + assert(drop_cutoff <= 1); + LOG_D(NR_MAC, "SINR = %f, Bler_val = %f, MCS = %"PRIu8"\n", slot_rnti_mcs[slot].sinr, bler_val, slot_rnti_mcs[slot].mcs[n]); + if (drop_cutoff <= bler_val) + { + slot_rnti_mcs[slot].drop_flag[n] = true; + LOG_T(NR_MAC, "We are dropping this packet. Bler_val = %f, MCS = %"PRIu8", slot = %d\n", bler_val, slot_rnti_mcs[slot].mcs[n], slot); + return slot_rnti_mcs[slot].drop_flag[n]; + } + } + + } + + if (mcs == 99) + { + LOG_E(NR_MAC, "NO MCS Found for rnti %x. slot_rnti_mcs[%d].mcs[%d] \n", rnti, slot, n); + abort(); + } + return false; +} diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 2a8a514769..034c1c6b48 100755 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -41,15 +41,44 @@ #include "nfapi_nr_interface_scf.h" #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h" +#define NR_NUM_MCS 29 +#define NUM_SINR 100 +#define NUM_BLER_COL 13 +#define NUM_NFAPI_SLOT 20 +#define NR_NUM_LAYER 1 + typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t; typedef struct nr_phy_channel_params_t { uint16_t sfn_slot; - float sinr; + uint16_t message_id; + uint16_t nb_of_sinrs; + float sinr[NR_NUM_LAYER]; // Incomplete, need all channel parameters } nr_phy_channel_params_t; +typedef struct +{ + uint8_t slot; + uint16_t rnti[256]; + uint8_t mcs[256]; + uint8_t rvIndex[256]; + float sinr; + uint16_t num_pdus; + bool drop_flag[256]; + bool latest; + +} slot_rnti_mcs_s; + +typedef struct +{ + uint16_t length; + float bler_table[NUM_SINR][NUM_BLER_COL]; +} nr_bler_struct; + +extern nr_bler_struct nr_bler_data[NR_NUM_MCS]; + typedef enum { ONLY_PUSCH, NOT_PUSCH, @@ -240,6 +269,8 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request, nfapi_nr_ul_dci_request_t *ul_dci_request, nfapi_nr_ul_tti_request_t *ul_tti_request); +bool sfn_slot_matcher(void *wanted, void *candidate); + /**\brief done free of memory allocation by module_id and release to pointer pool. \param module_id module id*/ int nr_ue_if_module_kill(uint32_t module_id); diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.c b/openair2/PHY_INTERFACE/phy_stub_UE.c index 1598e3d620..c4650f18f3 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.c +++ b/openair2/PHY_INTERFACE/phy_stub_UE.c @@ -1259,6 +1259,17 @@ void ue_init_standalone_socket(int tx_port, int rx_port) } } +static uint16_t get_message_id(const uint8_t *buffer, ssize_t len) +{ + if (len < 4) + return 0; + + // Unpack 2 bytes message_id from buffer. + uint16_t v; + memcpy(&v, buffer + 2, sizeof(v)); + return ntohs(v); +} + void *ue_standalone_pnf_task(void *context) { struct sockaddr_in server_address; @@ -1301,7 +1312,7 @@ void *ue_standalone_pnf_task(void *context) abort(); } } - else if (len == sizeof(phy_channel_params_t)) + else if (get_message_id((const uint8_t *)buffer, len) == 0x0FFF) // 0x0FFF : channel info identifier. { phy_channel_params_t ch_info; memcpy(&ch_info, buffer, sizeof(phy_channel_params_t)); @@ -1314,8 +1325,15 @@ void *ue_standalone_pnf_task(void *context) uint16_t sf = ch_info.sfn_sf & 15; assert(sf < 10); - sf_rnti_mcs[sf].sinr = ch_info.sinr; - LOG_D(MAC, "Received_SINR = %f\n",ch_info.sinr); + if (ch_info.nb_of_sinrs > 1) + LOG_W(MAC, "Expecting at most one SINR.\n"); + + // TODO: Update sinr field of slot_rnti_mcs to be array. + for (int i = 0; i < ch_info.nb_of_sinrs; ++i) + { + sf_rnti_mcs[sf].sinr = ch_info.sinr[i]; + LOG_D(MAC, "Received_SINR[%d] = %f\n", i, ch_info.sinr[i]); + } } else { diff --git a/openair2/PHY_INTERFACE/phy_stub_UE.h b/openair2/PHY_INTERFACE/phy_stub_UE.h index ebaae6e667..d68d1dffdd 100644 --- a/openair2/PHY_INTERFACE/phy_stub_UE.h +++ b/openair2/PHY_INTERFACE/phy_stub_UE.h @@ -24,6 +24,7 @@ #define NUM_MCS 28 #define NUM_SINR 100 #define NUM_BLER_COL 13 +#define LTE_NUM_LAYER 1 // this mutex is used to set multiple UE's UL value in L2 FAPI simulator. extern FILL_UL_INFO_MUTEX_t fill_ul_mutex; @@ -126,7 +127,9 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id, typedef struct phy_channel_params_t { uint16_t sfn_sf; - float sinr; + uint16_t message_id; + uint16_t nb_of_sinrs; + float sinr[LTE_NUM_LAYER]; // Incomplete, need all channel parameters } phy_channel_params_t; diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 3a8fc34e20..1715677c6d 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -821,7 +821,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( uint8_t buffer[RRC_BUF_SIZE]; uint16_t size; int qos_flow_index = 0; - NR_QFI_t qfi = 0; int pdu_sessions_done = 0; int i; NR_CellGroupConfig_t *cellGroupConfig; @@ -872,15 +871,21 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( sdap_config = CALLOC(1, sizeof(NR_SDAP_Config_t)); memset(sdap_config, 0, sizeof(NR_SDAP_Config_t)); sdap_config->pdu_Session = ue_context_pP->ue_context.pduSession[i].param.pdusession_id; - sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present; - sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent; + if (rrc->configuration.enable_sdap) { + sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_present; + sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_present; + } else { + sdap_config->sdap_HeaderDL = NR_SDAP_Config__sdap_HeaderDL_absent; + sdap_config->sdap_HeaderUL = NR_SDAP_Config__sdap_HeaderUL_absent; + } sdap_config->defaultDRB = TRUE; sdap_config->mappedQoS_FlowsToAdd = calloc(1, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd)); memset(sdap_config->mappedQoS_FlowsToAdd, 0, sizeof(struct NR_SDAP_Config__mappedQoS_FlowsToAdd)); for (qos_flow_index = 0; qos_flow_index < ue_context_pP->ue_context.pduSession[i].param.nb_qos; qos_flow_index++) { - qfi = ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].qfi; - ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, &qfi); + NR_QFI_t *qfi = calloc(1, sizeof(NR_QFI_t)); + *qfi = ue_context_pP->ue_context.pduSession[i].param.qos[qos_flow_index].qfi; + ASN_SEQUENCE_ADD(&sdap_config->mappedQoS_FlowsToAdd->list, qfi); } sdap_config->mappedQoS_FlowsToRelease = NULL; DRB_config->cnAssociation->choice.sdap_Config = sdap_config; diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index fa1690e450..6a678d0e18 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -2795,7 +2795,6 @@ void start_oai_nrue_threads() init_queue(&nr_tx_req_queue); init_queue(&nr_ul_dci_req_queue); init_queue(&nr_ul_tti_req_queue); - init_queue(&nr_wait_ul_tti_req_queue); if (sem_init(&sfn_slot_semaphore, 0, 0) != 0) { diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 62d9167251..510fbff230 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -51,7 +51,6 @@ extern queue_t nr_dl_tti_req_queue; extern queue_t nr_tx_req_queue; extern queue_t nr_ul_dci_req_queue; extern queue_t nr_ul_tti_req_queue; -extern queue_t nr_wait_ul_tti_req_queue; // // main_rrc.c // diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c new file mode 100644 index 0000000000..74ef93aff7 --- /dev/null +++ b/openair2/SDAP/nr_sdap/nr_sdap.c @@ -0,0 +1,86 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "nr_sdap.h" + +boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi, + const int pdusession_id) { + nr_sdap_entity_t *sdap_entity; + sdap_entity = nr_sdap_get_entity(ctxt_p->rnti, pdusession_id); + + if(sdap_entity == NULL) { + LOG_E(SDAP, "%s:%d:%s: Entity not found with ue rnti: %x and pdusession id: %d\n", __FILE__, __LINE__, __FUNCTION__, ctxt_p->rnti, pdusession_id); + return 0; + } + + boolean_t ret = sdap_entity->tx_entity(sdap_entity, + ctxt_p, + srb_flag, + rb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + pt_mode, + sourceL2Id, + destinationL2Id, + qfi, + rqi); + return ret; +} + +void sdap_data_ind(rb_id_t pdcp_entity, + int is_gnb, + int has_sdap, + int has_sdapULheader, + int pdusession_id, + int rnti, + char *buf, + int size) { + nr_sdap_entity_t *sdap_entity; + sdap_entity = nr_sdap_get_entity(rnti, pdusession_id); + + if(sdap_entity == NULL) { + LOG_E(SDAP, "%s:%d:%s: Entity not found\n", __FILE__, __LINE__, __FUNCTION__); + return; + } + + sdap_entity->rx_entity(sdap_entity, + pdcp_entity, + is_gnb, + has_sdap, + has_sdapULheader, + pdusession_id, + rnti, + buf, + size); +} diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h new file mode 100644 index 0000000000..cd702cfd7f --- /dev/null +++ b/openair2/SDAP/nr_sdap/nr_sdap.h @@ -0,0 +1,66 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _NR_SDAP_GNB_H_ +#define _NR_SDAP_GNB_H_ + +#include "openair2/COMMON/platform_types.h" +#include "common/utils/LOG/log.h" +#include "nr_sdap_entity.h" + +/* + * TS 37.324 4.4 Functions + * Transfer of user plane data + * Downlink - gNB + * Uplink - nrUE + */ +boolean_t sdap_data_req(protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi, + const int pdusession_id + ); + +/* + * TS 37.324 4.4 Functions + * Transfer of user plane data + * Uplink - gNB + * Downlink - nrUE + */ +void sdap_data_ind(rb_id_t pdcp_entity, + int is_gnb, + int has_sdap, + int has_sdapULheader, + int pdusession_id, + int rnti, + char *buf, + int size + ); + +#endif diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c new file mode 100644 index 0000000000..c5d1c1d6fe --- /dev/null +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c @@ -0,0 +1,481 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "nr_sdap_entity.h" +#include "common/utils/LOG/log.h" +#include +#include +#include "openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h" + +#include +#include +#include + +typedef struct { + nr_sdap_entity_t *sdap_entity_llist; +} nr_sdap_entity_info; + +static nr_sdap_entity_info sdap_info; + +nr_pdcp_ue_manager_t *nr_pdcp_sdap_get_ue_manager(void); + +void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu){ + nr_pdcp_ue_t *ue; + nr_pdcp_ue_manager_t *nr_pdcp_ue_manager; + nr_pdcp_ue_manager = nr_pdcp_sdap_get_ue_manager(); + ue = nr_pdcp_manager_get_ue(nr_pdcp_ue_manager, rnti); + ue->drb[sdap_ctrl_pdu_drb-1]->recv_sdu(ue->drb[sdap_ctrl_pdu_drb-1], (char*)&ctrl_pdu, SDAP_HDR_LENGTH, RLC_MUI_UNDEFINED); + return; +} + +static boolean_t nr_sdap_tx_entity(nr_sdap_entity_t *entity, + protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi + ) { + /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */ + int offset=0; + boolean_t ret=false; + /*Hardcode DRB ID given from upper layer (ue/enb_tun_read_thread rb_id), it will change if we have SDAP*/ + rb_id_t sdap_drb_id = rb_id; + int pdcp_ent_has_sdap = 0; + + if(sdu_buffer == NULL) { + LOG_E(SDAP, "%s:%d:%s: NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__); + exit(1); + } + + uint8_t sdap_buf[SDAP_MAX_PDU]; + rb_id_t pdcp_entity = entity->qfi2drb_map(entity, qfi, rb_id); + + if(pdcp_entity){ + sdap_drb_id = pdcp_entity; + pdcp_ent_has_sdap = entity->qfi2drb_table[qfi].hasSdap; + } + + if(!pdcp_ent_has_sdap){ + ret = pdcp_data_req(ctxt_p, + srb_flag, + sdap_drb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + pt_mode, + sourceL2Id, + destinationL2Id); + + if(!ret) + LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__); + + return ret; + } + + if(sdu_buffer_size == 0 || sdu_buffer_size > 8999) { + LOG_E(SDAP, "%s:%d:%s: NULL or 0 or exceeded sdu_buffer_size (over max PDCP SDU)\n", __FILE__, __LINE__, __FUNCTION__); + return 0; + } + + if(ctxt_p->enb_flag) { // gNB + offset = SDAP_HDR_LENGTH; + /* + * TS 37.324 4.4 Functions + * marking QoS flow ID in DL packets. + * + * Construct the DL SDAP data PDU. + */ + nr_sdap_dl_hdr_t sdap_hdr; + sdap_hdr.QFI = qfi; + sdap_hdr.RQI = rqi; + sdap_hdr.RDI = 0; // SDAP Hardcoded Value + /* Add the SDAP DL Header to the buffer */ + memcpy(&sdap_buf[0], &sdap_hdr, SDAP_HDR_LENGTH); + memcpy(&sdap_buf[SDAP_HDR_LENGTH], sdu_buffer, sdu_buffer_size); + LOG_D(SDAP, "TX Entity QFI: %u \n", sdap_hdr.QFI); + LOG_D(SDAP, "TX Entity RQI: %u \n", sdap_hdr.RQI); + LOG_D(SDAP, "TX Entity RDI: %u \n", sdap_hdr.RDI); + } else { // nrUE + offset = SDAP_HDR_LENGTH; + /* + * TS 37.324 4.4 Functions + * marking QoS flow ID in UL packets. + * + * 5.2.1 Uplink + * construct the UL SDAP data PDU as specified in the subclause 6.2.2.3. + */ + nr_sdap_ul_hdr_t sdap_hdr; + sdap_hdr.QFI = qfi; + sdap_hdr.R = 0; + sdap_hdr.DC = rqi; + /* Add the SDAP UL Header to the buffer */ + memcpy(&sdap_buf[0], &sdap_hdr, SDAP_HDR_LENGTH); + memcpy(&sdap_buf[SDAP_HDR_LENGTH], sdu_buffer, sdu_buffer_size); + LOG_D(SDAP, "TX Entity QFI: %u \n", sdap_hdr.QFI); + LOG_D(SDAP, "TX Entity R: %u \n", sdap_hdr.R); + LOG_D(SDAP, "TX Entity DC: %u \n", sdap_hdr.DC); + } + + /* + * TS 37.324 5.2 Data transfer + * 5.2.1 Uplink UE side + * submit the constructed UL SDAP data PDU to the lower layers + * + * Downlink gNB side + */ + ret = pdcp_data_req(ctxt_p, + srb_flag, + sdap_drb_id, + mui, + confirm, + sdu_buffer_size+offset, + sdap_buf, + pt_mode, + sourceL2Id, + destinationL2Id); + + if(!ret) + LOG_E(SDAP, "%s:%d:%s: PDCP refused PDU\n", __FILE__, __LINE__, __FUNCTION__); + + return ret; +} + +static void nr_sdap_rx_entity(nr_sdap_entity_t *entity, + rb_id_t pdcp_entity, + int is_gnb, + int has_sdap, + int has_sdapHeader, + int pdusession_id, + int rnti, + char *buf, + int size) { + /* The offset of the SDAP header, it might be 0 if the has_sdap is not true in the pdcp entity. */ + int offset=0; + + if(is_gnb) { // gNB + if(has_sdap && has_sdapHeader ) { // Handling the SDAP Header + offset = SDAP_HDR_LENGTH; + nr_sdap_ul_hdr_t *sdap_hdr = (nr_sdap_ul_hdr_t *)buf; + LOG_D(SDAP, "RX Entity Received QFI : %u\n", sdap_hdr->QFI); + LOG_D(SDAP, "RX Entity Received Reserved bit : %u\n", sdap_hdr->R); + LOG_D(SDAP, "RX Entity Received DC bit : %u\n", sdap_hdr->DC); + + switch (sdap_hdr->DC) { + case SDAP_HDR_UL_DATA_PDU: + LOG_D(SDAP, "RX Entity Received SDAP Data PDU\n"); + break; + + case SDAP_HDR_UL_CTRL_PDU: + LOG_D(SDAP, "RX Entity Received SDAP Control PDU\n"); + break; + } + } + + // Pushing SDAP SDU to GTP-U Layer + MessageDef *message_p; + uint8_t *gtpu_buffer_p; + gtpu_buffer_p = itti_malloc(TASK_PDCP_ENB, TASK_GTPV1_U, size + GTPU_HEADER_OVERHEAD_MAX - offset); + AssertFatal(gtpu_buffer_p != NULL, "OUT OF MEMORY"); + memcpy(>pu_buffer_p[GTPU_HEADER_OVERHEAD_MAX], buf+offset, size-offset); + message_p = itti_alloc_new_message(TASK_PDCP_ENB, 0 , GTPV1U_GNB_TUNNEL_DATA_REQ); + AssertFatal(message_p != NULL, "OUT OF MEMORY"); + GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).buffer = gtpu_buffer_p; + GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).length = size-offset; + GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).offset = GTPU_HEADER_OVERHEAD_MAX; + GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).rnti = rnti; + GTPV1U_GNB_TUNNEL_DATA_REQ(message_p).pdusession_id = pdusession_id; + LOG_D(SDAP, "%s() sending message to gtp size %d\n", __func__, size-offset); + itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_p); + } else { //nrUE + /* + * TS 37.324 5.2 Data transfer + * 5.2.2 Downlink + * if the DRB from which this SDAP data PDU is received is configured by RRC with the presence of SDAP header. + */ + if(has_sdap && has_sdapHeader) { // Handling the SDAP Header + offset = SDAP_HDR_LENGTH; + /* + * TS 37.324 5.2 Data transfer + * 5.2.2 Downlink + * retrieve the SDAP SDU from the DL SDAP data PDU as specified in the subclause 6.2.2.2. + */ + nr_sdap_dl_hdr_t *sdap_hdr = (nr_sdap_dl_hdr_t *)buf; + LOG_D(SDAP, "RX Entity Received QFI : %u\n", sdap_hdr->QFI); + LOG_D(SDAP, "RX Entity Received RQI : %u\n", sdap_hdr->RQI); + LOG_D(SDAP, "RX Entity Received RDI : %u\n", sdap_hdr->RDI); + + /* + * TS 37.324 5.2 Data transfer + * 5.2.2 Downlink + * Perform reflective QoS flow to DRB mapping as specified in the subclause 5.3.2. + */ + if(sdap_hdr->RDI == SDAP_REFLECTIVE_MAPPING) { + /* + * TS 37.324 5.3 QoS flow to DRB Mapping + * 5.3.2 Reflective mapping + * If there is no stored QoS flow to DRB mapping rule for the QoS flow and a default DRB is configured. + */ + if(!entity->qfi2drb_table[sdap_hdr->QFI].drb_id && entity->default_drb){ + nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI); + rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, sdap_hdr->QFI); + entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu); + } + + /* + * TS 37.324 5.3 QoS flow to DRB mapping + * 5.3.2 Reflective mapping + * if the stored QoS flow to DRB mapping rule for the QoS flow + * is different from the QoS flow to DRB mapping of the DL SDAP data PDU + * and + * the DRB according to the stored QoS flow to DRB mapping rule is configured by RRC + * with the presence of UL SDAP header + */ + if( (pdcp_entity != entity->qfi2drb_table[sdap_hdr->QFI].drb_id) && + has_sdapHeader ){ + nr_sdap_ul_hdr_t sdap_ctrl_pdu = entity->sdap_construct_ctrl_pdu(sdap_hdr->QFI); + rb_id_t sdap_ctrl_pdu_drb = entity->sdap_map_ctrl_pdu(entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, sdap_hdr->QFI); + entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu); + } + + /* + * TS 37.324 5.3 QoS flow to DRB Mapping + * 5.3.2 Reflective mapping + * store the QoS flow to DRB mapping of the DL SDAP data PDU as the QoS flow to DRB mapping rule for the UL. + */ + entity->qfi2drb_table[sdap_hdr->QFI].drb_id = pdcp_entity; + } + + /* + * TS 37.324 5.2 Data transfer + * 5.2.2 Downlink + * perform RQI handling as specified in the subclause 5.4 + */ + if(sdap_hdr->RQI == SDAP_RQI_HANDLING) { + LOG_W(SDAP, "UE - TODD 5.4\n"); + } + } /* else - retrieve the SDAP SDU from the DL SDAP data PDU as specified in the subclause 6.2.2.1 */ + + /* + * TS 37.324 5.2 Data transfer + * 5.2.2 Downlink + * deliver the retrieved SDAP SDU to the upper layer. + */ + extern int nas_sock_fd[]; + int len = write(nas_sock_fd[0], &buf[offset], size-offset); + LOG_D(SDAP, "RX Entity len : %d\n", len); + LOG_D(SDAP, "RX Entity size : %d\n", size); + LOG_D(SDAP, "RX Entity offset : %d\n", offset); + + if (len != size-offset) + LOG_E(SDAP, "%s:%d:%s: fatal\n", __FILE__, __LINE__, __FUNCTION__); + } +} + +void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap){ + if(qfi < SDAP_MAX_QFI && + qfi > SDAP_MAP_RULE_EMPTY && + drb > 0 && + drb <= AVLBL_DRB) + { + entity->qfi2drb_table[qfi].drb_id = drb; + entity->qfi2drb_table[qfi].hasSdap = hasSdap; + LOG_D(SDAP, "Updated QFI to DRB Map: QFI %u -> DRB %ld \n", qfi, entity->qfi2drb_table[qfi].drb_id); + LOG_D(SDAP, "DRB %ld %s\n", entity->qfi2drb_table[qfi].drb_id, hasSdap ? "has SDAP" : "does not have SDAP"); + } +} + +void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi){ + entity->qfi2drb_table[qfi].drb_id = SDAP_NO_MAPPING_RULE; + LOG_D(SDAP, "Deleted QFI to DRB Map for QFI %u \n", qfi); +} + +rb_id_t nr_sdap_qfi2drb_map(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t upper_layer_rb_id){ + rb_id_t pdcp_entity; + + pdcp_entity = entity->qfi2drb_table[qfi].drb_id; + + if(pdcp_entity){ + return pdcp_entity; + } else if(entity->default_drb) { + LOG_D(SDAP, "Mapped QFI %u to Default DRB\n", qfi); + return entity->default_drb; + } else { + return SDAP_MAP_RULE_EMPTY; + } + + return pdcp_entity; +} + +nr_sdap_ul_hdr_t nr_sdap_construct_ctrl_pdu(uint8_t qfi){ + nr_sdap_ul_hdr_t sdap_end_marker_hdr; + sdap_end_marker_hdr.QFI = qfi; + sdap_end_marker_hdr.R = 0; + sdap_end_marker_hdr.DC = SDAP_HDR_UL_CTRL_PDU; + LOG_D(SDAP, "Constructed Control PDU with QFI:%u R:%u DC:%u \n", sdap_end_marker_hdr.QFI, + sdap_end_marker_hdr.R, + sdap_end_marker_hdr.DC); + return sdap_end_marker_hdr; +} + +rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi){ + rb_id_t drb_of_endmarker = 0; + if(map_type == SDAP_CTRL_PDU_MAP_DEF_DRB){ + drb_of_endmarker = entity->default_drb; + LOG_D(SDAP, "Mapped Control PDU to default drb\n"); + } + if(map_type == SDAP_CTRL_PDU_MAP_RULE_DRB){ + drb_of_endmarker = entity->qfi2drb_map(entity, dl_qfi, pdcp_entity); + LOG_D(SDAP, "Mapped Control PDU according to the mapping rule, qfi %u \n", dl_qfi); + } + return drb_of_endmarker; +} + +void nr_sdap_submit_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu){ + if(sdap_ctrl_pdu_drb){ + nr_pdcp_submit_sdap_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, ctrl_pdu); + LOG_D(SDAP, "Sent Control PDU to PDCP Layer.\n"); + } +} + +void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, + rb_id_t pdcp_entity, + uint16_t rnti, + NR_QFI_t *mapped_qfi_2_add, + uint8_t mappedQFIs2AddCount, + uint8_t drb_identity) +{ + uint8_t qfi = 0; + + for(int i = 0; i < mappedQFIs2AddCount; i++){ + qfi = mapped_qfi_2_add[i]; + if(existing_sdap_entity->default_drb && existing_sdap_entity->qfi2drb_table[qfi].drb_id == SDAP_NO_MAPPING_RULE){ + nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi); + rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_DEF_DRB, qfi); + existing_sdap_entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu); + } + if(existing_sdap_entity->qfi2drb_table[qfi].drb_id != drb_identity && existing_sdap_entity->qfi2drb_table[qfi].hasSdap){ + nr_sdap_ul_hdr_t sdap_ctrl_pdu = existing_sdap_entity->sdap_construct_ctrl_pdu(qfi); + rb_id_t sdap_ctrl_pdu_drb = existing_sdap_entity->sdap_map_ctrl_pdu(existing_sdap_entity, pdcp_entity, SDAP_CTRL_PDU_MAP_RULE_DRB, qfi); + existing_sdap_entity->sdap_submit_ctrl_pdu(rnti, sdap_ctrl_pdu_drb, sdap_ctrl_pdu); + } + } +} + +nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap, + uint16_t rnti, + int pdusession_id, + boolean_t is_defaultDRB, + uint8_t drb_identity, + NR_QFI_t *mapped_qfi_2_add, + uint8_t mappedQFIs2AddCount) +{ + if(nr_sdap_get_entity(rnti, pdusession_id)) { + LOG_E(SDAP, "SDAP Entity for UE already exists.\n"); + nr_sdap_entity_t *existing_sdap_entity = nr_sdap_get_entity(rnti, pdusession_id); + rb_id_t pdcp_entity = existing_sdap_entity->default_drb; + nr_sdap_ue_qfi2drb_config(existing_sdap_entity, pdcp_entity, rnti, mapped_qfi_2_add, mappedQFIs2AddCount, drb_identity); + return existing_sdap_entity; + } + + nr_sdap_entity_t *sdap_entity; + sdap_entity = calloc(1, sizeof(nr_sdap_entity_t)); + + if(sdap_entity == NULL) { + LOG_E(SDAP, "SDAP Entity creation failed, out of memory\n"); + exit(1); + } + + sdap_entity->rnti = rnti; + sdap_entity->pdusession_id = pdusession_id; + + sdap_entity->tx_entity = nr_sdap_tx_entity; + sdap_entity->rx_entity = nr_sdap_rx_entity; + + sdap_entity->sdap_construct_ctrl_pdu = nr_sdap_construct_ctrl_pdu; + sdap_entity->sdap_map_ctrl_pdu = nr_sdap_map_ctrl_pdu; + sdap_entity->sdap_submit_ctrl_pdu = nr_sdap_submit_ctrl_pdu; + + sdap_entity->qfi2drb_map_update = nr_sdap_qfi2drb_map_update; + sdap_entity->qfi2drb_map_delete = nr_sdap_qfi2drb_map_del; + sdap_entity->qfi2drb_map = nr_sdap_qfi2drb_map; + + if(is_defaultDRB) { + sdap_entity->default_drb = drb_identity; + LOG_I(SDAP, "Default DRB for the created SDAP entity: %ld \n", sdap_entity->default_drb); + + if(mappedQFIs2AddCount) { + for (int i = 0; i < mappedQFIs2AddCount; i++) + { + LOG_D(SDAP, "Mapped QFI to Add : %ld \n", mapped_qfi_2_add[i]); + sdap_entity->qfi2drb_map_update(sdap_entity, mapped_qfi_2_add[i], sdap_entity->default_drb, has_sdap); + } + } + } + + sdap_entity->next_entity = sdap_info.sdap_entity_llist; + sdap_info.sdap_entity_llist = sdap_entity; + return sdap_entity; +} + +nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id) { + nr_sdap_entity_t *sdap_entity; + sdap_entity = sdap_info.sdap_entity_llist; + + if(sdap_entity == NULL) + return NULL; + + while(sdap_entity->rnti != rnti && sdap_entity->next_entity != NULL) { + sdap_entity = sdap_entity->next_entity; + } + + if (sdap_entity->rnti == rnti && sdap_entity->pdusession_id == pdusession_id) + return sdap_entity; + + return NULL; +} + +void delete_nr_sdap_entity(uint16_t rnti) { + nr_sdap_entity_t *entityPtr, *entityPrev = NULL; + entityPtr = sdap_info.sdap_entity_llist; + + if(entityPtr->rnti == rnti) { + sdap_info.sdap_entity_llist = sdap_info.sdap_entity_llist->next_entity; + free(entityPtr); + } else { + while(entityPtr->rnti != rnti && entityPtr->next_entity != NULL) { + entityPrev = entityPtr; + entityPtr = entityPtr->next_entity; + } + + if(entityPtr->rnti != rnti) { + entityPrev->next_entity = entityPtr->next_entity; + free(entityPtr); + } + } +} diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h new file mode 100644 index 0000000000..b46e5bf4e3 --- /dev/null +++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h @@ -0,0 +1,182 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _NR_SDAP_ENTITY_H_ +#define _NR_SDAP_ENTITY_H_ + +#include +#include "openair2/COMMON/platform_types.h" +#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h" +#include "NR_RadioBearerConfig.h" + +#define SDAP_BITMASK_DC (0x80) +#define SDAP_BITMASK_R (0x40) +#define SDAP_BITMASK_QFI (0x3F) +#define SDAP_BITMASK_RQI (0x40) +#define SDAP_HDR_UL_DATA_PDU (1) +#define SDAP_HDR_UL_CTRL_PDU (0) +#define SDAP_HDR_LENGTH (1) +#define SDAP_MAX_QFI (64) +#define SDAP_MAP_RULE_EMPTY (0) +#define AVLBL_DRB (5) +#define SDAP_NO_MAPPING_RULE (0) +#define SDAP_REFLECTIVE_MAPPING (1) +#define SDAP_RQI_HANDLING (1) +#define SDAP_CTRL_PDU_MAP_DEF_DRB (0) +#define SDAP_CTRL_PDU_MAP_RULE_DRB (1) +#define SDAP_MAX_PDU (9000) + +/* + * The values of QoS Flow ID (QFI) and Reflective QoS Indication, + * are located in the PDU Session Container, which is conveyed by + * the GTP-U Extension Header. Inside the DL PDU SESSION INFORMATION frame. + * TS 38.415 Fig. 5.5.2.1-1 + */ +typedef struct nr_sdap_dl_hdr_s { + uint8_t QFI:6; + uint8_t RQI:1; + uint8_t RDI:1; +} __attribute__((packed)) nr_sdap_dl_hdr_t; + +typedef struct nr_sdap_ul_hdr_s { + uint8_t QFI:6; + uint8_t R:1; + uint8_t DC:1; +} __attribute__((packed)) nr_sdap_ul_hdr_t; + +typedef struct qfi2drb_s { + rb_id_t drb_id; + boolean_t hasSdap; +} qfi2drb_t; + +void nr_pdcp_submit_sdap_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); + +typedef struct nr_sdap_entity_s { + uint16_t rnti; + rb_id_t default_drb; + int pdusession_id; + qfi2drb_t qfi2drb_table[SDAP_MAX_QFI]; + + void (*qfi2drb_map_update)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap); + void (*qfi2drb_map_delete)(struct nr_sdap_entity_s *entity, uint8_t qfi); + rb_id_t (*qfi2drb_map)(struct nr_sdap_entity_s *entity, uint8_t qfi, rb_id_t upper_layer_rb_id); + + nr_sdap_ul_hdr_t (*sdap_construct_ctrl_pdu)(uint8_t qfi); + rb_id_t (*sdap_map_ctrl_pdu)(struct nr_sdap_entity_s *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi); + void (*sdap_submit_ctrl_pdu)(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); + + + boolean_t (*tx_entity)(struct nr_sdap_entity_s *entity, + protocol_ctxt_t *ctxt_p, + const srb_flag_t srb_flag, + const rb_id_t rb_id, + const mui_t mui, + const confirm_t confirm, + const sdu_size_t sdu_buffer_size, + unsigned char *const sdu_buffer, + const pdcp_transmission_mode_t pt_mode, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi + ); + + void (*rx_entity)(struct nr_sdap_entity_s *entity, + rb_id_t pdcp_entity, + int is_gnb, + int has_sdap, + int has_sdapULheader, + int pdusession_id, + int rnti, + char *buf, + int size); + + /* List of entities */ + struct nr_sdap_entity_s *next_entity; +} nr_sdap_entity_t; + +/* QFI to DRB Mapping Related Function */ +void nr_sdap_qfi2drb_map_update(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t drb, boolean_t hasSdap); + +/* QFI to DRB Mapping Related Function */ +void nr_sdap_qfi2drb_map_del(nr_sdap_entity_t *entity, uint8_t qfi); + +/* + * TS 37.324 + * 4.4 Functions + * Mapping between a QoS flow and a DRB for both DL and UL. + * + * 5.2.1 Uplink + * If there is no stored QoS flow to DRB mapping rule for the QoS flow as specified in the subclause 5.3, map the SDAP SDU to the default DRB + * else, map the SDAP SDU to the DRB according to the stored QoS flow to DRB mapping rule. + */ +rb_id_t nr_sdap_qfi2drb_map(nr_sdap_entity_t *entity, uint8_t qfi, rb_id_t upper_layer_rb_id); + +/* + * TS 37.324 5.3 QoS flow to DRB Mapping + * construct an end-marker control PDU, as specified in the subclause 6.2.3, for the QoS flow; + */ +nr_sdap_ul_hdr_t nr_sdap_construct_ctrl_pdu(uint8_t qfi); + +/* + * TS 37.324 5.3 QoS flow to DRB Mapping + * map the end-marker control PDU to the + * 1.) default DRB or + * 2.) DRB according to the stored QoS flow to DRB mapping rule + */ +rb_id_t nr_sdap_map_ctrl_pdu(nr_sdap_entity_t *entity, rb_id_t pdcp_entity, int map_type, uint8_t dl_qfi); + +/* + * TS 37.324 5.3 QoS flow to DRB Mapping + * Submit the end-marker control PDU to the lower layer. + */ +void nr_sdap_submit_ctrl_pdu(int rnti, rb_id_t sdap_ctrl_pdu_drb, nr_sdap_ul_hdr_t ctrl_pdu); + +/* + * TS 37.324 5.3 QoS flow to DRB Mapping + * 5.3.1 Configuration Procedures + */ +void nr_sdap_ue_qfi2drb_config(nr_sdap_entity_t *existing_sdap_entity, + rb_id_t pdcp_entity, + uint16_t rnti, + NR_QFI_t *mapped_qfi_2_add, + uint8_t mappedQFIs2AddCount, + uint8_t drb_identity); + +/* + * TS 37.324 4.4 5.1.1 SDAP entity establishment + * Establish an SDAP entity. + */ +nr_sdap_entity_t *new_nr_sdap_entity(int has_sdap, + uint16_t rnti, + int pdusession_id, + boolean_t is_defaultDRB, + uint8_t default_DRB, + NR_QFI_t *mapped_qfi_2_add, + uint8_t mappedQFIs2AddCount); + +/* Entity Handling Related Functions */ +nr_sdap_entity_t *nr_sdap_get_entity(uint16_t rnti, int pdusession_id); + +/* Entity Handling Related Functions */ +void delete_nr_sdap_entity(uint16_t rnti); + +#endif diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.c b/openair2/SDAP/nr_sdap/nr_sdap_gnb.c deleted file mode 100644 index 5f0a2640e9..0000000000 --- a/openair2/SDAP/nr_sdap/nr_sdap_gnb.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "nr_sdap_gnb.h" -#include - -boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id - ) { - if(sdu_buffer == NULL) { - LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL sdu_buffer \n", __FILE__, __LINE__, __FUNCTION__); - exit(1); - } - - if(sdu_buffer_size == 0) { - LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - NULL or 0 sdu_buffer_size \n", __FILE__, __LINE__, __FUNCTION__); - exit(1); - } - - uint8_t *sdap_buf = (uint8_t *)malloc(sdu_buffer_size+SDAP_HDR_LENGTH); - nr_sdap_dl_hdr_t sdap_hdr; - sdap_hdr.RDI = 0; // SDAP_Hardcoded - - sdap_hdr.RQI = 0; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION - sdap_hdr.QFI = 1; // SDAP_Hardcoded - Should get this info from DL_PDU_SESSION_INFORMATION - memcpy(&sdap_buf[0], &sdap_hdr, 1); - memcpy(&sdap_buf[1], sdu_buffer, sdu_buffer_size); - rb_id_t sdap_drb_id = rb_id; // SDAP_Hardcoded - Should get this info from QFI to DRB mapping table - boolean_t ret = pdcp_data_req(ctxt_p, - srb_flag, - sdap_drb_id, - mui, - confirm, - sdu_buffer_size+1, - sdap_buf, - pt_mode, - sourceL2Id, - destinationL2Id); - - if(!ret) { - LOG_E(PDCP, "%s:%d:%s: SDAP Layer gNB - PDCP DL refused PDU\n", __FILE__, __LINE__, __FUNCTION__); - free(sdap_buf); - return 0; - } - - free(sdap_buf); - return 1; -} - -void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr) { - nr_sdap_ul_hdr_t *sdap_hdr_ul = (nr_sdap_ul_hdr_t *)&sdap_gnb_ul_hdr; - - switch (sdap_hdr_ul->DC) { - case SDAP_HDR_UL_DATA_PDU: - LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - UL Received SDAP Data PDU\n", __FILE__, __LINE__, __FUNCTION__); - break; - - case SDAP_HDR_UL_CTRL_PDU: - LOG_I(PDCP, "%s:%d:%s: SDAP Layer gNB - Received SDAP Control PDU\n", __FILE__, __LINE__, __FUNCTION__); - break; - } -} \ No newline at end of file diff --git a/openair2/SDAP/nr_sdap/nr_sdap_gnb.h b/openair2/SDAP/nr_sdap/nr_sdap_gnb.h deleted file mode 100644 index 243aa89010..0000000000 --- a/openair2/SDAP/nr_sdap/nr_sdap_gnb.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#ifndef _NR_SDAP_GNB_ -#define _NR_SDAP_GNB_ - -#include "openair2/COMMON/platform_types.h" -#include "common/utils/LOG/log.h" - -#define SDAP_BITMASK_DC (0x80) -#define SDAP_BITMASK_R (0x40) -#define SDAP_BITMASK_QFI (0x3F) -#define SDAP_HDR_UL_DATA_PDU (1) -#define SDAP_HDR_UL_CTRL_PDU (0) -#define SDAP_HDR_LENGTH (1) - -typedef struct nr_sdap_dl_hdr_s { - uint8_t QFI:6; - uint8_t RQI:1; - uint8_t RDI:1; -} __attribute__((packed)) nr_sdap_dl_hdr_t; - -typedef struct nr_sdap_ul_hdr_s { - uint8_t QFI:6; - uint8_t R:1; - uint8_t DC:1; -} __attribute__((packed)) nr_sdap_ul_hdr_t; - -boolean_t sdap_gnb_data_req(protocol_ctxt_t *ctxt_p, - const srb_flag_t srb_flag, - const rb_id_t rb_id, - const mui_t mui, - const confirm_t confirm, - const sdu_size_t sdu_buffer_size, - unsigned char *const sdu_buffer, - const pdcp_transmission_mode_t pt_mode, - const uint32_t *sourceL2Id, - const uint32_t *destinationL2Id - ); - -void sdap_gnb_ul_header_handler(char sdap_gnb_ul_hdr); - -#endif \ No newline at end of file diff --git a/openair2/SDAP/nr_sdap/sdap_gNB.c b/openair2/SDAP/nr_sdap/sdap_gNB.c deleted file mode 100644 index ad84e4c273..0000000000 --- a/openair2/SDAP/nr_sdap/sdap_gNB.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file sdap_gNB.c - * \brief sdap tasks for gNB - * \author Konstantinos Alexandris , Cedric Roux , Navid Nikaein - * \date 2018 - * \version 1.0 - */ -#define SDAP_GNB -#define SDAP_GNB_C - diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index cc41de3550..7b8ba308bf 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -17,9 +17,11 @@ extern "C" { #include #include #include -#include "openair2/SDAP/nr_sdap/nr_sdap_gnb.h" +#include "openair2/SDAP/nr_sdap/nr_sdap.h" //#include +static boolean_t is_gnb = false; + #pragma pack(1) typedef struct Gtpv1uMsgHeader { @@ -34,8 +36,35 @@ typedef struct Gtpv1uMsgHeader { teid_t teid; } __attribute__((packed)) Gtpv1uMsgHeaderT; +typedef struct Gtpv1uMsgHeaderOptFields { + uint8_t seqNum1Oct; + uint8_t seqNum2Oct; + uint8_t NPDUNum; + uint8_t NextExtHeaderType; +} __attribute__((packed)) Gtpv1uMsgHeaderOptFieldsT; + +typedef struct PDUSessionContainer { + uint8_t spare:4; + uint8_t PDU_type:4; + uint8_t QFI:6; + uint8_t RQI:1; + uint8_t PPP:1; +} __attribute__((packed)) PDUSessionContainerT; + +typedef struct Gtpv1uExtHeader { + uint8_t ExtHeaderLen; + PDUSessionContainerT pdusession_cntr; + //uint8_t NextExtHeaderType; +}__attribute__((packed)) Gtpv1uExtHeaderT; + #pragma pack() +// TS 29.281, fig 5.2.1-3 +#define PDU_SESSION_CONTAINER (0x85) +// TS 29.281, 5.2.1 +#define EXT_HDR_LNTH_OCTET_UNITS (4) +#define NO_MORE_EXT_HDRS (0) + // TS 29.060, table 7.1 defines the possible message types // here are all the possible messages (3GPP R16) #define GTP_ECHO_REQ (1) @@ -65,6 +94,8 @@ typedef struct { rnti_t rnti; ebi_t incoming_rb_id; gtpCallback callBack; + gtpCallbackSDAP callBackSDAP; + int pdusession_id; } rntiData_t; class gtpEndPoint { @@ -448,6 +479,10 @@ teid_t newGtpuCreateTunnel(instance_t instance, rnti_t rnti, int incoming_bearer inst->te2ue_mapping[incoming_teid].incoming_rb_id= incoming_bearer_id; inst->te2ue_mapping[incoming_teid].callBack=callBack; + + inst->te2ue_mapping[incoming_teid].callBackSDAP = sdap_data_req; + + inst->te2ue_mapping[incoming_teid].pdusession_id = (uint8_t)outgoing_bearer_id; gtpv1u_bearer_t *tmp=&inst->ue2te_mapping[rnti].bearers[outgoing_bearer_id]; @@ -567,14 +602,14 @@ int gtpv1u_create_ngu_tunnel( const instance_t instance, create_tunnel_req->num_tunnels, create_tunnel_req->outgoing_teid[0]); tcp_udp_port_t dstport=globGtp.instances[compatInst(instance)].get_dstport(); - + is_gnb = true; for (int i = 0; i < create_tunnel_req->num_tunnels; i++) { teid_t teid=newGtpuCreateTunnel(instance, create_tunnel_req->rnti, create_tunnel_req->incoming_rb_id[i], create_tunnel_req->pdusession_id[i], create_tunnel_req->outgoing_teid[i], create_tunnel_req->dst_addr[i], dstport, - sdap_gnb_data_req); + pdcp_data_req); create_tunnel_resp->status=0; create_tunnel_resp->rnti=create_tunnel_req->rnti; create_tunnel_resp->num_tunnels=create_tunnel_req->num_tunnels; @@ -815,10 +850,28 @@ static int Gtpv1uHandleGpdu(int h, return GTPNOK; } - int offset=8; + int offset=sizeof(Gtpv1uMsgHeaderT); - if( msgHdr->E || msgHdr->S ||msgHdr->PN) - offset+=8; + uint8_t qfi = 0; + boolean_t rqi = FALSE; + + if( msgHdr->E || msgHdr->S || msgHdr->PN){ + Gtpv1uMsgHeaderOptFieldsT *msgHdrOpt = (Gtpv1uMsgHeaderOptFieldsT *)(msgBuf+offset); + offset+=sizeof(Gtpv1uMsgHeaderOptFieldsT); + if( msgHdr->E && msgHdrOpt->NextExtHeaderType == PDU_SESSION_CONTAINER){ + Gtpv1uExtHeaderT *msgHdrExt = (Gtpv1uExtHeaderT *)(msgBuf+offset); + offset+=msgHdrExt->ExtHeaderLen*EXT_HDR_LNTH_OCTET_UNITS; + qfi = msgHdrExt->pdusession_cntr.QFI; + rqi = msgHdrExt->pdusession_cntr.RQI; + + /* + * Check if the next extension header type of GTP extension header is set to 0 + * We can not put it in the struct Gtpv1uExtHeaderT because the length is dynamic. + */ + if(*(msgBuf+offset-1) != NO_MORE_EXT_HDRS) + LOG_W(GTPU, "Warning - Next extension header is not zero, handle it \n"); + } + } // This context is not good for gtp // frame, ... has no meaning @@ -843,17 +896,34 @@ static int Gtpv1uHandleGpdu(int h, const uint32_t destinationL2Id=0; pthread_mutex_unlock(&globGtp.gtp_lock); - if ( !tunnel->second.callBack(&ctxt, - srb_flag, - rb_id, - mui, - confirm, - sdu_buffer_size, - sdu_buffer, - mode, - &sourceL2Id, - &destinationL2Id) ) - LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); + if(is_gnb && qfi){ + if ( !tunnel->second.callBackSDAP(&ctxt, + srb_flag, + rb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + mode, + &sourceL2Id, + &destinationL2Id, + qfi, + rqi, + tunnel->second.pdusession_id) ) + LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); + } else { + if ( !tunnel->second.callBack(&ctxt, + srb_flag, + rb_id, + mui, + confirm, + sdu_buffer_size, + sdu_buffer, + mode, + &sourceL2Id, + &destinationL2Id) ) + LOG_E(GTPU,"[%d] down layer refused incoming packet\n", h); + } LOG_D(GTPU,"[%d] Received a %d bytes packet for: teid:%x\n", h, msgBufLen-offset, diff --git a/openair3/ocp-gtpu/gtp_itf.h b/openair3/ocp-gtpu/gtp_itf.h index ba6cf0f8bb..17882ebf1e 100644 --- a/openair3/ocp-gtpu/gtp_itf.h +++ b/openair3/ocp-gtpu/gtp_itf.h @@ -20,6 +20,21 @@ typedef boolean_t (*gtpCallback)( const uint32_t *sourceL2Id, const uint32_t *destinationL2Id); +typedef boolean_t (*gtpCallbackSDAP)( + protocol_ctxt_t *ctxt_pP, + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_buffer_sizeP, + unsigned char *const sdu_buffer_pP, + const pdcp_transmission_mode_t modeP, + const uint32_t *sourceL2Id, + const uint32_t *destinationL2Id, + const uint8_t qfi, + const boolean_t rqi, + const int pdusession_id); + typedef struct openAddr_s { char originHost[HOST_NAME_MAX]; char originService[HOST_NAME_MAX];