<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14513">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: Test MGCP-over-IPA forwarding in SCCPlite tests<br><br>* MGCP-over-IPA handling in MSC_ConnectionHandler means we need to use<br>the new MGCP_CLIENT_MULTI port since we'll be managing MGCP messages<br>from 2 different UDP connections, and we need to be able to route<br>answers correctly. As a result, parameter multi_conn_mode is enabled for<br>SCCPlite and all code adapted to use that port in that type of scenario.<br>* iDuring calls when on SCCPlite, send a full (all-required-params-in)<br>CRCX through the MGCP-over-IPA connection towards the BSC in order to<br>emulate the MSC, and expect the correct answer back. This way we test<br>BSC funcionality to forward MGCP messages coming from MSC works as<br>expected.<br><br>Related: OS#2536<br>Depends: osmo-bsc.git I38ad8fa645c08900e0e1f1b4b96136bc6d96b3ab<br>Change-Id: I31fed700772dd0b063f913b1e1639fd428c46e7d<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>2 files changed, 135 insertions(+), 18 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index 4c86e51..ec1be13 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -38,6 +38,7 @@</span><br><span> import from MGCP_Emulation all;</span><br><span> import from MGCP_Templates all;</span><br><span> import from MGCP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_CodecPort all;</span><br><span> </span><br><span> import from Osmocom_CTRL_Functions all;</span><br><span> import from Osmocom_CTRL_Types all;</span><br><span>@@ -295,7 +296,9 @@</span><br><span>                callagent_udp_port := -1,</span><br><span>            mgw_ip := mp_test_ip,</span><br><span>                mgw_udp_port := 2427,</span><br><span style="color: hsl(0, 100%, 40%);">-           multi_conn_mode := false</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Enable it for SCCPlite, since we have 2 MGCP sockets towards MGW (UDP one +</span><br><span style="color: hsl(120, 100%, 40%);">+                   the on  with MGCP over IPA forwarded from MSC one) */</span><br><span style="color: hsl(120, 100%, 40%);">+              multi_conn_mode := (mp_bssap_cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER)</span><br><span>       };</span><br><span> </span><br><span>       vc_MGCP := MGCP_Emulation_CT.create(id);</span><br><span>@@ -1718,6 +1721,7 @@</span><br><span>     }</span><br><span>    connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);</span><br><span>       connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);</span><br><span> }</span><br><span> </span><br><span> function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit)</span><br><span>@@ -2891,18 +2895,32 @@</span><br><span> /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */</span><br><span> private function f_expect_dlcx_conns(boolean exp_clear_cmpl := true) runs on MSC_ConnHdlr {</span><br><span>       var MgcpCommand mgcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ var template MgcpResponse mgcp_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+  var MGCP_Recv>From mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template MgcpMessage msg_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    var template MgcpMessage msg_dlcx := {</span><br><span style="color: hsl(120, 100%, 40%);">+                command := tr_DLCX()</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (g_pars.aoip) {</span><br><span style="color: hsl(120, 100%, 40%);">+            MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span>                           log("Got first DLCX: ", mgcp);</span><br><span>                             MGCP.send(ts_DLCX_ACK2(mgcp.line.trans_id));</span><br><span style="color: hsl(0, 100%, 40%);">-            };</span><br><span style="color: hsl(120, 100%, 40%);">+                    };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* For SCCPLite, BSC doesn't handle the MSC-side */</span><br><span style="color: hsl(0, 100%, 40%);">- if (g_pars.aoip) {</span><br><span>           MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span>                           log("Got second DLCX: ", mgcp);</span><br><span>                            MGCP.send(ts_DLCX_ACK2(mgcp.line.trans_id));</span><br><span>                         };</span><br><span style="color: hsl(120, 100%, 40%);">+    } else  {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* For SCCPLite, BSC doesn't handle the MSC-side */</span><br><span style="color: hsl(120, 100%, 40%);">+               MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_dlcx)) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                  log("Got first DLCX: ", mrf.msg.command);</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg_resp := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         response := ts_DLCX_ACK2(mrf.msg.command.line.trans_id)</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span>   }</span><br><span> </span><br><span>        if (exp_clear_cmpl) {</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 4f9870f..57706c9 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -15,6 +15,7 @@</span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span> import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span> import from SCCPasp_Types all;</span><br><span> import from BSSAP_Types all;</span><br><span> import from RAN_Emulation all;</span><br><span>@@ -23,6 +24,7 @@</span><br><span> import from IPL4asp_Types all;</span><br><span> import from Native_Functions all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_CodecPort all;</span><br><span> import from MGCP_Types all;</span><br><span> import from MGCP_Templates all;</span><br><span> import from MGCP_Emulation all;</span><br><span>@@ -330,13 +332,35 @@</span><br><span>    return ts_MDCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function tr_MGCP_RecvFrom_any(template MgcpMessage msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr return template MGCP_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+   var template MGCP_RecvFrom mrf := {</span><br><span style="color: hsl(120, 100%, 40%);">+           connId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         msg := msg</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* altstep for handling of MGCP media related commands. Activated by as_Media() to test</span><br><span>  * MGW level media handling */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> altstep as_Media_mgw(boolean norepeat := false) runs on MSC_ConnHdlr {</span><br><span>    var MgcpCommand mgcp_cmd;</span><br><span>    var template MgcpResponse mgcp_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+  var MGCP_RecvFrom mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template MgcpMessage msg_crcx := {</span><br><span style="color: hsl(120, 100%, 40%);">+                command := tr_CRCX</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     var template MgcpMessage msg_mdcx := {</span><br><span style="color: hsl(120, 100%, 40%);">+                command := tr_MDCX</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     var template MgcpMessage msg_resp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+       [g_pars.aoip] MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span>           mgcp_resp := f_rx_crcx(mgcp_cmd);</span><br><span>            MGCP.send(mgcp_resp);</span><br><span>                if(norepeat == false) {</span><br><span>@@ -344,13 +368,35 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+       [not g_pars.aoip] MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_crcx)) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                mgcp_resp := f_rx_crcx(mrf.msg.command);</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_resp := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 response := mgcp_resp</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+             if(norepeat == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       repeat;</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%);">+   [g_pars.aoip] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span>           mgcp_resp := f_rx_mdcx(mgcp_cmd);</span><br><span>            MGCP.send(mgcp_resp);</span><br><span>                if(norepeat == false) {</span><br><span>                      repeat;</span><br><span>              }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   [not g_pars.aoip] MGCP_MULTI.receive(tr_MGCP_RecvFrom_any(msg_mdcx)) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                mgcp_resp := f_rx_mdcx(mrf.msg.command);</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_resp := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 response := mgcp_resp</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             MGCP_MULTI.send(t_MGCP_SendToMrf(mrf, msg_resp));</span><br><span style="color: hsl(120, 100%, 40%);">+             if(norepeat == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       repeat;</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> /* Altsteps for handling of media related commands. Can be activated by a given</span><br><span>@@ -371,11 +417,17 @@</span><br><span>        port RAN_PROC_PT RAN;</span><br><span>        port TELNETasp_PT BSCVTY;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Proxy MGCP-over-IPA and MGCP-over-UDP */</span><br><span style="color: hsl(120, 100%, 40%);">+   port IPA_MGCP_PT MGCP_MSC_CLIENT;</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer g_trans_id := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       var MediaState g_media;</span><br><span>      var TestHdlrParams g_pars;</span><br><span> </span><br><span>       var charstring host_bts := "127.0.0.2";</span><br><span>    var charstring host_mgw := "127.0.0.3";</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring host_msc := "127.0.0.4";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  var boolean g_vty_initialized := false;</span><br><span> }</span><br><span> </span><br><span>@@ -390,6 +442,12 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function get_next_trans_id() runs on MSC_ConnHdlr return MgcpTransId {</span><br><span style="color: hsl(120, 100%, 40%);">+    var MgcpTransId tid := int2str(g_trans_id);</span><br><span style="color: hsl(120, 100%, 40%);">+   g_trans_id := g_trans_id + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ return tid;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Callback function from general RAN_Emulation whenever a connectionless</span><br><span>  * BSSMAP message arrives.  Can retunr a PDU_BSSAP that should be sent in return */</span><br><span> private function UnitdataCallback(PDU_BSSAP bssap)</span><br><span>@@ -862,6 +920,31 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Send a MGCP request through MGCP-over-IPA from MSC side and receive a (matching!) response */</span><br><span style="color: hsl(120, 100%, 40%);">+function mgcp_transceive_mgw(template MgcpCommand cmd, template MgcpResponse resp := ?) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  template MgcpResponse resp_any := ?</span><br><span style="color: hsl(120, 100%, 40%);">+   var MgcpResponse resp_val;</span><br><span style="color: hsl(120, 100%, 40%);">+    resp.line.trans_id := cmd.line.trans_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.send(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] as_Media_mgw();</span><br><span style="color: hsl(120, 100%, 40%);">+            [] BSSAP.receive(resp) -> value resp_val { }</span><br><span style="color: hsl(120, 100%, 40%);">+               [] BSSAP.receive(resp_any) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Response didn't match template");</span><br><span style="color: hsl(120, 100%, 40%);">+                     mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] BSSAP.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+          [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "Timeout waiting for response to ", cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</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%);">+     T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Helper function to check if the activity on the MGCP matches what we</span><br><span>  * expected */</span><br><span> function f_check_mgcp_expectations() runs on MSC_ConnHdlr {</span><br><span>@@ -975,17 +1058,10 @@</span><br><span>            g_media.mgcp_conn[1].mdcx_seen_exp := 0;</span><br><span>     } else if (st.voice_call) {</span><br><span>          /* For voice calls we expect the following MGCP activity */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (g_pars.aoip == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     g_media.mgcp_conn[0].crcx_seen_exp := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[0].mdcx_seen_exp := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[1].crcx_seen_exp := 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[1].mdcx_seen_exp := 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[0].crcx_seen_exp := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[0].mdcx_seen_exp := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[1].crcx_seen_exp := 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        g_media.mgcp_conn[1].mdcx_seen_exp := 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(120, 100%, 40%);">+             g_media.mgcp_conn[0].crcx_seen_exp := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_media.mgcp_conn[0].mdcx_seen_exp := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_media.mgcp_conn[1].crcx_seen_exp := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_media.mgcp_conn[1].mdcx_seen_exp := 0;</span><br><span>     }</span><br><span> </span><br><span>        f_create_mgcp_expect(mgcpcrit);</span><br><span>@@ -1044,6 +1120,29 @@</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (not exp_fail and st.voice_call and not g_pars.aoip) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* With SCCPLite, connect to BSC-located MGW using a CRCX + SDP.</span><br><span style="color: hsl(120, 100%, 40%);">+                 It is sent in MGCP over IPA in the BSC<->MSC (BSC-NAT)</span><br><span style="color: hsl(120, 100%, 40%);">+                  connection. BSC will forward it to its MGW. */</span><br><span style="color: hsl(120, 100%, 40%);">+             var template MgcpCommand cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+         var template MgcpResponse resp;</span><br><span style="color: hsl(120, 100%, 40%);">+               var integer cic := f_bssmap_ie_cic_2_int(ass_cmd.pdu.bssmap.assignmentRequest.circuitIdentityCode);</span><br><span style="color: hsl(120, 100%, 40%);">+           var MgcpEndpoint ep := int2str(cic) & "@mgw"; /* 1: matches value configured in BSC_Tests.ttcn pass in AssignReq */</span><br><span style="color: hsl(120, 100%, 40%);">+             var MgcpCallId call_id := '51234'H;</span><br><span style="color: hsl(120, 100%, 40%);">+           var SDP_attribute_list attributes := { valueof(ts_SDP_ptime(20)) };</span><br><span style="color: hsl(120, 100%, 40%);">+           if (g_pars.use_osmux) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       cmd := ts_CRCX_osmux(get_next_trans_id(), ep, "sendrecv", call_id, cic);</span><br><span style="color: hsl(120, 100%, 40%);">+                    resp := tr_CRCX_ACK_osmux;</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      cmd := ts_CRCX(get_next_trans_id(), ep, "sendrecv", call_id);</span><br><span style="color: hsl(120, 100%, 40%);">+                       resp := tr_CRCX_ACK;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             cmd.sdp := ts_SDP(host_msc, host_mgw, "23", "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                      14000, { int2str(g_media.mgcp_conn[1].rtp_pt) },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { valueof(ts_SDP_ptime(20)) });</span><br><span style="color: hsl(120, 100%, 40%);">+          mgcp_transceive_mgw(cmd, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  f_check_mgcp_expectations();</span><br><span> </span><br><span>     if (st.is_assignment and st.assignment_done) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14513">change 14513</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/+/14513"/><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: I31fed700772dd0b063f913b1e1639fd428c46e7d </div>
<div style="display:none"> Gerrit-Change-Number: 14513 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>