Change in ...osmo_ss7[master]: ipa_proto: Allow configuring ack initiation behavior

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Fri Sep 25 10:13:30 UTC 2020


laforge has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo_ss7/+/20019 )

Change subject: ipa_proto: Allow configuring ack initiation behavior
......................................................................

ipa_proto: Allow configuring ack initiation behavior

When the osmo-msc version 1.6.1 connects to the osmo-hlr, it sends an
id response and an immediate ack. This commit allows initiating the
handshake with an ack rather than an id request (as is done by ipa
*clients*, like a bts towards a bsc, or the msc towards the hlr) if
needed to mimic behavior of particular components.

Change-Id: I6ab3c9efb51e806f582ce8f473a13ee73ca1567e
---
M include/ipa.hrl
M src/ipa_proto.erl
2 files changed, 26 insertions(+), 14 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved



diff --git a/include/ipa.hrl b/include/ipa.hrl
index 352057f..f0372f4 100644
--- a/include/ipa.hrl
+++ b/include/ipa.hrl
@@ -26,7 +26,7 @@
 			  unit_type,
 			  equipment_version,
 			  sw_version,
-			  unit_name
-			 }).
+			  unit_name,
+			  initiate_ack=false}).
 
 -endif.
diff --git a/src/ipa_proto.erl b/src/ipa_proto.erl
index e472b6c..d1d4396 100644
--- a/src/ipa_proto.erl
+++ b/src/ipa_proto.erl
@@ -99,33 +99,35 @@
 
 % unblock the socket from further processing
 unblock(Socket) ->
-	send_ccm_id_get(Socket),
 	call_sync_sock(Socket, {ipa_unblock, Socket}).
 
-
 % server-side handler for unregister_stream()
-request({ipa_reg_stream, Socket, StreamID, Pid}) ->
+request({ipa_reg_stream, Socket, StreamID, Pid}, _) ->
 	io:format("Registering handler ~p for socket ~p Stream ~p~n", [Pid, Socket, StreamID]),
 	[IpaSock] = ets:lookup(ipa_sockets, Socket),
 	ets:insert_new(IpaSock#ipa_socket.streamTbl, {{Socket, StreamID}, Pid});
 % server-side handler for unregister_stream()
-request({ipa_unreg_stream, Socket, StreamID}) ->
+request({ipa_unreg_stream, Socket, StreamID}, _) ->
 	io:format("Unregistering handler for Socket ~p Stream ~p~n", [Socket, StreamID]),
 	[IpaSock] = ets:lookup(ipa_sockets, Socket),
 	ets:delete(IpaSock#ipa_socket.streamTbl, {Socket, StreamID});
 % server-side handler for controlling_process()
-request({ipa_ctrl_proc, Socket, StreamID, NewPid}) ->
+request({ipa_ctrl_proc, Socket, StreamID, NewPid}, _) ->
 	io:format("Changing handler for socket ~p Stream ~p~n", [Socket, StreamID]),
 	[IpaSock] = ets:lookup(ipa_sockets, Socket),
 	ets:delete(IpaSock#ipa_socket.streamTbl, {Socket, StreamID}),
 	ets:insert_new(IpaSock#ipa_socket.streamTbl, {{Socket, StreamID}, NewPid});
 % server-side handler for set_ccm_options()
 % set ccm protocol metadata options reported with connection setup.
-request({ipa_set_ccm_options, Socket, CcmOptions}) ->
+request({ipa_set_ccm_options, Socket, CcmOptions}, _) ->
 	io:format("Setting ccm options for socket ~p to ~p~n", [Socket, CcmOptions]),
 	{ccm_options, CcmOptions};
 % server-side handler for unblock()
-request({ipa_unblock, Socket}) ->
+request({ipa_unblock, Socket}, CcmOptions) ->
+	if
+		CcmOptions#ipa_ccm_options.initiate_ack -> send_ccm_id_ack(Socket);
+		true -> send_ccm_id_get(Socket)
+	end,
 	io:format("Unblocking socket ~p~n", [Socket]),
 	%[IpaSock] = ets:lookup(ipa_sockets, Socket),
 	Ret = inet:setopts(Socket, [{active, once}]),
@@ -253,7 +255,7 @@
 loop(S, StreamMap, CcmOptions) ->
 	receive
 		{request, From, Request} ->
-			case ipa_proto:request(Request) of
+			case ipa_proto:request(Request, CcmOptions) of
 				{ccm_options, NewCcmOptions} ->
 					NextCcmOptions = NewCcmOptions,
 					Reply = ok;
@@ -282,10 +284,17 @@
 process_ccm_msg(Socket, StreamID, _, ping, _) ->
 	io:format("Socket ~p Stream ~p: PING -> PONG~n", [Socket, StreamID]),
 	send(Socket, StreamID, <<?IPAC_MSGT_PONG>>);
-% Simply respond to ID_ACK with ID_ACK
-process_ccm_msg(Socket, StreamID, _, id_ack, _) ->
-	io:format("Socket ~p Stream ~p: ID_ACK -> ID_ACK~n", [Socket, StreamID]),
-	send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);
+% Respond to ID_ACK with ID_ACK if this instance did not initiate
+process_ccm_msg(Socket, StreamID, CcmOptions, id_ack, _) ->
+	if
+		CcmOptions#ipa_ccm_options.initiate_ack /= true ->
+			% Only respond to an ack if this instance did
+			% not initiate to prevent an infinite ack loop.
+			io:format("Socket ~p Stream ~p: ID_ACK -> ID_ACK~n", [Socket, StreamID]),
+			send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);
+		true ->
+			io:format("Socket ~p Stream ~p: ID_ACK -> None~n", [Socket, StreamID])
+	end;
 % Simply respond to ID_RESP with ID_ACK
 process_ccm_msg(Socket, StreamID, _, id_resp, _) ->
 	io:format("Socket ~p Stream ~p: ID_RESP -> ID_ACK~n", [Socket, StreamID]),
@@ -319,6 +328,9 @@
 send_ccm_id_get(Socket) ->
 	send(Socket, ?IPAC_PROTO_CCM, <<?IPAC_MSGT_ID_GET>>).
 
+send_ccm_id_ack(Socket) ->
+	send(Socket, ?IPAC_PROTO_CCM, <<?IPAC_MSGT_ID_ACK>>).
+
 % convenience wrapper for interactive use / debugging from the shell
 listen_accept_handle(LPort, Opts) ->
 	case gen_tcp:listen(LPort, ?IPA_SOCKOPTS ++ Opts) of

-- 
To view, visit https://gerrit.osmocom.org/c/erlang/osmo_ss7/+/20019
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: erlang/osmo_ss7
Gerrit-Branch: master
Gerrit-Change-Id: I6ab3c9efb51e806f582ce8f473a13ee73ca1567e
Gerrit-Change-Number: 20019
Gerrit-PatchSet: 3
Gerrit-Owner: matt9j <matt9j at cs.washington.edu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de>
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-Reviewer: matt9j <matt9j at cs.washington.edu>
Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200925/32c2b53a/attachment.htm>


More information about the gerrit-log mailing list