blob: 5522e87f3109eed93991d64ab0c68de46465d2ae [file] [log] [blame]
Harald Welte00566f52017-11-21 16:43:49 +01001/* (C) 2017 by Harald Welte <laforge@gnumonks.org> */
2
3module IPA_Types {
4
5import from Osmocom_Types all;
6
Harald Welted86cdc62017-11-22 00:45:07 +01007type enumerated IpaStreamId {
Harald Welteda9d36c2017-12-07 17:57:17 +01008 IPAC_PROTO_RSL_TRX0 (0),
9 IPAC_PROTO_RSL_TRX1 (1),
10 IPAC_PROTO_RSL_TRX2 (2),
11 IPAC_PROTO_RSL_TRX3 (3),
Harald Welted86cdc62017-11-22 00:45:07 +010012 IPAC_PROTO_OSMO (238),
13 IPAC_PROTO_MGCP_OLD (252),
14 IPAC_PROTO_SCCP (253),
15 IPAC_PROTO_CCM (254),
16 IPAC_PROTO_OML (255)
17} with { variant "FIELDLENGTH(8)" }
18
19type enumerated IpaExtStreamId {
20 IPAC_PROTO_EXT_CTRL ('00'H),
21 IPAC_PROTO_EXT_MGCP ('01'H),
22 IPAC_PROTO_EXT_LAC ('02'H),
23 IPAC_PROTO_EXT_SMSC ('03'H),
24 IPAC_PROTO_EXT_ORC ('04'H),
25 IPAC_PROTO_EXT_GSUP ('05'H),
26 IPAC_PROTO_EXT_OAP ('06'H)
27} with { variant "FIELDLENGTH(8)" }
Harald Welte00566f52017-11-21 16:43:49 +010028
29external function enc_PDU_IPA(in PDU_IPA pdu) return octetstring
30with { extension "prototype(convert)"
31 extension "encode(RAW)"
32 }
33
34external function dec_PDU_IPA(in octetstring stream) return PDU_IPA
35with { extension "prototype(convert)"
36 extension "decode(RAW)"
37 }
38
39type record PDU_IPA
40{
41 uint16_t lengthInd,
42 IpaStreamId streamId,
Harald Welte2a8f8472017-11-23 21:11:34 +010043 IpaExtStreamId streamIdExt optional,
Harald Welte00566f52017-11-21 16:43:49 +010044 octetstring payloadData
45} with {
Harald Welte19ad52b2017-11-24 19:54:55 +010046 variant (lengthInd) "LENGTHTO(streamIdExt,payloadData)";
Harald Welte00566f52017-11-21 16:43:49 +010047 variant (lengthInd) "FIELDLENGTH(16)";
48 variant (lengthInd) "BYTEORDER(last)";
Harald Welte2a8f8472017-11-23 21:11:34 +010049 variant (streamIdExt) "PRESENCE(streamId=IPAC_PROTO_OSMO)";
Harald Welte00566f52017-11-21 16:43:49 +010050}
51
Harald Welte4c5ef5b2017-12-12 15:53:40 +010052template PDU_IPA ts_PDU_IPA(IpaStreamId id, template octetstring payload) := {
53 lengthInd := 0,
54 streamId := id,
55 streamIdExt := omit,
56 payloadData := valueof(payload)
57}
58
Harald Welted86cdc62017-11-22 00:45:07 +010059
60type enumerated IpaCcmMsgtype {
61 IPAC_MSGT_PING ('00'H),
62 IPAC_MSGT_PONG ('01'H),
63 IPAC_MSGT_ID_GET ('04'H),
64 IPAC_MSGT_ID_RESP ('05'H),
65 IPAC_MSGT_ID_ACK ('06'H)
66} with { variant "FIELDLENGTH(8)" }
67
68type enumerated IpaCcmIdTag {
69 IPAC_IDTAG_SERNR ('00'H),
70 IPAC_IDTAG_UNITNAME ('01'H),
71 IPAC_IDTAG_LOCATION1 ('02'H),
72 IPAC_IDTAG_LOCATION2 ('03'H),
73 IPAC_IDTAG_EQUIPVERS ('04'H),
74 IPAC_IDTAG_SWVERSION ('05'H),
75 IPAC_IDTAG_IPADDR ('06'H),
76 IPAC_IDTAG_MACADDR ('07'H),
Harald Welte92e98162017-11-29 11:09:13 +010077 IPAC_IDTAG_UNIT ('08'H),
78 IPAC_IDTAG_OSMO_RAND ('23'H)
Harald Welted86cdc62017-11-22 00:45:07 +010079} with { variant "FIELDLENGTH(8)" }
80
81
82type record IpaCcmGetPart {
Harald Welte92e98162017-11-29 11:09:13 +010083 uint8_t len,
Harald Welted86cdc62017-11-22 00:45:07 +010084 IpaCcmIdTag tag
Harald Welte92e98162017-11-29 11:09:13 +010085} with { variant (len) "LENGTHTO(tag)" }
86
Harald Welted86cdc62017-11-22 00:45:07 +010087type set of IpaCcmGetPart IpaCcmIdGet;
88
89type record IpaCcmRespPart {
90 uint16_t len,
91 IpaCcmIdTag tag,
92 charstring data
93} with { variant (len) "LENGTHTO(data,tag)" }
94type set of IpaCcmRespPart IpaCcmIdResp;
95
96type union IpaCcmUnion {
97 IpaCcmIdGet get,
98 IpaCcmIdResp resp,
99 octetstring other
100}
101
102type record PDU_IPA_CCM {
103 IpaCcmMsgtype msg_type,
104 IpaCcmUnion u optional
Harald Weltea1f0cbc2017-11-29 11:04:40 +0100105} with { variant (u) "CROSSTAG(
106 get, msg_type = IPAC_MSGT_ID_GET;
107 resp, msg_type = IPAC_MSGT_ID_RESP;
108 other, OTHERWISE;
109 )" };
Harald Welted86cdc62017-11-22 00:45:07 +0100110
111
112external function enc_PDU_IPA_CCM(in PDU_IPA_CCM pdu) return octetstring
113with { extension "prototype(convert)"
114 extension "encode(RAW)"
115 }
116
117external function dec_PDU_IPA_CCM(in octetstring stream) return PDU_IPA_CCM
118with { extension "prototype(convert)"
119 extension "decode(RAW)"
120 }
121
122
123} with { encode "RAW" }