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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ipa_proto: Implement ccm response with variable options<br><br>This commit allows configuration of the ccm protocol options used when<br>setting up an ipa connection with an external entity. The options<br>record is kept alongside the socket in the socket-owning process loop,<br>and used to fill the values in the ccm identity response. If<br>additional CCM state were needed in the future this commit could be<br>extended to keep generic state, with the options only representing one<br>piece of the overall state.<br><br>Change-Id: I3f67095f33f1ff826ad04dad72990bf79617149a<br>---<br>A include/ipa.hrl<br>M src/ipa_proto.erl<br>2 files changed, 83 insertions(+), 17 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>new file mode 100644</span><br><span>index 0000000..352057f</span><br><span>--- /dev/null</span><br><span>+++ b/include/ipa.hrl</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+% (C) 2020 by Matt Johnson <matt9j@cs.washington.edu></span><br><span style="color: hsl(120, 100%, 40%);">+%</span><br><span style="color: hsl(120, 100%, 40%);">+% All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+%</span><br><span style="color: hsl(120, 100%, 40%);">+% This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+% it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+% the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+% (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+%</span><br><span style="color: hsl(120, 100%, 40%);">+% This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+% but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+% GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+%</span><br><span style="color: hsl(120, 100%, 40%);">+% You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+% with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-ifndef(IPA).</span><br><span style="color: hsl(120, 100%, 40%);">+-define(IPA, true).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-record(ipa_ccm_options, {serial_number,</span><br><span style="color: hsl(120, 100%, 40%);">+                     unit_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                      mac_address,</span><br><span style="color: hsl(120, 100%, 40%);">+                          location,</span><br><span style="color: hsl(120, 100%, 40%);">+                     unit_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                    equipment_version,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sw_version,</span><br><span style="color: hsl(120, 100%, 40%);">+                   unit_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%);">+-endif.</span><br><span>diff --git a/src/ipa_proto.erl b/src/ipa_proto.erl</span><br><span>index 20e5a1b..e472b6c 100644</span><br><span>--- a/src/ipa_proto.erl</span><br><span>+++ b/src/ipa_proto.erl</span><br><span>@@ -23,6 +23,8 @@</span><br><span> -author('Harald Welte <laforge@gnumonks.org>').</span><br><span> -compile(export_all).</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+-include("ipa.hrl").</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> -define(TIMEOUT, 1000).</span><br><span> -define(IPA_SOCKOPTS, [binary, {packet, 0}, {reuseaddr, true}, {active, false}]).</span><br><span> </span><br><span>@@ -91,6 +93,10 @@</span><br><span> controlling_process(Socket, StreamID, NewPid) -></span><br><span>         call_sync_sock(Socket, {ipa_ctrl_proc, Socket, StreamID, NewPid}).</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+% Set the metadata required for the ipa CCM sub-protocol.</span><br><span style="color: hsl(120, 100%, 40%);">+set_ccm_options(Socket, CcmOptions) -></span><br><span style="color: hsl(120, 100%, 40%);">+  call_sync_sock(Socket, {ipa_set_ccm_options, Socket, CcmOptions}).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> % unblock the socket from further processing</span><br><span> unblock(Socket) -></span><br><span>        send_ccm_id_get(Socket),</span><br><span>@@ -113,6 +119,11 @@</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 style="color: hsl(120, 100%, 40%);">+% server-side handler for set_ccm_options()</span><br><span style="color: hsl(120, 100%, 40%);">+% set ccm protocol metadata options reported with connection setup.</span><br><span style="color: hsl(120, 100%, 40%);">+request({ipa_set_ccm_options, Socket, CcmOptions}) -></span><br><span style="color: hsl(120, 100%, 40%);">+       io:format("Setting ccm options for socket ~p to ~p~n", [Socket, CcmOptions]),</span><br><span style="color: hsl(120, 100%, 40%);">+       {ccm_options, CcmOptions};</span><br><span> % server-side handler for unblock()</span><br><span> request({ipa_unblock, Socket}) -></span><br><span>    io:format("Unblocking socket ~p~n", [Socket]),</span><br><span>@@ -167,20 +178,20 @@</span><br><span>     end.</span><br><span> </span><br><span> % process (split + deliver) an incoming IPA message</span><br><span style="color: hsl(0, 100%, 40%);">-process_rx_ipa_msg(_S, _StreamMap, <<>>) -></span><br><span style="color: hsl(120, 100%, 40%);">+process_rx_ipa_msg(_S, _StreamMap, _, <<>>) -></span><br><span>     ok;</span><br><span style="color: hsl(0, 100%, 40%);">-process_rx_ipa_msg(S, StreamMap, Data) -></span><br><span style="color: hsl(120, 100%, 40%);">+process_rx_ipa_msg(S, StreamMap, CcmOptions, Data) -></span><br><span>    {StreamID, PayloadBin, Trailer} = split_ipa_msg(Data),</span><br><span>       case StreamID of</span><br><span>             ?IPAC_PROTO_CCM -></span><br><span style="color: hsl(0, 100%, 40%);">-                   process_rx_ccm_msg(S, StreamID, PayloadBin);</span><br><span style="color: hsl(120, 100%, 40%);">+                  process_rx_ccm_msg(S, StreamID, CcmOptions, PayloadBin);</span><br><span>             ?IPAC_PROTO_OSMO -></span><br><span>                       <<ExtStreamID:8, PayloadExt/binary>> = PayloadBin,</span><br><span>                       deliver_rx_ipa_msg(S, {osmo, ExtStreamID}, StreamMap, PayloadExt);</span><br><span>           _ -></span><br><span>                      deliver_rx_ipa_msg(S, StreamID, StreamMap, PayloadBin)</span><br><span>       end,</span><br><span style="color: hsl(0, 100%, 40%);">-    process_rx_ipa_msg(S, StreamMap, Trailer).</span><br><span style="color: hsl(120, 100%, 40%);">+    process_rx_ipa_msg(S, StreamMap, CcmOptions, Trailer).</span><br><span> </span><br><span> send_close_signal([]) -></span><br><span>    ok;</span><br><span>@@ -237,22 +248,29 @@</span><br><span>  StreamMap = ets:new(stream_map, [set]),</span><br><span>      ets:insert(ipa_sockets, #ipa_socket{socket=Socket, ipaPid=self(), streamTbl=StreamMap}),</span><br><span>     CallingPid ! {ipa_init_sock_done, Socket},</span><br><span style="color: hsl(0, 100%, 40%);">-      loop(Socket, StreamMap).</span><br><span style="color: hsl(120, 100%, 40%);">+      loop(Socket, StreamMap, #ipa_ccm_options{}).</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-loop(S, StreamMap) -></span><br><span style="color: hsl(120, 100%, 40%);">+loop(S, StreamMap, CcmOptions) -></span><br><span>       receive</span><br><span>              {request, From, Request} -></span><br><span style="color: hsl(0, 100%, 40%);">-                  Reply = ipa_proto:request(Request),</span><br><span style="color: hsl(120, 100%, 40%);">+                   case ipa_proto:request(Request) of</span><br><span style="color: hsl(120, 100%, 40%);">+                            {ccm_options, NewCcmOptions} -></span><br><span style="color: hsl(120, 100%, 40%);">+                                    NextCcmOptions = NewCcmOptions,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       Reply = ok;</span><br><span style="color: hsl(120, 100%, 40%);">+                           EmbeddedReply -></span><br><span style="color: hsl(120, 100%, 40%);">+                                   NextCcmOptions = CcmOptions,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  Reply = EmbeddedReply</span><br><span style="color: hsl(120, 100%, 40%);">+                 end,</span><br><span>                         ipa_proto:reply(From, Reply),</span><br><span style="color: hsl(0, 100%, 40%);">-                   ipa_proto:loop(S, StreamMap);</span><br><span style="color: hsl(120, 100%, 40%);">+                 ipa_proto:loop(S, StreamMap, NextCcmOptions);</span><br><span>                {ipa_send, S, StreamId, Data} -></span><br><span>                  send(S, StreamId, Data),</span><br><span style="color: hsl(0, 100%, 40%);">-                        ipa_proto:loop(S, StreamMap);</span><br><span style="color: hsl(120, 100%, 40%);">+                 ipa_proto:loop(S, StreamMap, CcmOptions);</span><br><span>            {tcp, S, Data} -></span><br><span>                         % process incoming IPA message and mark socket active once more</span><br><span style="color: hsl(0, 100%, 40%);">-                 ipa_proto:process_rx_ipa_msg(S, StreamMap, Data),</span><br><span style="color: hsl(120, 100%, 40%);">+                     ipa_proto:process_rx_ipa_msg(S, StreamMap, CcmOptions, Data),</span><br><span>                        inet:setopts(S, [{active, once}]),</span><br><span style="color: hsl(0, 100%, 40%);">-                      ipa_proto:loop(S, StreamMap);</span><br><span style="color: hsl(120, 100%, 40%);">+                 ipa_proto:loop(S, StreamMap, CcmOptions);</span><br><span>            {tcp_closed, S} -></span><br><span>                        io:format("Socket ~w closed [~w]~n", [S,self()]),</span><br><span>                  ipa_proto:process_tcp_closed(S, StreamMap),</span><br><span>@@ -261,26 +279,42 @@</span><br><span>  end.</span><br><span> </span><br><span> % Respond with PONG to PING</span><br><span style="color: hsl(0, 100%, 40%);">-process_ccm_msg(Socket, StreamID, ping, _) -></span><br><span style="color: hsl(120, 100%, 40%);">+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> % 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(120, 100%, 40%);">+process_ccm_msg(Socket, StreamID, _, id_ack, _) -></span><br><span>  io:format("Socket ~p Stream ~p: ID_ACK -> ID_ACK~n", [Socket, StreamID]),</span><br><span>       send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);</span><br><span> % Simply respond to ID_RESP with ID_ACK</span><br><span style="color: hsl(0, 100%, 40%);">-process_ccm_msg(Socket, StreamID, id_resp, _) -></span><br><span style="color: hsl(120, 100%, 40%);">+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>      send(Socket, StreamID, <<?IPAC_MSGT_ID_ACK>>);</span><br><span style="color: hsl(120, 100%, 40%);">+% Simply respond to ID_GET with ID_RESP</span><br><span style="color: hsl(120, 100%, 40%);">+process_ccm_msg(Socket, StreamID, CcmOptions, id_req, _) -></span><br><span style="color: hsl(120, 100%, 40%);">+   io:format("Socket ~p Stream ~p: ID_GET -> ID_RESP~n", [Socket, StreamID]),</span><br><span style="color: hsl(120, 100%, 40%);">+       CcmBin = ipa_proto_ccm:encode(</span><br><span style="color: hsl(120, 100%, 40%);">+                {id_resp,</span><br><span style="color: hsl(120, 100%, 40%);">+              [{string,serial_nr,CcmOptions#ipa_ccm_options.serial_number},</span><br><span style="color: hsl(120, 100%, 40%);">+                  {string,unit_id,CcmOptions#ipa_ccm_options.unit_id},</span><br><span style="color: hsl(120, 100%, 40%);">+                  {string,mac_address,CcmOptions#ipa_ccm_options.mac_address},</span><br><span style="color: hsl(120, 100%, 40%);">+                  {string,location,CcmOptions#ipa_ccm_options.location},</span><br><span style="color: hsl(120, 100%, 40%);">+                {string,unit_type,CcmOptions#ipa_ccm_options.unit_type},</span><br><span style="color: hsl(120, 100%, 40%);">+              {string,equip_vers,CcmOptions#ipa_ccm_options.equipment_version},</span><br><span style="color: hsl(120, 100%, 40%);">+             {string,sw_version,CcmOptions#ipa_ccm_options.sw_version},</span><br><span style="color: hsl(120, 100%, 40%);">+            {string,unit_name,CcmOptions#ipa_ccm_options.unit_name}</span><br><span style="color: hsl(120, 100%, 40%);">+              ]}),</span><br><span style="color: hsl(120, 100%, 40%);">+ send(Socket, StreamID, CcmBin);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> % Default message handler for unknown messages</span><br><span style="color: hsl(0, 100%, 40%);">-process_ccm_msg(Socket, StreamID, MsgType, Opts) -></span><br><span style="color: hsl(120, 100%, 40%);">+process_ccm_msg(Socket, StreamID, _, MsgType, Opts) -></span><br><span>         io:format("Socket ~p Stream ~p: Unknown CCM message type ~p Opts ~p~n",</span><br><span>              [Socket, StreamID, MsgType, Opts]).</span><br><span> </span><br><span> % process an incoming CCM message (Stream ID 254)</span><br><span style="color: hsl(0, 100%, 40%);">-process_rx_ccm_msg(Socket, StreamID, PayloadBin) -></span><br><span style="color: hsl(120, 100%, 40%);">+process_rx_ccm_msg(Socket, StreamID, CcmOptions, PayloadBin) -></span><br><span>     {MsgType, Opts} = ipa_proto_ccm:decode(PayloadBin),</span><br><span style="color: hsl(0, 100%, 40%);">-     process_ccm_msg(Socket, StreamID, MsgType, Opts).</span><br><span style="color: hsl(120, 100%, 40%);">+     process_ccm_msg(Socket, StreamID, CcmOptions, MsgType, Opts).</span><br><span> </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></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/erlang/osmo_ss7/+/20018">change 20018</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/+/20018"/><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: I3f67095f33f1ff826ad04dad72990bf79617149a </div>
<div style="display:none"> Gerrit-Change-Number: 20018 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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-MessageType: merged </div>