<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>