Change in ...osmo_ss7[master]: Add IPA CCM protocol encoder/decoder

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
Tue Aug 25 07:15:05 UTC 2020


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

Change subject: Add IPA CCM protocol encoder/decoder
......................................................................

Add IPA CCM protocol encoder/decoder

This uses the new 'codec' infrastructure of our Erlang IPA
implementation to decode/encode the IPA CCM messages.

Change-Id: I9575145acbb6e3aff57f8bd97d327cbcd81b3665
---
A src/ipa_proto_ccm.erl
1 file changed, 119 insertions(+), 0 deletions(-)

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



diff --git a/src/ipa_proto_ccm.erl b/src/ipa_proto_ccm.erl
new file mode 100644
index 0000000..cfd3863
--- /dev/null
+++ b/src/ipa_proto_ccm.erl
@@ -0,0 +1,119 @@
+% ip.access IPA CCM protocol 
+
+% (C) 2019 by Harald Welte <laforge at gnumonks.org>
+%
+% 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.
+
+-module(ipa_proto_ccm).
+-author('Harald Welte <laforge at gnumonks.org>').
+
+-export([decode/1, encode/1]).
+
+-define(TESTMSG, <<5,0,7,8,48,47,48,47,48,0,0,19,7,48,48,58,48,48,58,48,48,58,48,48,58,48,48,58,
+  48,48,0,0,19,2,48,48,58,48,48,58,48,48,58,48,48,58,48,48,58,48,48,0,0,19,3,
+  48,48,58,48,48,58,48,48,58,48,48,58,48,48,58,48,48,0,0,19,4,48,48,58,48,48,
+  58,48,48,58,48,48,58,48,48,58,48,48,0,0,24,5,111,115,109,111,45,109,115,99,
+  45,49,46,51,46,49,46,49,49,45,52,50,55,50,0,0,23,1,77,83,67,45,48,48,45,48,
+  48,45,48,48,45,48,48,45,48,48,45,48,48,0,0,23,0,77,83,67,45,48,48,45,48,48,
+  45,48,48,45,48,48,45,48,48,45,48,48,0>>).
+
+decode_msgt(0) -> ping;
+decode_msgt(1) -> pong;
+decode_msgt(4) -> id_req;
+decode_msgt(5) -> id_resp;
+decode_msgt(6) -> id_ack;
+decode_msgt(7) -> id_nack;
+decode_msgt(8) -> proxy_req;
+decode_msgt(9) -> proxy_ack;
+decode_msgt(10) -> proxy_nack;
+decode_msgt(Int) when is_integer(Int) -> Int.
+
+encode_msgt(ping) -> 0;
+encode_msgt(pong) -> 1;
+encode_msgt(id_req) -> 4;
+encode_msgt(id_resp) -> 5;
+encode_msgt(id_ack) -> 6;
+encode_msgt(id_nack) -> 7;
+encode_msgt(proxy_req) -> 8;
+encode_msgt(proxy_ack) -> 9;
+encode_msgt(proxy_nack) -> 10;
+encode_msgt(Int) when is_integer(Int) -> Int.
+
+decode_idtag(0) -> serial_nr;
+decode_idtag(1) -> unit_name;
+decode_idtag(2) -> location;
+decode_idtag(3) -> unit_type;
+decode_idtag(4) -> equip_vers;
+decode_idtag(5) -> sw_version;
+decode_idtag(6) -> ip_address;
+decode_idtag(7) -> mac_address;
+decode_idtag(8) -> unit_id;
+decode_idtag(Int) when is_integer(Int) -> Int.
+
+encode_idtag(serial_nr) -> 0;
+encode_idtag(unit_name) -> 1;
+encode_idtag(location) -> 2;
+encode_idtag(unit_type) -> 3;
+encode_idtag(equip_vers) -> 4;
+encode_idtag(sw_version) -> 5;
+encode_idtag(ip_address) -> 6;
+encode_idtag(mac_address) -> 7;
+encode_idtag(unit_id) -> 8;
+encode_idtag(Int) when is_integer(Int) -> Int.
+
+decode(Bin) when is_binary(Bin) ->
+	<<MsgType:8, IeList/binary>> = Bin,
+	{decode_msgt(MsgType), decode_ies(IeList, [])}.
+
+decode_ies(<<>>, IeList) when is_list(IeList) ->
+	IeList;
+decode_ies(<<1:8, IdTag:8, Remain/binary>>, IeList) when is_list(IeList) ->
+	decode_ies(Remain, IeList ++ [{id, IdTag}]);
+decode_ies(<<0:8, Len:8, TypeValue:Len/binary, Remain/binary>>, IeList) when is_list(IeList) ->
+	<<Type:8, Value/binary>> = TypeValue,
+	ValueList = binary_to_list(Value),
+	case lists:last(ValueList) of
+		0 -> ValueStripped = lists:droplast(ValueList);
+		_ -> ValueStripped = ValueList
+	end,
+	decode_ies(Remain, IeList ++ [{string, decode_idtag(Type), ValueStripped}]).
+
+
+encode_ie({id, IdTag}) ->
+	<<1:8, IdTag:8>>;
+encode_ie({string, Type, Value}) ->
+	case lists:last(Value) of
+		0 -> ValueTerminated = Value;
+		_ -> ValueTerminated = lists:append(Value, [0])
+	end,
+	ValueBin = list_to_binary(ValueTerminated),
+	Type2 = encode_idtag(Type),
+	TypeValue = <<Type2:8, ValueBin/binary>>,
+	Len = byte_size(TypeValue),
+	<<0:8, Len:8, TypeValue/binary>>.
+
+encode_ies(IeList) when is_list(IeList) ->
+	encode_ies(IeList, <<>>).
+encode_ies([], Bin) -> Bin;
+encode_ies([Head|Tail], Bin) ->
+	IeBin = encode_ie(Head),
+	encode_ies(Tail, <<Bin/binary, IeBin/binary>>).
+
+encode({MsgType, IeList}) ->
+	MsgtInt = encode_msgt(MsgType),
+	IesBin = encode_ies(IeList),
+	<<MsgtInt:8, IesBin/binary>>.

-- 
To view, visit https://gerrit.osmocom.org/c/erlang/osmo_ss7/+/19807
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: I9575145acbb6e3aff57f8bd97d327cbcd81b3665
Gerrit-Change-Number: 19807
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200825/c9f83055/attachment.htm>


More information about the gerrit-log mailing list