1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
module SIMTRACE_Types {
/* TTCN-3 data types with TITAN RAW codec annotations for Osmocom SIMTRACE2
* as found in simtrace2.git/host/include/osmocom/simtrace2/simtrace_prot.h
*
* (C) 2020 by Harald Welte <laforge@gnumonks.org>
*/
import from General_Types all;
import from Osmocom_Types all;
type integer u16le_t (0..65535) with { variant "unsigned 16 bit" variant "BYTEORDER(first)" };
type integer u32le_t (0..4294967295) with { variant "unsigned 32 bit" variant "BYTEORDER(first)" };
type charstring CHAR32 length (0..32) with { variant "FIELDLENGTH(32)" };
type enumerated SIMTRACE_MsgClassType {
/* SIMTRACE_MSGC_GENERIC */
SIMTRACE_CMD_DO_ERROR ('0000'H),
SIMTRACE_CMD_BD_BOARD_INFO ('0001'H),
/* SIMTRACE_MSGC_CARDEM */
SIMTRACE_MSGT_DT_CEMU_TX_DATA ('0101'H),
SIMTRACE_MSGT_DT_CEMU_SET_ATR ('0102'H),
SIMTRACE_MSGT_BD_CEMU_STATS ('0103'H),
SIMTRACE_MSGT_BD_CEMU_STATUS ('0104'H),
SIMTRACE_MSGT_DT_CEMU_CARDINSERT ('0105'H),
SIMTRACE_MSGT_DO_CEMU_RX_DATA ('0106'H),
SIMTRACE_MSGT_DO_CEMU_PTS ('0107'H),
SIMTRACE_MSGT_BD_CEMU_CONFIG ('0108'H),
/* SIMTRACE_MSGC_MODEM */
SIMTRACE_MSGT_DT_MODEM_RESET ('0201'H),
SIMTRACE_MSGT_DT_MODEM_SIM_SELECT ('0202'H),
SIMTRACE_MSGT_BD_MODEM_STATUS ('0203'H),
/* SIMTRACE_MSGC_SNIFF */
SIMTRACE_MSGT_SNIFF_CHANGE ('0300'H),
SIMTRACE_MSGT_SNIFF_FIDI ('0301'H),
SIMTRACE_MSGT_SNIFF_ATR ('0302'H),
SIMTRACE_MSGT_SNIFF_PPS ('0303'H),
SIMTRACE_MSGT_SNIFF_TPDU ('0304'H)
} with { variant "FIELDLENGTH(16)" variant "BYTEORDER(last)" };
type record SIMTRACE_PDU {
SIMTRACE_MsgClassType msg_type,
uint8_t seq_nr,
uint8_t slot_nr,
OCT2 reserved,
u16le_t msg_len,
SIMTRACE_Payload payload
/* payload */
} with {
variant (msg_len) "LENGTHTO(msg_type,seq_nr,slot_nr,reserved,msg_len,payload)"
variant (payload) "CROSSTAG(
gen_do_error, msg_type = SIMTRACE_CMD_DO_ERROR;
gen_bd_board_info, msg_type = SIMTRACE_CMD_BD_BOARD_INFO;
cardem_dt_txdata, msg_type = SIMTRACE_MSGT_DT_CEMU_TX_DATA;
cardem_dt_setatr, msg_type = SIMTRACE_MSGT_DT_CEMU_SET_ATR;
/* FIXME: stats */
cardem_bd_status, msg_type = SIMTRACE_MSGT_BD_CEMU_STATUS;
cardem_dt_cardinsert, msg_type = SIMTRACE_MSGT_DT_CEMU_CARDINSERT;
cardem_do_rxdata, msg_type = SIMTRACE_MSGT_DO_CEMU_RX_DATA;
cardem_do_pts, msg_type = SIMTRACE_MSGT_DO_CEMU_PTS;
cardem_bd_config, msg_type = SIMTRACE_MSGT_BD_CEMU_CONFIG;
modem_dt_reset, msg_type = SIMTRACE_MSGT_DT_MODEM_RESET;
modem_dt_sim_select, msg_type = SIMTRACE_MSGT_DT_MODEM_SIM_SELECT;
modem_bd_status, msg_type = SIMTRACE_MSGT_BD_MODEM_STATUS;
sniff_do_change, msg_type = SIMTRACE_MSGT_SNIFF_CHANGE;
sniff_do_fidi, msg_type = SIMTRACE_MSGT_SNIFF_FIDI;
sniff_do_atr, msg_type = SIMTRACE_MSGT_SNIFF_ATR;
sniff_do_pps, msg_type = SIMTRACE_MSGT_SNIFF_PPS;
sniff_do_tpdu, msg_type = SIMTRACE_MSGT_SNIFF_TPDU;
other, OTHERWISE;
)"
};
external function enc_SIMTRACE_PDU(in SIMTRACE_PDU pdu) return octetstring
with { extension "prototype(convert)" extension "encode(RAW)" };
external function dec_SIMTRACE_PDU(in octetstring stream) return SIMTRACE_PDU
with { extension "prototype(convert)" extension "decode(RAW)" };
type union SIMTRACE_Payload {
Generic_DO_Error gen_do_error,
Generic_BD_BoardInfo gen_bd_board_info,
CardEmu_DT_TxData cardem_dt_txdata,
CardEmu_DT_SetAtr cardem_dt_setatr,
CardEmu_BD_Status cardem_bd_status,
Cardemu_DT_CardInsert cardem_dt_cardinsert,
CardEmu_DO_RxData cardem_do_rxdata,
CardEmu_DO_Pts cardem_do_pts,
CardEmu_BD_Config cardem_bd_config,
Modem_DT_Reset modem_dt_reset,
Modem_DT_SimSelect modem_dt_sim_select,
Modem_BD_Status modem_bd_status,
Sniff_DO_Change sniff_do_change,
Sniff_DO_FiDi sniff_do_fidi,
Sniff_DO_Data sniff_do_atr,
Sniff_DO_Data sniff_do_pps,
Sniff_DO_Data sniff_do_tpdu,
octetstring other
};
/***********************************************************************
* GENERIC
***********************************************************************/
/* SIMTRACE_CMD_DO_ERROR */
type record Generic_DO_Error {
uint8_t severity,
uint8_t subsystem,
u16le_t code,
uint8_t msg_len,
charstring msg
} with {
variant (msg_len) "LENGTHTO(msg)"
};
type record Generic_Capability_Vendor {
/* Can erase a peer SAM3 controller */
boolean sysmo_qmod_erase_peer,
/* Can read/write an attached EEPROM */
boolean sysmo_qmod_rw_eeprom,
/* can reset an attached USB hub */
boolean sysmo_qmod_reset_hub
};
type record Generic_Capability {
/* compatible with 5V SIM card interface */
boolean cap_volt_5v,
/* compatible with 3V SIM card interface */
boolean cap_volt_3v,
/* compatible with 1.8V SIM card interface */
boolean cap_volt_1v8,
boolean cap_led_1,
boolean cap_led_2,
/* Has Single-Pole Dual-Throw (local/remote SIM) */
boolean cap_spdt,
/* Has Bus-Switch (trace / MITM) */
boolean cap_bus_switch,
/* Can read VSIM via ADC */
boolean cap_vsim_adc,
/* Can read temperature via ADC */
boolean cap_temp_adc,
/* Supports DFU for firmware update */
boolean cap_dfu,
/* Supports Ctrl EP command for erasing flash / return to SAM-BA */
boolean cap_erase_flash,
/* Can read the status of card insert contact */
boolean cap_read_card_det,
/* Can control the status of a simulated card insert */
boolean cap_assert_card_det,
/* Can toggle the hardware reset of an attached modem */
boolean cap_assert_modem_rst
};
type record Board_Info_Hardware {
CHAR32 manufacturer,
CHAR32 model,
CHAR32 version
};
type record Board_Info_Software {
CHAR32 provider,
CHAR32 name,
CHAR32 version,
CHAR32 buildhost,
OCT4 crc
};
type record Generic_BD_BoardInfo {
Board_Info_Hardware hardware,
Board_Info_Software software,
u32le_t max_baud_rate,
uint8_t cap_generic_bytes,
uint8_t cap_vendor_bytes,
Generic_Capability cap_generic optional,
Generic_Capability_Vendor cap_vendor optional
} with {
variant (cap_generic_bytes) "LENGTHTO(cap_generic)"
variant (cap_vendor_bytes) "LENGTHTO(cap_vendor)"
};
/***********************************************************************
* CARD EMULATOR / FORWARDER
***********************************************************************/
/* CEMU_USB_MSGT_DT_CARDINSERT */
type record Cardemu_DT_CardInsert {
uint8_t card_insert
};
/* CEMU_USB_MSGT_DT_SET_ATR */
type record CardEmu_DT_SetAtr {
uint8_t atr_len,
octetstring atr
} with {
variant (atr_len) "LENGTHTO(atr)"
};
type record CardEmu_DataFlags {
/* First octet here is last octet of little-endian encoded uint32_t */
BIT4 reserved,
/* indicates a PB is present and we should continue with RX */
boolean pb_and_rx,
/* indicates a PB is present and we should continue with TX */
boolean pb_and_tx,
/* indicates last part of transmission in this direction */
boolean final,
/* indicates a TPDU header is present in this message */
boolean tpdu_hdr,
BIT24 reserved2
} with { variant "BITORDER(msb)" };
/* CEMU_USB_MSGT_DT_TX_DATA */
type record CardEmu_DT_TxData {
CardEmu_DataFlags flags,
u16le_t data_len,
octetstring data
} with {
variant (data_len) "LENGTHTO(data)"
};
/* CEMU_USB_MSGT_DO_RX_DATA */
type record CardEmu_DO_RxData {
CardEmu_DataFlags flags,
u16le_t data_len,
octetstring data
} with {
variant (data_len) "LENGTHTO(data)"
};
type record CardEmu_StatusFlags {
/* First octet here is last octet of little-endian encoded uint32_t */
BIT3 reserved,
boolean reset_active,
boolean card_insert,
boolean rcemu_active,
boolean clk_active,
boolean vcc_present,
BIT24 reserved2
};
/* CEMU_USB_MSGT_BD_STATUS */
type record CardEmu_BD_Status {
CardEmu_StatusFlags flags,
u16le_t voltage_mv,
uint8_t fi,
uint8_t di,
uint8_t wi,
u32le_t waiting_time
};
/* CEMU_USB_MSGT_DO_PTS */
type record CardEmu_DO_Pts {
uint8_t pts_len,
OCT6 req,
OCT6 resp
};
type record CardEmu_FeatureFlags {
BIT7 reserved,
boolean status_irq,
BIT24 reserved2
};
type record CardEmu_BD_Config {
CardEmu_FeatureFlags features,
uint8_t slot_mux_nr optional
};
/***********************************************************************
* MODEM CONTROL
***********************************************************************/
type enumerated ModemResetType {
MODEM_RESET_RELEASE (0),
MODEM_RESET_ASSERT (1),
MODEM_RESET_PULSE (2)
} with { variant "FIELDLENGTH(8)" };
/* SIMTRACE_MSGT_DT_MODEM_RESET */
type record Modem_DT_Reset {
ModemResetType asserted,
u16le_t pulse_duration_msec
};
type enumerated SimSelect {
SIM_SELECT_LOCAL (0),
SIM_SELECT_REMOTE (1)
} with { variant "FIELDLENGTH(8)" };
/* SIMTRACE_MSGT_DT_MODEM_SIM_SELECT */
type record Modem_DT_SimSelect {
SimSelect sim_select
};
type record Modem_Status {
BIT6 reserved,
boolean card_inserted,
boolean wwan_led
};
/* SIMTRACE_MSGT_BD_MODEM_STATUS */
type record Modem_BD_Status {
Modem_Status supported,
Modem_Status status,
Modem_Status changed
};
/***********************************************************************
* SNIFF
***********************************************************************/
type record Sniff_Flags {
/* First octet here is last octet of little-endian encoded uint32_t */
boolean error_checksum,
boolean error_malformed,
boolean error_incomplete,
boolean timeout_wt,
boolean reset_deassert,
boolean reset_assert,
boolean card_eject,
boolean card_insert,
BIT24 reserved
};
/* SIMTRACE_MSGT_SNIFF_CHANGE */
type record Sniff_DO_Change {
Sniff_Flags flags
};
/* SIMTRACE_MSGT_SNIFF_FIDI */
type record Sniff_DO_FiDi {
uint8_t fidi
};
/* SIMTRACE_MSGT_SNIFF_ATR, PPS, TPDU */
type record Sniff_DO_Data {
Sniff_Flags flags,
u16le_t data_len,
octetstring data
} with {
variant (data_len) "LENGTHTO(data)"
};
} with { encode "RAW"; variant "FIELDORDER(msb)" };
|