<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11487">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">SGsAP_Emulation: Add functions to send MME or VLR reset<br><br>... including encoding/decoding of names between string and binary labels<br><br>Change-Id: I981c7c1d34f0db60031b5436739cd924e5a09407<br>---<br>A library/DNS_Helpers.ttcn<br>M library/SGsAP_Emulation.ttcn<br>2 files changed, 106 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/87/11487/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/DNS_Helpers.ttcn b/library/DNS_Helpers.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..45c3a09</span><br><span>--- /dev/null</span><br><span>+++ b/library/DNS_Helpers.ttcn</span><br><span>@@ -0,0 +1,63 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module DNS_Helpers {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_strchr(charstring s, char c) return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i := 0; i < lengthof(s); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (s[i] == c) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return i;</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 -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_dns_enc_label(charstring str) return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ret[0] := int2oct(lengthof(str), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+  return ret & char2oct(str);</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%);">+function f_enc_dns_hostname(charstring str) return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring ret := ''O;</span><br><span style="color: hsl(120, 100%, 40%);">+   while (lengthof(str) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var integer dot_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring lbl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                dot_idx := f_strchr(str, ".");</span><br><span style="color: hsl(120, 100%, 40%);">+              if (dot_idx >= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* there is another dot */</span><br><span style="color: hsl(120, 100%, 40%);">+                    lbl := f_dns_enc_label(substr(str, 0, dot_idx));</span><br><span style="color: hsl(120, 100%, 40%);">+                      str := substr(str, dot_idx+1, lengthof(str)-dot_idx-1);</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* no more dot */</span><br><span style="color: hsl(120, 100%, 40%);">+                     lbl := f_dns_enc_label(str);</span><br><span style="color: hsl(120, 100%, 40%);">+                  str := "";</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             ret := ret & lbl;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return ret;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_dec_dns_hostname(octetstring inp) return charstring {</span><br><span style="color: hsl(120, 100%, 40%);">+      var charstring ret := "";</span><br><span style="color: hsl(120, 100%, 40%);">+   while (lengthof(inp) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var integer label_len;</span><br><span style="color: hsl(120, 100%, 40%);">+                var charstring lbl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         label_len := oct2int(substr(inp, 0, 1));</span><br><span style="color: hsl(120, 100%, 40%);">+              lbl := oct2char(substr(inp, 1, label_len));</span><br><span style="color: hsl(120, 100%, 40%);">+           inp := substr(inp, 1+label_len, lengthof(inp)-1-label_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         ret := ret & lbl;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lengthof(inp) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   ret := ret & ".";</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 ret;</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%);">+}</span><br><span>diff --git a/library/SGsAP_Emulation.ttcn b/library/SGsAP_Emulation.ttcn</span><br><span>index 0c37840..968bcdd 100644</span><br><span>--- a/library/SGsAP_Emulation.ttcn</span><br><span>+++ b/library/SGsAP_Emulation.ttcn</span><br><span>@@ -31,6 +31,7 @@</span><br><span> import from SGsAP_Templates all;</span><br><span> import from Osmocom_Types all;</span><br><span> import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span> </span><br><span> type component SGsAP_ConnHdlr {</span><br><span>  port SGsAP_Conn_PT SGsAP;</span><br><span>@@ -295,6 +296,7 @@</span><br><span>              var hexstring imsi;</span><br><span>          var SGsAP_RecvFrom mrf;</span><br><span>              var PDU_SGsAP msg;</span><br><span style="color: hsl(120, 100%, 40%);">+            var charstring vlr_name, mme_name;</span><br><span> </span><br><span>               alt {</span><br><span>                /* SGsAP from client */</span><br><span>@@ -329,6 +331,24 @@</span><br><span>                       f_create_expect(imsi, vc_conn);</span><br><span>                      SGsAP_PROC.reply(SGsAPEM_register:{imsi, vc_conn}) to vc_conn;</span><br><span>                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] SGsAP_PROC.getcall(SGsAPEM_reset_mme:{?,-}) -> param(mme_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        var octetstring mme_enc, vlr_enc;</span><br><span style="color: hsl(120, 100%, 40%);">+                     mme_enc := f_enc_dns_hostname(mme_name);</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg := f_sgsap_xceive(ts_SGsAP_RESET_IND_MME(mme_enc));</span><br><span style="color: hsl(120, 100%, 40%);">+                       vlr_enc := msg.sGsAP_RESET_ACK.vLR_Name.name;</span><br><span style="color: hsl(120, 100%, 40%);">+                 vlr_name := f_dec_dns_hostname(vlr_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+                      SGsAP_PROC.reply(SGsAPEM_reset_mme:{mme_name, vlr_name});</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] SGsAP_PROC.getcall(SGsAPEM_reset_vlr:{?,-}) -> param(vlr_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        var octetstring mme_enc, vlr_enc;</span><br><span style="color: hsl(120, 100%, 40%);">+                     vlr_enc := f_enc_dns_hostname(vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg := f_sgsap_xceive(ts_SGsAP_RESET_IND_VLR(vlr_enc));</span><br><span style="color: hsl(120, 100%, 40%);">+                       mme_enc := msg.sGsAP_RESET_ACK.mME_Name.name;</span><br><span style="color: hsl(120, 100%, 40%);">+                 mme_name := f_dec_dns_hostname(mme_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+                      SGsAP_PROC.reply(SGsAPEM_reset_vlr:{vlr_name, mme_name});</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>                }</span><br><span> </span><br><span>        }</span><br><span>@@ -343,8 +363,11 @@</span><br><span> </span><br><span> signature SGsAPEM_register(in hexstring imsi, in SGsAP_ConnHdlr hdlr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+signature SGsAPEM_reset_vlr(in charstring vlr_name, out charstring mme_name);</span><br><span style="color: hsl(120, 100%, 40%);">+signature SGsAPEM_reset_mme(in charstring mme_name, out charstring vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type port SGsAPEM_PROC_PT procedure {</span><br><span style="color: hsl(0, 100%, 40%);">-     inout SGsAPEM_register;</span><br><span style="color: hsl(120, 100%, 40%);">+       inout SGsAPEM_register, SGsAPEM_reset_vlr, SGsAPEM_reset_mme;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span> /* Function that can be used as create_cb and will usse the expect table */</span><br><span>@@ -399,6 +422,25 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* client/conn_hdlr side function to use procedure port to send RESET from emulated MME */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgsap_reset_mme(charstring mme_name) runs on SGsAP_ConnHdlr return charstring {</span><br><span style="color: hsl(120, 100%, 40%);">+    var charstring vlr_name;</span><br><span style="color: hsl(120, 100%, 40%);">+      SGsAP_PROC.call(SGsAPEM_reset_mme:{mme_name, -}) {</span><br><span style="color: hsl(120, 100%, 40%);">+            [] SGsAP_PROC.getreply(SGsAPEM_reset_mme:{mme_name,?}) -> param(vlr_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        return vlr_name;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* client/conn_hdlr side function to use procedure port to send RESET from emulated VLR */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgsap_reset_vlr(charstring vlr_name) runs on SGsAP_ConnHdlr return charstring {</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring mme_name;</span><br><span style="color: hsl(120, 100%, 40%);">+      SGsAP_PROC.call(SGsAPEM_reset_vlr:{vlr_name, -}) {</span><br><span style="color: hsl(120, 100%, 40%);">+            [] SGsAP_PROC.getreply(SGsAPEM_reset_vlr:{vlr_name,?}) -> param(mme_name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        return mme_name;</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> </span><br><span> private function f_expect_table_init()</span><br><span> runs on SGsAP_Emulation_CT {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11487">change 11487</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/11487"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I981c7c1d34f0db60031b5436739cd924e5a09407 </div>
<div style="display:none"> Gerrit-Change-Number: 11487 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>