Attention is currently required from: msuraev.
keith has posted comments on this change by msuraev. ( https://gerrit.osmocom.org/c/osmo-msc/+/29709?usp=email )
Change subject: .deb/.rpm: add osmocom user during package install
......................................................................
Patch Set 2:
(1 comment)
File debian/postinst:
https://gerrit.osmocom.org/c/osmo-msc/+/29709/comment/74a42f7e_dbba8ecc?usp… :
PS2, Line 32: chperms root osmocom 2775 /etc/osmocom
I know this is merged, but we might also have changed the permission on an existing MNCC socket. - and it is user configurable so you'ld have to parse the config for it.
if osmo-msc is unable to access the socket, it will not restart after this upgrade.
--
To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/29709?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Change-Id: I41d47c0884d09d4674ec806d77e43bc8f08d9b64
Gerrit-Change-Number: 29709
Gerrit-PatchSet: 2
Gerrit-Owner: msuraev <msuraev(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-CC: keith <keith(a)rhizomatica.org>
Gerrit-Attention: msuraev <msuraev(a)sysmocom.de>
Gerrit-Comment-Date: Thu, 05 Sep 2024 04:13:43 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Attention is currently required from: laforge, pespin.
neels has posted comments on this change by neels. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37882?usp=email )
Change subject: ctrl, hnbgw: access rate counter groups by given ID instead of index
......................................................................
Patch Set 4:
(1 comment)
Patchset:
PS2:
> you are missing the use of array indexes in this API verifying rate counters via the ctrl interface. […]
I thought some more about this, and a nicer API would actually be one where the object identification is also part of the array entry. It could be a string, then callers could enter "msc.0" or "hnb.by_name.A1B2C3".
That would be nice, but I currently prefer not to spend time on our testing API cosmetics, and just use this patch that is quickest to success.
There is another compound to this: when we revert this patch to osmo-hnbgw
https://gerrit.osmocom.org/c/osmo-hnbgw/+/38002
then the object identification behavior does not change, and we don't currently need these patches here applied at all to fix our test suite.
(The general mismatch of using "obj.N" for volatile objects still exists, but it would not show in the test suite, because osmo-hnbgw will always snap back to hnb.0.)
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37882?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I70e74e7554482df67aa1d90bc04314124dea444f
Gerrit-Change-Number: 37882
Gerrit-PatchSet: 4
Gerrit-Owner: neels <nhofmeyr(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: laforge <laforge(a)osmocom.org>
Gerrit-Attention: pespin <pespin(a)sysmocom.de>
Gerrit-Comment-Date: Wed, 04 Sep 2024 21:41:20 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: neels <nhofmeyr(a)sysmocom.de>
Comment-In-Reply-To: laforge <laforge(a)osmocom.org>
Comment-In-Reply-To: pespin <pespin(a)sysmocom.de>
pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38029?usp=email )
Change subject: pcrf: Validate Gx metrics
......................................................................
Patch Set 1:
(1 comment)
This change is ready for review.
Patchset:
PS1:
Marking as ready, found the culprit in open5gs: https://github.com/open5gs/open5gs/pull/3442
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38029?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I4eab93f14d45f291c391d9519dc1462508f8a1eb
Gerrit-Change-Number: 38029
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Comment-Date: Wed, 04 Sep 2024 19:35:40 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38028?usp=email )
Change subject: Introduce PCRF_Tests testsuite
......................................................................
Introduce PCRF_Tests testsuite
Change-Id: I381577111ccadaefe42f6abe3cd9bb30cc8ceb56
---
M library/DIAMETER_Templates.ttcn
M library/DIAMETER_ts29_212_Templates.ttcn
A pcrf/PCRF_Tests.cfg
A pcrf/PCRF_Tests.default
A pcrf/PCRF_Tests.ttcn
A pcrf/create_test_subscribers.sh
A pcrf/expected-results.xml
A pcrf/freediameter.conf
A pcrf/gen_links.sh
A pcrf/mongod.conf
A pcrf/open5gs-pcrf.yaml
A pcrf/regen_makefile.sh
A pcrf/testenv.cfg
13 files changed, 795 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/28/38028/1
diff --git a/library/DIAMETER_Templates.ttcn b/library/DIAMETER_Templates.ttcn
index 7148513..bb63d51 100644
--- a/library/DIAMETER_Templates.ttcn
+++ b/library/DIAMETER_Templates.ttcn
@@ -200,6 +200,7 @@
address_data := addr_data
}
+/* RFC 4006 8.46 Subscription-Id */
template (present) GenericAVP tr_AVP_SubcrId(template (present) DCC_NONE_Subscription_Id t) := {
avp := {
avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id),
@@ -208,7 +209,16 @@
}
}
}
+template (value) GenericAVP ts_AVP_SubcrId(template (value) DCC_NONE_Subscription_Id t) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id),
+ avp_data := {
+ avp_DCC_NONE_Subscription_Id := t
+ }
+ }
+}
+/* RFC 4006 8.47 Subscription-Id-Type */
template (present) GenericAVP tr_AVP_SubcrIdType(template (present) DCC_NONE_Subscription_Id_Type t) := {
avp := {
avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Type),
@@ -217,7 +227,16 @@
}
}
}
+template (value) GenericAVP ts_AVP_SubcrIdType(template (value) DCC_NONE_Subscription_Id_Type t) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Type),
+ avp_data := {
+ avp_DCC_NONE_Subscription_Id_Type := t
+ }
+ }
+}
+/* RFC 4006 8.48 Subscription-Id-Data */
template (present) GenericAVP tr_AVP_SubcrIdData(template (present) DCC_NONE_Subscription_Id_Data t) := {
avp := {
avp_header := tr_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Data),
@@ -226,6 +245,14 @@
}
}
}
+template (value) GenericAVP ts_AVP_SubcrIdData(template (value) DCC_NONE_Subscription_Id_Data t) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_DCC_NONE_Subscription_Id_Data),
+ avp_data := {
+ avp_DCC_NONE_Subscription_Id_Data := t
+ }
+ }
+}
template (present) GenericAVP tr_AVP_RequestedAction(template (present) DCC_NONE_Requested_Action t := ?) := {
avp := {
@@ -1125,6 +1152,14 @@
}
}
}
+template (value) GenericAVP ts_AVP_3GPP_CalledStationId(template (value) DNAS_NONE_Called_Station_Id id) := {
+ avp := {
+ avp_header := ts_DIA_Hdr(c_AVP_Code_DNAS_NONE_Called_Station_Id),
+ avp_data := {
+ avp_DNAS_NONE_Called_Station_Id := id
+ }
+ }
+}
/* RFC6733 8.7. Auth-Request-Type AVP */
template (value) GenericAVP ts_AVP_AuthRequestType(BASE_NONE_Auth_Request_Type auth_req_type) := {
diff --git a/library/DIAMETER_ts29_212_Templates.ttcn b/library/DIAMETER_ts29_212_Templates.ttcn
index 209ac10..73d5177 100644
--- a/library/DIAMETER_ts29_212_Templates.ttcn
+++ b/library/DIAMETER_ts29_212_Templates.ttcn
@@ -38,6 +38,27 @@
tr_AVP_CcReqNum(?)
));
+template (value) PDU_DIAMETER
+ts_DIA_Gx_CCR(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
+ template (value) octetstring sess_id,
+ template (value) DCC_NONE_Subscription_Id subscr_id,
+ template (value) DNAS_NONE_Called_Station_Id called_station_id,
+ template (value) DCC_NONE_CC_Request_Type req_type := INITIAL_REQUEST,
+ template (value) AVP_Unsigned32 req_num := '00000000'O)
+:= ts_DIAMETER(flags:='11000000'B, cmd_code:=Credit_Control,
+ app_id:=int2oct(c_DIAMETER_3GPP_Gx_AID, 4), hbh_id:=hbh_id, ete_id:=ete_id,
+ avps := {
+ ts_AVP_SessionId(sess_id),
+ ts_AVP_OriginHost("pcrf.localdomain"),
+ ts_AVP_OriginRealm("localdomain"),
+ ts_AVP_DestinationRealm("localdomain"),
+ ts_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
+ ts_AVP_CcReqType(req_type),
+ ts_AVP_CcReqNum(req_num),
+ ts_AVP_SubcrId(subscr_id),
+ ts_AVP_3GPP_CalledStationId(called_station_id)
+ });
+
/* 3GPP TS 29.212 5.6.3 Credit-Control-Answer (CC-Answer, CCA) Command */
template (value) PDU_DIAMETER
ts_DIA_Gx_CCA(template (value) UINT32 hbh_id, template (value) UINT32 ete_id,
@@ -66,4 +87,19 @@
// origin
});
+template (present) PDU_DIAMETER
+tr_DIA_Gx_CCA(template (present) octetstring sess_id := ?,
+ template (present) DCC_NONE_CC_Request_Type req_type := ?,
+ template (present) DIAMETER_Resultcode res_code := DIAMETER_SUCCESS)
+:= tr_DIAMETER(flags:='01000000'B, cmd_code:=Credit_Control,
+ avps := superset(
+ tr_AVP_SessionId(sess_id),
+ tr_AVP_ResultCode(res_code),
+ tr_AVP_OriginHost,
+ tr_AVP_OriginRealm,
+ tr_AVP_AuthAppId(int2oct(c_DIAMETER_3GPP_Gx_AID, 4)),
+ tr_AVP_CcReqType(req_type),
+ tr_AVP_CcReqNum(?)
+ ));
+
} /* module */
diff --git a/pcrf/PCRF_Tests.cfg b/pcrf/PCRF_Tests.cfg
new file mode 100644
index 0000000..456d84f
--- /dev/null
+++ b/pcrf/PCRF_Tests.cfg
@@ -0,0 +1,26 @@
+[ORDERED_INCLUDE]
+# Common configuration, shared between test suites
+"../Common.cfg"
+# testsuite specific configuration, not expected to change
+"./PCRF_Tests.default"
+
+# Local configuration below
+
+[LOGGING]
+
+[TESTPORT_PARAMETERS]
+
+[MODULE_PARAMETERS]
+mp_pcrf_hostname := "127.0.0.201";
+mp_pcrf_port := 3868;
+mp_diam_local_hostname := "127.0.0.202";
+mp_diam_local_port := 3868;
+mp_diam_orig_realm := "localdomain";
+mp_diam_orig_host := "smf.localdomain";
+mp_diam_dest_realm := "localdomain";
+mp_diam_dest_host := "pcrf.localdomain";
+
+[MAIN_CONTROLLER]
+
+[EXECUTE]
+PCRF_Tests.control
diff --git a/pcrf/PCRF_Tests.default b/pcrf/PCRF_Tests.default
new file mode 100644
index 0000000..3a78848
--- /dev/null
+++ b/pcrf/PCRF_Tests.default
@@ -0,0 +1,9 @@
+[LOGGING]
+
+[TESTPORT_PARAMETERS]
+*.TCP.noDelay := "yes" // turn off nagle
+*.HTTP.use_notification_ASPs := "yes"
+
+[MODULE_PARAMETERS]
+
+[EXECUTE]
diff --git a/pcrf/PCRF_Tests.ttcn b/pcrf/PCRF_Tests.ttcn
new file mode 100644
index 0000000..3cfe1bf
--- /dev/null
+++ b/pcrf/PCRF_Tests.ttcn
@@ -0,0 +1,250 @@
+module PCRF_Tests {
+
+import from TCCEncoding_Functions all;
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from Native_Functions all;
+import from Misc_Helpers all;
+
+import from DIAMETER_Types all;
+import from DIAMETER_Templates all;
+import from DIAMETER_ts29_212_Templates all;
+import from DIAMETER_Emulation all;
+
+import from Prometheus_Checker all;
+
+type record of hexstring SubscriberConfigs;
+
+modulepar {
+ charstring mp_pcrf_hostname := "127.0.0.4";
+ integer mp_pcrf_port := 3868;
+ charstring mp_pcrf_prometheus_hostname := "127.0.0.5";
+ integer mp_pcrf_prometheus_port := c_prometheus_default_http_port;
+ charstring mp_diam_local_hostname := "127.0.0.1";
+ integer mp_diam_local_port := 3868;
+ charstring mp_diam_orig_realm := "localdomain";
+ charstring mp_diam_orig_host := "smf.localdomain";
+ charstring mp_diam_dest_realm := "localdomain";
+ charstring mp_diam_dest_host := "pcrf.localdomain";
+ SubscriberConfigs subscribers := {
+ /* Existing subscriber, ULA returns SERVICE_GRANTED */
+ '001010000000000'H,
+ '001010000000001'H
+ };
+}
+
+/* main component, we typically have one per testcase */
+type component MTC_CT {
+
+ /* emulated SMF */
+ var DIAMETER_Emulation_CT vc_Gx;
+ port DIAMETER_PT Gx_UNIT;
+ port DIAMETEREM_PROC_PT Gx_PROC;
+ /* global test case guard timer (actual timeout value is set in f_init()) */
+ timer T_guard;
+}
+
+/* global altstep for global guard timer; */
+altstep as_Tguard() runs on MTC_CT {
+ [] T_guard.timeout {
+ setverdict(fail, "Timeout of T_guard");
+ mtc.stop;
+ }
+}
+
+type component DIAMETER_ConnHdlr_CT extends DIAMETER_ConnHdlr {
+ port DIAMETER_Conn_PT DIAMETER_CLIENT;
+ port DIAMETEREM_PROC_PT DIAMETER_PROC_CLIENT;
+}
+
+function f_diam_connhldr_ct_main(hexstring imsi) runs on DIAMETER_ConnHdlr_CT {
+ var DIAMETER_ConnHdlr vc_conn_unused;
+ var PDU_DIAMETER msg;
+ var UINT32 ete_id;
+
+ f_diameter_expect_imsi(imsi);
+
+ while (true) {
+ alt {
+ [] DIAMETER_CLIENT.receive(PDU_DIAMETER:?) -> value msg {
+ DIAMETER.send(msg);
+ }
+ [] DIAMETER.receive(PDU_DIAMETER:?) -> value msg {
+ DIAMETER_CLIENT.send(msg);
+ }
+ [] DIAMETER_PROC_CLIENT.getcall(DIAMETEREM_register_eteid:{?,?}) -> param(ete_id, vc_conn_unused) {
+ DIAMETER_PROC.call(DIAMETEREM_register_eteid:{ete_id, self}) {
+ [] DIAMETER_PROC.getreply(DIAMETEREM_register_eteid:{?,?}) {};
+ }
+ DIAMETER_PROC_CLIENT.reply(DIAMETEREM_register_eteid:{ete_id, vc_conn_unused});
+ }
+ }
+ }
+}
+
+/* per-session component; we typically have 1..N per testcase */
+type component Cli_Session_CT extends Prometheus_Checker_CT {
+ var SessionPars g_pars;
+
+ port DIAMETER_Conn_PT Gx;
+ port DIAMETEREM_PROC_PT Gx_PROC;
+
+}
+function f_diam_connhldr_expect_eteid(UINT32 ete_id) runs on Cli_Session_CT {
+ Gx_PROC.call(DIAMETEREM_register_eteid:{ete_id, null}) {
+ [] Gx_PROC.getreply(DIAMETEREM_register_eteid:{?,?}) {};
+ }
+}
+
+/* configuration data for a given Session */
+type record SessionPars {
+ hexstring imsi,
+ uint32_t gx_next_hbh_id,
+ uint32_t gx_next_ete_id
+}
+
+template (value) SessionPars
+t_SessionPars(hexstring imsi, uint32_t gx_next_hbh_id := 1000, uint32_t gx_next_ete_id := 22220) := {
+ imsi := imsi,
+ gx_next_hbh_id := gx_next_hbh_id,
+ gx_next_ete_id := gx_next_ete_id
+}
+
+type function void_fn() runs on Cli_Session_CT;
+
+friend function DiameterForwardUnitdataCallback(PDU_DIAMETER msg)
+runs on DIAMETER_Emulation_CT return template PDU_DIAMETER {
+ DIAMETER_UNIT.send(msg);
+ return omit;
+}
+
+friend function f_init_diameter(charstring id) runs on MTC_CT {
+ var DIAMETEROps ops := {
+ create_cb := refers(DIAMETER_Emulation.ExpectedCreateCallback),
+ unitdata_cb := refers(DiameterForwardUnitdataCallback),
+ raw := false /* handler mode (IMSI based routing) */
+ };
+ var DIAMETER_conn_parameters pars;
+
+ /* Gx setup: */
+ pars := {
+ remote_ip := mp_pcrf_hostname,
+ remote_sctp_port := mp_pcrf_port,
+ local_ip := mp_diam_local_hostname,
+ local_sctp_port := mp_diam_local_port,
+ origin_host := mp_diam_orig_host,
+ origin_realm := mp_diam_orig_realm,
+ auth_app_id := omit,
+ vendor_app_id := c_DIAMETER_3GPP_Gx_AID
+ };
+ vc_Gx := DIAMETER_Emulation_CT.create(id);
+ map(vc_Gx:DIAMETER, system:DIAMETER_CODEC_PT);
+ connect(vc_Gx:DIAMETER_UNIT, self:Gx_UNIT);
+ connect(vc_Gx:DIAMETER_PROC, self:Gx_PROC);
+ vc_Gx.start(DIAMETER_Emulation.main(ops, pars, id));
+
+ f_diameter_wait_capability(Gx_UNIT);
+ /* Give some time for our emulation to get out of SUSPECT list of SUT (3 watchdong ping-pongs):
+ * RFC6733 sec 5.1
+ * RFC3539 sec 3.4.1 [5]
+ * https://github.com/freeDiameter/freeDiameter/blob/master/libfdcore/p_psm.c#…
+ */
+ f_sleep(1.0);
+}
+
+private function f_init(float guard_timeout := 60.0) runs on MTC_CT {
+ T_guard.start(guard_timeout);
+ activate(as_Tguard());
+ f_init_diameter(testcasename());
+}
+
+function f_start_handler(void_fn fn, template (omit) SessionPars pars_tmpl := omit)
+runs on MTC_CT return Cli_Session_CT {
+ var charstring id := testcasename();
+ var DIAMETER_ConnHdlr_CT vc_conn_gx;
+ var Cli_Session_CT vc_conn;
+ var SessionPars pars;
+
+ if (isvalue(pars_tmpl)) {
+ pars := valueof(pars_tmpl);
+ } else {
+ /*TODO: set default values */
+ }
+
+ vc_conn := Cli_Session_CT.create(id);
+
+ vc_conn_gx := DIAMETER_ConnHdlr_CT.create(id);
+ connect(vc_conn_gx:DIAMETER, vc_Gx:DIAMETER_CLIENT);
+ connect(vc_conn_gx:DIAMETER_PROC, vc_Gx:DIAMETER_PROC);
+ connect(vc_conn:Gx, vc_conn_gx:DIAMETER_CLIENT);
+ connect(vc_conn:Gx_PROC, vc_conn_gx:DIAMETER_PROC_CLIENT);
+ vc_conn_gx.start(f_diam_connhldr_ct_main(pars.imsi));
+
+ vc_conn.start(f_handler_init(fn, pars));
+ return vc_conn;
+}
+
+private function f_handler_init(void_fn fn, SessionPars pars)
+runs on Cli_Session_CT {
+ g_pars := valueof(pars);
+ f_prometheus_init(mp_pcrf_prometheus_hostname, mp_pcrf_prometheus_port);
+ fn.apply();
+}
+
+/* CCR + CCA against PCRF */
+private function f_dia_ccr_cca() runs on Cli_Session_CT {
+ var octetstring sess_id := char2oct("foobar");
+ var PDU_DIAMETER rx_dia;
+ var UINT32 hbh_id := int2oct(g_pars.gx_next_hbh_id, 4);
+ var UINT32 ete_id := int2oct(g_pars.gx_next_ete_id, 4);
+ var octetstring imsi := char2oct(f_dec_TBCD(imsi_hex2oct(g_pars.imsi)));
+ var octetstring apn := char2oct("internet");
+
+ /* Unlike CCR, CCA contains no IMSI. Register ete_id in DIAMETER_Emulation,
+ * so CCA is forwarded back to us in DIAMETER port instead of MTC_CT.DIAMETER_UNIT.
+ */
+ f_diam_connhldr_expect_eteid(ete_id);
+
+ /* TODO: change this into a ts_DIA_ULR */
+ Gx.send(ts_DIA_Gx_CCR(hbh_id, ete_id,
+ sess_id,
+ {ts_AVP_SubcrIdType(END_USER_IMSI), ts_AVP_SubcrIdData(imsi)},
+ apn,
+ INITIAL_REQUEST,
+ req_num := '00000000'O
+ ));
+ g_pars.gx_next_hbh_id := g_pars.gx_next_hbh_id + 1;
+ g_pars.gx_next_ete_id := g_pars.gx_next_ete_id + 1;
+
+ alt {
+ [] Gx.receive(tr_DIA_Gx_CCA(sess_id)) -> value rx_dia {
+ setverdict(pass);
+ }
+ [] Gx.receive(PDU_DIAMETER:?) -> value rx_dia {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Received unexpected DIAMETER ", rx_dia));
+ }
+ }
+}
+
+/* Test that PCRF can serve metrics over prometheus */
+private function f_TC_ccr_cca() runs on Cli_Session_CT {
+ f_dia_ccr_cca();
+ setverdict(pass);
+}
+testcase TC_ccr_cca() runs on MTC_CT {
+ var Cli_Session_CT vc_conn;
+ var SessionPars pars := valueof(t_SessionPars(subscribers[0]));
+ f_init();
+ vc_conn := f_start_handler(refers(f_TC_ccr_cca), pars);
+ vc_conn.done;
+}
+
+
+control {
+ execute( TC_ccr_cca() );
+}
+
+
+}
diff --git a/pcrf/create_test_subscribers.sh b/pcrf/create_test_subscribers.sh
new file mode 100755
index 0000000..f5b6c5b
--- /dev/null
+++ b/pcrf/create_test_subscribers.sh
@@ -0,0 +1,27 @@
+#!/bin/sh -ex
+DB_URI="mongodb://127.0.0.103/open5gs"
+DBCTL="$TESTENV_CACHE_DIR/open5gs-dbctl"
+DBCTL_CMD="$DBCTL --db_uri=$DB_URI"
+
+if ! [ -e "$DBCTL" ]; then
+ wget "https://raw.githubusercontent.com/open5gs/open5gs/v2.7.1/misc/db/open5gs-db…" \
+ -O "$DBCTL"
+fi
+
+if ! [ -x "$DBCTL" ]; then
+ chmod +x "$DBCTL"
+fi
+
+# mongod needs some time to bootstrap...
+while ! mongosh --quiet $DB_URI</dev/null; do
+ sleep 1
+done
+
+# Create a test subscriber with IMSI=001010000000000
+$DBCTL_CMD add 001010000000000 3c6e0b8a9c15224a8228b9a98ca1531d 762a2206fe0b4151ace403c86a11e479
+
+# Mark test subscriber with IMSI=001010000000001 as:
+# Subscriber-Status=OPERATOR_DETERMINED_BARRING (1)
+# Operator-Determined-Barring="Barring of all outgoing inter-zonal calls except those directed to the home PLMN country" (7)
+$DBCTL_CMD add 001010000000001 3c6e0b8a9c15224a8228b9a98ca1531d 762a2206fe0b4151ace403c86a11e479
+$DBCTL_CMD subscriber_status 001010000000001 1 7
diff --git a/pcrf/expected-results.xml b/pcrf/expected-results.xml
new file mode 100644
index 0000000..cd706a2
--- /dev/null
+++ b/pcrf/expected-results.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<testsuite name='Titan' tests='1' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+ <testcase classname='PCRF_Tests' name='TC_metrics_prometheus' time='MASKED'/>
+</testsuite>
diff --git a/pcrf/freediameter.conf b/pcrf/freediameter.conf
new file mode 100644
index 0000000..563c1f1
--- /dev/null
+++ b/pcrf/freediameter.conf
@@ -0,0 +1,265 @@
+# This is a sample configuration file for freeDiameter daemon.
+
+# Most of the options can be omitted, as they default to reasonable values.
+# Only TLS-related options must be configured properly in usual setups.
+
+# It is possible to use "include" keyword to import additional files
+# e.g.: include "/etc/freeDiameter.d/*.conf"
+# This is exactly equivalent as copy & paste the content of the included file(s)
+# where the "include" keyword is found.
+
+
+##############################################################
+## Peer identity and realm
+
+# The Diameter Identity of this daemon.
+# This must be a valid FQDN that resolves to the local host.
+# Default: hostname's FQDN
+#Identity = "aaa.koganei.freediameter.net";
+Identity = "pcrf.localdomain";
+
+# The Diameter Realm of this daemon.
+# Default: the domain part of Identity (after the first dot).
+#Realm = "koganei.freediameter.net";
+Realm = "localdomain";
+
+##############################################################
+## Transport protocol configuration
+
+# The port this peer is listening on for incoming connections (TCP and SCTP).
+# Default: 3868. Use 0 to disable.
+Port = 3868;
+
+# The port this peer is listening on for incoming TLS-protected connections (TCP and SCTP).
+# See TLS_old_method for more information about TLS flavours.
+# Note: we use TLS/SCTP instead of DTLS/SCTP at the moment. This will change in future version of freeDiameter.
+# Default: 5868. Use 0 to disable.
+SecPort = 0;
+
+# Use RFC3588 method for TLS protection, where TLS is negociated after CER/CEA exchange is completed
+# on the unsecure connection. The alternative is RFC6733 mechanism, where TLS protects also the
+# CER/CEA exchange on a dedicated secure port.
+# This parameter only affects outgoing connections.
+# The setting can be also defined per-peer (see Peers configuration section).
+# Default: use RFC6733 method with separate port for TLS.
+#TLS_old_method;
+
+# Disable use of TCP protocol (only listen and connect over SCTP)
+# Default : TCP enabled
+#No_TCP;
+
+# Disable use of SCTP protocol (only listen and connect over TCP)
+# Default : SCTP enabled
+#No_SCTP;
+# This option is ignored if freeDiameter is compiled with DISABLE_SCTP option.
+
+# Prefer TCP instead of SCTP for establishing new connections.
+# This setting may be overwritten per peer in peer configuration blocs.
+# Default : SCTP is attempted first.
+#Prefer_TCP;
+
+# Default number of streams per SCTP associations.
+# This setting may be overwritten per peer basis.
+# Default : 30 streams
+#SCTP_streams = 30;
+
+##############################################################
+## Endpoint configuration
+
+# Disable use of IP addresses (only IPv6)
+# Default : IP enabled
+#No_IP;
+
+# Disable use of IPv6 addresses (only IP)
+# Default : IPv6 enabled
+#No_IPv6;
+
+# Specify local addresses the server must bind to
+# Default : listen on all addresses available.
+#ListenOn = "202.249.37.5";
+#ListenOn = "2001:200:903:2::202:1";
+#ListenOn = "fe80::21c:5ff:fe98:7d62%eth0";
+ListenOn = "127.0.0.201";
+
+
+##############################################################
+## Server configuration
+
+# How many Diameter peers are allowed to be connecting at the same time ?
+# This parameter limits the number of incoming connections from the time
+# the connection is accepted until the first CER is received.
+# Default: 5 unidentified clients in paralel.
+#ThreadsPerServer = 5;
+
+##############################################################
+## TLS Configuration
+
+# TLS is managed by the GNUTLS library in the freeDiameter daemon.
+# You may find more information about parameters and special behaviors
+# in the relevant documentation.
+# http://www.gnu.org/software/gnutls/manual/
+
+# Credentials of the local peer
+# The X509 certificate and private key file to use for the local peer.
+# The files must contain PKCS-1 encoded RSA key, in PEM format.
+# (These parameters are passed to gnutls_certificate_set_x509_key_file function)
+# Default : NO DEFAULT
+#TLS_Cred = "<x509 certif file.PEM>" , "<x509 private key file.PEM>";
+#TLS_Cred = "/etc/ssl/certs/freeDiameter.pem", "/etc/ssl/private/freeDiameter.key";
+
+# Certificate authority / trust anchors
+# The file containing the list of trusted Certificate Authorities (PEM list)
+# (This parameter is passed to gnutls_certificate_set_x509_trust_file function)
+# The directive can appear several times to specify several files.
+# Default : GNUTLS default behavior
+#TLS_CA = "<file.PEM>";
+
+# Certificate Revocation List file
+# The information about revoked certificates.
+# The file contains a list of trusted CRLs in PEM format. They should have been verified before.
+# (This parameter is passed to gnutls_certificate_set_x509_crl_file function)
+# Note: openssl CRL format might have interoperability issue with GNUTLS format.
+# Default : GNUTLS default behavior
+#TLS_CRL = "<file.PEM>";
+
+# GNU TLS Priority string
+# This string allows to configure the behavior of GNUTLS key exchanges
+# algorithms. See gnutls_priority_init function documentation for information.
+# You should also refer to the Diameter required TLS support here:
+# http://tools.ietf.org/html/rfc6733#section-13.1
+# Default : "NORMAL"
+# Example: TLS_Prio = "NONE:+VERS-TLS1.1:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL";
+#TLS_Prio = "NORMAL";
+
+# Diffie-Hellman parameters size
+# Set the number of bits for generated DH parameters
+# Valid value should be 768, 1024, 2048, 3072 or 4096.
+# (This parameter is passed to gnutls_dh_params_generate2 function,
+# it usually should match RSA key size)
+# Default : 1024
+#TLS_DH_Bits = 1024;
+
+# Alternatively, you can specify a file to load the PKCS#3 encoded
+# DH parameters directly from. This accelerates the daemon start
+# but is slightly less secure. If this file is provided, the
+# TLS_DH_Bits parameters has no effect.
+# Default : no default.
+#TLS_DH_File = "<file.PEM>";
+
+
+##############################################################
+## Timers configuration
+
+# The Tc timer of this peer.
+# It is the delay before a new attempt is made to reconnect a disconnected peer.
+# The value is expressed in seconds. The recommended value is 30 seconds.
+# Default: 30
+#TcTimer = 30;
+
+# The Tw timer of this peer.
+# It is the delay before a watchdog message is sent, as described in RFC 3539.
+# The value is expressed in seconds. The default value is 30 seconds. Value must
+# be greater or equal to 6 seconds. See details in the RFC.
+# Default: 30
+#TwTimer = 30;
+
+##############################################################
+## Applications configuration
+
+# Disable the relaying of Diameter messages?
+# For messages not handled locally, the default behavior is to forward the
+# message to another peer if any is available, according to the routing
+# algorithms. In addition the "0xffffff" application is advertised in CER/CEA
+# exchanges.
+# Default: Relaying is enabled.
+#NoRelay;
+NoRelay;
+
+# Number of server threads that can handle incoming messages at the same time.
+# Default: 4
+#AppServThreads = 4;
+
+# Other applications are configured by loaded extensions.
+
+##############################################################
+## Extensions configuration
+
+# The freeDiameter framework merely provides support for
+# Diameter Base Protocol. The specific application behaviors,
+# as well as advanced functions, are provided
+# by loadable extensions (plug-ins).
+# These extensions may in addition receive the name of a
+# configuration file, the format of which is extension-specific.
+#
+# Format:
+#LoadExtension = "/path/to/extension" [ : "/optional/configuration/file" ] ;
+#
+# Examples:
+#LoadExtension = "extensions/sample.fdx";
+#LoadExtension = "extensions/sample.fdx":"conf/sample.conf";
+
+# Extensions are named as follow:
+# dict_* for extensions that add content to the dictionary definitions.
+# dbg_* for extensions useful only to retrieve more information on the framework execution.
+# acl_* : Access control list, to control which peers are allowed to connect.
+# rt_* : routing extensions that impact how messages are forwarded to other peers.
+# app_* : applications, these extensions usually register callbacks to handle specific messages.
+# test_* : dummy extensions that are useful only in testing environments.
+
+
+# The dbg_msg_dump.fdx extension allows you to tweak the way freeDiameter displays some
+# information about some events. This extension does not actually use a configuration file
+# but receives directly a parameter in the string passed to the extension. Here are some examples:
+## LoadExtension = "dbg_msg_dumps.fdx" : "0x1111"; # Removes all default hooks, very quiet even in case of errors.
+## LoadExtension = "dbg_msg_dumps.fdx" : "0x2222"; # Display all events with few details.
+## LoadExtension = "dbg_msg_dumps.fdx" : "0x0080"; # Dump complete information about sent and received messages.
+# The four digits respectively control: connections, routing decisions, sent/received messages, errors.
+# The values for each digit are:
+# 0 - default - keep the default behavior
+# 1 - quiet - remove any specific log
+# 2 - compact - display only a summary of the information
+# 4 - full - display the complete information on a single long line
+# 8 - tree - display the complete information in an easier to read format spanning several lines.
+
+LoadExtension = "dbg_msg_dumps.fdx" : "0x8888";
+LoadExtension = "dict_rfc5777.fdx";
+LoadExtension = "dict_mip6i.fdx";
+LoadExtension = "dict_nasreq.fdx";
+LoadExtension = "dict_nas_mipv6.fdx";
+LoadExtension = "dict_dcca.fdx";
+LoadExtension = "dict_dcca_3gpp.fdx";
+
+
+##############################################################
+## Peers configuration
+
+# The local server listens for incoming connections. By default,
+# all unknown connecting peers are rejected. Extensions can override this behavior (e.g., acl_wl).
+#
+# In addition to incoming connections, the local peer can
+# be configured to establish and maintain connections to some
+# Diameter nodes and allow connections from these nodes.
+# This is achieved with the ConnectPeer directive described below.
+#
+# Note that the configured Diameter Identity MUST match
+# the information received inside CEA, or the connection will be aborted.
+#
+# Format:
+#ConnectPeer = "diameterid" [ { parameter1; parameter2; ...} ] ;
+# Parameters that can be specified in the peer's parameter list:
+# No_TCP; No_SCTP; No_IP; No_IPv6; Prefer_TCP; TLS_old_method;
+# No_TLS; # assume transparent security instead of TLS. DTLS is not supported yet (will change in future versions).
+# Port = 5868; # The port to connect to
+# TcTimer = 30;
+# TwTimer = 30;
+# ConnectTo = "202.249.37.5";
+# ConnectTo = "2001:200:903:2::202:1";
+# TLS_Prio = "NORMAL";
+# Realm = "realm.net"; # Reject the peer if it does not advertise this realm.
+# Examples:
+#ConnectPeer = "aaa.wide.ad.jp";
+#ConnectPeer = "old.diameter.serv" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;
+ConnectPeer = "smf.localdomain" { ConnectTo = "127.0.0.202"; Port = 3868; No_TLS; TcTimer = 2; };
+
+
+##############################################################
diff --git a/pcrf/gen_links.sh b/pcrf/gen_links.sh
new file mode 100755
index 0000000..baa8315
--- /dev/null
+++ b/pcrf/gen_links.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+BASEDIR=../deps
+
+. ../gen_links.sh.inc
+
+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src
+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"
+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src
+FILES="Socket_API_Definitions.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src
+FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttcn IPL4asp_Types.ttcn IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator/src
+FILES="DIAMETER_EncDec.cc"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src
+FILES="Abstract_Socket.cc Abstract_Socket.hh "
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.HTTPmsg/src
+FILES="HTTPmsg_MessageLen.ttcn HTTPmsg_MessageLen_Function.cc HTTPmsg_PT.cc HTTPmsg_PT.hh HTTPmsg_PortType.ttcn HTTPmsg_Types.ttcn "
+gen_links $DIR $FILES
+
+DIR=../library
+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
+FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc DIAMETER_Emulation.ttcn "
+FILES+="DIAMETER_Templates.ttcn DIAMETER_ts29_212_Templates.ttcn "
+FILES+="SCTP_Templates.ttcn "
+FILES+="HTTP_Adapter.ttcn Prometheus_Checker.ttcn "
+gen_links $DIR $FILES
+
+ignore_pp_results
diff --git a/pcrf/mongod.conf b/pcrf/mongod.conf
new file mode 100644
index 0000000..ff648f4
--- /dev/null
+++ b/pcrf/mongod.conf
@@ -0,0 +1,45 @@
+# mongod.conf
+
+# for documentation of all options, see:
+# http://docs.mongodb.org/manual/reference/configuration-options/
+
+# Where and how to store data.
+storage:
+ dbPath: db
+# journal:
+# enabled: true
+# engine:
+# mmapv1:
+# wiredTiger:
+
+# where to write logging data.
+# systemLog:
+# destination: file
+# logAppend: true
+# path: /data/mongod.log
+
+# network interfaces
+net:
+ port: 27017
+ bindIp: 127.0.0.103
+
+
+# how the process runs
+processManagement:
+ timeZoneInfo: /usr/share/zoneinfo
+
+#security:
+
+#operationProfiling:
+
+#replication:
+
+#sharding:
+
+## Enterprise-Only Options:
+
+#auditLog:
+
+#snmp:
+
+
diff --git a/pcrf/open5gs-pcrf.yaml b/pcrf/open5gs-pcrf.yaml
new file mode 100644
index 0000000..dcab51a
--- /dev/null
+++ b/pcrf/open5gs-pcrf.yaml
@@ -0,0 +1,18 @@
+# See https://github.com/open5gs/open5gs/blob/main/configs/open5gs/pcrf.yaml.in
+
+db_uri: mongodb://127.0.0.103/open5gs
+
+logger:
+ level: trace
+
+global:
+ max:
+ ue: 1024
+
+pcrf:
+ freeDiameter: freediameter.conf
+ diameter_stats_interval: 1
+ metrics:
+ server:
+ - address: 127.0.0.5
+ port: 9090
\ No newline at end of file
diff --git a/pcrf/regen_makefile.sh b/pcrf/regen_makefile.sh
new file mode 100755
index 0000000..7d703ad
--- /dev/null
+++ b/pcrf/regen_makefile.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+NAME=PCRF_Tests
+
+FILES="
+ *.ttcn
+ Abstract_Socket.cc
+ DIAMETER_CodecPort_CtrlFunctDef.cc
+ DIAMETER_EncDec.cc
+ HTTPmsg_MessageLen_Function.cc
+ HTTPmsg_PT.cc
+ IPL4asp_PT.cc
+ IPL4asp_discovery.cc
+ Native_FunctionDefs.cc
+ TCCConversion.cc
+ TCCEncoding.cc
+ TCCInterface.cc
+"
+
+export CPPFLAGS_TTCN3="
+"
+
+../regen-makefile.sh -e $NAME $FILES
diff --git a/pcrf/testenv.cfg b/pcrf/testenv.cfg
new file mode 100644
index 0000000..221e4a9
--- /dev/null
+++ b/pcrf/testenv.cfg
@@ -0,0 +1,17 @@
+[testsuite]
+program=PCRF_Tests
+config=PCRF_Tests.cfg
+
+[db]
+prepare=mkdir db
+program=mongod --config mongod.conf
+setup=create_test_subscribers.sh
+copy=mongod.conf
+make=no
+package=no
+
+[pcrf]
+program=open5gs-pcrfd -c open5gs-pcrf.yaml
+make=open5gs
+copy=open5gs-pcrf.yaml freediameter.conf
+package=open5gs-pcrf
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38028?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I381577111ccadaefe42f6abe3cd9bb30cc8ceb56
Gerrit-Change-Number: 38028
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38025?usp=email )
Change subject: Misc_Helpers: Introduce API helper f_str_startswith
......................................................................
Misc_Helpers: Introduce API helper f_str_startswith
Counterpart of f_str_endswith(), this API is usually available in
several programming languages like python, and it's handy to have since
it's usually used and hence dev doesn't need to think on how to
implement it using regexp, etc.
This API will be used in a follow-up patch implementing Prometheus
metrics checker module.
Change-Id: Iad392ac652714a54a25954ea697f082d55772aa8
---
M library/Misc_Helpers.ttcn
1 file changed, 10 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/25/38025/1
diff --git a/library/Misc_Helpers.ttcn b/library/Misc_Helpers.ttcn
index a742b0b..967c8d1 100644
--- a/library/Misc_Helpers.ttcn
+++ b/library/Misc_Helpers.ttcn
@@ -79,6 +79,16 @@
return count;
}
+/* Return true if str starts exactly with token: */
+function f_str_startswith(charstring str, charstring token) return boolean
+{
+ if (lengthof(str) < lengthof(token)) {
+ return false;
+ }
+ var charstring str_start := substr(str, 0, lengthof(token));
+ return str_start == token;
+}
+
/* Return true if str ends exactly with token: */
function f_str_endswith(charstring str, charstring token) return boolean
{
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38025?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Iad392ac652714a54a25954ea697f082d55772aa8
Gerrit-Change-Number: 38025
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Attention is currently required from: fixeria, lynxis lazus.
pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/37924?usp=email )
Change subject: s1ap_proxy: Support replying errors
......................................................................
Patch Set 4:
(1 comment)
Patchset:
PS4:
> > Then please at least add unit tests here. I am aiming for good testing coverage. […]
Please understand it's quite frustrating having my patches here for a few days (even a week) and then seeing your recent PFCP patches being pushed and merged quickly without seeing any related TTCN3 tests in gerrit, while my patches are deliverately stopped in here.
And as a result, having to keep my own state and needing to maintain it making me lose time and efforts.
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/37924?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I242e84fb09b00f4794b6e1aa770f348a0e60aea4
Gerrit-Change-Number: 37924
Gerrit-PatchSet: 4
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-Comment-Date: Wed, 04 Sep 2024 14:12:47 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: pespin <pespin(a)sysmocom.de>
Comment-In-Reply-To: fixeria <vyanitskiy(a)sysmocom.de>
Attention is currently required from: fixeria, lynxis lazus.
pespin has posted comments on this change by pespin. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/37924?usp=email )
Change subject: s1ap_proxy: Support replying errors
......................................................................
Patch Set 4:
(1 comment)
Patchset:
PS4:
> Then please at least add unit tests here. I am aiming for good testing coverage.
I'm aiming for it too, but not everything can be done together at the same time.
I'm not aware that you followed yourself the same constrains that you are now applying on me in here while implementing all the stuff you did for osmo-s1gw.
The ttcn3 testsuite is not yet in a state where new tests can easily be added.
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/37924?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I242e84fb09b00f4794b6e1aa770f348a0e60aea4
Gerrit-Change-Number: 37924
Gerrit-PatchSet: 4
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-Comment-Date: Wed, 04 Sep 2024 14:07:46 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: pespin <pespin(a)sysmocom.de>
Comment-In-Reply-To: fixeria <vyanitskiy(a)sysmocom.de>