aboutsummaryrefslogtreecommitdiffstats
path: root/library/OSMUX_Emulation.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'library/OSMUX_Emulation.ttcn')
-rw-r--r--library/OSMUX_Emulation.ttcn75
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");
}
}
}