<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18465">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">library/RSL_Emulation: server mode: handle multiple transceivers<br><br>Change-Id: I86afb55ecc6703ce7a229aaa626223f9331a4778<br>Related: OS#4546<br>---<br>M library/RSL_Emulation.ttcn<br>1 file changed, 79 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/65/18465/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/RSL_Emulation.ttcn b/library/RSL_Emulation.ttcn</span><br><span>index ffd60a7..6c595fa 100644</span><br><span>--- a/library/RSL_Emulation.ttcn</span><br><span>+++ b/library/RSL_Emulation.ttcn</span><br><span>@@ -314,6 +314,69 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_trx_conn_map_init()</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RSL_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < sizeof(TrxConnMap); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TrxConnMap[i] := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_trx_conn_map_register(integer conn_id, in IpaCcmIdResp id_resp)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RSL_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template charstring unit_id_fmt := pattern "(\d+)/(\d+)/(\d+)";</span><br><span style="color: hsl(120, 100%, 40%);">+ var charstring unit_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer trx_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check if we have room for a new connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TrxConnNum >= sizeof(TrxConnMap)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("We cannot handle more than ", sizeof(TrxConnMap), " transceivers");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Find IPAC_IDTAG_UNITID in the IPA IDENTITY RESPONSE */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < sizeof(id_resp); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (id_resp[i].tag == IPAC_IDTAG_UNITID) {</span><br><span style="color: hsl(120, 100%, 40%);">+ unit_id := oct2char(id_resp[i].data);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If this is the last element, nothing is found */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i + 1 == sizeof(id_resp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("IPA IDENTITY RESPONSE contains no unit-id");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure that IPA unit-id is valid */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(unit_id, unit_id_fmt)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("IPA unit-id has unknown/unexpected format");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Parse transceiver number (site/bts/trx) */</span><br><span style="color: hsl(120, 100%, 40%);">+ unit_id := regexp(unit_id, unit_id_fmt, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_nr := str2int(unit_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_nr >= sizeof(TrxConnMap)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("Transceiver #", trx_nr, " does not fit");</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (TrxConnMap[trx_nr] != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("Transceiver #", trx_nr, " is already connected?!?");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Finally, store the connection ID */</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Mapped TRX#", trx_nr, " to TCP/IP conn_id=", conn_id);</span><br><span style="color: hsl(120, 100%, 40%);">+ TrxConnMap[trx_nr] := conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ TrxConnNum := TrxConnNum + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_trx_conn_map_resolve(IpaStreamId id)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RSL_Emulation_CT return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer trx_nr := f_trx_by_streamId(id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (TrxConnMap[trx_nr] == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("Transceiver #", trx_nr, " is not connected");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return TrxConnMap[trx_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type component RSL_Emulation_CT {</span><br><span> /* port facing down towards IPA emulation */</span><br><span> port IPA_RSL_PT IPA_PT;</span><br><span>@@ -329,6 +392,10 @@</span><br><span> </span><br><span> /* last RSL CHAN ACT for each chan_nr */</span><br><span> var LastActData LastActTable[64];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* IPA stream ID -> TCP/IP connection ID mapping for transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer TrxConnNum := 0; /* number of connected transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer TrxConnMap[4]; /* up to 4 transceivers for now */</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -362,6 +429,7 @@</span><br><span> var boolean dchan_suspended := false;</span><br><span> </span><br><span> f_conn_table_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_trx_conn_map_init();</span><br><span> f_last_act_table_init();</span><br><span> </span><br><span> while (true) {</span><br><span>@@ -369,7 +437,15 @@</span><br><span> [bts_role] IPA_PT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) {</span><br><span> }</span><br><span> [not bts_role] IPA_PT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) -> value evt {</span><br><span style="color: hsl(0, 100%, 40%);">- CCHAN_PT.send(evt);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("A new IPA/RSL connection has been established (conn_id=",</span><br><span style="color: hsl(120, 100%, 40%);">+ evt.conn_id, "), waiting for IDENTITY RESPONSE...");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [not bts_role] IPA_PT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_RESP)) -> value evt {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Got IDENTITY RESPONSE (conn_id=", evt.conn_id, "): ", evt.id_resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Update [ IPA stream ID -> TCP/IP connection ID ] mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_trx_conn_map_register(evt.conn_id, evt.id_resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: craft and send our own event type with TRX number */</span><br><span style="color: hsl(120, 100%, 40%);">+ CCHAN_PT.send(ts_ASP_IPA_EV(ASP_IPA_EVENT_UP, evt.conn_id));</span><br><span> }</span><br><span> [bts_role] IPA_PT.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {</span><br><span> Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Lost IPA connection!");</span><br><span>@@ -485,12 +561,14 @@</span><br><span> f_cid_create(chan_rqd.ra, chan_rqd.fn, vc_conn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* RSL message from a component that runs on RSL_DchanHdlr */</span><br><span> [] CLIENT_PT.receive(tr_RSL_MsgType(?)) -> value rx_rsl_msg sender vc_conn {</span><br><span> /* forward to BSC */</span><br><span> cid := f_cid_by_comp_ref(vc_conn);</span><br><span> IPA_PT.send(ts_ASP_RSL_UD(rx_rsl_msg, ConnectionTable[cid].stream_id));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* RSL message from MTC */</span><br><span> [] CCHAN_PT.receive(tr_ASP_RSL_UD(?)) -> value rx_rsl {</span><br><span> IPA_PT.send(ts_ASP_RSL_UD(rx_rsl.rsl, rx_rsl.streamId));</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18465">change 18465</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18465"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I86afb55ecc6703ce7a229aaa626223f9331a4778 </div>
<div style="display:none"> Gerrit-Change-Number: 18465 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>