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 51acb75968..e06b0e39b6 100644
--- a/ci-scripts/ci_ueinfra.yaml
+++ b/ci-scripts/ci_ueinfra.yaml
@@ -39,6 +39,46 @@ 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
+ HostIPAddress : 192.168.18.89
+ HostUsername : root
+ HostPassword : toor
+ HostSourceCodePath : /tmp
+
+
+#an other scenario example
+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
+ 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..3407ec9046
--- /dev/null
+++ b/ci-scripts/cls_amarisoft_ue.py
@@ -0,0 +1,75 @@
+# * 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)
+ cmd='echo $USER; nohup '+self.Cmd + ' ' + self.Config + ' &'
+ mySSH.command(cmd,'#',5)
+ mySSH.close()
+
+
+
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index 5d89a7b2e0..ae6a26fc18 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)
@@ -418,49 +419,62 @@ 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])
+ 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):
@@ -1569,16 +1583,24 @@ 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)):
+ logging.debug("Ping analysis from amarisoft scenario")
+ 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)
@@ -1596,14 +1618,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 + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log'
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')
@@ -1613,7 +1635,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):
@@ -1625,13 +1648,25 @@ 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 + ' 2>&1 > ping_' + self.testCase_id + '_' + self.ue_id + '.log'
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 Ping log from AS server : " + Module_UE.Ping)
+ SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, Module_UE.Ping, '.')
+ 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:
@@ -1679,28 +1714,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')
@@ -1728,6 +1765,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):
@@ -1855,11 +1893,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
@@ -1870,6 +1918,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()
@@ -3447,16 +3496,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/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 5357a90a3d..ad9d97b787 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):
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_files/fr1_sa_amarisoft_ue_1x.xml b/ci-scripts/xml_files/fr1_sa_amarisoft_ue_1x.xml
new file mode 100644
index 0000000000..68df2873d9
--- /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
+ Initialize Amarisoft UE 1x
+ 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 from AS UEc
+ 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
+
+
+