<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/23476">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Initial Open5GS support<br><br>Change-Id: Iff8b88dc22d8f156572839abb48b0c1377c55e33<br>---<br>M contrib/jenkins-build-common.sh<br>M doc/manuals/chapters/install.adoc<br>M src/osmo_gsm_tester/obj/epc.py<br>A src/osmo_gsm_tester/obj/epc_open5gs.py<br>A src/osmo_gsm_tester/obj/hss_open5gs.py<br>A src/osmo_gsm_tester/obj/mme_open5gs.py<br>A src/osmo_gsm_tester/obj/pcrf_open5gs.py<br>A src/osmo_gsm_tester/obj/sgwc_open5gs.py<br>A src/osmo_gsm_tester/obj/sgwu_open5gs.py<br>A src/osmo_gsm_tester/obj/smf_open5gs.py<br>A src/osmo_gsm_tester/obj/upf_open5gs.py<br>A src/osmo_gsm_tester/templates/open5gs-freediameter.conf.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-hssd.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-mmed.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-pcrfd.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-sgwcd.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-sgwud.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-smfd.yaml.tmpl<br>A src/osmo_gsm_tester/templates/open5gs-upfd.yaml.tmpl<br>M sysmocom/defaults.conf<br>A sysmocom/scenarios/cfg-epc-db@.conf<br>21 files changed, 2,973 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/jenkins-build-common.sh b/contrib/jenkins-build-common.sh</span><br><span>index 75d1e4f..9d59ca7 100644</span><br><span>--- a/contrib/jenkins-build-common.sh</span><br><span>+++ b/contrib/jenkins-build-common.sh</span><br><span>@@ -154,7 +154,7 @@</span><br><span>   elif [ -f meson.build ]; then</span><br><span>     rm -rf build && mkdir build && cd build || exit 1</span><br><span>     set +x; echo; echo; set -x</span><br><span style="color: hsl(0, 100%, 40%);">-    meson ../ --prefix=$prefix $configure_opts</span><br><span style="color: hsl(120, 100%, 40%);">+    meson ../ --prefix=$prefix --libdir="lib" $configure_opts</span><br><span>     ninja -j8</span><br><span>     ninja install</span><br><span>     return</span><br><span>diff --git a/doc/manuals/chapters/install.adoc b/doc/manuals/chapters/install.adoc</span><br><span>index c94c596..fb364aa 100644</span><br><span>--- a/doc/manuals/chapters/install.adoc</span><br><span>+++ b/doc/manuals/chapters/install.adoc</span><br><span>@@ -392,6 +392,13 @@</span><br><span>         pydbus</span><br><span> ----</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+If one plans to use Open5GS EPC, pymongo modules to interact against MongoDB</span><br><span style="color: hsl(120, 100%, 40%);">+(_epc_open5gs.py_) shall be installed:</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+pip3 install \</span><br><span style="color: hsl(120, 100%, 40%);">+        pymongo</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> IMPORTANT: ofono may need to be installed from source to contain the most</span><br><span> recent fixes needed to operate your modems. This depends on the modem hardware</span><br><span> used and the tests run. Please see <<hardware_modems>>.</span><br><span>diff --git a/src/osmo_gsm_tester/obj/epc.py b/src/osmo_gsm_tester/obj/epc.py</span><br><span>index aaa96b7..4c43f5e 100644</span><br><span>--- a/src/osmo_gsm_tester/obj/epc.py</span><br><span>+++ b/src/osmo_gsm_tester/obj/epc.py</span><br><span>@@ -71,6 +71,9 @@</span><br><span>         elif epc_type == 'srsepc':</span><br><span>             from .epc_srs import srsEPC</span><br><span>             epc_class = srsEPC</span><br><span style="color: hsl(120, 100%, 40%);">+        elif epc_type == 'open5gsepc':</span><br><span style="color: hsl(120, 100%, 40%);">+            from .epc_open5gs import Open5gsEPC</span><br><span style="color: hsl(120, 100%, 40%);">+            epc_class = Open5gsEPC</span><br><span>         else:</span><br><span>             raise log.Error('EPC type not supported:', epc_type)</span><br><span> </span><br><span>diff --git a/src/osmo_gsm_tester/obj/epc_open5gs.py b/src/osmo_gsm_tester/obj/epc_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..15f4eab</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/epc_open5gs.py</span><br><span>@@ -0,0 +1,184 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS EPC</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+import copy</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+from .pcrf_open5gs import Open5gsPCRF</span><br><span style="color: hsl(120, 100%, 40%);">+from .upf_open5gs import Open5gsUPF</span><br><span style="color: hsl(120, 100%, 40%);">+from .smf_open5gs import Open5gsSMF</span><br><span style="color: hsl(120, 100%, 40%);">+from .hss_open5gs import Open5gsHSS</span><br><span style="color: hsl(120, 100%, 40%);">+from .mme_open5gs import Open5gsMME</span><br><span style="color: hsl(120, 100%, 40%);">+from .sgwc_open5gs import Open5gsSGWC</span><br><span style="color: hsl(120, 100%, 40%);">+from .sgwu_open5gs import Open5gsSGWU</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    config_schema = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'db_host': schema.STR,</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+    schema.register_config_schema('epc', config_schema)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsEPC(epc.EPC):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_node):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(testenv, run_node, 'open5gs_epc')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.pcrf = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.upf = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.smf = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.mme = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.hss = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwc = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwu = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.subscriber_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.pcrf:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.pcrf.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.upf:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.upf.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.smf:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.smf.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.hss:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.hss.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.mme:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.mme.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.sgwc.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.sgwu.cleanup()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        values = super().configure(['open5gsepc'])</span><br><span style="color: hsl(120, 100%, 40%);">+        db_host = values['epc']['db_host']</span><br><span style="color: hsl(120, 100%, 40%);">+        db_uri = 'mongodb://'+db_host+'/open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(epc=dict(db_uri=db_uri)))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.fill_subscribers_mongodb(values['epc']['db_host'], 27017)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.pcrf = Open5gsPCRF(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.upf = Open5gsUPF(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.smf = Open5gsSMF(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.hss = Open5gsHSS(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.mme = Open5gsMME(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwc = Open5gsSGWC(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwu = Open5gsSGWU(self.testenv, self)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.pcrf.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.upf.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.smf.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.hss.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.mme.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwc.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwu.configure(copy.deepcopy(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting srsepc')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.configure()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.pcrf.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.upf.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.smf.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.hss.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.mme.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwc.start()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.sgwu.start()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def subscriber_add(self, modem, msisdn=None, algo_str=None):</span><br><span style="color: hsl(120, 100%, 40%);">+        if msisdn is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            msisdn = modem.msisdn()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if algo_str is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            algo_str = modem.auth_algo() or 'milenage'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if algo_str == 'milenage':</span><br><span style="color: hsl(120, 100%, 40%);">+            if not modem.ki():</span><br><span style="color: hsl(120, 100%, 40%);">+                raise log.Error("Auth algo milenage selected but no KI specified")</span><br><span style="color: hsl(120, 100%, 40%);">+            if not modem.opc():</span><br><span style="color: hsl(120, 100%, 40%);">+                raise log.Error("Auth algo milenage selected but no OPC specified")</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error("Open5Gs only supports auth algo: milenage")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        subscriber_id = len(self.subscriber_list) # list index</span><br><span style="color: hsl(120, 100%, 40%);">+        self.subscriber_list.append({'id': subscriber_id, 'imsi': modem.imsi(), 'msisdn': msisdn, 'auth_algo': algo_str, 'ki': modem.ki(), 'opc': modem.opc(), 'apn_ipaddr': modem.apn_ipaddr()})</span><br><span style="color: hsl(120, 100%, 40%);">+        return subscriber_id</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def fill_subscribers_mongodb(self, server, port):</span><br><span style="color: hsl(120, 100%, 40%);">+        import pymongo</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        myclient = pymongo.MongoClient("mongodb://" + str(server) + ":" + str(port) + "/")</span><br><span style="color: hsl(120, 100%, 40%);">+        mydb = myclient["open5gs"]</span><br><span style="color: hsl(120, 100%, 40%);">+        mycol = mydb["subscribers"]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for s in self.subscriber_list:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log('Insert subscriber to DB', msisdn=s['msisdn'], imsi=s['imsi'], subscriber_id=s['id'],</span><br><span style="color: hsl(120, 100%, 40%);">+                     algo_str=s['auth_algo'])</span><br><span style="color: hsl(120, 100%, 40%);">+            slice_data = [ { \</span><br><span style="color: hsl(120, 100%, 40%);">+                "sst": 1, \</span><br><span style="color: hsl(120, 100%, 40%);">+                "default_indicator": True, \</span><br><span style="color: hsl(120, 100%, 40%);">+                "session": [ \</span><br><span style="color: hsl(120, 100%, 40%);">+                    { \</span><br><span style="color: hsl(120, 100%, 40%);">+                    "name": "internet", \</span><br><span style="color: hsl(120, 100%, 40%);">+                    "type": 3, "pcc_rule": [], "ambr": {"uplink": {"value": 1, "unit": 0}, "downlink": {"value": 1, "unit": 0}}, \</span><br><span style="color: hsl(120, 100%, 40%);">+                    "qos": { "index": 9, "arp": {"priority_level": 8, "pre_emption_capability": 1, "pre_emption_vulnerability": 1} } \</span><br><span style="color: hsl(120, 100%, 40%);">+                    } \</span><br><span style="color: hsl(120, 100%, 40%);">+                ] \</span><br><span style="color: hsl(120, 100%, 40%);">+            } ]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            sub_data = {'imsi':  s['imsi'], \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'subscribed_rau_tau_timer': 12, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'network_access_mode': 2, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'subscriber_status': 0, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        "access_restriction_data": 32, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'slice': slice_data, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'ambr': {"uplink": {"value": 1, "unit": 0}, "downlink": {"value": 1, "unit": 0}}, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        'security': {'k': s['ki'], 'amf': '8000', 'op': None, 'opc': s['opc']},</span><br><span style="color: hsl(120, 100%, 40%);">+                        'schema_version': 1, \</span><br><span style="color: hsl(120, 100%, 40%);">+                        '__v': 0}</span><br><span style="color: hsl(120, 100%, 40%);">+            x = mycol.insert_one(sub_data)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg("Added subscriber with Inserted ID : " + str(x.inserted_id))</span><br><span style="color: hsl(120, 100%, 40%);">+            s['inserted_id'] = x.inserted_id</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def enb_is_connected(self, enb):</span><br><span style="color: hsl(120, 100%, 40%);">+        # Match against sample mmed line: "eNB-S1 accepted[172.18.50.101]:50867"</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.mme or not self.mme.running():</span><br><span style="color: hsl(120, 100%, 40%);">+            return False</span><br><span style="color: hsl(120, 100%, 40%);">+        stdout_lines = (self.mme.process.get_stdout() or '').splitlines()</span><br><span style="color: hsl(120, 100%, 40%);">+        for l in stdout_lines:</span><br><span style="color: hsl(120, 100%, 40%);">+            if 'eNB' in l and 'accepted' in l and enb.addr() in l:</span><br><span style="color: hsl(120, 100%, 40%);">+                return True</span><br><span style="color: hsl(120, 100%, 40%);">+        return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return self.pcrf and self.upf and self.smf and self.hss and \</span><br><span style="color: hsl(120, 100%, 40%);">+               self.mme and self.sgwc and self.sgwu and \</span><br><span style="color: hsl(120, 100%, 40%);">+               self.pcrf.running() and self.upf.running() and self.smf.running() and \</span><br><span style="color: hsl(120, 100%, 40%);">+               self.hss.running() and self.mme.running() and self.sgwc.running() and \</span><br><span style="color: hsl(120, 100%, 40%);">+               self.sgwu.running()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def tun_addr(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return '172.16.0.1'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def get_kpis(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/hss_open5gs.py b/src/osmo_gsm_tester/obj/hss_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..211d09a</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/hss_open5gs.py</span><br><span>@@ -0,0 +1,158 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS hssd process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsHSS(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-hssd'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-hssd.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-hssd.log'</span><br><span style="color: hsl(120, 100%, 40%);">+    DIAMETERFILE = 'open5gs-freediameter.conf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-hssd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsHSS.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsHSS.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsHSS.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsHSS.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsHSS.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsHSS.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsHSS.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsHSS.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = self.run_dir.child(Open5gsHSS.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsHSS.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsHSS.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsHSS.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsHSS.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_diameter_file = remote_run_dir.child(Open5gsHSS.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        diameter_file = self.diameter_file if self._run_node.is_local() else self.remote_diameter_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(hss=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             diameter_filename=diameter_file,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(diameter=dict(identity=self.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  inst_prefix=inst_prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_port=self.diameter_port(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_name=self.o5gs_epc.mme.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_port=self.o5gs_epc.mme.diameter_port())))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-HSS CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsHSS.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.diameter_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsHSS.DIAMETERFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-diam-to-remote', self.diameter_file, self.remote_diameter_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_name(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 'hss'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 3868;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/mme_open5gs.py b/src/osmo_gsm_tester/obj/mme_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..0b3d633</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/mme_open5gs.py</span><br><span>@@ -0,0 +1,172 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS mmed process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsMME(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-mmed'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-mmed.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-mmed.log'</span><br><span style="color: hsl(120, 100%, 40%);">+    DIAMETERFILE = 'open5gs-freediameter.conf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-mmed')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsMME.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsMME.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # setting capabilities will later disable use of LD_LIBRARY_PATH from ELF loader -> modify RPATH instead.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Setting RPATH for open5gs-mmed')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host.change_elf_rpath(remote_binary, remote_lib)</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-mmed requires CAP_NET_ADMIN to create tunnel devices: ioctl(TUNSETIFF):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Applying CAP_NET_ADMIN capability to open5gs-mmed')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host.setcap_net_admin(remote_binary)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsMME.BINFILE, args)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsMME.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # setting capabilities will later disable use of LD_LIBRARY_PATH from ELF loader -> modify RPATH instead.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Setting RPATH for open5gs-mmed')</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-mmed binary needs patchelf <= 0.9 (0.10 and current master fail) to avoid failing during patch. OS#4389, patchelf-GH#192.</span><br><span style="color: hsl(120, 100%, 40%);">+        util.change_elf_rpath(binary, util.prepend_library_path(lib), self.run_dir.new_dir('patchelf'))</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-mmed requires CAP_NET_ADMIN to create tunnel devices: ioctl(TUNSETIFF):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Applying CAP_NET_ADMIN capability to open5gs-mmed')</span><br><span style="color: hsl(120, 100%, 40%);">+        util.setcap_net_admin(binary, self.run_dir.new_dir('setcap_net_admin'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsMME.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsMME.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsMME.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsMME.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = self.run_dir.child(Open5gsMME.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsMME.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsMME.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsMME.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsMME.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_diameter_file = remote_run_dir.child(Open5gsMME.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        diameter_file = self.diameter_file if self._run_node.is_local() else self.remote_diameter_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(mme=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             diameter_filename=diameter_file,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(diameter=dict(identity=self.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  inst_prefix=inst_prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_port=self.diameter_port(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_name=self.o5gs_epc.hss.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_port=self.o5gs_epc.hss.diameter_port())))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-MME CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsMME.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.diameter_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsMME.DIAMETERFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-diam-to-remote', self.diameter_file, self.remote_diameter_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_name(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 'mme'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 3868 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/pcrf_open5gs.py b/src/osmo_gsm_tester/obj/pcrf_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..4f93a47</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/pcrf_open5gs.py</span><br><span>@@ -0,0 +1,158 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS pcrfd process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsPCRF(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-pcrfd'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-pcrfd.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-pcrfd.log'</span><br><span style="color: hsl(120, 100%, 40%);">+    DIAMETERFILE = 'open5gs-freediameter.conf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-pcrfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsPCRF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsPCRF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsPCRF.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsPCRF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsPCRF.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsPCRF.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsPCRF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsPCRF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = self.run_dir.child(Open5gsPCRF.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsPCRF.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsPCRF.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsPCRF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsPCRF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_diameter_file = remote_run_dir.child(Open5gsPCRF.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        diameter_file = self.diameter_file if self._run_node.is_local() else self.remote_diameter_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(pcrf=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             diameter_filename=diameter_file,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(diameter=dict(identity=self.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  inst_prefix=inst_prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_port=self.diameter_port(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_name=self.o5gs_epc.smf.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_port=self.o5gs_epc.smf.diameter_port())))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-PCRF CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsPCRF.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.diameter_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsPCRF.DIAMETERFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-diam-to-remote', self.diameter_file, self.remote_diameter_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_name(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 'pcrf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 3868 + 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/sgwc_open5gs.py b/src/osmo_gsm_tester/obj/sgwc_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..efc4568</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/sgwc_open5gs.py</span><br><span>@@ -0,0 +1,132 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS swgcd process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsSGWC(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-sgwcd'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-sgwcd.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-sgwcd.log'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-sgwcd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsSGWC.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsSGWC.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsSGWC.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsSGWC.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsSGWC.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsSGWC.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsSGWC.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsSGWC.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsSGWC.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsSGWC.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsSGWC.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsSGWC.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(sgwc=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-SGWC CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsSGWC.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/sgwu_open5gs.py b/src/osmo_gsm_tester/obj/sgwu_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..b97dd92</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/sgwu_open5gs.py</span><br><span>@@ -0,0 +1,140 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS sgwud process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsSGWU(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-sgwud'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-sgwud.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-sgwud.log'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-sgwud')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsSGWU.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsSGWU.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsSGWU.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsSGWU.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # setting capabilities will later disable use of LD_LIBRARY_PATH from ELF loader -> modify RPATH instead.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Setting RPATH for open5gs-sgwud')</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-sgwud binary needs patchelf <= 0.9 (0.10 and current master fail) to avoid failing during patch. OS#4389, patchelf-GH#192.</span><br><span style="color: hsl(120, 100%, 40%);">+        util.change_elf_rpath(binary, util.prepend_library_path(lib), self.run_dir.new_dir('patchelf'))</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-sgwud requires CAP_NET_ADMIN to create tunnel devices: ioctl(TUNSETIFF):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Applying CAP_NET_ADMIN capability to open5gs-sgwud')</span><br><span style="color: hsl(120, 100%, 40%);">+        util.setcap_net_admin(binary, self.run_dir.new_dir('setcap_net_admin'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsSGWU.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsSGWU.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsSGWU.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsSGWU.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsSGWU.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsSGWU.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsSGWU.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsSGWU.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(sgwu=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-SGWU CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsSGWU.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/smf_open5gs.py b/src/osmo_gsm_tester/obj/smf_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..5241dc2</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/smf_open5gs.py</span><br><span>@@ -0,0 +1,158 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open5GS smfd process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsSMF(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-smfd'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-smfd.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-smfd.log'</span><br><span style="color: hsl(120, 100%, 40%);">+    DIAMETERFILE = 'open5gs-freediameter.conf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-smfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_diameter_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsSMF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_env = { 'LD_LIBRARY_PATH': self.remote_inst.child('lib') }</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsSMF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsSMF.BINFILE, args, remote_env=remote_env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsSMF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsSMF.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsSMF.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsSMF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsSMF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.diameter_file = self.run_dir.child(Open5gsSMF.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsSMF.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsSMF.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsSMF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsSMF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_diameter_file = remote_run_dir.child(Open5gsSMF.DIAMETERFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        diameter_file = self.diameter_file if self._run_node.is_local() else self.remote_diameter_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(smf=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             diameter_filename=diameter_file,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(diameter=dict(identity=self.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  inst_prefix=inst_prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  listen_port=self.diameter_port(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_name=self.o5gs_epc.pcrf.diameter_name(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_address=self.o5gs_epc.addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  connect_port=self.o5gs_epc.pcrf.diameter_port())))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-SMF CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsSMF.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.diameter_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsSMF.DIAMETERFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-diam-to-remote', self.diameter_file, self.remote_diameter_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_name(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 'smf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def diameter_port(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return 3868 + 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/obj/upf_open5gs.py b/src/osmo_gsm_tester/obj/upf_open5gs.py</span><br><span>new file mode 100644</span><br><span>index 0000000..f22a6d7</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/upf_open5gs.py</span><br><span>@@ -0,0 +1,147 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running an Open%GS upfd process</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import pprint</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log, util, config, template, process, remote</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import schema</span><br><span style="color: hsl(120, 100%, 40%);">+from . import epc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_register_schemas():</span><br><span style="color: hsl(120, 100%, 40%);">+    pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class Open5gsUPF(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    REMOTE_DIR = '/osmo-gsm-tester-open5gs'</span><br><span style="color: hsl(120, 100%, 40%);">+    BINFILE = 'open5gs-upfd'</span><br><span style="color: hsl(120, 100%, 40%);">+    CFGFILE = 'open5gs-upfd.yaml'</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGFILE = 'open5gs-upfd.log'</span><br><span style="color: hsl(120, 100%, 40%);">+    DIAMETERFILE = 'open5gs-freediameter.conf'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, o5gs_epc):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, 'open5gs-upfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self.o5gs_epc = o5gs_epc</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = o5gs_epc.run_node()</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_inst = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_config_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.remote_log_file = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def cleanup(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.process is None:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        # copy back files (may not exist, for instance if there was an early error of process):</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scpfrom('scp-back-log', self.remote_log_file, self.log_file)</span><br><span style="color: hsl(120, 100%, 40%);">+        except Exception as e:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.log(repr(e))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Starting %s' % Open5gsUPF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        if self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_locally()</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.start_remotely()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_remotely(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_lib = self.remote_inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        remote_binary = self.remote_inst.child('bin', Open5gsUPF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # setting capabilities will later disable use of LD_LIBRARY_PATH from ELF loader -> modify RPATH instead.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Setting RPATH for open5gs-upfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host.change_elf_rpath(remote_binary, remote_lib)</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-upfd requires CAP_NET_ADMIN to create tunnel devices: ioctl(TUNSETIFF):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Applying CAP_NET_ADMIN capability to open5gs-upfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host.setcap_net_admin(remote_binary)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (remote_binary, '-c', self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = self.rem_host.RemoteProcess(Open5gsUPF.BINFILE, args)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def start_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        binary = self.inst.child('bin', Open5gsUPF.BINFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        lib = self.inst.child('lib')</span><br><span style="color: hsl(120, 100%, 40%);">+        env = {}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # setting capabilities will later disable use of LD_LIBRARY_PATH from ELF loader -> modify RPATH instead.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Setting RPATH for open5gs-upfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-upfd binary needs patchelf <= 0.9 (0.10 and current master fail) to avoid failing during patch. OS#4389, patchelf-GH#192.</span><br><span style="color: hsl(120, 100%, 40%);">+        util.change_elf_rpath(binary, util.prepend_library_path(lib), self.run_dir.new_dir('patchelf'))</span><br><span style="color: hsl(120, 100%, 40%);">+        # open5gs-upfd requires CAP_NET_ADMIN to create tunnel devices: ioctl(TUNSETIFF):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log('Applying CAP_NET_ADMIN capability to open5gs-upfd')</span><br><span style="color: hsl(120, 100%, 40%);">+        util.setcap_net_admin(binary, self.run_dir.new_dir('setcap_net_admin'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        args = (binary, '-c', os.path.abspath(self.config_file))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process = process.Process(self.name(), self.run_dir, args, env=env)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.process)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.process.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def configure(self, values):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.o5gs_epc.run_dir.new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.inst = util.Dir(os.path.abspath(self.testenv.suite().trial().get_inst('open5gs', self._run_node.run_label())))</span><br><span style="color: hsl(120, 100%, 40%);">+        if not os.path.isdir(self.inst.child('lib')):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No lib/ in', self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self.inst.isfile('bin', Open5gsUPF.BINFILE):</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('No %s binary in' % Open5gsUPF.BINFILE, self.inst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.config_file = self.run_dir.child(Open5gsUPF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.log_file = self.run_dir.child(Open5gsUPF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_prefix_dir = util.Dir(Open5gsUPF.REMOTE_DIR)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_inst = util.Dir(remote_prefix_dir.child(os.path.basename(str(self.inst))))</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_run_dir = util.Dir(remote_prefix_dir.child(Open5gsUPF.BINFILE))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_config_file = remote_run_dir.child(Open5gsUPF.CFGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.remote_log_file = remote_run_dir.child(Open5gsUPF.LOGFILE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        logfile = self.log_file if self._run_node.is_local() else self.remote_log_file</span><br><span style="color: hsl(120, 100%, 40%);">+        inst_prefix = str(self.inst) if self._run_node.is_local() else str(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+        config.overlay(values, dict(upf=dict(log_filename=logfile,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             inst_prefix=inst_prefix)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('OPEN5GS-UPF CONFIG:\n' + pprint.pformat(values))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        with open(self.config_file, 'w') as f:</span><br><span style="color: hsl(120, 100%, 40%);">+            r = template.render(Open5gsUPF.CFGFILE, values)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.dbg(r)</span><br><span style="color: hsl(120, 100%, 40%);">+            f.write(r)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if not self._run_node.is_local():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(self.remote_inst)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-inst-to-remote', str(self.inst), remote_prefix_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.recreate_remote_dir(remote_run_dir)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host.scp('scp-cfg-to-remote', self.config_file, self.remote_config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def running(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return not self.process.terminated()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-freediameter.conf.tmpl b/src/osmo_gsm_tester/templates/open5gs-freediameter.conf.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..e3e0f5c</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-freediameter.conf.tmpl</span><br><span>@@ -0,0 +1,266 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# This is a sample configuration file for freeDiameter daemon.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Most of the options can be omitted, as they default to reasonable values.</span><br><span style="color: hsl(120, 100%, 40%);">+# Only TLS-related options must be configured properly in usual setups.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# It is possible to use "include" keyword to import additional files</span><br><span style="color: hsl(120, 100%, 40%);">+# e.g.: include "/etc/freeDiameter.d/*.conf"</span><br><span style="color: hsl(120, 100%, 40%);">+# This is exactly equivalent as copy & paste the content of the included file(s)</span><br><span style="color: hsl(120, 100%, 40%);">+# where the "include" keyword is found.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Peer identity and realm</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The Diameter Identity of this daemon.</span><br><span style="color: hsl(120, 100%, 40%);">+# This must be a valid FQDN that resolves to the local host.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: hostname's FQDN</span><br><span style="color: hsl(120, 100%, 40%);">+#Identity = "aaa.koganei.freediameter.net";</span><br><span style="color: hsl(120, 100%, 40%);">+Identity = "${diameter.identity}.localdomain";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The Diameter Realm of this daemon.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: the domain part of Identity (after the first dot).</span><br><span style="color: hsl(120, 100%, 40%);">+#Realm = "koganei.freediameter.net";</span><br><span style="color: hsl(120, 100%, 40%);">+Realm = "localdomain";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Transport protocol configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The port this peer is listening on for incoming connections (TCP and SCTP).</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 3868. Use 0 to disable.</span><br><span style="color: hsl(120, 100%, 40%);">+Port = ${diameter.listen_port};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The port this peer is listening on for incoming TLS-protected connections (TCP and SCTP).</span><br><span style="color: hsl(120, 100%, 40%);">+# See TLS_old_method for more information about TLS flavours.</span><br><span style="color: hsl(120, 100%, 40%);">+# Note: we use TLS/SCTP instead of DTLS/SCTP at the moment. This will change in future version of freeDiameter.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 5868. Use 0 to disable.</span><br><span style="color: hsl(120, 100%, 40%);">+SecPort = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed</span><br><span style="color: hsl(120, 100%, 40%);">+# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the</span><br><span style="color: hsl(120, 100%, 40%);">+# CER/CEA exchange on a dedicated secure port.</span><br><span style="color: hsl(120, 100%, 40%);">+# This parameter only affects outgoing connections.</span><br><span style="color: hsl(120, 100%, 40%);">+# The setting can be also defined per-peer (see Peers configuration section).</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: use RFC6733 method with separate port for TLS.</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_old_method;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Disable use of TCP protocol (only listen and connect over SCTP)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : TCP enabled</span><br><span style="color: hsl(120, 100%, 40%);">+#No_TCP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Disable use of SCTP protocol (only listen and connect over TCP)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : SCTP enabled</span><br><span style="color: hsl(120, 100%, 40%);">+#No_SCTP;</span><br><span style="color: hsl(120, 100%, 40%);">+# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Prefer TCP instead of SCTP for establishing new connections.</span><br><span style="color: hsl(120, 100%, 40%);">+# This setting may be overwritten per peer in peer configuration blocs.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : SCTP is attempted first.</span><br><span style="color: hsl(120, 100%, 40%);">+#Prefer_TCP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Default number of streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+# This setting may be overwritten per peer basis.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : 30 streams</span><br><span style="color: hsl(120, 100%, 40%);">+#SCTP_streams = 30;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Endpoint configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Disable use of IP addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : IP enabled</span><br><span style="color: hsl(120, 100%, 40%);">+#No_IP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Disable use of IPv6 addresses (only IP)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : IPv6 enabled</span><br><span style="color: hsl(120, 100%, 40%);">+#No_IPv6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Specify local addresses the server must bind to</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : listen on all addresses available.</span><br><span style="color: hsl(120, 100%, 40%);">+#ListenOn = "202.249.37.5";</span><br><span style="color: hsl(120, 100%, 40%);">+#ListenOn = "2001:200:903:2::202:1";</span><br><span style="color: hsl(120, 100%, 40%);">+#ListenOn = "fe80::21c:5ff:fe98:7d62%eth0";</span><br><span style="color: hsl(120, 100%, 40%);">+ListenOn = "${diameter.listen_address}";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Server configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# How many Diameter peers are allowed to be connecting at the same time ?</span><br><span style="color: hsl(120, 100%, 40%);">+# This parameter limits the number of incoming connections from the time</span><br><span style="color: hsl(120, 100%, 40%);">+# the connection is accepted until the first CER is received.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 5 unidentified clients in paralel.</span><br><span style="color: hsl(120, 100%, 40%);">+#ThreadsPerServer = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  TLS Configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TLS is managed by the GNUTLS library in the freeDiameter daemon.</span><br><span style="color: hsl(120, 100%, 40%);">+# You may find more information about parameters and special behaviors</span><br><span style="color: hsl(120, 100%, 40%);">+# in the relevant documentation.</span><br><span style="color: hsl(120, 100%, 40%);">+# http://www.gnu.org/software/gnutls/manual/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Credentials of the local peer</span><br><span style="color: hsl(120, 100%, 40%);">+# The X509 certificate and private key file to use for the local peer.</span><br><span style="color: hsl(120, 100%, 40%);">+# The files must contain PKCS-1 encoded RSA key, in PEM format.</span><br><span style="color: hsl(120, 100%, 40%);">+# (These parameters are passed to gnutls_certificate_set_x509_key_file function)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : NO DEFAULT</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_Cred = "<x509 certif file.PEM>" , "<x509 private key file.PEM>";</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key";</span><br><span style="color: hsl(120, 100%, 40%);">+TLS_Cred = "${diameter.inst_prefix}/etc/freeDiameter/${diameter.identity}.cert.pem", "${diameter.inst_prefix}/etc/freeDiameter/${diameter.identity}.key.pem";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Certificate authority / trust anchors</span><br><span style="color: hsl(120, 100%, 40%);">+# The file containing the list of trusted Certificate Authorities (PEM list)</span><br><span style="color: hsl(120, 100%, 40%);">+# (This parameter is passed to gnutls_certificate_set_x509_trust_file function)</span><br><span style="color: hsl(120, 100%, 40%);">+# The directive can appear several times to specify several files.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : GNUTLS default behavior</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_CA = "<file.PEM>";</span><br><span style="color: hsl(120, 100%, 40%);">+TLS_CA = "${diameter.inst_prefix}/etc/freeDiameter/cacert.pem";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Certificate Revocation List file</span><br><span style="color: hsl(120, 100%, 40%);">+# The information about revoked certificates.</span><br><span style="color: hsl(120, 100%, 40%);">+# The file contains a list of trusted CRLs in PEM format. They should have been verified before.</span><br><span style="color: hsl(120, 100%, 40%);">+# (This parameter is passed to gnutls_certificate_set_x509_crl_file function)</span><br><span style="color: hsl(120, 100%, 40%);">+# Note: openssl CRL format might have interoperability issue with GNUTLS format.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : GNUTLS default behavior</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_CRL = "<file.PEM>";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU TLS Priority string</span><br><span style="color: hsl(120, 100%, 40%);">+# This string allows to configure the behavior of GNUTLS key exchanges</span><br><span style="color: hsl(120, 100%, 40%);">+# algorithms. See gnutls_priority_init function documentation for information.</span><br><span style="color: hsl(120, 100%, 40%);">+# You should also refer to the Diameter required TLS support here:</span><br><span style="color: hsl(120, 100%, 40%);">+#   http://tools.ietf.org/html/rfc6733#section-13.1</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : "NORMAL"</span><br><span style="color: hsl(120, 100%, 40%);">+# Example: TLS_Prio = "NONE:+VERS-TLS1.1:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL";</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_Prio = "NORMAL";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Diffie-Hellman parameters size</span><br><span style="color: hsl(120, 100%, 40%);">+# Set the number of bits for generated DH parameters</span><br><span style="color: hsl(120, 100%, 40%);">+# Valid value should be 768, 1024, 2048, 3072 or 4096.</span><br><span style="color: hsl(120, 100%, 40%);">+# (This parameter is passed to gnutls_dh_params_generate2 function,</span><br><span style="color: hsl(120, 100%, 40%);">+# it usually should match RSA key size)</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_DH_Bits = 1024;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Alternatively, you can specify a file to load the PKCS#3 encoded</span><br><span style="color: hsl(120, 100%, 40%);">+# DH parameters directly from. This accelerates the daemon start</span><br><span style="color: hsl(120, 100%, 40%);">+# but is slightly less secure. If this file is provided, the</span><br><span style="color: hsl(120, 100%, 40%);">+# TLS_DH_Bits parameters has no effect.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default : no default.</span><br><span style="color: hsl(120, 100%, 40%);">+#TLS_DH_File = "<file.PEM>";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Timers configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The Tc timer of this peer.</span><br><span style="color: hsl(120, 100%, 40%);">+# It is the delay before a new attempt is made to reconnect a disconnected peer.</span><br><span style="color: hsl(120, 100%, 40%);">+# The value is expressed in seconds. The recommended value is 30 seconds.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#TcTimer = 30;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The Tw timer of this peer.</span><br><span style="color: hsl(120, 100%, 40%);">+# It is the delay before a watchdog message is sent, as described in RFC 3539.</span><br><span style="color: hsl(120, 100%, 40%);">+# The value is expressed in seconds. The default value is 30 seconds. Value must</span><br><span style="color: hsl(120, 100%, 40%);">+# be greater or equal to 6 seconds. See details in the RFC.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#TwTimer = 30;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Applications configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Disable the relaying of Diameter messages?</span><br><span style="color: hsl(120, 100%, 40%);">+# For messages not handled locally, the default behavior is to forward the</span><br><span style="color: hsl(120, 100%, 40%);">+# message to another peer if any is available, according to the routing</span><br><span style="color: hsl(120, 100%, 40%);">+# algorithms. In addition the "0xffffff" application is advertised in CER/CEA</span><br><span style="color: hsl(120, 100%, 40%);">+# exchanges.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: Relaying is enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+#NoRelay;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Number of server threads that can handle incoming messages at the same time.</span><br><span style="color: hsl(120, 100%, 40%);">+# Default: 4</span><br><span style="color: hsl(120, 100%, 40%);">+#AppServThreads = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Other applications are configured by loaded extensions.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Extensions configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#  The freeDiameter framework merely provides support for</span><br><span style="color: hsl(120, 100%, 40%);">+# Diameter Base Protocol. The specific application behaviors,</span><br><span style="color: hsl(120, 100%, 40%);">+# as well as advanced functions, are provided</span><br><span style="color: hsl(120, 100%, 40%);">+# by loadable extensions (plug-ins).</span><br><span style="color: hsl(120, 100%, 40%);">+#  These extensions may in addition receive the name of a</span><br><span style="color: hsl(120, 100%, 40%);">+# configuration file, the format of which is extension-specific.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Format:</span><br><span style="color: hsl(120, 100%, 40%);">+#LoadExtension = "/path/to/extension" [ : "/optional/configuration/file" ] ;</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Examples:</span><br><span style="color: hsl(120, 100%, 40%);">+#LoadExtension = "extensions/sample.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+#LoadExtension = "extensions/sample.fdx":"conf/sample.conf";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Extensions are named as follow:</span><br><span style="color: hsl(120, 100%, 40%);">+# dict_* for extensions that add content to the dictionary definitions.</span><br><span style="color: hsl(120, 100%, 40%);">+# dbg_*  for extensions useful only to retrieve more information on the framework execution.</span><br><span style="color: hsl(120, 100%, 40%);">+# acl_*  : Access control list, to control which peers are allowed to connect.</span><br><span style="color: hsl(120, 100%, 40%);">+# rt_*   : routing extensions that impact how messages are forwarded to other peers.</span><br><span style="color: hsl(120, 100%, 40%);">+# app_*  : applications, these extensions usually register callbacks to handle specific messages.</span><br><span style="color: hsl(120, 100%, 40%);">+# test_* : dummy extensions that are useful only in testing environments.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The dbg_msg_dump.fdx extension allows you to tweak the way freeDiameter displays some</span><br><span style="color: hsl(120, 100%, 40%);">+# information about some events. This extension does not actually use a configuration file</span><br><span style="color: hsl(120, 100%, 40%);">+# but receives directly a parameter in the string passed to the extension. Here are some examples:</span><br><span style="color: hsl(120, 100%, 40%);">+## LoadExtension = "dbg_msg_dumps.fdx" : "0x1111"; # Removes all default hooks, very quiet even in case of errors.</span><br><span style="color: hsl(120, 100%, 40%);">+## LoadExtension = "dbg_msg_dumps.fdx" : "0x2222"; # Display all events with few details.</span><br><span style="color: hsl(120, 100%, 40%);">+## LoadExtension = "dbg_msg_dumps.fdx" : "0x0080"; # Dump complete information about sent and received messages.</span><br><span style="color: hsl(120, 100%, 40%);">+# The four digits respectively control: connections, routing decisions, sent/received messages, errors.</span><br><span style="color: hsl(120, 100%, 40%);">+# The values for each digit are:</span><br><span style="color: hsl(120, 100%, 40%);">+#  0 - default - keep the default behavior</span><br><span style="color: hsl(120, 100%, 40%);">+#  1 - quiet   - remove any specific log</span><br><span style="color: hsl(120, 100%, 40%);">+#  2 - compact - display only a summary of the information</span><br><span style="color: hsl(120, 100%, 40%);">+#  4 - full    - display the complete information on a single long line</span><br><span style="color: hsl(120, 100%, 40%);">+#  8 - tree    - display the complete information in an easier to read format spanning several lines.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dbg_msg_dumps.fdx" : "0x8888";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_rfc5777.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_mip6i.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_nasreq.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_nas_mipv6.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_dcca.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+LoadExtension = "${diameter.inst_prefix}/lib/freeDiameter/dict_dcca_3gpp.fdx";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span style="color: hsl(120, 100%, 40%);">+##  Peers configuration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#  The local server listens for incoming connections. By default,</span><br><span style="color: hsl(120, 100%, 40%);">+# all unknown connecting peers are rejected. Extensions can override this behavior (e.g., acl_wl).</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  In addition to incoming connections, the local peer can</span><br><span style="color: hsl(120, 100%, 40%);">+# be configured to establish and maintain connections to some</span><br><span style="color: hsl(120, 100%, 40%);">+# Diameter nodes and allow connections from these nodes.</span><br><span style="color: hsl(120, 100%, 40%);">+#  This is achieved with the ConnectPeer directive described below.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Note that the configured Diameter Identity MUST match</span><br><span style="color: hsl(120, 100%, 40%);">+# the information received inside CEA, or the connection will be aborted.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Format:</span><br><span style="color: hsl(120, 100%, 40%);">+#ConnectPeer = "diameterid" [ { parameter1; parameter2; ...} ] ;</span><br><span style="color: hsl(120, 100%, 40%);">+# Parameters that can be specified in the peer's parameter list:</span><br><span style="color: hsl(120, 100%, 40%);">+#  No_TCP; No_SCTP; No_IP; No_IPv6; Prefer_TCP; TLS_old_method;</span><br><span style="color: hsl(120, 100%, 40%);">+#  No_TLS;       # assume transparent security instead of TLS. DTLS is not supported yet (will change in future versions).</span><br><span style="color: hsl(120, 100%, 40%);">+#  Port = 5868;  # The port to connect to</span><br><span style="color: hsl(120, 100%, 40%);">+#  TcTimer = 30;</span><br><span style="color: hsl(120, 100%, 40%);">+#  TwTimer = 30;</span><br><span style="color: hsl(120, 100%, 40%);">+#  ConnectTo = "202.249.37.5";</span><br><span style="color: hsl(120, 100%, 40%);">+#  ConnectTo = "2001:200:903:2::202:1";</span><br><span style="color: hsl(120, 100%, 40%);">+#  TLS_Prio = "NORMAL";</span><br><span style="color: hsl(120, 100%, 40%);">+#  Realm = "realm.net"; # Reject the peer if it does not advertise this realm.</span><br><span style="color: hsl(120, 100%, 40%);">+# Examples:</span><br><span style="color: hsl(120, 100%, 40%);">+#ConnectPeer = "aaa.wide.ad.jp";</span><br><span style="color: hsl(120, 100%, 40%);">+#ConnectPeer = "old.diameter.serv" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;</span><br><span style="color: hsl(120, 100%, 40%);">+ConnectPeer = "${diameter.connect_name}.localdomain" { ConnectTo = "${diameter.connect_address}"; Port = ${diameter.connect_port}; No_TLS; };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############################################################</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-hssd.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-hssd.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..830e8cd</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-hssd.yaml.tmpl</span><br><span>@@ -0,0 +1,85 @@</span><br><span style="color: hsl(120, 100%, 40%);">+db_uri: ${epc.db_uri}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,fd,hss,event,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${hss.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+hss:</span><br><span style="color: hsl(120, 100%, 40%);">+    freeDiameter: ${hss.diameter_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-mmed.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-mmed.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..9aec578</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-mmed.yaml.tmpl</span><br><span>@@ -0,0 +1,245 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,s1ap,nas,fd,gtp,mme,emm,esm,event,tlv,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${mme.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+mme:</span><br><span style="color: hsl(120, 100%, 40%);">+    freeDiameter: ${mme.diameter_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+    s1ap:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+    gummei:</span><br><span style="color: hsl(120, 100%, 40%);">+      plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+        mcc: ${epc.mcc}</span><br><span style="color: hsl(120, 100%, 40%);">+        mnc: ${epc.mnc}</span><br><span style="color: hsl(120, 100%, 40%);">+      mme_gid: 2</span><br><span style="color: hsl(120, 100%, 40%);">+      mme_code: 1</span><br><span style="color: hsl(120, 100%, 40%);">+    tai:</span><br><span style="color: hsl(120, 100%, 40%);">+      plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+        mcc: ${epc.mcc}</span><br><span style="color: hsl(120, 100%, 40%);">+        mnc: ${epc.mnc}</span><br><span style="color: hsl(120, 100%, 40%);">+      tac: 7</span><br><span style="color: hsl(120, 100%, 40%);">+    security:</span><br><span style="color: hsl(120, 100%, 40%);">+        integrity_order : [ EIA2, EIA1, EIA0 ]</span><br><span style="color: hsl(120, 100%, 40%);">+        ciphering_order : [ EEA0, EEA1, EEA2 ]</span><br><span style="color: hsl(120, 100%, 40%);">+    network_name:</span><br><span style="color: hsl(120, 100%, 40%);">+        full: Open5GS</span><br><span style="color: hsl(120, 100%, 40%);">+    mme_name: open5gs-mme0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# <GTP-C Client></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Specify SGW addresses the GTP-C must connect to</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o One SGW is defined.</span><br><span style="color: hsl(120, 100%, 40%);">+#    If prefer_ipv4 is not true, [fe80::2%lo] is selected.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::2%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Two SGW are defined. MME selects SGW with round-robin manner per UE</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: fe80::2%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Three SGW are defined. MME selects SGW with round-robin manner per UE</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::2%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.22</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::12%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#      - name: sgw3.open5gs.org</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# <SGW Selection Mode></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Round-Robin</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#     addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#     addr: 127.0.2.2</span><br><span style="color: hsl(120, 100%, 40%);">+#     addr: 127.0.4.2</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o SGW selection by eNodeB TAC</span><br><span style="color: hsl(120, 100%, 40%);">+#   (either single TAC or multiple TACs, DECIMAL representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#     - addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#       tac: 26000</span><br><span style="color: hsl(120, 100%, 40%);">+#     - addr: 127.0.2.2</span><br><span style="color: hsl(120, 100%, 40%);">+#       tac: [25000, 27000, 28000]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o SGW selection by e_cell_id(28bit)</span><br><span style="color: hsl(120, 100%, 40%);">+#   (either single or multiple e_cell_id, HEX representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#     - addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#       e_cell_id: abcde01</span><br><span style="color: hsl(120, 100%, 40%);">+#     - addr: 127.0.2.2</span><br><span style="color: hsl(120, 100%, 40%);">+#       e_cell_id: [12345, a9413, 98765]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2125</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# smf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-C Client></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o By default, the SMF uses the first SMF node.</span><br><span style="color: hsl(120, 100%, 40%);">+#    - To use a different APN for each SMF, specify gtpc.apn as the APN name.</span><br><span style="color: hsl(120, 100%, 40%);">+#    - If the HSS uses WebUI to set the SMF IP for each UE,</span><br><span style="color: hsl(120, 100%, 40%);">+#      you can use a specific SMF node for each UE.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Two SMF are defined. 127.0.0.4:2123 is used.</span><br><span style="color: hsl(120, 100%, 40%);">+#    [fe80::3%lo]:2123 is ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: fe80::3%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o One SMF is defined. if prefer_ipv4 is not true,</span><br><span style="color: hsl(120, 100%, 40%);">+#    [fe80::3%lo] is selected.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::3%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Two SMF are defined with a different APN.</span><br><span style="color: hsl(120, 100%, 40%);">+#    - Note that if SMF IP for UE is configured in HSS,</span><br><span style="color: hsl(120, 100%, 40%);">+#      the following configurion for this UE is ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#        apn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.5</span><br><span style="color: hsl(120, 100%, 40%);">+#        apn: volte</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o If APN is omitted, the default APN uses the first SMF node.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.5</span><br><span style="color: hsl(120, 100%, 40%);">+#        apn: volte</span><br><span style="color: hsl(120, 100%, 40%);">+smf:</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2124</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Use OAI UE</span><br><span style="color: hsl(120, 100%, 40%);">+#    - Remove HashMME in Security-mode command message</span><br><span style="color: hsl(120, 100%, 40%);">+#    - Use the length 1 of EPS network feature support in Attach accept message</span><br><span style="color: hsl(120, 100%, 40%);">+#      use_openair: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sctp:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o heartbit_interval : 5000 (5secs)</span><br><span style="color: hsl(120, 100%, 40%);">+#  o rto_initial : 3000 (3secs)</span><br><span style="color: hsl(120, 100%, 40%);">+#  o rto_min : 1000 (1sec)</span><br><span style="color: hsl(120, 100%, 40%);">+#  o rto_max : 5000 (5secs)</span><br><span style="color: hsl(120, 100%, 40%);">+#  o max_num_of_ostreams : 30</span><br><span style="color: hsl(120, 100%, 40%);">+#  o max_num_of_istreams : 65535</span><br><span style="color: hsl(120, 100%, 40%);">+#  o max_attempts : 4</span><br><span style="color: hsl(120, 100%, 40%);">+#  o max_initial_timeout : 8000(8secs)</span><br><span style="color: hsl(120, 100%, 40%);">+#  o usrsctp_udp_port : 9899</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sctp:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# time:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (Default : 10,000 ms = 10 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (3000 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    message:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 3000</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Handover Wait Duration (Default : 300 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    Time to wait for MME to send UEContextReleaseCommand</span><br><span style="color: hsl(120, 100%, 40%);">+#    to the source eNB after receiving HandoverNotify</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Handover Wait Duration (500ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    handover:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 500</span><br><span style="color: hsl(120, 100%, 40%);">+time:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-pcrfd.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-pcrfd.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..d61d8ef</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-pcrfd.yaml.tmpl</span><br><span>@@ -0,0 +1,87 @@</span><br><span style="color: hsl(120, 100%, 40%);">+db_uri: ${epc.db_uri}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,fd,pcrf,event,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${pcrf.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pcrf:</span><br><span style="color: hsl(120, 100%, 40%);">+    freeDiameter: ${pcrf.diameter_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Legacy support for pre-release LTE 11 devices to do calling</span><br><span style="color: hsl(120, 100%, 40%);">+#    - Replace IPv4/v6 local addr field in AAR Media-Subcomponent AVP by any</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4v6_local_addr_in_packet_filter: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-sgwcd.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-sgwcd.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..8d2bd1a</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-sgwcd.yaml.tmpl</span><br><span>@@ -0,0 +1,183 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,pfcp,gtp,sgwc,event,tlv,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${sgwc.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-C Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-C Server(127.0.0.3:2123, [fe80::2%lo]:2123)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::2%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o On SGW, Same Configuration(127.0.0.3:2123,</span><br><span style="color: hsl(120, 100%, 40%);">+#  [fe80::2%lo]:2123) as below.</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: fe80::2%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Server(127.0.0.3:8805, ::1:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2125</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8805</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Client>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Client(127.0.0.6:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <SGWU_SELECTION_MODE - EPC only></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Round-Robin</span><br><span style="color: hsl(120, 100%, 40%);">+#   (note that round robin can be disabled for a particular node</span><br><span style="color: hsl(120, 100%, 40%);">+#     by setting flag 'rr' to 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        rr: 0</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.18</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o SGWU selection by eNodeB TAC</span><br><span style="color: hsl(120, 100%, 40%);">+#   (either single TAC or multiple TACs, DECIMAL representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#        tac: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        tac: [3,5,8]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o SGWU selection by UE's APN (either single APN or multiple APNs)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#        apn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        apn: [internet, web]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o SGWU selection by CellID(e_cell_id: 28bit)</span><br><span style="color: hsl(120, 100%, 40%);">+#   (either single e_cell_id or multiple e_cell_id, HEX representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#        e_cell_id: 463</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        e_cell_id: [123456789, 9413]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8806</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# time:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (Default : 10,000 ms = 10 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (3000 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    message:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 3000</span><br><span style="color: hsl(120, 100%, 40%);">+time:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-sgwud.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-sgwud.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..27dd55c</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-sgwud.yaml.tmpl</span><br><span>@@ -0,0 +1,138 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,pfcp,gtp,sgwu,event,tlv,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${sgwu.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Server(127.0.0.6:8805, ::1:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-U Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.6:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sgwu:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8806</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2152</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Client>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Client(127.0.0.6:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 127.0.0.6</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+sgwc:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8805</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# time:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (Default : 10,000 ms = 10 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (3000 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    message:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 3000</span><br><span style="color: hsl(120, 100%, 40%);">+time:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-smfd.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-smfd.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..0e01337</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-smfd.yaml.tmpl</span><br><span>@@ -0,0 +1,506 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,pfcp,fd,pfcp,gtp,smf,event,tlv,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${smf.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# smf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <SBI Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(http://<all address available>:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(http://<any address>:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 0.0.0.0</span><br><span style="color: hsl(120, 100%, 40%);">+#          - ::0</span><br><span style="color: hsl(120, 100%, 40%);">+#        port: 7777</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(https://<all address avaiable>:443)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#        tls:</span><br><span style="color: hsl(120, 100%, 40%);">+#          key: smf.key</span><br><span style="color: hsl(120, 100%, 40%);">+#          pem: smf.pem</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(https://127.0.0.4:443, http://[::1]:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#        tls:</span><br><span style="color: hsl(120, 100%, 40%);">+#          key: smf.key</span><br><span style="color: hsl(120, 100%, 40%);">+#          pem: smf.pem</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(http://smf.open5gs.org:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: smf.open5gs.org</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(http://127.0.0.4:7777)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#        port: 7777</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Server(http://<eth0 IP address>:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      dev: eth0</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Server(127.0.0.4:8805, ::1:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-C Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-C Server(127.0.0.4:2123, [fe80::3%lo]:2123)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::3%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o On SMF, Same configuration</span><br><span style="color: hsl(120, 100%, 40%);">+#    (127.0.0.4:2123, [fe80::3%lo]:2123).</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: fe80::3%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-U Server>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.4:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <Subnet for UE Pool></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o IPv4 Pool</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o IPv4/IPv6 Pool</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Specific DNN/APN(e.g 'ims') uses 10.46.0.1/16, 2001:230:babe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.46.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:babe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Pool Range Sample</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/24</span><br><span style="color: hsl(120, 100%, 40%);">+#        range: 10.45.0.100-10.45.0.200</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/24</span><br><span style="color: hsl(120, 100%, 40%);">+#        range:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 10.45.0.5-10.45.0.50</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 10.45.0.100-</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/24</span><br><span style="color: hsl(120, 100%, 40%);">+#        range:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - -10.45.0.200</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 10.45.0.210-10.45.0.220</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        range:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 10.45.0.100-10.45.0.200</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 10.45.1.100-10.45.1.200</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        range:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 2001:230:cafe:a0::0-2001:230:cafe:b0::0</span><br><span style="color: hsl(120, 100%, 40%);">+#          - 2001:230:cafe:c0::0-2001:230:cafe:d0::0</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <Domain Name Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Primary/Secondary can be configured. Others are ignored.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    dns:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - 8.8.8.8</span><br><span style="color: hsl(120, 100%, 40%);">+#      - 8.8.4.4</span><br><span style="color: hsl(120, 100%, 40%);">+#      - 2001:4860:4860::8888</span><br><span style="color: hsl(120, 100%, 40%);">+#      - 2001:4860:4860::8844</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <MTU Size></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Provisioning a limit on the size of the packets sent by the MS</span><br><span style="color: hsl(120, 100%, 40%);">+#    to avoid packet fragmentation in the backbone network</span><br><span style="color: hsl(120, 100%, 40%);">+#    between the MS and the GGSN/PGW and/or across the (S)Gi reference point)</span><br><span style="color: hsl(120, 100%, 40%);">+#    when some of the backbone links does not support</span><br><span style="color: hsl(120, 100%, 40%);">+#    packets larger then 1500 octets</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <P-CSCF></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Proxy Call Session Control Function</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    p-cscf:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+#      - ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <SMF Selection - 5G Core only></span><br><span style="color: hsl(120, 100%, 40%);">+#  1. SMF sends SmfInfo(S-NSSAI, DNN, TAI) to the NRF</span><br><span style="color: hsl(120, 100%, 40%);">+#  2. NRF responds to AMF with SmfInfo during NF-Discovery.</span><br><span style="color: hsl(120, 100%, 40%);">+#  3. AMF selects SMF based on S-NSSAI, DNN and TAI in SmfInfo.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  Note that if there is no SmfInfo, any AMF can select this SMF.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o S-NSSAI[SST:1] and DNN[internet] - At least 1 DNN is required in S-NSSAI</span><br><span style="color: hsl(120, 100%, 40%);">+#    info:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o S-NSSAI[SST:1 SD:009000] and DNN[internet or ims]</span><br><span style="color: hsl(120, 100%, 40%);">+#    info:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            sd: 009000</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#              - ims</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o S-NSSAI[SST:1] and DNN[internet] and TAI[PLMN-ID:90170 TAC:1]</span><br><span style="color: hsl(120, 100%, 40%);">+#    info:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        tai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            tac: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o If any of conditions below are met:</span><br><span style="color: hsl(120, 100%, 40%);">+#   - S-NSSAI[SST:1] and DNN[internet] and TAI[PLMN-ID:90170 TAC:1-9]</span><br><span style="color: hsl(120, 100%, 40%);">+#   - S-NSSAI[SST:2 SD:000080] and DNN[internet or ims]</span><br><span style="color: hsl(120, 100%, 40%);">+#   - S-NSSAI[SST:4] and DNN[internet] and TAI[PLMN-ID:90170 TAC:10-20,30-40]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    info:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        tai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            range:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 1-9</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 2</span><br><span style="color: hsl(120, 100%, 40%);">+#            sd: 000080</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#              - ims</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 4</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        tai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            range:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 10-20</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 30-40</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Complex Example</span><br><span style="color: hsl(120, 100%, 40%);">+#    info:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            sd: 000080</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#              - ims</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            sd: 009000</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              [internet, ims]</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 2</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 3</span><br><span style="color: hsl(120, 100%, 40%);">+#            sd: 123456</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        tai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            tac: [1, 2, 3]</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            tac: 4</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            tac:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 5</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 6</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            range:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 100-200</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 300-400</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            range:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 500-600</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 700-800</span><br><span style="color: hsl(120, 100%, 40%);">+#              - 900-1000</span><br><span style="color: hsl(120, 100%, 40%);">+#      - s_nssai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - sst: 4</span><br><span style="color: hsl(120, 100%, 40%);">+#            dnn:</span><br><span style="color: hsl(120, 100%, 40%);">+#              - internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        tai:</span><br><span style="color: hsl(120, 100%, 40%);">+#          - plmn_id:</span><br><span style="color: hsl(120, 100%, 40%);">+#              mcc: 901</span><br><span style="color: hsl(120, 100%, 40%);">+#              mnc: 70</span><br><span style="color: hsl(120, 100%, 40%);">+#            tac: 99</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+smf:</span><br><span style="color: hsl(120, 100%, 40%);">+    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 7777</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8808</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpc:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2124</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2153</span><br><span style="color: hsl(120, 100%, 40%);">+    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+    dns:</span><br><span style="color: hsl(120, 100%, 40%);">+      - 8.8.8.8</span><br><span style="color: hsl(120, 100%, 40%);">+      - 8.8.4.4</span><br><span style="color: hsl(120, 100%, 40%);">+      - 2001:4860:4860::8888</span><br><span style="color: hsl(120, 100%, 40%);">+      - 2001:4860:4860::8844</span><br><span style="color: hsl(120, 100%, 40%);">+    mtu: 1400</span><br><span style="color: hsl(120, 100%, 40%);">+    freeDiameter: ${smf.diameter_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# nrf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <SBI Client>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Client(http://127.0.0.1:7777)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 127.0.0.10</span><br><span style="color: hsl(120, 100%, 40%);">+#      port: 7777</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Client(https://127.0.0.10:443, http://nrf.open5gs.org:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.10</span><br><span style="color: hsl(120, 100%, 40%);">+#        tls:</span><br><span style="color: hsl(120, 100%, 40%);">+#          key: nrf.key</span><br><span style="color: hsl(120, 100%, 40%);">+#          pem: nrf.pem</span><br><span style="color: hsl(120, 100%, 40%);">+#      - name: nrf.open5gs.org</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o SBI Client(http://[fe80::1%lo]:80)</span><br><span style="color: hsl(120, 100%, 40%);">+#    If prefer_ipv4 is true, http://127.0.0.10:80 is selected.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr:</span><br><span style="color: hsl(120, 100%, 40%);">+#        - 127.0.0.10</span><br><span style="color: hsl(120, 100%, 40%);">+#        - fe80::1%lo</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+nrf:</span><br><span style="color: hsl(120, 100%, 40%);">+    sbi:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr:</span><br><span style="color: hsl(120, 100%, 40%);">+          - ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 7777</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Client>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Client(127.0.0.7:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <UPF Selection></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Round-Robin</span><br><span style="color: hsl(120, 100%, 40%);">+#    (note that round robin can be disabled for a particular node</span><br><span style="color: hsl(120, 100%, 40%);">+#     by setting flag 'rr' to 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        rr: 0</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.19</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o UPF selection by eNodeB TAC</span><br><span style="color: hsl(120, 100%, 40%);">+#    (either single TAC or multiple TACs, DECIMAL representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#        tac: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        tac: [3,5,8]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o UPF selection by UE's DNN/APN (either single DNN/APN or multiple DNNs/APNs)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: [internet, web]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o UPF selection by CellID(e_cell_id: 28bit, nr_cell_id: 36bit)</span><br><span style="color: hsl(120, 100%, 40%);">+#    (either single enb_id or multiple enb_ids, HEX representation)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#        e_cell_id: 463</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.12</span><br><span style="color: hsl(120, 100%, 40%);">+#        nr_cell_id: [123456789, 9413]</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+upf:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8807</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# time:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o NF Instance Heartbeat (Default : 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#    NFs will not send heart-beat timer in NFProfile</span><br><span style="color: hsl(120, 100%, 40%);">+#    NRF will send heart-beat timer in NFProfile</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o NF Instance Heartbeat (20 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#    NFs will send heart-beat timer (20 seconds) in NFProfile</span><br><span style="color: hsl(120, 100%, 40%);">+#    NRF can change heart-beat timer in NFProfile</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    nf_instance:</span><br><span style="color: hsl(120, 100%, 40%);">+#      heartbeat: 20</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (Default : 10,000 ms = 10 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (3000 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    message:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 3000</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Handover Wait Duration (Default : 300 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    Time to wait for SMF to send</span><br><span style="color: hsl(120, 100%, 40%);">+#    PFCP Session Modification Request(Remove Indirect Tunnel) to the UPF</span><br><span style="color: hsl(120, 100%, 40%);">+#    after sending Nsmf_PDUSession_UpdateSMContext Response(hoState:COMPLETED)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Handover Wait Duration (500ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    handover:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 500</span><br><span style="color: hsl(120, 100%, 40%);">+time:</span><br><span>diff --git a/src/osmo_gsm_tester/templates/open5gs-upfd.yaml.tmpl b/src/osmo_gsm_tester/templates/open5gs-upfd.yaml.tmpl</span><br><span>new file mode 100644</span><br><span>index 0000000..4f7a25d</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/templates/open5gs-upfd.yaml.tmpl</span><br><span>@@ -0,0 +1,197 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# logger:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_INFO to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `level` is omitted, the default level is OGS_LOG_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#   - If `domain` is omitted, the all domain level is set from 'level'</span><br><span style="color: hsl(120, 100%, 40%);">+#    (Nothing is needed)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_ERROR to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#   - `level` can be set with none, fatal, error, warn, info, debug, trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: error</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_DEBUG to mme/emm domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: debug</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: mme,emm</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Set OGS_LOG_TRACE to all domain level</span><br><span style="color: hsl(120, 100%, 40%);">+#    level: trace</span><br><span style="color: hsl(120, 100%, 40%);">+#    domain: core,pfcp,gtp,upf,event,tlv,mem,sock</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+logger:</span><br><span style="color: hsl(120, 100%, 40%);">+    file: ${upf.log_filename}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# upf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Server></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Server(127.0.0.7:8805, ::1:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <GTP-U Server>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.7:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 127.0.0.7</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: ::1</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o GTP-U Server(127.0.0.1:2152, [::1]:2152)</span><br><span style="color: hsl(120, 100%, 40%);">+#    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+#      name: localhost</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <Subnet for UE network></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  Note that you need to setup your UE network using TUN device.</span><br><span style="color: hsl(120, 100%, 40%);">+#  (ogstun, ogstun2, ogstunX, ..)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o IPv4 Pool</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.45.0.1/16 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o IPv4/IPv6 Pool</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.45.0.1/16 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 2001:230:cafe::1/48 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Specific DNN/APN(e.g 'ims') uses 10.46.0.1/16, 2001:230:babe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#    All other APNs use 10.45.0.1/16, 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.45.0.1/16 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.46.0.1/16 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 2001:230:cafe::1/48 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 2001:230:babe::1/48 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.46.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:babe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Multiple Devices (default: ogstun)</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.45.0.1/16 dev ogstun</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 2001:230:cafe::1/48 dev ogstun2</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 10.46.0.1/16 dev ogstun3</span><br><span style="color: hsl(120, 100%, 40%);">+#    $ sudo ip addr add 2001:230:babe::1/48 dev ogstun3</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: internet</span><br><span style="color: hsl(120, 100%, 40%);">+#        dev: ogstun2</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 10.46.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#        dev: ogstun3</span><br><span style="color: hsl(120, 100%, 40%);">+#      - addr: 2001:230:babe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+#        dnn: ims</span><br><span style="color: hsl(120, 100%, 40%);">+#        dev: ogstun3</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+upf:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8807</span><br><span style="color: hsl(120, 100%, 40%);">+    gtpu:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 2154</span><br><span style="color: hsl(120, 100%, 40%);">+    subnet:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: 10.45.0.1/16</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: 2001:230:cafe::1/48</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# smf:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  <PFCP Client>></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o PFCP Client(127.0.0.3:8805)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+#      addr: 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+smf:</span><br><span style="color: hsl(120, 100%, 40%);">+    pfcp:</span><br><span style="color: hsl(120, 100%, 40%);">+      - addr: ${epc.run_addr}</span><br><span style="color: hsl(120, 100%, 40%);">+        port: 8808</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Number of output streams per SCTP associations.</span><br><span style="color: hsl(120, 100%, 40%);">+#      sctp_streams: 30</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv4 addresses (only IPv6)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable use of IPv6 addresses (only IPv4)</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_ipv6: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Prefer IPv4 instead of IPv6 for estabishing new GTP connections.</span><br><span style="color: hsl(120, 100%, 40%);">+#      prefer_ipv4: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Enable Multicast traffic to the UE</span><br><span style="color: hsl(120, 100%, 40%);">+#      multicast: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Disable Stateless Address Autoconfiguration for IPv6</span><br><span style="color: hsl(120, 100%, 40%);">+#      no_slaac: true</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+parameter:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# max:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of UE per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    ue: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+# o Maximum Number of gNB/eNB per AMF/MME</span><br><span style="color: hsl(120, 100%, 40%);">+#    gnb: 32</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+max:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# pool:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# o The default memory pool size was set assuming 1024 UEs.</span><br><span style="color: hsl(120, 100%, 40%);">+#   To connect more UEs, you need to increase the size further.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 128         => 65536 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 256         => 16384 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 512         => 4096 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024        => 1024 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 2048        => 512 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 8192        => 128 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#   - Pool-size 1024*1024   => 8 Number</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#    128:  65536</span><br><span style="color: hsl(120, 100%, 40%);">+#    256:  16384</span><br><span style="color: hsl(120, 100%, 40%);">+#    512:  4096</span><br><span style="color: hsl(120, 100%, 40%);">+#    1024: 1024</span><br><span style="color: hsl(120, 100%, 40%);">+#    2048: 512</span><br><span style="color: hsl(120, 100%, 40%);">+#    8192: 128</span><br><span style="color: hsl(120, 100%, 40%);">+#    big:  8</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+pool:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# time:</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (Default : 10,000 ms = 10 seconds)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+#  o Message Wait Duration (3000 ms)</span><br><span style="color: hsl(120, 100%, 40%);">+#    message:</span><br><span style="color: hsl(120, 100%, 40%);">+#        duration: 3000</span><br><span style="color: hsl(120, 100%, 40%);">+time:</span><br><span>diff --git a/sysmocom/defaults.conf b/sysmocom/defaults.conf</span><br><span>index 69d9ed9..eeb2b83 100644</span><br><span>--- a/sysmocom/defaults.conf</span><br><span>+++ b/sysmocom/defaults.conf</span><br><span>@@ -101,6 +101,9 @@</span><br><span>   enable_pcap: false</span><br><span>   log_all_level: warning</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+open5gsepc:</span><br><span style="color: hsl(120, 100%, 40%);">+  db_host: "localhost"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> amarisoft:</span><br><span>   license_server_addr: 0.0.0.0</span><br><span> </span><br><span>diff --git a/sysmocom/scenarios/cfg-epc-db@.conf b/sysmocom/scenarios/cfg-epc-db@.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..e6c79c4</span><br><span>--- /dev/null</span><br><span>+++ b/sysmocom/scenarios/cfg-epc-db@.conf</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+config:</span><br><span style="color: hsl(120, 100%, 40%);">+  epc:</span><br><span style="color: hsl(120, 100%, 40%);">+    db_host: ${param1}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/23476">change 23476</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/23476"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iff8b88dc22d8f156572839abb48b0c1377c55e33 </div>
<div style="display:none"> Gerrit-Change-Number: 23476 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>