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