blob: fc729fbf5d2057be611bba060e4266fb24421195 [file] [log] [blame]
Harald Welte00566f52017-11-21 16:43:49 +01001module IPA_Types {
2
Harald Welte35bb7162018-01-03 21:07:52 +01003/* Definitions of abstract data types for the IPA multiplex protocol.
4 * Uses the TITAN "RAW" codec syntax to auto-generate encoder and decoder
5 * functions.
6 *
Harald Welte34b5a952019-05-27 11:54:11 +02007 * (C) 2017-2018 by Harald Welte <laforge@gnumonks.org>
Harald Welte35bb7162018-01-03 21:07:52 +01008 * All rights reserved.
9 *
10 * Released under the terms of GNU General Public License, Version 2 or
11 * (at your option) any later version.
Harald Welte34b5a952019-05-27 11:54:11 +020012 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
Harald Welte35bb7162018-01-03 21:07:52 +010014 */
15
Harald Welte00566f52017-11-21 16:43:49 +010016import from Osmocom_Types all;
17
Harald Welted86cdc62017-11-22 00:45:07 +010018type enumerated IpaStreamId {
Harald Welteda9d36c2017-12-07 17:57:17 +010019 IPAC_PROTO_RSL_TRX0 (0),
20 IPAC_PROTO_RSL_TRX1 (1),
21 IPAC_PROTO_RSL_TRX2 (2),
22 IPAC_PROTO_RSL_TRX3 (3),
Harald Welted86cdc62017-11-22 00:45:07 +010023 IPAC_PROTO_OSMO (238),
24 IPAC_PROTO_MGCP_OLD (252),
25 IPAC_PROTO_SCCP (253),
26 IPAC_PROTO_CCM (254),
27 IPAC_PROTO_OML (255)
28} with { variant "FIELDLENGTH(8)" }
29
30type enumerated IpaExtStreamId {
31 IPAC_PROTO_EXT_CTRL ('00'H),
32 IPAC_PROTO_EXT_MGCP ('01'H),
33 IPAC_PROTO_EXT_LAC ('02'H),
34 IPAC_PROTO_EXT_SMSC ('03'H),
35 IPAC_PROTO_EXT_ORC ('04'H),
36 IPAC_PROTO_EXT_GSUP ('05'H),
Harald Welte7460a722018-10-10 12:28:27 +020037 IPAC_PROTO_EXT_OAP ('06'H),
Pau Espin Pedrol6924ef72021-06-09 16:19:26 +020038 IPAC_PROTO_EXT_RSPRO ('07'H),
39 IPAC_PROTO_EXT_OSMO_PCU ('08'H)
Harald Welted86cdc62017-11-22 00:45:07 +010040} with { variant "FIELDLENGTH(8)" }
Harald Welte00566f52017-11-21 16:43:49 +010041
42external function enc_PDU_IPA(in PDU_IPA pdu) return octetstring
43with { extension "prototype(convert)"
44 extension "encode(RAW)"
45 }
46
47external function dec_PDU_IPA(in octetstring stream) return PDU_IPA
48with { extension "prototype(convert)"
49 extension "decode(RAW)"
50 }
51
52type record PDU_IPA
53{
54 uint16_t lengthInd,
55 IpaStreamId streamId,
Harald Welte2a8f8472017-11-23 21:11:34 +010056 IpaExtStreamId streamIdExt optional,
Harald Welte00566f52017-11-21 16:43:49 +010057 octetstring payloadData
58} with {
Harald Welte19ad52b2017-11-24 19:54:55 +010059 variant (lengthInd) "LENGTHTO(streamIdExt,payloadData)";
Harald Welte00566f52017-11-21 16:43:49 +010060 variant (lengthInd) "FIELDLENGTH(16)";
61 variant (lengthInd) "BYTEORDER(last)";
Harald Welte2a8f8472017-11-23 21:11:34 +010062 variant (streamIdExt) "PRESENCE(streamId=IPAC_PROTO_OSMO)";
Harald Welte00566f52017-11-21 16:43:49 +010063}
64
Harald Welte4c5ef5b2017-12-12 15:53:40 +010065template PDU_IPA ts_PDU_IPA(IpaStreamId id, template octetstring payload) := {
66 lengthInd := 0,
67 streamId := id,
68 streamIdExt := omit,
69 payloadData := valueof(payload)
70}
71
Harald Welted86cdc62017-11-22 00:45:07 +010072
73type enumerated IpaCcmMsgtype {
74 IPAC_MSGT_PING ('00'H),
75 IPAC_MSGT_PONG ('01'H),
76 IPAC_MSGT_ID_GET ('04'H),
77 IPAC_MSGT_ID_RESP ('05'H),
78 IPAC_MSGT_ID_ACK ('06'H)
79} with { variant "FIELDLENGTH(8)" }
80
81type enumerated IpaCcmIdTag {
82 IPAC_IDTAG_SERNR ('00'H),
83 IPAC_IDTAG_UNITNAME ('01'H),
84 IPAC_IDTAG_LOCATION1 ('02'H),
85 IPAC_IDTAG_LOCATION2 ('03'H),
86 IPAC_IDTAG_EQUIPVERS ('04'H),
87 IPAC_IDTAG_SWVERSION ('05'H),
88 IPAC_IDTAG_IPADDR ('06'H),
89 IPAC_IDTAG_MACADDR ('07'H),
Vadim Yanitskiy44f0c482020-05-24 20:49:29 +070090 IPAC_IDTAG_UNITID ('08'H),
Harald Welte92e98162017-11-29 11:09:13 +010091 IPAC_IDTAG_OSMO_RAND ('23'H)
Harald Welted86cdc62017-11-22 00:45:07 +010092} with { variant "FIELDLENGTH(8)" }
93
94
95type record IpaCcmGetPart {
Harald Welte92e98162017-11-29 11:09:13 +010096 uint8_t len,
Harald Welted86cdc62017-11-22 00:45:07 +010097 IpaCcmIdTag tag
Harald Welte92e98162017-11-29 11:09:13 +010098} with { variant (len) "LENGTHTO(tag)" }
99
Harald Welted86cdc62017-11-22 00:45:07 +0100100type set of IpaCcmGetPart IpaCcmIdGet;
101
102type record IpaCcmRespPart {
103 uint16_t len,
104 IpaCcmIdTag tag,
Harald Welte95686e02018-08-02 15:05:43 +0200105 octetstring data
Harald Welted86cdc62017-11-22 00:45:07 +0100106} with { variant (len) "LENGTHTO(data,tag)" }
107type set of IpaCcmRespPart IpaCcmIdResp;
108
109type union IpaCcmUnion {
110 IpaCcmIdGet get,
111 IpaCcmIdResp resp,
112 octetstring other
113}
114
115type record PDU_IPA_CCM {
116 IpaCcmMsgtype msg_type,
117 IpaCcmUnion u optional
Harald Weltea1f0cbc2017-11-29 11:04:40 +0100118} with { variant (u) "CROSSTAG(
119 get, msg_type = IPAC_MSGT_ID_GET;
120 resp, msg_type = IPAC_MSGT_ID_RESP;
121 other, OTHERWISE;
122 )" };
Harald Welted86cdc62017-11-22 00:45:07 +0100123
124
125external function enc_PDU_IPA_CCM(in PDU_IPA_CCM pdu) return octetstring
126with { extension "prototype(convert)"
127 extension "encode(RAW)"
128 }
129
130external function dec_PDU_IPA_CCM(in octetstring stream) return PDU_IPA_CCM
131with { extension "prototype(convert)"
132 extension "decode(RAW)"
133 }
134
Vadim Yanitskiy89be8e22020-05-25 23:37:00 +0700135/* Example: 1234/0/0 (site_id=1234, bts_id=0, trx_id=0) */
136type record IpaUnitId {
137 integer site_id,
138 integer bts_id,
139 integer trx_id
140} with {
141 encode "TEXT"
142 variant "SEPARATOR('/')"
143 /* workaround for https://gitlab.eclipse.org/eclipse/titan/titan.core/-/issues/725 */
144 variant (trx_id) "TEXT_CODING(,,'\d+')"
145};
146
147external function enc_IpaUnitId(in IpaUnitId unit_id) return charstring
148 with { extension "prototype(convert) encode(TEXT)" }
149external function dec_IpaUnitId(in charstring stream) return IpaUnitId
150 with { extension "prototype(convert) decode(TEXT)" }
151
152template (value) IpaUnitId ts_IpaUnitId(integer site_id := 1234,
153 integer bts_id := 0,
154 integer trx_id := 0) := {
155 site_id := site_id,
156 bts_id := bts_id,
157 trx_id := trx_id
158};
159template (present) IpaUnitId tr_IpaUnitId(template (present) integer site_id := ?,
160 template (present) integer bts_id := ?,
161 template (present) integer trx_id := ?) := {
162 site_id := site_id,
163 bts_id := bts_id,
164 trx_id := trx_id
165};
166
Vadim Yanitskiy6de2fcb2020-05-25 19:40:45 +0700167/* Finds an IE with the given tag in IPA IDENTITY RESPONSE.
168 * Returns index of an IE if found, -1 otherwise. */
169function f_ipa_id_resp_find_ie(in IpaCcmIdResp resp, IpaCcmIdTag tag)
170return integer {
171 for (var integer i := 0; i < sizeof(resp); i := i + 1) {
172 if (resp[i].tag == tag) {
173 return i;
174 }
175 }
176
177 return -1;
178}
179
Harald Welted86cdc62017-11-22 00:45:07 +0100180
181} with { encode "RAW" }