fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36099?usp=email )
Change subject: WIP ......................................................................
WIP
Change-Id: I6dfed05adb332c29404997ea7dc93ec3dabfc43a --- M start-testsuite.sh M stp/STP_Tests.ttcn M stp/STP_Tests_M3UA.ttcn M ttcn3-tcpdump-start.sh M ttcn3-tcpdump-stop.sh 5 files changed, 141 insertions(+), 33 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/99/36099/1
diff --git a/start-testsuite.sh b/start-testsuite.sh index 4b88501..6ffacd2 100755 --- a/start-testsuite.sh +++ b/start-testsuite.sh @@ -50,8 +50,8 @@ ulimit -n 100000
# below is for the debian packages -TTCN3_BIN_DIR="${TTCN3_BIN_DIR:-/usr/bin}" -TITAN_LIBRARY_PATH="${TITAN_LIBRARY_PATH:-/usr/lib/titan:/usr/ttcn3/lib}" +TTCN3_BIN_DIR="${TTCN3_DIR}/bin" +TITAN_LIBRARY_PATH="${TTCN3_DIR}/lib" LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SUITE_DIR:$TITAN_LIBRARY_PATH" "$TTCN3_BIN_DIR/ttcn3_start" $SUITE $CFG $TEST
expected="$SUITE_DIR/expected-results.xml" diff --git a/stp/STP_Tests.ttcn b/stp/STP_Tests.ttcn index e2e5336..8c6a065 100644 --- a/stp/STP_Tests.ttcn +++ b/stp/STP_Tests.ttcn @@ -60,6 +60,34 @@ } }
+/* Test routing of SCCP between an M3UA-o-SCTP and an M3UA-o-TCP */ +testcase TC_m3ua_tcp() runs on IPA_M3UA_CT { + var OCT4 rctx_sender := int2oct(1023, 4); + var OCT4 pc_sender := int2oct(23, 4); + var OCT4 pc_receiver := int2oct(5, 4); + + f_init_m3ua(); + f_init_ipa(); + + f_connect_ipa(3); + f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx + + /* send a well-formed, encoded SCCP message via M3UA */ + var octetstring data := f_rnd_octstring_rnd_len(100); + var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H)); + var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H)); + var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data)); + var octetstring sccp_enc := enc_PDU_SCCP(sccp); + var template (value) M3UA_Protocol_Data tx_pd; + tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc); + f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1); + + /* expect to receive it via IPA */ + // f_IPA_exp(3, sccp_enc); + + f_clear_m3ua(); +} + /* Test routing of SCCP between an M3UA and an IPA ASP */ testcase TC_m3ua_to_ipa() runs on IPA_M3UA_CT { var OCT4 rctx_sender := int2oct(1023, 4); diff --git a/stp/STP_Tests_M3UA.ttcn b/stp/STP_Tests_M3UA.ttcn index 5af894a..8592d4a 100644 --- a/stp/STP_Tests_M3UA.ttcn +++ b/stp/STP_Tests_M3UA.ttcn @@ -45,41 +45,47 @@ 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-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 := - } @@ -89,10 +95,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 */ @@ -119,7 +127,7 @@ sctpPeerAddrChange := ? } } -private template PortEvent tr_SctpConnOpened := { +private template PortEvent tr_ConnOpened := { connOpened := ? }
@@ -137,9 +145,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 { @@ -192,7 +204,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 := {}; @@ -213,15 +225,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)) { @@ -231,9 +243,34 @@ 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; + + 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)}); + 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] := 0; }
@@ -255,12 +292,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 { @@ -275,7 +320,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); + } } }
@@ -294,15 +343,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; } } } @@ -982,12 +1031,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", mp_m3ua_configs[3]); + 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", mp_m3ua_configs[3]); + 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/ttcn3-tcpdump-start.sh b/ttcn3-tcpdump-start.sh index c4905d9..003d439 100755 --- a/ttcn3-tcpdump-start.sh +++ b/ttcn3-tcpdump-start.sh @@ -36,6 +36,8 @@ TTCN3_PCAP_PATH=/tmp fi
+exit + kill_rm_pidfile $PIDFILE_NETCAT kill_rm_pidfile $PIDFILE_PCAP
diff --git a/ttcn3-tcpdump-stop.sh b/ttcn3-tcpdump-stop.sh index 82d3a4f..0a13841 100755 --- a/ttcn3-tcpdump-stop.sh +++ b/ttcn3-tcpdump-stop.sh @@ -54,6 +54,8 @@ fi fi
+exit + # Wait for up to 2 seconds if we keep receiving traffinc from packet dumper, # otherwise we might lose last packets from test. i=0