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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ipa_proto: Allow configuring ack initiation behavior<br><br>When the osmo-msc version 1.6.1 connects to the osmo-hlr, it sends an<br>id response and an immediate ack. This commit allows initiating the<br>handshake with an ack rather than an id request (as is done by ipa<br>*clients*, like a bts towards a bsc, or the msc towards the hlr) if<br>needed to mimic behavior of particular components.<br><br>Change-Id: I6ab3c9efb51e806f582ce8f473a13ee73ca1567e<br>---<br>M include/ipa.hrl<br>M src/ipa_proto.erl<br>2 files changed, 26 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/ipa.hrl b/include/ipa.hrl</span><br><span>index 352057f..f0372f4 100644</span><br><span>--- a/include/ipa.hrl</span><br><span>+++ b/include/ipa.hrl</span><br><span>@@ -26,7 +26,7 @@</span><br><span>                         unit_type,</span><br><span>                           equipment_version,</span><br><span>                           sw_version,</span><br><span style="color: hsl(0, 100%, 40%);">-                     unit_name</span><br><span style="color: hsl(0, 100%, 40%);">-                      }).</span><br><span style="color: hsl(120, 100%, 40%);">+                    unit_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                    initiate_ack=false}).</span><br><span> </span><br><span> -endif.</span><br><span>diff --git a/src/ipa_proto.erl b/src/ipa_proto.erl</span><br><span>index e472b6c..d1d4396 100644</span><br><span>--- a/src/ipa_proto.erl</span><br><span>+++ b/src/ipa_proto.erl</span><br><span>@@ -99,33 +99,35 @@</span><br><span> </span><br><span> % unblock the socket from further processing</span><br><span> unblock(Socket) -></span><br><span style="color: hsl(0, 100%, 40%);">-      send_ccm_id_get(Socket),</span><br><span>     call_sync_sock(Socket, {ipa_unblock, Socket}).</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> % server-side handler for unregister_stream()</span><br><span style="color: hsl(0, 100%, 40%);">-request({ipa_reg_stream, Socket, StreamID, Pid}) -></span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_reg_stream, Socket, StreamID, Pid}, _) -></span><br><span>         io:format("Registering handler ~p for socket ~p Stream ~p~n", [Pid, Socket, StreamID]),</span><br><span>    [IpaSock] = ets:lookup(ipa_sockets, Socket),</span><br><span>         ets:insert_new(IpaSock#ipa_socket.streamTbl, {{Socket, StreamID}, Pid});</span><br><span> % server-side handler for unregister_stream()</span><br><span style="color: hsl(0, 100%, 40%);">-request({ipa_unreg_stream, Socket, StreamID}) -></span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_unreg_stream, Socket, StreamID}, _) -></span><br><span>         io:format("Unregistering handler for Socket ~p Stream ~p~n", [Socket, StreamID]),</span><br><span>  [IpaSock] = ets:lookup(ipa_sockets, Socket),</span><br><span>         ets:delete(IpaSock#ipa_socket.streamTbl, {Socket, StreamID});</span><br><span> % server-side handler for controlling_process()</span><br><span style="color: hsl(0, 100%, 40%);">-request({ipa_ctrl_proc, Socket, StreamID, NewPid}) -></span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_ctrl_proc, Socket, StreamID, NewPid}, _) -></span><br><span>        io:format("Changing handler for socket ~p Stream ~p~n", [Socket, StreamID]),</span><br><span>       [IpaSock] = ets:lookup(ipa_sockets, Socket),</span><br><span>         ets:delete(IpaSock#ipa_socket.streamTbl, {Socket, StreamID}),</span><br><span>        ets:insert_new(IpaSock#ipa_socket.streamTbl, {{Socket, StreamID}, NewPid});</span><br><span> % server-side handler for set_ccm_options()</span><br><span> % set ccm protocol metadata options reported with connection setup.</span><br><span style="color: hsl(0, 100%, 40%);">-request({ipa_set_ccm_options, Socket, CcmOptions}) -></span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_set_ccm_options, Socket, CcmOptions}, _) -></span><br><span>       io:format("Setting ccm options for socket ~p to ~p~n", [Socket, CcmOptions]),</span><br><span>      {ccm_options, CcmOptions};</span><br><span> % server-side handler for unblock()</span><br><span style="color: hsl(0, 100%, 40%);">-request({ipa_unblock, Socket}) -></span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_unblock, Socket}, CcmOptions) -></span><br><span style="color: hsl(120, 100%, 40%);">+       if</span><br><span style="color: hsl(120, 100%, 40%);">+            CcmOptions#ipa_ccm_options.initiate_ack -> send_ccm_id_ack(Socket);</span><br><span style="color: hsl(120, 100%, 40%);">+                true -> send_ccm_id_get(Socket)</span><br><span style="color: hsl(120, 100%, 40%);">+    end,</span><br><span>         io:format("Unblocking socket ~p~n", [Socket]),</span><br><span>     %[IpaSock] = ets:lookup(ipa_sockets, Socket),</span><br><span>        Ret = inet:setopts(Socket, [{active, once}]),</span><br><span>@@ -253,7 +255,7 @@</span><br><span> loop(S, StreamMap, CcmOptions) -></span><br><span>  receive</span><br><span>              {request, From, Request} -></span><br><span style="color: hsl(0, 100%, 40%);">-                  case ipa_proto:request(Request) of</span><br><span style="color: hsl(120, 100%, 40%);">+                    case ipa_proto:request(Request, CcmOptions) of</span><br><span>                               {ccm_options, NewCcmOptions} -></span><br><span>                                   NextCcmOptions = NewCcmOptions,</span><br><span>                                      Reply = ok;</span><br><span>@@ -282,10 +284,17 @@</span><br><span> process_ccm_msg(Socket, StreamID, _, ping, _) -></span><br><span>   io:format("Socket ~p Stream ~p: PING -> PONG~n", [Socket, StreamID]),</span><br><span>   send(Socket, StreamID, <<?IPAC_MSGT_PONG>>);</span><br><span style="color: hsl(0, 100%, 40%);">-% Simply respond to ID_ACK with ID_ACK</span><br><span style="color: hsl(0, 100%, 40%);">-process_ccm_msg(Socket, StreamID, _, id_ack, _) -></span><br><span style="color: hsl(0, 100%, 40%);">-     io:format("Socket ~p Stream ~p: ID_ACK -> ID_ACK~n", [Socket, StreamID]),</span><br><span style="color: hsl(0, 100%, 40%);">-  send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);</span><br><span style="color: hsl(120, 100%, 40%);">+% Respond to ID_ACK with ID_ACK if this instance did not initiate</span><br><span style="color: hsl(120, 100%, 40%);">+process_ccm_msg(Socket, StreamID, CcmOptions, id_ack, _) -></span><br><span style="color: hsl(120, 100%, 40%);">+ if</span><br><span style="color: hsl(120, 100%, 40%);">+            CcmOptions#ipa_ccm_options.initiate_ack /= true -></span><br><span style="color: hsl(120, 100%, 40%);">+                 % Only respond to an ack if this instance did</span><br><span style="color: hsl(120, 100%, 40%);">+                 % not initiate to prevent an infinite ack loop.</span><br><span style="color: hsl(120, 100%, 40%);">+                       io:format("Socket ~p Stream ~p: ID_ACK -> ID_ACK~n", [Socket, StreamID]),</span><br><span style="color: hsl(120, 100%, 40%);">+                        send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);</span><br><span style="color: hsl(120, 100%, 40%);">+            true -></span><br><span style="color: hsl(120, 100%, 40%);">+                    io:format("Socket ~p Stream ~p: ID_ACK -> None~n", [Socket, StreamID])</span><br><span style="color: hsl(120, 100%, 40%);">+   end;</span><br><span> % Simply respond to ID_RESP with ID_ACK</span><br><span> process_ccm_msg(Socket, StreamID, _, id_resp, _) -></span><br><span>    io:format("Socket ~p Stream ~p: ID_RESP -> ID_ACK~n", [Socket, StreamID]),</span><br><span>@@ -319,6 +328,9 @@</span><br><span> send_ccm_id_get(Socket) -></span><br><span>       send(Socket, ?IPAC_PROTO_CCM, <<?IPAC_MSGT_ID_GET>>).</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+send_ccm_id_ack(Socket) -></span><br><span style="color: hsl(120, 100%, 40%);">+  send(Socket, ?IPAC_PROTO_CCM, <<?IPAC_MSGT_ID_ACK>>).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> % convenience wrapper for interactive use / debugging from the shell</span><br><span> listen_accept_handle(LPort, Opts) -></span><br><span>       case gen_tcp:listen(LPort, ?IPA_SOCKOPTS ++ Opts) of</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/erlang/osmo_ss7/+/20019">change 20019</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/erlang/osmo_ss7/+/20019"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: erlang/osmo_ss7 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6ab3c9efb51e806f582ce8f473a13ee73ca1567e </div>
<div style="display:none"> Gerrit-Change-Number: 20019 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: matt9j <matt9j@cs.washington.edu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: matt9j <matt9j@cs.washington.edu> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>