blob: 933a3fe614df5b1799ae8e89dd8dd7fab7578ef9 [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 *
7 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
8 * All rights reserved.
9 *
10 * Released under the terms of GNU General Public License, Version 2 or
11 * (at your option) any later version.
12 */
13
Harald Welte00566f52017-11-21 16:43:49 +010014import from Osmocom_Types all;
15
Harald Welted86cdc62017-11-22 00:45:07 +010016type enumerated IpaStreamId {
Harald Welteda9d36c2017-12-07 17:57:17 +010017 IPAC_PROTO_RSL_TRX0 (0),
18 IPAC_PROTO_RSL_TRX1 (1),
19 IPAC_PROTO_RSL_TRX2 (2),
20 IPAC_PROTO_RSL_TRX3 (3),
Harald Welted86cdc62017-11-22 00:45:07 +010021 IPAC_PROTO_OSMO (238),
22 IPAC_PROTO_MGCP_OLD (252),
23 IPAC_PROTO_SCCP (253),
24 IPAC_PROTO_CCM (254),
25 IPAC_PROTO_OML (255)
26} with { variant "FIELDLENGTH(8)" }
27
28type enumerated IpaExtStreamId {
29 IPAC_PROTO_EXT_CTRL ('00'H),
30 IPAC_PROTO_EXT_MGCP ('01'H),
31 IPAC_PROTO_EXT_LAC ('02'H),
32 IPAC_PROTO_EXT_SMSC ('03'H),
33 IPAC_PROTO_EXT_ORC ('04'H),
34 IPAC_PROTO_EXT_GSUP ('05'H),
35 IPAC_PROTO_EXT_OAP ('06'H)
36} with { variant "FIELDLENGTH(8)" }
Harald Welte00566f52017-11-21 16:43:49 +010037
38external function enc_PDU_IPA(in PDU_IPA pdu) return octetstring
39with { extension "prototype(convert)"
40 extension "encode(RAW)"
41 }
42
43external function dec_PDU_IPA(in octetstring stream) return PDU_IPA
44with { extension "prototype(convert)"
45 extension "decode(RAW)"
46 }
47
48type record PDU_IPA
49{
50 uint16_t lengthInd,
51 IpaStreamId streamId,
Harald Welte2a8f8472017-11-23 21:11:34 +010052 IpaExtStreamId streamIdExt optional,
Harald Welte00566f52017-11-21 16:43:49 +010053 octetstring payloadData
54} with {
Harald Welte19ad52b2017-11-24 19:54:55 +010055 variant (lengthInd) "LENGTHTO(streamIdExt,payloadData)";
Harald Welte00566f52017-11-21 16:43:49 +010056 variant (lengthInd) "FIELDLENGTH(16)";
57 variant (lengthInd) "BYTEORDER(last)";
Harald Welte2a8f8472017-11-23 21:11:34 +010058 variant (streamIdExt) "PRESENCE(streamId=IPAC_PROTO_OSMO)";
Harald Welte00566f52017-11-21 16:43:49 +010059}
60
Harald Welte4c5ef5b2017-12-12 15:53:40 +010061template PDU_IPA ts_PDU_IPA(IpaStreamId id, template octetstring payload) := {
62 lengthInd := 0,
63 streamId := id,
64 streamIdExt := omit,
65 payloadData := valueof(payload)
66}
67
Harald Welted86cdc62017-11-22 00:45:07 +010068
69type enumerated IpaCcmMsgtype {
70 IPAC_MSGT_PING ('00'H),
71 IPAC_MSGT_PONG ('01'H),
72 IPAC_MSGT_ID_GET ('04'H),
73 IPAC_MSGT_ID_RESP ('05'H),
74 IPAC_MSGT_ID_ACK ('06'H)
75} with { variant "FIELDLENGTH(8)" }
76
77type enumerated IpaCcmIdTag {
78 IPAC_IDTAG_SERNR ('00'H),
79 IPAC_IDTAG_UNITNAME ('01'H),
80 IPAC_IDTAG_LOCATION1 ('02'H),
81 IPAC_IDTAG_LOCATION2 ('03'H),
82 IPAC_IDTAG_EQUIPVERS ('04'H),
83 IPAC_IDTAG_SWVERSION ('05'H),
84 IPAC_IDTAG_IPADDR ('06'H),
85 IPAC_IDTAG_MACADDR ('07'H),
Harald Welte92e98162017-11-29 11:09:13 +010086 IPAC_IDTAG_UNIT ('08'H),
87 IPAC_IDTAG_OSMO_RAND ('23'H)
Harald Welted86cdc62017-11-22 00:45:07 +010088} with { variant "FIELDLENGTH(8)" }
89
90
91type record IpaCcmGetPart {
Harald Welte92e98162017-11-29 11:09:13 +010092 uint8_t len,
Harald Welted86cdc62017-11-22 00:45:07 +010093 IpaCcmIdTag tag
Harald Welte92e98162017-11-29 11:09:13 +010094} with { variant (len) "LENGTHTO(tag)" }
95
Harald Welted86cdc62017-11-22 00:45:07 +010096type set of IpaCcmGetPart IpaCcmIdGet;
97
98type record IpaCcmRespPart {
99 uint16_t len,
100 IpaCcmIdTag tag,
101 charstring data
102} with { variant (len) "LENGTHTO(data,tag)" }
103type set of IpaCcmRespPart IpaCcmIdResp;
104
105type union IpaCcmUnion {
106 IpaCcmIdGet get,
107 IpaCcmIdResp resp,
108 octetstring other
109}
110
111type record PDU_IPA_CCM {
112 IpaCcmMsgtype msg_type,
113 IpaCcmUnion u optional
Harald Weltea1f0cbc2017-11-29 11:04:40 +0100114} with { variant (u) "CROSSTAG(
115 get, msg_type = IPAC_MSGT_ID_GET;
116 resp, msg_type = IPAC_MSGT_ID_RESP;
117 other, OTHERWISE;
118 )" };
Harald Welted86cdc62017-11-22 00:45:07 +0100119
120
121external function enc_PDU_IPA_CCM(in PDU_IPA_CCM pdu) return octetstring
122with { extension "prototype(convert)"
123 extension "encode(RAW)"
124 }
125
126external function dec_PDU_IPA_CCM(in octetstring stream) return PDU_IPA_CCM
127with { extension "prototype(convert)"
128 extension "decode(RAW)"
129 }
130
131
132} with { encode "RAW" }