diff options
Diffstat (limited to 'library/OSMUX_Emulation.ttcn')
-rw-r--r-- | library/OSMUX_Emulation.ttcn | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/library/OSMUX_Emulation.ttcn b/library/OSMUX_Emulation.ttcn index d31a562b..4538fdff 100644 --- a/library/OSMUX_Emulation.ttcn +++ b/library/OSMUX_Emulation.ttcn @@ -54,6 +54,8 @@ module OSMUX_Emulation { import from General_Types all; import from Osmocom_Types all; import from IPL4asp_Types all; +import from Misc_Helpers all; +import from AMR_Types all; import from OSMUX_Types all; import from OSMUX_CodecPort all; import from OSMUX_CodecPort_CtrlFunct all; @@ -65,6 +67,8 @@ type component OSMUX_Emulation_CT { /* user-facing port for controlling the binding */ port OsmuxEM_CTRL_PT CTRL; + /* user-facing port for sniffing Osmux frames */ + port OsmuxEM_DATA_PT DATA; /* configurable by user, should be fixed */ var OsmuxemConfig g_cfg := c_OsmuxemDefaultCfg; @@ -188,6 +192,10 @@ type port OsmuxEM_CTRL_PT procedure { OsmuxEM_stats_get, OsmuxEM_register_rxhandle, OsmuxEM_register_txhandle; } with { extension "internal" }; +type port OsmuxEM_DATA_PT message { + inout OSMUX_PDU; +} with { extension "internal" }; + function f_osmuxem_bind(OsmuxEM_CTRL_PT pt, in HostName local_host, inout PortNumber local_port) { pt.call(OsmuxEM_bind:{local_host, local_port}) { [] pt.getreply(OsmuxEM_bind:{local_host, ?}) -> param (local_port) {}; @@ -289,26 +297,26 @@ function f_osmuxem_stats_err_check(OsmuxemStats s) { /* Check if there was some activity at either on the RX or on the * TX side, but complete silence would indicate some problem */ if (s.num_pkts_tx < 1 and s.num_pkts_rx < 1) { - setverdict(fail, "no Osmux packet activity detected (packets)"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "no Osmux packet activity detected (packets)"); } if (s.bytes_payload_tx < 1 and s.bytes_payload_rx < 1) { - setverdict(fail, "no Osmux packet activity detected (bytes)"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "no Osmux packet activity detected (bytes)"); } /* Check error counters */ if (s.num_pkts_rx_err_seq != 0) { - setverdict(fail, "Osmux packet sequence number errors occurred"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Osmux packet sequence number errors occurred"); } if (s.num_pkts_rx_err_disabled != 0) { - setverdict(fail, "Osmux packets received while RX was disabled"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Osmux packets received while RX was disabled"); } if (s.num_pkts_rx_err_payload != 0) { - setverdict(fail, "Osmux packets with mismatching payload received"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Osmux packets with mismatching payload received"); } } @@ -336,8 +344,9 @@ private function f_rxhandle_get_by_cid(OsmuxCID cid) runs on OSMUX_Emulation_CT return RxHandleTable[i].vc_conn; } } - setverdict(fail, "No Component for CID ", cid); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("No Component for CID ", cid)); + return RxHandleTable[0].vc_conn; /* make compiler happy, not reached */ } private function f_rxhandle_cid_add(OsmuxRxHandle hdl) runs on OSMUX_Emulation_CT { @@ -349,8 +358,8 @@ private function f_rxhandle_cid_add(OsmuxRxHandle hdl) runs on OSMUX_Emulation_C return; } } - testcase.stop("No Space in RxHandleTable for ", hdl.cid); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("No Space in RxHandleTable for ", hdl.cid)); } private function f_txhandle_cid_add(OsmuxTxHandle hdl) runs on OSMUX_Emulation_CT { @@ -361,16 +370,24 @@ private function f_txhandle_cid_add(OsmuxTxHandle hdl) runs on OSMUX_Emulation_C return; } } - testcase.stop("No Space in TxHandleList for ", hdl.cid); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("No Space in TxHandleList for ", hdl.cid)); } +/* Generate correctly-sized AMR payload based on amr_ft, using tx_fixed_payload as a fill pattern. */ function f_osmux_gen_expected_rx_rtp_payload(INT4b amr_ft, octetstring tx_fixed_payload) return octetstring { + var integer payload_len_bits; var integer payload_len; + var bitstring payload_truncated_bits; var octetstring payload_truncated; - var integer i; + + /* Generate the AMR payload as a bitstring, since some formats don't end up in octet boundary: */ + payload_len_bits := f_amrft_payload_bits_len(amr_ft); + payload_truncated_bits := substr(oct2bit(tx_fixed_payload), 0, payload_len_bits); + + /* Now convert it as an octet string filling final padding with zeroes: */ payload_len := f_amrft_payload_len(amr_ft); - payload_truncated := substr(tx_fixed_payload, 0, payload_len); + payload_truncated := bit2oct(f_pad_bit(payload_truncated_bits, payload_len*8, '0'B)); return payload_truncated; } @@ -420,7 +437,7 @@ function f_main() runs on OSMUX_Emulation_CT var OsmuxRxHandle rx_hdl; var OsmuxTxHandle tx_hdl; var octetstring payload_truncated; - + var PortEvent port_event; timer T_transmit := int2float(g_cfg.tx_duration_ms)/1000.0; var Osmux_RecvFrom rx_osmux; var PDU_Osmux_AMR rx_amr; @@ -459,8 +476,8 @@ function f_main() runs on OSMUX_Emulation_CT res := OSMUX_CodecPort_CtrlFunct.f_IPL4_listen(OSMUX, g_local_host, g_local_port, {udp:={}}); if (not ispresent(res.connId)) { - setverdict(fail, "Could not listen on Osmux socket, check your configuration"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Could not listen on Osmux socket, check your configuration"); } g_osmux_conn_id := res.connId; tr_osmux_amr.connId := g_osmux_conn_id; @@ -474,8 +491,8 @@ function f_main() runs on OSMUX_Emulation_CT g_local_host, g_local_port, g_osmux_conn_id, {udp:={}}); if (not ispresent(res.connId)) { - setverdict(fail, "Could not connect to Osmux socket, check your configuration"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Could not connect to Osmux socket, check your configuration"); } g_tx_connected := true; CTRL.reply(OsmuxEM_connect:{g_remote_host, g_remote_port}); @@ -553,6 +570,9 @@ function f_main() runs on OSMUX_Emulation_CT if (ispresent(g_cfg.rx_fixed_payload) and rx_osmux.msg.osmux_amr.data != payload_truncated) { g_stat.num_pkts_rx_err_payload := g_stat.num_pkts_rx_err_payload + 1; } + if (DATA.checkstate("Connected")) { + DATA.send(rx_osmux.msg); + } } /* process received Osmux Dummy if receiver enabled */ [g_rx_enabled] OSMUX.receive(tr_osmux_dummy) -> value rx_osmux { @@ -567,10 +587,15 @@ function f_main() runs on OSMUX_Emulation_CT T_transmit.start; } + [] OSMUX.receive(PortEvent:?) -> value port_event { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Received unexpected port event from Osmux:", port_event)); + } + /* fail on any unexpected messages */ [] OSMUX.receive { - setverdict(fail, "Received unexpected type from Osmux"); - mtc.stop; + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + "Received unexpected msg type from Osmux"); } } } |