fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36149?usp=email )
Change subject: stp: prepare for testing M3UA-over-TCP ......................................................................
stp: prepare for testing M3UA-over-TCP
* rename various fields and templates to be transport neutral * extend mp_m3ua_configs[]: add one client and one server ASPs * f_M3UA_connect(): split onto f_M3UA_connect_{tcp,sctp}() * f[_no]_quirk(): properly handle ASPs using TCP transport * add osmo-stp-tcp.confmerge [*]
We cannot add new M3UA-over-TCP ASPs to osmo-stp.cfg because that would break the job testing latest osmo-stp version. Instead, add a confmerge file to be applied by jenkins.sh (for nightly only).
Change-Id: I5d0b05aa434c057ad379125ac293f5fc9a240b6f Related: docker-playground.git I210b7d62845075dcfe147f2f77603625cc1e64f9 Related: SYS#5424 --- M stp/STP_Tests_M3UA.ttcn A stp/osmo-stp-tcp.confmerge 2 files changed, 175 insertions(+), 35 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/49/36149/1
diff --git a/stp/STP_Tests_M3UA.ttcn b/stp/STP_Tests_M3UA.ttcn index 8b3db48..3100ab6 100644 --- a/stp/STP_Tests_M3UA.ttcn +++ b/stp/STP_Tests_M3UA.ttcn @@ -2,6 +2,7 @@
/* Osmocom STP test suite in in TTCN-3 * (C) 2019 Harald Welte laforge@gnumonks.org + * (C) 2024 by sysmocom - s.f.m.c. GmbH info@sysmocom.de * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or @@ -15,6 +16,7 @@ import from General_Types all; import from Osmocom_Types all; import from IPL4asp_Types all; +import from Misc_Helpers all;
import from Osmocom_VTY_Functions all;
@@ -34,8 +36,8 @@
import from STP_Tests_Common all;
-private const integer NR_M3UA := 3; /* number of M3UA clients in ATS */ -private const integer NR_M3UA_SRV := 3; /* number of M3UA servres in ATS */ +private const integer NR_M3UA := 4; /* number of M3UA clients in ATS */ +private const integer NR_M3UA_SRV := 4; /* number of M3UA servres in ATS */
modulepar { /* STP-side IP addresses */ @@ -45,43 +47,65 @@ M3uaConfigs mp_m3ua_configs := { /* as-sender: One ASP within AS */ { - remote_sctp_port := 2905, - local_sctp_port := 9999, + use_tcp := false, + remote_port := 2905, + local_port := 9999, point_code := 23, routing_ctx := 1023 }, /* as-receiver: Two ASP within AS */ { - remote_sctp_port := 2905, - local_sctp_port := 10000, + use_tcp := false, + remote_port := 2905, + local_port := 10000, point_code := 42, routing_ctx := 1042 }, { - remote_sctp_port := 2905, - local_sctp_port := 10001, + use_tcp := false, + remote_port := 2905, + local_port := 10001, point_code := 42, routing_ctx := 1042 }, + /* as-sender-tcp: One ASP within AS */ + { + use_tcp := true, + remote_port := 2905, + local_port := 9999, + point_code := 123, + routing_ctx := 1123 + }, /* as-client: One ASP within AS */ { - remote_sctp_port := 2906, - local_sctp_port := 10002, + use_tcp := false, + remote_port := 2906, + local_port := 10002, point_code := 55, routing_ctx := 1055 }, /* as-client60-norctx */ { - remote_sctp_port := 2907, - local_sctp_port := 11060, + use_tcp := false, + remote_port := 2907, + local_port := 11060, point_code := 60, routing_ctx := - }, /* as-client61-norctx */ { - remote_sctp_port := 2907, - local_sctp_port := 11061, + use_tcp := false, + remote_port := 2907, + local_port := 11061, point_code := 61, routing_ctx := - + }, + /* as-client-tcp: One ASP within AS */ + { + use_tcp := true, + remote_port := 2906, + local_port := 10002, + point_code := 155, + routing_ctx := 1155 } }; integer mp_recovery_timeout_msec := 2000; @@ -89,10 +113,12 @@ }
type record M3uaConfig { - /* STP-side SCTP port for M3UA */ - integer remote_sctp_port, + /* use TCP (true) or SCTP (false) */ + boolean use_tcp, + /* STP-side SCTP (or TCP) port for M3UA */ + integer remote_port, /* local M3UA base port on TTCN3 side */ - integer local_sctp_port, + integer local_port, /* point code routed via this M3U */ integer point_code, /* associated routing context */ @@ -135,7 +161,7 @@ sctpPeerAddrChange := ? } } -private template PortEvent tr_SctpConnOpened := { +private template PortEvent tr_ConnOpened := { connOpened := ? }
@@ -153,9 +179,13 @@ } }
-friend function f_M3UA_send(integer idx, template (present) PDU_M3UA msg, template integer stream := 0) +friend function f_M3UA_send(integer idx, template (present) PDU_M3UA msg, integer stream := 0) runs on RAW_M3UA_CT { - M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, stream)); + if (mp_m3ua_configs[idx].use_tcp) { + M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, omit)); + } else { + M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, stream)); + } }
friend function f_M3UA_exp(integer idx, template (present) PDU_M3UA msg) runs on RAW_M3UA_CT { @@ -208,7 +238,7 @@ assocId := omit };
-friend function f_M3UA_connect(integer i) runs on RAW_M3UA_CT { +friend function f_M3UA_connect_sctp(integer i) runs on RAW_M3UA_CT { var Result res; var Option opt_add_local_addrs; var OptionList opt_list := {}; @@ -229,15 +259,15 @@
if (lengthof(mp_stp_m3ua_ip) > 1) { for (var integer j := 1; j < lengthof(mp_stp_m3ua_ip); j := j + 1) { - var Socket sk := valueof(ts_Socket(mp_stp_m3ua_ip[j], m3cfg.remote_sctp_port)); + var Socket sk := valueof(ts_Socket(mp_stp_m3ua_ip[j], m3cfg.remote_port)); opt_add_remote_addrs[j - 1] := sk; } } else { opt_add_remote_addrs := omit; }
- res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_sctp_port, - mp_local_m3ua_ip[0], m3cfg.local_sctp_port, 0, + res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_port, + mp_local_m3ua_ip[0], m3cfg.local_port, 0, {sctp:=valueof(ts_SCTP(3, 0, opt_add_remote_addrs))}, opt_list); if (not ispresent(res.connId)) { @@ -247,10 +277,47 @@ g_m3ua_conn_id[i] := res.connId; }
+friend function f_M3UA_connect_tcp(integer i) runs on RAW_M3UA_CT { + var M3uaConfig m3cfg := mp_m3ua_configs[i]; + var Result res; + + /* XXX: M3UA-over-TCP is not supported by osmo-stp <= 1.8.1 */ + if (not Misc_Helpers.f_osmo_repo_is("nightly")) { + log("Not connect()ing m3cfg := ", m3cfg, " (not supported by IUT)"); + g_m3ua_conn_id[i] := -1; + return; + } + + if (lengthof(mp_local_m3ua_ip) == 0 or lengthof(mp_stp_m3ua_ip) == 0) { + setverdict(fail, "Empty local or remote address trying to connect TCP socket: ", + mp_local_m3ua_ip, " / ", mp_stp_m3ua_ip); + mtc.stop; + } + + res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_port, + mp_local_m3ua_ip[0], m3cfg.local_port, 0, + {tcp:={}}); + if (not ispresent(res.connId)) { + setverdict(fail, "Could not connect M3UA socket, check your configuration"); + mtc.stop; + } + g_m3ua_conn_id[i] := res.connId; + M3UA_CodecPort.f_set_tcp_segmentation(M3UA[i], res.connId); +} + friend function f_M3UA_close(integer i) runs on RAW_M3UA_CT { var Result res; - res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {sctp:=valueof(ts_SCTP)}); - g_m3ua_conn_id[i] := 0; + if (g_m3ua_conn_id[i] < 0) { + log("Not close()ing m3cfg := ", mp_m3ua_configs[i], " (not connected)"); + /* not connected */ + return; + } + if (mp_m3ua_configs[i].use_tcp) { + res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {tcp:={}}); + } else { + res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {sctp:=valueof(ts_SCTP)}); + } + g_m3ua_conn_id[i] := -1; }
friend function f_M3UA_listen(integer i) runs on RAW_M3UA_CT { @@ -271,12 +338,20 @@ opt_list := {opt_add_local_addrs}; }
- res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_sctp_port, - {sctp:=valueof(ts_SCTP)}, opt_list); + if (mp_m3ua_configs[i].use_tcp) { + res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_port, + {tcp:={}}); + } else { + res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_port, + {sctp:=valueof(ts_SCTP)}, opt_list); + } if (not ispresent(res.connId)) { setverdict(fail, "Could not bind M3UA socket, check your configuration"); mtc.stop; } + if (mp_m3ua_configs[i].use_tcp) { + M3UA_CodecPort.f_set_tcp_segmentation(M3UA[i], res.connId); + } }
friend function f_init_m3ua(boolean ignore_ssnm := true) runs on RAW_M3UA_CT { @@ -291,7 +366,11 @@
for (i := 0; i < NR_M3UA; i:=i+1) { map(self:M3UA[i], system:M3UA_CODEC_PT); - f_M3UA_connect(i); + if (mp_m3ua_configs[i].use_tcp) { + f_M3UA_connect_tcp(i); + } else { + f_M3UA_connect_sctp(i); + } } }
@@ -310,15 +389,15 @@
friend function f_init_m3ua_srv() runs on RAW_M3UA_CT { var integer i; - var PortEvent sctp_evt; + var PortEvent port_evt;
for (i := NR_M3UA; i < NR_M3UA+NR_M3UA_SRV; i:=i+1) { map(self:M3UA[i], system:M3UA_CODEC_PT); /* bind+ listen */ f_M3UA_listen(i); /* wait for accept() */ - M3UA[i].receive(tr_SctpConnOpened) -> value sctp_evt { - g_m3ua_conn_id[i] := sctp_evt.connOpened.connId; + M3UA[i].receive(tr_ConnOpened) -> value port_evt { + g_m3ua_conn_id[i] := port_evt.connOpened.connId; } } } @@ -526,7 +605,7 @@
/* verify traffic is routed from sender to new receiver */ const integer iter_per_asp := 5; - var integer num_rx[NR_M3UA] := { 0, 0, 0 }; + var integer num_rx[NR_M3UA] := { 0, 0, 0, 0 }; for (i := 0; i < 2*iter_per_asp; i := i+1) { var octetstring data := f_rnd_octstring_rnd_len(100); var template (value) M3UA_Protocol_Data tx_pd; @@ -1002,12 +1081,30 @@ f_M3UA_exp(0, tr_M3UA_SCON({adv_pc}, rctx0)); }
+private function f_asp_cfg_str(charstring asp_name, in M3uaConfig cfg) +return charstring { + var charstring str; + + str := "asp " & asp_name; + str := str & " " & int2str(cfg.local_port); + str := str & " " & int2str(cfg.remote_port); + str := str & " m3ua"; + + if (cfg.use_tcp) { + str := str & " tcp"; + } + + return str; +} + private function f_quirk(charstring quirk) runs on RAW_M3UA_CT { - f_vty_config2(VTY, {"cs7 instance 0", "asp asp-client0 10002 2906 m3ua"}, "quirk " & quirk); + var charstring asp_cfg_str := f_asp_cfg_str("asp-client0", f_m3ua_srv_config(0)); + f_vty_config2(VTY, {"cs7 instance 0", asp_cfg_str}, "quirk " & quirk); }
private function f_no_quirk(charstring quirk) runs on RAW_M3UA_CT { - f_vty_config2(VTY, {"cs7 instance 0", "asp asp-client0 10002 2906 m3ua"}, "no quirk " & quirk); + var charstring asp_cfg_str := f_asp_cfg_str("asp-client0", f_m3ua_srv_config(0)); + f_vty_config2(VTY, {"cs7 instance 0", asp_cfg_str}, "no quirk " & quirk); }
/* quirk 'no_notify': Expect inbound connection from ASP/SCTP-client, followed by ASP-UP + ASP-ACT */ diff --git a/stp/osmo-stp-tcp.confmerge b/stp/osmo-stp-tcp.confmerge new file mode 100644 index 0000000..b40867a --- /dev/null +++ b/stp/osmo-stp-tcp.confmerge @@ -0,0 +1,22 @@ +cs7 instance 0 + asp asp-sender-tcp 9999 2905 m3ua tcp + local-ip 127.0.0.1 + remote-ip 127.0.0.1 + role sg + transport-role server + asp asp-client0-tcp 10002 2906 m3ua tcp + local-ip 127.0.0.1 + remote-ip 127.0.0.1 + role asp + transport-role client + as as-sender-tcp m3ua + asp asp-sender-tcp + routing-key 1123 123 + as as-client-tcp m3ua + routing-key 1155 155 + asp asp-client0-tcp + route-table system + update route 123 16777215 linkset as-sender-tcp + update route 155 16777215 linkset as-client-tcp + listen m3ua 2905 tcp + accept-asp-connections dynamic-permitted