Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-eobi.c
blobc8c2142b80088bb7d375ac5c73be0568a5be9070
1 // auto-generated by Georg Sauthoff's eti2wireshark.py
3 /* packet-eti.c
4 * Routines for EOBI dissection
5 * Copyright 2021, Georg Sauthoff <mail@gms.tf>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * SPDX-License-Identifier: GPL-2.0-or-later
15 * The Enhanced Order Book Interface 10.0 (EOBI) is an electronic trading protocol
16 * that is used by a few exchanges (Eurex, Xetra, ...).
18 * It's a Length-Tag based protocol consisting of mostly fix sized
19 * request/response messages.
21 * Links:
22 * https://en.wikipedia.org/wiki/List_of_electronic_trading_protocols#Europe
23 * https://github.com/gsauthof/python-eti#protocol-descriptions
24 * https://github.com/gsauthof/python-eti#protocol-introduction
28 #include <config.h>
31 #include <epan/packet.h> // Should be first Wireshark include (other than config.h)
32 #include "packet-udp.h" // udp_dissect_pdus()
33 #include <epan/expert.h> // expert info
35 #include <inttypes.h>
36 #include <stdio.h> // snprintf()
39 /* Prototypes */
40 /* (Required to prevent [-Wmissing-prototypes] warnings */
41 void proto_reg_handoff_eobi(void);
42 void proto_register_eobi(void);
44 static dissector_handle_t eobi_handle;
46 static int proto_eobi;
48 static expert_field ei_eobi_counter_overflow;
49 static expert_field ei_eobi_invalid_template;
50 static expert_field ei_eobi_invalid_length;
51 static expert_field ei_eobi_missing;
52 static expert_field ei_eobi_overused;
54 static int hf_eobi[83];
55 static int hf_eobi_dscp_exec_summary;
56 static int hf_eobi_dscp_improved;
57 static int hf_eobi_dscp_widened;
58 enum Field_Handle_Index {
59 AGGRESSORSIDE_FH_IDX
60 , AGGRESSORTIME_FH_IDX
61 , ALGORITHMICTRADEINDICATOR_FH_IDX
62 , APPLSEQNUM_FH_IDX
63 , APPLSEQRESETINDICATOR_FH_IDX
64 , BIDORDTYPE_FH_IDX
65 , BIDPX_FH_IDX
66 , BIDSIZE_FH_IDX
67 , BODYLEN_FH_IDX
68 , COMPLETIONINDICATOR_FH_IDX
69 , CROSSREQUESTTYPE_FH_IDX
70 , DSCP_FH_IDX
71 , DISPLAYQTY_FH_IDX
72 , EXECID_FH_IDX
73 , FASTMARKETINDICATOR_FH_IDX
74 , HIGHPX_FH_IDX
75 , IMBALANCEQTY_FH_IDX
76 , IMPLIEDMARKETINDICATOR_FH_IDX
77 , INPUTSOURCE_FH_IDX
78 , INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX
79 , LASTFRAGMENT_FH_IDX
80 , LASTMSGSEQNUMPROCESSED_FH_IDX
81 , LASTPX_FH_IDX
82 , LASTQTY_FH_IDX
83 , LASTUPDATETIME_FH_IDX
84 , LEGPRICE_FH_IDX
85 , LEGRATIOMULTIPLIER_FH_IDX
86 , LEGRATIOQTY_FH_IDX
87 , LEGSECURITYID_FH_IDX
88 , LEGSECURITYTYPE_FH_IDX
89 , LEGSIDE_FH_IDX
90 , LEGSYMBOL_FH_IDX
91 , LOWPX_FH_IDX
92 , MDENTRYPX_FH_IDX
93 , MDENTRYSIZE_FH_IDX
94 , MDENTRYTYPE_FH_IDX
95 , MARKETCONDITION_FH_IDX
96 , MARKETSEGMENTID_FH_IDX
97 , MASSMARKETCONDITION_FH_IDX
98 , MASSSOLDOUTINDICATOR_FH_IDX
99 , MATCHSUBTYPE_FH_IDX
100 , MATCHTYPE_FH_IDX
101 , MSGSEQNUM_FH_IDX
102 , NOLEGS_FH_IDX
103 , NOMDENTRIES_FH_IDX
104 , NORELATEDSYM_FH_IDX
105 , NUMBEROFBUYORDERS_FH_IDX
106 , NUMBEROFSELLORDERS_FH_IDX
107 , OFFERORDTYPE_FH_IDX
108 , OFFERPX_FH_IDX
109 , OFFERSIZE_FH_IDX
110 , ORDTYPE_FH_IDX
111 , PARTITIONID_FH_IDX
112 , POTENTIALSECURITYTRADINGEVENT_FH_IDX
113 , PREVDISPLAYQTY_FH_IDX
114 , PREVPRICE_FH_IDX
115 , PRICE_FH_IDX
116 , PRODUCTCOMPLEX_FH_IDX
117 , REQUESTTIME_FH_IDX
118 , RESTINGCXLQTY_FH_IDX
119 , RESTINGHIDDENQTY_FH_IDX
120 , SECURITYID_FH_IDX
121 , SECURITYMASSSTATUS_FH_IDX
122 , SECURITYMASSTRADINGEVENT_FH_IDX
123 , SECURITYMASSTRADINGSTATUS_FH_IDX
124 , SECURITYSTATUS_FH_IDX
125 , SECURITYSUBTYPE_FH_IDX
126 , SECURITYTRADINGEVENT_FH_IDX
127 , SECURITYTRADINGSTATUS_FH_IDX
128 , SIDE_FH_IDX
129 , SOLDOUTINDICATOR_FH_IDX
130 , TEMPLATEID_FH_IDX
131 , TOTNOORDERS_FH_IDX
132 , TRADSESSTATUS_FH_IDX
133 , TRADECONDITION_FH_IDX
134 , TRADINGSESSIONID_FH_IDX
135 , TRADINGSESSIONSUBID_FH_IDX
136 , TRANSACTTIME_FH_IDX
137 , TRDMATCHID_FH_IDX
138 , TRDREGTSEXECUTIONTIME_FH_IDX
139 , TRDREGTSPREVTIMEPRIORITY_FH_IDX
140 , TRDREGTSTIMEIN_FH_IDX
141 , TRDREGTSTIMEPRIORITY_FH_IDX
143 static const value_string template_id_vals[] = { // TemplateID
144 { 13001, "Heartbeat" },
145 { 13002, "Unknown" },
146 { 13003, "Unknown" },
147 { 13004, "Unknown" },
148 { 13005, "PacketHeader" },
149 { 13006, "Unknown" },
150 { 13007, "Unknown" },
151 { 13008, "Unknown" },
152 { 13009, "Unknown" },
153 { 13010, "Unknown" },
154 { 13011, "Unknown" },
155 { 13012, "Unknown" },
156 { 13013, "Unknown" },
157 { 13014, "Unknown" },
158 { 13015, "Unknown" },
159 { 13016, "Unknown" },
160 { 13017, "Unknown" },
161 { 13018, "Unknown" },
162 { 13019, "Unknown" },
163 { 13020, "Unknown" },
164 { 13021, "Unknown" },
165 { 13022, "Unknown" },
166 { 13023, "Unknown" },
167 { 13024, "Unknown" },
168 { 13025, "Unknown" },
169 { 13026, "Unknown" },
170 { 13027, "Unknown" },
171 { 13028, "Unknown" },
172 { 13029, "Unknown" },
173 { 13030, "Unknown" },
174 { 13031, "Unknown" },
175 { 13032, "Unknown" },
176 { 13033, "Unknown" },
177 { 13034, "Unknown" },
178 { 13035, "Unknown" },
179 { 13036, "Unknown" },
180 { 13037, "Unknown" },
181 { 13038, "Unknown" },
182 { 13039, "Unknown" },
183 { 13040, "Unknown" },
184 { 13041, "Unknown" },
185 { 13042, "Unknown" },
186 { 13043, "Unknown" },
187 { 13044, "Unknown" },
188 { 13045, "Unknown" },
189 { 13046, "Unknown" },
190 { 13047, "Unknown" },
191 { 13048, "Unknown" },
192 { 13049, "Unknown" },
193 { 13050, "Unknown" },
194 { 13051, "Unknown" },
195 { 13052, "Unknown" },
196 { 13053, "Unknown" },
197 { 13054, "Unknown" },
198 { 13055, "Unknown" },
199 { 13056, "Unknown" },
200 { 13057, "Unknown" },
201 { 13058, "Unknown" },
202 { 13059, "Unknown" },
203 { 13060, "Unknown" },
204 { 13061, "Unknown" },
205 { 13062, "Unknown" },
206 { 13063, "Unknown" },
207 { 13064, "Unknown" },
208 { 13065, "Unknown" },
209 { 13066, "Unknown" },
210 { 13067, "Unknown" },
211 { 13068, "Unknown" },
212 { 13069, "Unknown" },
213 { 13070, "Unknown" },
214 { 13071, "Unknown" },
215 { 13072, "Unknown" },
216 { 13073, "Unknown" },
217 { 13074, "Unknown" },
218 { 13075, "Unknown" },
219 { 13076, "Unknown" },
220 { 13077, "Unknown" },
221 { 13078, "Unknown" },
222 { 13079, "Unknown" },
223 { 13080, "Unknown" },
224 { 13081, "Unknown" },
225 { 13082, "Unknown" },
226 { 13083, "Unknown" },
227 { 13084, "Unknown" },
228 { 13085, "Unknown" },
229 { 13086, "Unknown" },
230 { 13087, "Unknown" },
231 { 13088, "Unknown" },
232 { 13089, "Unknown" },
233 { 13090, "Unknown" },
234 { 13091, "Unknown" },
235 { 13092, "Unknown" },
236 { 13093, "Unknown" },
237 { 13094, "Unknown" },
238 { 13095, "Unknown" },
239 { 13096, "Unknown" },
240 { 13097, "Unknown" },
241 { 13098, "Unknown" },
242 { 13099, "Unknown" },
243 { 13100, "OrderAdd" },
244 { 13101, "OrderModify" },
245 { 13102, "OrderDelete" },
246 { 13103, "OrderMassDelete" },
247 { 13104, "FullOrderExecution" },
248 { 13105, "PartialOrderExecution" },
249 { 13106, "OrderModifySamePrio" },
250 { 13107, "Unknown" },
251 { 13108, "Unknown" },
252 { 13109, "Unknown" },
253 { 13110, "Unknown" },
254 { 13111, "Unknown" },
255 { 13112, "Unknown" },
256 { 13113, "Unknown" },
257 { 13114, "Unknown" },
258 { 13115, "Unknown" },
259 { 13116, "Unknown" },
260 { 13117, "Unknown" },
261 { 13118, "Unknown" },
262 { 13119, "Unknown" },
263 { 13120, "Unknown" },
264 { 13121, "Unknown" },
265 { 13122, "Unknown" },
266 { 13123, "Unknown" },
267 { 13124, "Unknown" },
268 { 13125, "Unknown" },
269 { 13126, "Unknown" },
270 { 13127, "Unknown" },
271 { 13128, "Unknown" },
272 { 13129, "Unknown" },
273 { 13130, "Unknown" },
274 { 13131, "Unknown" },
275 { 13132, "Unknown" },
276 { 13133, "Unknown" },
277 { 13134, "Unknown" },
278 { 13135, "Unknown" },
279 { 13136, "Unknown" },
280 { 13137, "Unknown" },
281 { 13138, "Unknown" },
282 { 13139, "Unknown" },
283 { 13140, "Unknown" },
284 { 13141, "Unknown" },
285 { 13142, "Unknown" },
286 { 13143, "Unknown" },
287 { 13144, "Unknown" },
288 { 13145, "Unknown" },
289 { 13146, "Unknown" },
290 { 13147, "Unknown" },
291 { 13148, "Unknown" },
292 { 13149, "Unknown" },
293 { 13150, "Unknown" },
294 { 13151, "Unknown" },
295 { 13152, "Unknown" },
296 { 13153, "Unknown" },
297 { 13154, "Unknown" },
298 { 13155, "Unknown" },
299 { 13156, "Unknown" },
300 { 13157, "Unknown" },
301 { 13158, "Unknown" },
302 { 13159, "Unknown" },
303 { 13160, "Unknown" },
304 { 13161, "Unknown" },
305 { 13162, "Unknown" },
306 { 13163, "Unknown" },
307 { 13164, "Unknown" },
308 { 13165, "Unknown" },
309 { 13166, "Unknown" },
310 { 13167, "Unknown" },
311 { 13168, "Unknown" },
312 { 13169, "Unknown" },
313 { 13170, "Unknown" },
314 { 13171, "Unknown" },
315 { 13172, "Unknown" },
316 { 13173, "Unknown" },
317 { 13174, "Unknown" },
318 { 13175, "Unknown" },
319 { 13176, "Unknown" },
320 { 13177, "Unknown" },
321 { 13178, "Unknown" },
322 { 13179, "Unknown" },
323 { 13180, "Unknown" },
324 { 13181, "Unknown" },
325 { 13182, "Unknown" },
326 { 13183, "Unknown" },
327 { 13184, "Unknown" },
328 { 13185, "Unknown" },
329 { 13186, "Unknown" },
330 { 13187, "Unknown" },
331 { 13188, "Unknown" },
332 { 13189, "Unknown" },
333 { 13190, "Unknown" },
334 { 13191, "Unknown" },
335 { 13192, "Unknown" },
336 { 13193, "Unknown" },
337 { 13194, "Unknown" },
338 { 13195, "Unknown" },
339 { 13196, "Unknown" },
340 { 13197, "Unknown" },
341 { 13198, "Unknown" },
342 { 13199, "Unknown" },
343 { 13200, "TradeReversal" },
344 { 13201, "TradeReport" },
345 { 13202, "ExecutionSummary" },
346 { 13203, "Unknown" },
347 { 13204, "Unknown" },
348 { 13205, "Unknown" },
349 { 13206, "Unknown" },
350 { 13207, "Unknown" },
351 { 13208, "Unknown" },
352 { 13209, "Unknown" },
353 { 13210, "Unknown" },
354 { 13211, "Unknown" },
355 { 13212, "Unknown" },
356 { 13213, "Unknown" },
357 { 13214, "Unknown" },
358 { 13215, "Unknown" },
359 { 13216, "Unknown" },
360 { 13217, "Unknown" },
361 { 13218, "Unknown" },
362 { 13219, "Unknown" },
363 { 13220, "Unknown" },
364 { 13221, "Unknown" },
365 { 13222, "Unknown" },
366 { 13223, "Unknown" },
367 { 13224, "Unknown" },
368 { 13225, "Unknown" },
369 { 13226, "Unknown" },
370 { 13227, "Unknown" },
371 { 13228, "Unknown" },
372 { 13229, "Unknown" },
373 { 13230, "Unknown" },
374 { 13231, "Unknown" },
375 { 13232, "Unknown" },
376 { 13233, "Unknown" },
377 { 13234, "Unknown" },
378 { 13235, "Unknown" },
379 { 13236, "Unknown" },
380 { 13237, "Unknown" },
381 { 13238, "Unknown" },
382 { 13239, "Unknown" },
383 { 13240, "Unknown" },
384 { 13241, "Unknown" },
385 { 13242, "Unknown" },
386 { 13243, "Unknown" },
387 { 13244, "Unknown" },
388 { 13245, "Unknown" },
389 { 13246, "Unknown" },
390 { 13247, "Unknown" },
391 { 13248, "Unknown" },
392 { 13249, "Unknown" },
393 { 13250, "Unknown" },
394 { 13251, "Unknown" },
395 { 13252, "Unknown" },
396 { 13253, "Unknown" },
397 { 13254, "Unknown" },
398 { 13255, "Unknown" },
399 { 13256, "Unknown" },
400 { 13257, "Unknown" },
401 { 13258, "Unknown" },
402 { 13259, "Unknown" },
403 { 13260, "Unknown" },
404 { 13261, "Unknown" },
405 { 13262, "Unknown" },
406 { 13263, "Unknown" },
407 { 13264, "Unknown" },
408 { 13265, "Unknown" },
409 { 13266, "Unknown" },
410 { 13267, "Unknown" },
411 { 13268, "Unknown" },
412 { 13269, "Unknown" },
413 { 13270, "Unknown" },
414 { 13271, "Unknown" },
415 { 13272, "Unknown" },
416 { 13273, "Unknown" },
417 { 13274, "Unknown" },
418 { 13275, "Unknown" },
419 { 13276, "Unknown" },
420 { 13277, "Unknown" },
421 { 13278, "Unknown" },
422 { 13279, "Unknown" },
423 { 13280, "Unknown" },
424 { 13281, "Unknown" },
425 { 13282, "Unknown" },
426 { 13283, "Unknown" },
427 { 13284, "Unknown" },
428 { 13285, "Unknown" },
429 { 13286, "Unknown" },
430 { 13287, "Unknown" },
431 { 13288, "Unknown" },
432 { 13289, "Unknown" },
433 { 13290, "Unknown" },
434 { 13291, "Unknown" },
435 { 13292, "Unknown" },
436 { 13293, "Unknown" },
437 { 13294, "Unknown" },
438 { 13295, "Unknown" },
439 { 13296, "Unknown" },
440 { 13297, "Unknown" },
441 { 13298, "Unknown" },
442 { 13299, "Unknown" },
443 { 13300, "ProductStateChange" },
444 { 13301, "InstrumentStateChange" },
445 { 13302, "MassInstrumentStateChange" },
446 { 13303, "Unknown" },
447 { 13304, "Unknown" },
448 { 13305, "Unknown" },
449 { 13306, "Unknown" },
450 { 13307, "Unknown" },
451 { 13308, "Unknown" },
452 { 13309, "Unknown" },
453 { 13310, "Unknown" },
454 { 13311, "Unknown" },
455 { 13312, "Unknown" },
456 { 13313, "Unknown" },
457 { 13314, "Unknown" },
458 { 13315, "Unknown" },
459 { 13316, "Unknown" },
460 { 13317, "Unknown" },
461 { 13318, "Unknown" },
462 { 13319, "Unknown" },
463 { 13320, "Unknown" },
464 { 13321, "Unknown" },
465 { 13322, "Unknown" },
466 { 13323, "Unknown" },
467 { 13324, "Unknown" },
468 { 13325, "Unknown" },
469 { 13326, "Unknown" },
470 { 13327, "Unknown" },
471 { 13328, "Unknown" },
472 { 13329, "Unknown" },
473 { 13330, "Unknown" },
474 { 13331, "Unknown" },
475 { 13332, "Unknown" },
476 { 13333, "Unknown" },
477 { 13334, "Unknown" },
478 { 13335, "Unknown" },
479 { 13336, "Unknown" },
480 { 13337, "Unknown" },
481 { 13338, "Unknown" },
482 { 13339, "Unknown" },
483 { 13340, "Unknown" },
484 { 13341, "Unknown" },
485 { 13342, "Unknown" },
486 { 13343, "Unknown" },
487 { 13344, "Unknown" },
488 { 13345, "Unknown" },
489 { 13346, "Unknown" },
490 { 13347, "Unknown" },
491 { 13348, "Unknown" },
492 { 13349, "Unknown" },
493 { 13350, "Unknown" },
494 { 13351, "Unknown" },
495 { 13352, "Unknown" },
496 { 13353, "Unknown" },
497 { 13354, "Unknown" },
498 { 13355, "Unknown" },
499 { 13356, "Unknown" },
500 { 13357, "Unknown" },
501 { 13358, "Unknown" },
502 { 13359, "Unknown" },
503 { 13360, "Unknown" },
504 { 13361, "Unknown" },
505 { 13362, "Unknown" },
506 { 13363, "Unknown" },
507 { 13364, "Unknown" },
508 { 13365, "Unknown" },
509 { 13366, "Unknown" },
510 { 13367, "Unknown" },
511 { 13368, "Unknown" },
512 { 13369, "Unknown" },
513 { 13370, "Unknown" },
514 { 13371, "Unknown" },
515 { 13372, "Unknown" },
516 { 13373, "Unknown" },
517 { 13374, "Unknown" },
518 { 13375, "Unknown" },
519 { 13376, "Unknown" },
520 { 13377, "Unknown" },
521 { 13378, "Unknown" },
522 { 13379, "Unknown" },
523 { 13380, "Unknown" },
524 { 13381, "Unknown" },
525 { 13382, "Unknown" },
526 { 13383, "Unknown" },
527 { 13384, "Unknown" },
528 { 13385, "Unknown" },
529 { 13386, "Unknown" },
530 { 13387, "Unknown" },
531 { 13388, "Unknown" },
532 { 13389, "Unknown" },
533 { 13390, "Unknown" },
534 { 13391, "Unknown" },
535 { 13392, "Unknown" },
536 { 13393, "Unknown" },
537 { 13394, "Unknown" },
538 { 13395, "Unknown" },
539 { 13396, "Unknown" },
540 { 13397, "Unknown" },
541 { 13398, "Unknown" },
542 { 13399, "Unknown" },
543 { 13400, "AddComplexInstrument" },
544 { 13401, "Unknown" },
545 { 13402, "Unknown" },
546 { 13403, "Unknown" },
547 { 13404, "Unknown" },
548 { 13405, "Unknown" },
549 { 13406, "Unknown" },
550 { 13407, "Unknown" },
551 { 13408, "Unknown" },
552 { 13409, "Unknown" },
553 { 13410, "Unknown" },
554 { 13411, "Unknown" },
555 { 13412, "Unknown" },
556 { 13413, "Unknown" },
557 { 13414, "Unknown" },
558 { 13415, "Unknown" },
559 { 13416, "Unknown" },
560 { 13417, "Unknown" },
561 { 13418, "Unknown" },
562 { 13419, "Unknown" },
563 { 13420, "Unknown" },
564 { 13421, "Unknown" },
565 { 13422, "Unknown" },
566 { 13423, "Unknown" },
567 { 13424, "Unknown" },
568 { 13425, "Unknown" },
569 { 13426, "Unknown" },
570 { 13427, "Unknown" },
571 { 13428, "Unknown" },
572 { 13429, "Unknown" },
573 { 13430, "Unknown" },
574 { 13431, "Unknown" },
575 { 13432, "Unknown" },
576 { 13433, "Unknown" },
577 { 13434, "Unknown" },
578 { 13435, "Unknown" },
579 { 13436, "Unknown" },
580 { 13437, "Unknown" },
581 { 13438, "Unknown" },
582 { 13439, "Unknown" },
583 { 13440, "Unknown" },
584 { 13441, "Unknown" },
585 { 13442, "Unknown" },
586 { 13443, "Unknown" },
587 { 13444, "Unknown" },
588 { 13445, "Unknown" },
589 { 13446, "Unknown" },
590 { 13447, "Unknown" },
591 { 13448, "Unknown" },
592 { 13449, "Unknown" },
593 { 13450, "Unknown" },
594 { 13451, "Unknown" },
595 { 13452, "Unknown" },
596 { 13453, "Unknown" },
597 { 13454, "Unknown" },
598 { 13455, "Unknown" },
599 { 13456, "Unknown" },
600 { 13457, "Unknown" },
601 { 13458, "Unknown" },
602 { 13459, "Unknown" },
603 { 13460, "Unknown" },
604 { 13461, "Unknown" },
605 { 13462, "Unknown" },
606 { 13463, "Unknown" },
607 { 13464, "Unknown" },
608 { 13465, "Unknown" },
609 { 13466, "Unknown" },
610 { 13467, "Unknown" },
611 { 13468, "Unknown" },
612 { 13469, "Unknown" },
613 { 13470, "Unknown" },
614 { 13471, "Unknown" },
615 { 13472, "Unknown" },
616 { 13473, "Unknown" },
617 { 13474, "Unknown" },
618 { 13475, "Unknown" },
619 { 13476, "Unknown" },
620 { 13477, "Unknown" },
621 { 13478, "Unknown" },
622 { 13479, "Unknown" },
623 { 13480, "Unknown" },
624 { 13481, "Unknown" },
625 { 13482, "Unknown" },
626 { 13483, "Unknown" },
627 { 13484, "Unknown" },
628 { 13485, "Unknown" },
629 { 13486, "Unknown" },
630 { 13487, "Unknown" },
631 { 13488, "Unknown" },
632 { 13489, "Unknown" },
633 { 13490, "Unknown" },
634 { 13491, "Unknown" },
635 { 13492, "Unknown" },
636 { 13493, "Unknown" },
637 { 13494, "Unknown" },
638 { 13495, "Unknown" },
639 { 13496, "Unknown" },
640 { 13497, "Unknown" },
641 { 13498, "Unknown" },
642 { 13499, "Unknown" },
643 { 13500, "AuctionBBO" },
644 { 13501, "AuctionClearingPrice" },
645 { 13502, "CrossRequest" },
646 { 13503, "QuoteRequest" },
647 { 13504, "TopOfBook" },
648 { 13505, "Unknown" },
649 { 13506, "Unknown" },
650 { 13507, "Unknown" },
651 { 13508, "Unknown" },
652 { 13509, "Unknown" },
653 { 13510, "Unknown" },
654 { 13511, "Unknown" },
655 { 13512, "Unknown" },
656 { 13513, "Unknown" },
657 { 13514, "Unknown" },
658 { 13515, "Unknown" },
659 { 13516, "Unknown" },
660 { 13517, "Unknown" },
661 { 13518, "Unknown" },
662 { 13519, "Unknown" },
663 { 13520, "Unknown" },
664 { 13521, "Unknown" },
665 { 13522, "Unknown" },
666 { 13523, "Unknown" },
667 { 13524, "Unknown" },
668 { 13525, "Unknown" },
669 { 13526, "Unknown" },
670 { 13527, "Unknown" },
671 { 13528, "Unknown" },
672 { 13529, "Unknown" },
673 { 13530, "Unknown" },
674 { 13531, "Unknown" },
675 { 13532, "Unknown" },
676 { 13533, "Unknown" },
677 { 13534, "Unknown" },
678 { 13535, "Unknown" },
679 { 13536, "Unknown" },
680 { 13537, "Unknown" },
681 { 13538, "Unknown" },
682 { 13539, "Unknown" },
683 { 13540, "Unknown" },
684 { 13541, "Unknown" },
685 { 13542, "Unknown" },
686 { 13543, "Unknown" },
687 { 13544, "Unknown" },
688 { 13545, "Unknown" },
689 { 13546, "Unknown" },
690 { 13547, "Unknown" },
691 { 13548, "Unknown" },
692 { 13549, "Unknown" },
693 { 13550, "Unknown" },
694 { 13551, "Unknown" },
695 { 13552, "Unknown" },
696 { 13553, "Unknown" },
697 { 13554, "Unknown" },
698 { 13555, "Unknown" },
699 { 13556, "Unknown" },
700 { 13557, "Unknown" },
701 { 13558, "Unknown" },
702 { 13559, "Unknown" },
703 { 13560, "Unknown" },
704 { 13561, "Unknown" },
705 { 13562, "Unknown" },
706 { 13563, "Unknown" },
707 { 13564, "Unknown" },
708 { 13565, "Unknown" },
709 { 13566, "Unknown" },
710 { 13567, "Unknown" },
711 { 13568, "Unknown" },
712 { 13569, "Unknown" },
713 { 13570, "Unknown" },
714 { 13571, "Unknown" },
715 { 13572, "Unknown" },
716 { 13573, "Unknown" },
717 { 13574, "Unknown" },
718 { 13575, "Unknown" },
719 { 13576, "Unknown" },
720 { 13577, "Unknown" },
721 { 13578, "Unknown" },
722 { 13579, "Unknown" },
723 { 13580, "Unknown" },
724 { 13581, "Unknown" },
725 { 13582, "Unknown" },
726 { 13583, "Unknown" },
727 { 13584, "Unknown" },
728 { 13585, "Unknown" },
729 { 13586, "Unknown" },
730 { 13587, "Unknown" },
731 { 13588, "Unknown" },
732 { 13589, "Unknown" },
733 { 13590, "Unknown" },
734 { 13591, "Unknown" },
735 { 13592, "Unknown" },
736 { 13593, "Unknown" },
737 { 13594, "Unknown" },
738 { 13595, "Unknown" },
739 { 13596, "Unknown" },
740 { 13597, "Unknown" },
741 { 13598, "Unknown" },
742 { 13599, "Unknown" },
743 { 13600, "ProductSummary" },
744 { 13601, "InstrumentSummary" },
745 { 13602, "SnapshotOrder" },
746 { 0, NULL }
748 static value_string_ext template_id_vals_ext = VALUE_STRING_EXT_INIT(template_id_vals);
749 static const value_string aggressor_side_vals[] = { // AggressorSide
750 { 1, "Buy" },
751 { 2, "Sell" },
752 { 0xFF, "NO_VALUE" },
753 { 0, NULL }
755 static const value_string algorithmic_trade_indicator_vals[] = { // AlgorithmicTradeIndicator
756 { 1, "AlgorithmicTrade" },
757 { 0xFF, "NO_VALUE" },
758 { 0, NULL }
760 static const value_string appl_seq_reset_indicator_vals[] = { // ApplSeqResetIndicator
761 { 0, "NoReset" },
762 { 1, "Reset" },
763 { 0xFF, "NO_VALUE" },
764 { 0, NULL }
766 static const value_string bid_ord_type_vals[] = { // BidOrdType
767 { 1, "Market" },
768 { 0xFF, "NO_VALUE" },
769 { 0, NULL }
771 static const value_string completion_indicator_vals[] = { // CompletionIndicator
772 { 0, "Incomplete" },
773 { 1, "Complete" },
774 { 0xFF, "NO_VALUE" },
775 { 0, NULL }
777 static const value_string cross_request_type_vals[] = { // CrossRequestType
778 { 1, "CrossAnnouncement" },
779 { 2, "LiquidityImprovementCross" },
780 { 0xFF, "NO_VALUE" },
781 { 0, NULL }
783 static const value_string fast_market_indicator_vals[] = { // FastMarketIndicator
784 { 0, "No" },
785 { 1, "Yes" },
786 { 0xFF, "NO_VALUE" },
787 { 0, NULL }
789 static const value_string implied_market_indicator_vals[] = { // ImpliedMarketIndicator
790 { 0, "NotImplied" },
791 { 3, "ImpliedInOut" },
792 { 0xFF, "NO_VALUE" },
793 { 0, NULL }
795 static const value_string input_source_vals[] = { // InputSource
796 { 1, "CLIPClientBroker" },
797 { 0xFF, "NO_VALUE" },
798 { 0, NULL }
800 static const value_string instrument_scope_product_complex_vals[] = { // InstrumentScopeProductComplex
801 { 1, "SimpleInstrument" },
802 { 2, "StandardOptionStrategy" },
803 { 3, "NonStandardOptionStrategy" },
804 { 4, "VolatilityStrategy" },
805 { 5, "FuturesSpread" },
806 { 6, "InterProductSpread" },
807 { 7, "StandardFuturesStrategy" },
808 { 8, "PackAndBundle" },
809 { 9, "Strip" },
810 { 0xFF, "NO_VALUE" },
811 { 0, NULL }
813 static value_string_ext instrument_scope_product_complex_vals_ext = VALUE_STRING_EXT_INIT(instrument_scope_product_complex_vals);
814 static const value_string last_fragment_vals[] = { // LastFragment
815 { 0, "N" },
816 { 1, "Y" },
817 { 0xFF, "NO_VALUE" },
818 { 0, NULL }
820 static const value_string leg_security_type_vals[] = { // LegSecurityType
821 { 1, "LegSecurityMultiLeg" },
822 { 2, "LegSecurityUnderlyingLeg" },
823 { 0xFF, "NO_VALUE" },
824 { 0, NULL }
826 // LegSide aliased by AggressorSide
827 static const value_string mdentry_type_vals[] = { // MDEntryType
828 { 2, "Trade" },
829 { 4, "OpeningPrice" },
830 { 5, "ClosingPrice" },
831 { 7, "HighPrice" },
832 { 8, "LowPrice" },
833 { 66, "TradeVolume" },
834 { 101, "PreviousClosingPrice" },
835 { 200, "OpeningAuction" },
836 { 201, "IntradayAuction" },
837 { 202, "CircuitBreakerAuction" },
838 { 203, "ClosingAuction" },
839 { 204, "IPOAuction" },
840 { 0xFF, "NO_VALUE" },
841 { 0, NULL }
843 static value_string_ext mdentry_type_vals_ext = VALUE_STRING_EXT_INIT(mdentry_type_vals);
844 static const value_string market_condition_vals[] = { // MarketCondition
845 { 0, "Normal" },
846 { 1, "Stressed" },
847 { 0xFF, "NO_VALUE" },
848 { 0, NULL }
850 // MassMarketCondition aliased by MarketCondition
851 static const value_string mass_sold_out_indicator_vals[] = { // MassSoldOutIndicator
852 { 1, "SoldOut" },
853 { 0xFF, "NO_VALUE" },
854 { 0, NULL }
856 static const value_string match_sub_type_vals[] = { // MatchSubType
857 { 1, "OpeningAuction" },
858 { 2, "ClosingAuction" },
859 { 3, "IntradayAuction" },
860 { 4, "CircuitBreakerAuction" },
861 { 5, "IPOAuction" },
862 { 0xFF, "NO_VALUE" },
863 { 0, NULL }
865 static const value_string match_type_vals[] = { // MatchType
866 { 3, "ConfirmedTradeReport" },
867 { 5, "CrossAuction" },
868 { 7, "CallAuction" },
869 { 13, "LiquidityImprovementCross" },
870 { 14, "ContinuousAuction" },
871 { 0xFF, "NO_VALUE" },
872 { 0, NULL }
874 // OfferOrdType aliased by BidOrdType
875 // OrdType aliased by BidOrdType
876 static const value_string potential_security_trading_event_vals[] = { // PotentialSecurityTradingEvent
877 { 0, "None" },
878 { 10, "PriceVolatilityAuctionIsExtended" },
879 { 0xFF, "NO_VALUE" },
880 { 0, NULL }
882 // ProductComplex aliased by InstrumentScopeProductComplex
883 static const value_string security_mass_status_vals[] = { // SecurityMassStatus
884 { 1, "Active" },
885 { 2, "Inactive" },
886 { 4, "Expired" },
887 { 6, "KnockedOut" },
888 { 7, "KnockOutRevoked" },
889 { 9, "Suspended" },
890 { 11, "PendingDeletion" },
891 { 12, "KnockedOutAndSuspended" },
892 { 0xFF, "NO_VALUE" },
893 { 0, NULL }
895 static value_string_ext security_mass_status_vals_ext = VALUE_STRING_EXT_INIT(security_mass_status_vals);
896 static const value_string security_mass_trading_event_vals[] = { // SecurityMassTradingEvent
897 { 10, "PriceVolatilityAuctionIsExtended" },
898 { 11, "PriceVolatilityAuctionIsExtendedAgain" },
899 { 0xFF, "NO_VALUE" },
900 { 0, NULL }
902 static const value_string security_mass_trading_status_vals[] = { // SecurityMassTradingStatus
903 { 2, "TradingHalt" },
904 { 7, "MarketImbalanceBuy" },
905 { 8, "MarketImbalanceSell" },
906 { 200, "Closed" },
907 { 201, "Restricted" },
908 { 202, "Book" },
909 { 203, "Continuous" },
910 { 204, "OpeningAuction" },
911 { 205, "OpeningAuctionFreeze" },
912 { 206, "IntradayAuction" },
913 { 207, "IntradayAuctionFreeze" },
914 { 208, "CircuitBreakerAuction" },
915 { 209, "CircuitBreakerAuctionFreeze" },
916 { 210, "ClosingAuction" },
917 { 211, "ClosingAuctionFreeze" },
918 { 212, "IPOAuction" },
919 { 213, "IPOAuctionFreeze" },
920 { 214, "PreCall" },
921 { 215, "Call" },
922 { 216, "Freeze" },
923 { 217, "TradeAtClose" },
924 { 0xFF, "NO_VALUE" },
925 { 0, NULL }
927 static value_string_ext security_mass_trading_status_vals_ext = VALUE_STRING_EXT_INIT(security_mass_trading_status_vals);
928 // SecurityStatus aliased by SecurityMassStatus
929 // SecurityTradingEvent aliased by SecurityMassTradingEvent
930 // SecurityTradingStatus aliased by SecurityMassTradingStatus
931 // Side aliased by AggressorSide
932 // SoldOutIndicator aliased by MassSoldOutIndicator
933 static const value_string trad_ses_status_vals[] = { // TradSesStatus
934 { 1, "Halted" },
935 { 2, "Open" },
936 { 3, "Closed" },
937 { 0xFF, "NO_VALUE" },
938 { 0, NULL }
940 static const value_string trade_condition_vals[] = { // TradeCondition
941 { 1, "ImpliedTrade" },
942 { 107, "OutOfSequence" },
943 { 155, "MidpointPrice" },
944 { 156, "TradingOnTermsOfIssue" },
945 { 596, "SpecialAuction" },
946 { 624, "TradeAtClose" },
947 { 0xFFFF, "NO_VALUE" },
948 { 0, NULL }
950 static const value_string trading_session_id_vals[] = { // TradingSessionID
951 { 1, "Day" },
952 { 3, "Morning" },
953 { 5, "Evening" },
954 { 6, "AfterHours" },
955 { 7, "Holiday" },
956 { 0xFF, "NO_VALUE" },
957 { 0, NULL }
959 static const value_string trading_session_sub_id_vals[] = { // TradingSessionSubID
960 { 1, "PreTrading" },
961 { 3, "Continuous" },
962 { 4, "Closing" },
963 { 5, "PostTrading" },
964 { 7, "Quiescent" },
965 { 0xFF, "NO_VALUE" },
966 { 0, NULL }
969 enum ETI_Type {
970 ETI_EOF,
971 ETI_PADDING,
972 ETI_UINT,
973 ETI_INT,
974 ETI_UINT_ENUM,
975 ETI_INT_ENUM,
976 ETI_COUNTER,
977 ETI_FIXED_POINT,
978 ETI_TIMESTAMP_NS,
979 ETI_CHAR,
980 ETI_STRING,
981 ETI_VAR_STRING,
982 ETI_STRUCT,
983 ETI_VAR_STRUCT,
984 ETI_DSCP
987 struct ETI_Field {
988 uint8_t type;
989 uint8_t counter_off; // offset into counter array
990 // if ETI_COUNTER => storage
991 // if ETI_VAR_STRING or ETI_VAR_STRUCT => load
992 // to get length or repeat count
993 // if ETI_FIXED_POINT: #fractional digits
994 uint16_t size; // or offset into struct_names if ETI_STRUCT/ETI_VAR_STRUCT
995 uint16_t field_handle_idx; // or index into fields array if ETI_STRUCT/ETI_VAR_STRUT
996 uint16_t ett_idx; // index into ett array if ETI_STRUCT/ETI_VAR_STRUCT
997 // or max value if ETI_COUNTER
1000 static int ett_eobi[7];
1001 static int ett_eobi_dscp;
1002 /* This method dissects fully reassembled messages */
1003 static int
1004 dissect_eobi_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1006 col_set_str(pinfo->cinfo, COL_PROTOCOL, "EOBI");
1007 col_clear(pinfo->cinfo, COL_INFO);
1008 uint16_t templateid = tvb_get_letohs(tvb, 2);
1009 const char *template_str = val_to_str_ext(templateid, &template_id_vals_ext, "Unknown EOBI template: 0x%04x");
1010 col_add_str(pinfo->cinfo, COL_INFO, template_str);
1012 /* create display subtree for the protocol */
1013 proto_item *ti = proto_tree_add_item(tree, proto_eobi, tvb, 0, -1, ENC_NA);
1014 uint32_t bodylen= tvb_get_letohs(tvb, 0);
1015 proto_item_append_text(ti, ", %s (%" PRIu16 "), BodyLen: %u", template_str, templateid, bodylen);
1016 proto_tree *root = proto_item_add_subtree(ti, ett_eobi[0]);
1018 static const char struct_names[] = "InstrmtLegGrp\0MDInstrumentEntryGrp\0MDTradeEntryGrp\0MessageHeader\0OrderDetails\0SecMassStatGrp";
1019 static const struct ETI_Field fields[] = {
1020 // InstrmtLegGrpComp@0
1021 { ETI_INT, 0, 4, LEGSYMBOL_FH_IDX, 0 }
1022 , { ETI_PADDING, 0, 4, 0, 0 }
1023 , { ETI_INT, 0, 8, LEGSECURITYID_FH_IDX, 0 }
1024 , { ETI_FIXED_POINT, 8, 8, LEGPRICE_FH_IDX, 0 }
1025 , { ETI_INT, 0, 4, LEGRATIOQTY_FH_IDX, 0 }
1026 , { ETI_UINT_ENUM, 0, 1, LEGSECURITYTYPE_FH_IDX, 0 }
1027 , { ETI_UINT_ENUM, 0, 1, LEGSIDE_FH_IDX, 0 }
1028 , { ETI_PADDING, 0, 2, 0, 0 }
1029 , { ETI_EOF, 0, 0, 0, 0 }
1030 // MDInstrumentEntryGrpComp@9
1031 , { ETI_FIXED_POINT, 8, 8, MDENTRYPX_FH_IDX, 0 }
1032 , { ETI_FIXED_POINT, 4, 8, MDENTRYSIZE_FH_IDX, 0 }
1033 , { ETI_UINT_ENUM, 0, 1, MDENTRYTYPE_FH_IDX, 0 }
1034 , { ETI_PADDING, 0, 1, 0, 0 }
1035 , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 }
1036 , { ETI_PADDING, 0, 4, 0, 0 }
1037 , { ETI_EOF, 0, 0, 0, 0 }
1038 // MDTradeEntryGrpComp@16
1039 , { ETI_FIXED_POINT, 8, 8, MDENTRYPX_FH_IDX, 0 }
1040 , { ETI_FIXED_POINT, 4, 8, MDENTRYSIZE_FH_IDX, 0 }
1041 , { ETI_UINT_ENUM, 0, 1, MDENTRYTYPE_FH_IDX, 0 }
1042 , { ETI_PADDING, 0, 7, 0, 0 }
1043 , { ETI_EOF, 0, 0, 0, 0 }
1044 // MessageHeaderComp@21
1045 , { ETI_UINT, 0, 2, BODYLEN_FH_IDX, 0 }
1046 , { ETI_UINT, 0, 2, TEMPLATEID_FH_IDX, 0 }
1047 , { ETI_UINT, 0, 4, MSGSEQNUM_FH_IDX, 0 }
1048 , { ETI_EOF, 0, 0, 0, 0 }
1049 // OrderDetailsComp@25
1050 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 }
1051 , { ETI_FIXED_POINT, 4, 8, DISPLAYQTY_FH_IDX, 0 }
1052 , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 }
1053 , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 }
1054 , { ETI_PADDING, 0, 6, 0, 0 }
1055 , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 }
1056 , { ETI_EOF, 0, 0, 0, 0 }
1057 // SecMassStatGrpComp@32
1058 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1059 , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 }
1060 , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 }
1061 , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 }
1062 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 }
1063 , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 }
1064 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 }
1065 , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 }
1066 , { ETI_PADDING, 0, 3, 0, 0 }
1067 , { ETI_EOF, 0, 0, 0, 0 }
1068 // AddComplexInstrument@42
1069 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1070 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1071 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1072 , { ETI_INT, 0, 4, SECURITYSUBTYPE_FH_IDX, 0 }
1073 , { ETI_UINT_ENUM, 0, 1, PRODUCTCOMPLEX_FH_IDX, 0 }
1074 , { ETI_UINT_ENUM, 0, 1, IMPLIEDMARKETINDICATOR_FH_IDX, 0 }
1075 , { ETI_PADDING, 0, 2, 0, 0 }
1076 , { ETI_UINT, 0, 4, LEGRATIOMULTIPLIER_FH_IDX, 0 }
1077 , { ETI_COUNTER, 0, 1, NOLEGS_FH_IDX, 20 } // <- counter@0
1078 , { ETI_PADDING, 0, 3, 0, 0 }
1079 , { ETI_VAR_STRUCT, 0, 0, 0, 1 } // InstrmtLegGrp
1080 , { ETI_EOF, 0, 0, 0, 0 }
1081 // AuctionBBO@54
1082 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1083 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1084 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1085 , { ETI_FIXED_POINT, 8, 8, BIDPX_FH_IDX, 0 }
1086 , { ETI_FIXED_POINT, 8, 8, OFFERPX_FH_IDX, 0 }
1087 , { ETI_FIXED_POINT, 4, 8, BIDSIZE_FH_IDX, 0 }
1088 , { ETI_FIXED_POINT, 4, 8, OFFERSIZE_FH_IDX, 0 }
1089 , { ETI_UINT_ENUM, 0, 1, POTENTIALSECURITYTRADINGEVENT_FH_IDX, 0 }
1090 , { ETI_UINT_ENUM, 0, 1, BIDORDTYPE_FH_IDX, 0 }
1091 , { ETI_UINT_ENUM, 0, 1, OFFERORDTYPE_FH_IDX, 0 }
1092 , { ETI_PADDING, 0, 5, 0, 0 }
1093 , { ETI_EOF, 0, 0, 0, 0 }
1094 // AuctionClearingPrice@66
1095 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1096 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1097 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1098 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1099 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1100 , { ETI_FIXED_POINT, 4, 8, IMBALANCEQTY_FH_IDX, 0 }
1101 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 }
1102 , { ETI_UINT_ENUM, 0, 1, POTENTIALSECURITYTRADINGEVENT_FH_IDX, 0 }
1103 , { ETI_PADDING, 0, 6, 0, 0 }
1104 , { ETI_EOF, 0, 0, 0, 0 }
1105 // CrossRequest@76
1106 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1107 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1108 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1109 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1110 , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 }
1111 , { ETI_UINT_ENUM, 0, 1, CROSSREQUESTTYPE_FH_IDX, 0 }
1112 , { ETI_UINT_ENUM, 0, 1, INPUTSOURCE_FH_IDX, 0 }
1113 , { ETI_PADDING, 0, 5, 0, 0 }
1114 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1115 , { ETI_EOF, 0, 0, 0, 0 }
1116 // ExecutionSummary@86
1117 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1118 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1119 , { ETI_TIMESTAMP_NS, 0, 8, AGGRESSORTIME_FH_IDX, 0 }
1120 , { ETI_TIMESTAMP_NS, 0, 8, REQUESTTIME_FH_IDX, 0 }
1121 , { ETI_TIMESTAMP_NS, 0, 8, EXECID_FH_IDX, 0 }
1122 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1123 , { ETI_UINT_ENUM, 0, 1, AGGRESSORSIDE_FH_IDX, 0 }
1124 , { ETI_PADDING, 0, 1, 0, 0 }
1125 , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 }
1126 , { ETI_PADDING, 0, 4, 0, 0 }
1127 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1128 , { ETI_FIXED_POINT, 4, 8, RESTINGHIDDENQTY_FH_IDX, 0 }
1129 , { ETI_FIXED_POINT, 4, 8, RESTINGCXLQTY_FH_IDX, 0 }
1130 , { ETI_EOF, 0, 0, 0, 0 }
1131 // FullOrderExecution@100
1132 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1133 , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 }
1134 , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 }
1135 , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 }
1136 , { ETI_PADDING, 0, 1, 0, 0 }
1137 , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 }
1138 , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 }
1139 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 }
1140 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1141 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1142 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1143 , { ETI_EOF, 0, 0, 0, 0 }
1144 // Heartbeat@112
1145 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1146 , { ETI_UINT, 0, 4, LASTMSGSEQNUMPROCESSED_FH_IDX, 0 }
1147 , { ETI_PADDING, 0, 4, 0, 0 }
1148 , { ETI_EOF, 0, 0, 0, 0 }
1149 // InstrumentStateChange@116
1150 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1151 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1152 , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 }
1153 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 }
1154 , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 }
1155 , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 }
1156 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 }
1157 , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 }
1158 , { ETI_PADDING, 0, 2, 0, 0 }
1159 , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 }
1160 , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 }
1161 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1162 , { ETI_EOF, 0, 0, 0, 0 }
1163 // InstrumentSummary@129
1164 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1165 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1166 , { ETI_TIMESTAMP_NS, 0, 8, LASTUPDATETIME_FH_IDX, 0 }
1167 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSEXECUTIONTIME_FH_IDX, 0 }
1168 , { ETI_COUNTER, 0, 2, TOTNOORDERS_FH_IDX, 65534 } // <- counter@0
1169 , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 }
1170 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 }
1171 , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 }
1172 , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 }
1173 , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 }
1174 , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 }
1175 , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 }
1176 , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 }
1177 , { ETI_UINT_ENUM, 0, 1, PRODUCTCOMPLEX_FH_IDX, 0 }
1178 , { ETI_COUNTER, 1, 1, NOMDENTRIES_FH_IDX, 15 } // <- counter@1
1179 , { ETI_PADDING, 0, 6, 0, 0 }
1180 , { ETI_VAR_STRUCT, 1, 14, 9, 2 } // MDInstrumentEntryGrp
1181 , { ETI_EOF, 0, 0, 0, 0 }
1182 // MassInstrumentStateChange@147
1183 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1184 , { ETI_UINT_ENUM, 0, 1, INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX, 0 }
1185 , { ETI_UINT_ENUM, 0, 1, SECURITYMASSSTATUS_FH_IDX, 0 }
1186 , { ETI_UINT_ENUM, 0, 1, SECURITYMASSTRADINGSTATUS_FH_IDX, 0 }
1187 , { ETI_UINT_ENUM, 0, 1, MASSMARKETCONDITION_FH_IDX, 0 }
1188 , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 }
1189 , { ETI_UINT_ENUM, 0, 1, SECURITYMASSTRADINGEVENT_FH_IDX, 0 }
1190 , { ETI_UINT_ENUM, 0, 1, MASSSOLDOUTINDICATOR_FH_IDX, 0 }
1191 , { ETI_PADDING, 0, 1, 0, 0 }
1192 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1193 , { ETI_UINT_ENUM, 0, 1, LASTFRAGMENT_FH_IDX, 0 }
1194 , { ETI_COUNTER, 0, 1, NORELATEDSYM_FH_IDX, 24 } // <- counter@0
1195 , { ETI_PADDING, 0, 6, 0, 0 }
1196 , { ETI_VAR_STRUCT, 0, 78, 32, 6 } // SecMassStatGrp
1197 , { ETI_EOF, 0, 0, 0, 0 }
1198 // OrderAdd@162
1199 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1200 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 }
1201 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1202 , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails
1203 , { ETI_EOF, 0, 0, 0, 0 }
1204 // OrderDelete@167
1205 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1206 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 }
1207 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1208 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1209 , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails
1210 , { ETI_EOF, 0, 0, 0, 0 }
1211 // OrderMassDelete@173
1212 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1213 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1214 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1215 , { ETI_EOF, 0, 0, 0, 0 }
1216 // OrderModify@177
1217 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1218 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 }
1219 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSPREVTIMEPRIORITY_FH_IDX, 0 }
1220 , { ETI_FIXED_POINT, 8, 8, PREVPRICE_FH_IDX, 0 }
1221 , { ETI_FIXED_POINT, 4, 8, PREVDISPLAYQTY_FH_IDX, 0 }
1222 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1223 , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails
1224 , { ETI_EOF, 0, 0, 0, 0 }
1225 // OrderModifySamePrio@185
1226 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1227 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 }
1228 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1229 , { ETI_FIXED_POINT, 4, 8, PREVDISPLAYQTY_FH_IDX, 0 }
1230 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1231 , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails
1232 , { ETI_EOF, 0, 0, 0, 0 }
1233 // PacketHeader@192
1234 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1235 , { ETI_UINT, 0, 4, APPLSEQNUM_FH_IDX, 0 }
1236 , { ETI_INT, 0, 4, MARKETSEGMENTID_FH_IDX, 0 }
1237 , { ETI_UINT, 0, 1, PARTITIONID_FH_IDX, 0 }
1238 , { ETI_UINT_ENUM, 0, 1, COMPLETIONINDICATOR_FH_IDX, 0 }
1239 , { ETI_UINT_ENUM, 0, 1, APPLSEQRESETINDICATOR_FH_IDX, 0 }
1240 , { ETI_DSCP, 0, 1, DSCP_FH_IDX, 0 }
1241 , { ETI_PADDING, 0, 4, 0, 0 }
1242 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1243 , { ETI_EOF, 0, 0, 0, 0 }
1244 // PartialOrderExecution@202
1245 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1246 , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 }
1247 , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 }
1248 , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 }
1249 , { ETI_PADDING, 0, 1, 0, 0 }
1250 , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 }
1251 , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 }
1252 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 }
1253 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1254 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1255 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1256 , { ETI_EOF, 0, 0, 0, 0 }
1257 // ProductStateChange@214
1258 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1259 , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONID_FH_IDX, 0 }
1260 , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONSUBID_FH_IDX, 0 }
1261 , { ETI_UINT_ENUM, 0, 1, TRADSESSTATUS_FH_IDX, 0 }
1262 , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 }
1263 , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 }
1264 , { ETI_PADDING, 0, 3, 0, 0 }
1265 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1266 , { ETI_EOF, 0, 0, 0, 0 }
1267 // ProductSummary@223
1268 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1269 , { ETI_UINT, 0, 4, LASTMSGSEQNUMPROCESSED_FH_IDX, 0 }
1270 , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONID_FH_IDX, 0 }
1271 , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONSUBID_FH_IDX, 0 }
1272 , { ETI_UINT_ENUM, 0, 1, TRADSESSTATUS_FH_IDX, 0 }
1273 , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 }
1274 , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 }
1275 , { ETI_PADDING, 0, 7, 0, 0 }
1276 , { ETI_EOF, 0, 0, 0, 0 }
1277 // QuoteRequest@232
1278 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1279 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1280 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1281 , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 }
1282 , { ETI_PADDING, 0, 7, 0, 0 }
1283 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1284 , { ETI_EOF, 0, 0, 0, 0 }
1285 // SnapshotOrder@239
1286 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1287 , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails
1288 , { ETI_EOF, 0, 0, 0, 0 }
1289 // TopOfBook@242
1290 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1291 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1292 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1293 , { ETI_FIXED_POINT, 8, 8, BIDPX_FH_IDX, 0 }
1294 , { ETI_FIXED_POINT, 8, 8, OFFERPX_FH_IDX, 0 }
1295 , { ETI_FIXED_POINT, 4, 8, BIDSIZE_FH_IDX, 0 }
1296 , { ETI_FIXED_POINT, 4, 8, OFFERSIZE_FH_IDX, 0 }
1297 , { ETI_UINT, 0, 2, NUMBEROFBUYORDERS_FH_IDX, 0 }
1298 , { ETI_UINT, 0, 2, NUMBEROFSELLORDERS_FH_IDX, 0 }
1299 , { ETI_PADDING, 0, 4, 0, 0 }
1300 , { ETI_EOF, 0, 0, 0, 0 }
1301 // TradeReport@253
1302 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1303 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1304 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1305 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1306 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1307 , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 }
1308 , { ETI_UINT_ENUM, 0, 1, MATCHTYPE_FH_IDX, 0 }
1309 , { ETI_UINT_ENUM, 0, 1, MATCHSUBTYPE_FH_IDX, 0 }
1310 , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 }
1311 , { ETI_PADDING, 0, 1, 0, 0 }
1312 , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 }
1313 , { ETI_PADDING, 0, 6, 0, 0 }
1314 , { ETI_EOF, 0, 0, 0, 0 }
1315 // TradeReversal@266
1316 , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader
1317 , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 }
1318 , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 }
1319 , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 }
1320 , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 }
1321 , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSEXECUTIONTIME_FH_IDX, 0 }
1322 , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 }
1323 , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 }
1324 , { ETI_PADDING, 0, 2, 0, 0 }
1325 , { ETI_COUNTER, 0, 1, NOMDENTRIES_FH_IDX, 15 } // <- counter@0
1326 , { ETI_PADDING, 0, 7, 0, 0 }
1327 , { ETI_VAR_STRUCT, 0, 35, 16, 3 } // MDTradeEntryGrp
1328 , { ETI_EOF, 0, 0, 0, 0 }
1330 static const int16_t tid2fidx[] = {
1331 112 /* Heartbeat */
1332 , -1
1333 , -1
1334 , -1
1335 , 192 /* PacketHeader */
1336 , -1
1337 , -1
1338 , -1
1339 , -1
1340 , -1
1341 , -1
1342 , -1
1343 , -1
1344 , -1
1345 , -1
1346 , -1
1347 , -1
1348 , -1
1349 , -1
1350 , -1
1351 , -1
1352 , -1
1353 , -1
1354 , -1
1355 , -1
1356 , -1
1357 , -1
1358 , -1
1359 , -1
1360 , -1
1361 , -1
1362 , -1
1363 , -1
1364 , -1
1365 , -1
1366 , -1
1367 , -1
1368 , -1
1369 , -1
1370 , -1
1371 , -1
1372 , -1
1373 , -1
1374 , -1
1375 , -1
1376 , -1
1377 , -1
1378 , -1
1379 , -1
1380 , -1
1381 , -1
1382 , -1
1383 , -1
1384 , -1
1385 , -1
1386 , -1
1387 , -1
1388 , -1
1389 , -1
1390 , -1
1391 , -1
1392 , -1
1393 , -1
1394 , -1
1395 , -1
1396 , -1
1397 , -1
1398 , -1
1399 , -1
1400 , -1
1401 , -1
1402 , -1
1403 , -1
1404 , -1
1405 , -1
1406 , -1
1407 , -1
1408 , -1
1409 , -1
1410 , -1
1411 , -1
1412 , -1
1413 , -1
1414 , -1
1415 , -1
1416 , -1
1417 , -1
1418 , -1
1419 , -1
1420 , -1
1421 , -1
1422 , -1
1423 , -1
1424 , -1
1425 , -1
1426 , -1
1427 , -1
1428 , -1
1429 , -1
1430 , 162 /* OrderAdd */
1431 , 177 /* OrderModify */
1432 , 167 /* OrderDelete */
1433 , 173 /* OrderMassDelete */
1434 , 100 /* FullOrderExecution */
1435 , 202 /* PartialOrderExecution */
1436 , 185 /* OrderModifySamePrio */
1437 , -1
1438 , -1
1439 , -1
1440 , -1
1441 , -1
1442 , -1
1443 , -1
1444 , -1
1445 , -1
1446 , -1
1447 , -1
1448 , -1
1449 , -1
1450 , -1
1451 , -1
1452 , -1
1453 , -1
1454 , -1
1455 , -1
1456 , -1
1457 , -1
1458 , -1
1459 , -1
1460 , -1
1461 , -1
1462 , -1
1463 , -1
1464 , -1
1465 , -1
1466 , -1
1467 , -1
1468 , -1
1469 , -1
1470 , -1
1471 , -1
1472 , -1
1473 , -1
1474 , -1
1475 , -1
1476 , -1
1477 , -1
1478 , -1
1479 , -1
1480 , -1
1481 , -1
1482 , -1
1483 , -1
1484 , -1
1485 , -1
1486 , -1
1487 , -1
1488 , -1
1489 , -1
1490 , -1
1491 , -1
1492 , -1
1493 , -1
1494 , -1
1495 , -1
1496 , -1
1497 , -1
1498 , -1
1499 , -1
1500 , -1
1501 , -1
1502 , -1
1503 , -1
1504 , -1
1505 , -1
1506 , -1
1507 , -1
1508 , -1
1509 , -1
1510 , -1
1511 , -1
1512 , -1
1513 , -1
1514 , -1
1515 , -1
1516 , -1
1517 , -1
1518 , -1
1519 , -1
1520 , -1
1521 , -1
1522 , -1
1523 , -1
1524 , -1
1525 , -1
1526 , -1
1527 , -1
1528 , -1
1529 , -1
1530 , 266 /* TradeReversal */
1531 , 253 /* TradeReport */
1532 , 86 /* ExecutionSummary */
1533 , -1
1534 , -1
1535 , -1
1536 , -1
1537 , -1
1538 , -1
1539 , -1
1540 , -1
1541 , -1
1542 , -1
1543 , -1
1544 , -1
1545 , -1
1546 , -1
1547 , -1
1548 , -1
1549 , -1
1550 , -1
1551 , -1
1552 , -1
1553 , -1
1554 , -1
1555 , -1
1556 , -1
1557 , -1
1558 , -1
1559 , -1
1560 , -1
1561 , -1
1562 , -1
1563 , -1
1564 , -1
1565 , -1
1566 , -1
1567 , -1
1568 , -1
1569 , -1
1570 , -1
1571 , -1
1572 , -1
1573 , -1
1574 , -1
1575 , -1
1576 , -1
1577 , -1
1578 , -1
1579 , -1
1580 , -1
1581 , -1
1582 , -1
1583 , -1
1584 , -1
1585 , -1
1586 , -1
1587 , -1
1588 , -1
1589 , -1
1590 , -1
1591 , -1
1592 , -1
1593 , -1
1594 , -1
1595 , -1
1596 , -1
1597 , -1
1598 , -1
1599 , -1
1600 , -1
1601 , -1
1602 , -1
1603 , -1
1604 , -1
1605 , -1
1606 , -1
1607 , -1
1608 , -1
1609 , -1
1610 , -1
1611 , -1
1612 , -1
1613 , -1
1614 , -1
1615 , -1
1616 , -1
1617 , -1
1618 , -1
1619 , -1
1620 , -1
1621 , -1
1622 , -1
1623 , -1
1624 , -1
1625 , -1
1626 , -1
1627 , -1
1628 , -1
1629 , -1
1630 , 214 /* ProductStateChange */
1631 , 116 /* InstrumentStateChange */
1632 , 147 /* MassInstrumentStateChange */
1633 , -1
1634 , -1
1635 , -1
1636 , -1
1637 , -1
1638 , -1
1639 , -1
1640 , -1
1641 , -1
1642 , -1
1643 , -1
1644 , -1
1645 , -1
1646 , -1
1647 , -1
1648 , -1
1649 , -1
1650 , -1
1651 , -1
1652 , -1
1653 , -1
1654 , -1
1655 , -1
1656 , -1
1657 , -1
1658 , -1
1659 , -1
1660 , -1
1661 , -1
1662 , -1
1663 , -1
1664 , -1
1665 , -1
1666 , -1
1667 , -1
1668 , -1
1669 , -1
1670 , -1
1671 , -1
1672 , -1
1673 , -1
1674 , -1
1675 , -1
1676 , -1
1677 , -1
1678 , -1
1679 , -1
1680 , -1
1681 , -1
1682 , -1
1683 , -1
1684 , -1
1685 , -1
1686 , -1
1687 , -1
1688 , -1
1689 , -1
1690 , -1
1691 , -1
1692 , -1
1693 , -1
1694 , -1
1695 , -1
1696 , -1
1697 , -1
1698 , -1
1699 , -1
1700 , -1
1701 , -1
1702 , -1
1703 , -1
1704 , -1
1705 , -1
1706 , -1
1707 , -1
1708 , -1
1709 , -1
1710 , -1
1711 , -1
1712 , -1
1713 , -1
1714 , -1
1715 , -1
1716 , -1
1717 , -1
1718 , -1
1719 , -1
1720 , -1
1721 , -1
1722 , -1
1723 , -1
1724 , -1
1725 , -1
1726 , -1
1727 , -1
1728 , -1
1729 , -1
1730 , 42 /* AddComplexInstrument */
1731 , -1
1732 , -1
1733 , -1
1734 , -1
1735 , -1
1736 , -1
1737 , -1
1738 , -1
1739 , -1
1740 , -1
1741 , -1
1742 , -1
1743 , -1
1744 , -1
1745 , -1
1746 , -1
1747 , -1
1748 , -1
1749 , -1
1750 , -1
1751 , -1
1752 , -1
1753 , -1
1754 , -1
1755 , -1
1756 , -1
1757 , -1
1758 , -1
1759 , -1
1760 , -1
1761 , -1
1762 , -1
1763 , -1
1764 , -1
1765 , -1
1766 , -1
1767 , -1
1768 , -1
1769 , -1
1770 , -1
1771 , -1
1772 , -1
1773 , -1
1774 , -1
1775 , -1
1776 , -1
1777 , -1
1778 , -1
1779 , -1
1780 , -1
1781 , -1
1782 , -1
1783 , -1
1784 , -1
1785 , -1
1786 , -1
1787 , -1
1788 , -1
1789 , -1
1790 , -1
1791 , -1
1792 , -1
1793 , -1
1794 , -1
1795 , -1
1796 , -1
1797 , -1
1798 , -1
1799 , -1
1800 , -1
1801 , -1
1802 , -1
1803 , -1
1804 , -1
1805 , -1
1806 , -1
1807 , -1
1808 , -1
1809 , -1
1810 , -1
1811 , -1
1812 , -1
1813 , -1
1814 , -1
1815 , -1
1816 , -1
1817 , -1
1818 , -1
1819 , -1
1820 , -1
1821 , -1
1822 , -1
1823 , -1
1824 , -1
1825 , -1
1826 , -1
1827 , -1
1828 , -1
1829 , -1
1830 , 54 /* AuctionBBO */
1831 , 66 /* AuctionClearingPrice */
1832 , 76 /* CrossRequest */
1833 , 232 /* QuoteRequest */
1834 , 242 /* TopOfBook */
1835 , -1
1836 , -1
1837 , -1
1838 , -1
1839 , -1
1840 , -1
1841 , -1
1842 , -1
1843 , -1
1844 , -1
1845 , -1
1846 , -1
1847 , -1
1848 , -1
1849 , -1
1850 , -1
1851 , -1
1852 , -1
1853 , -1
1854 , -1
1855 , -1
1856 , -1
1857 , -1
1858 , -1
1859 , -1
1860 , -1
1861 , -1
1862 , -1
1863 , -1
1864 , -1
1865 , -1
1866 , -1
1867 , -1
1868 , -1
1869 , -1
1870 , -1
1871 , -1
1872 , -1
1873 , -1
1874 , -1
1875 , -1
1876 , -1
1877 , -1
1878 , -1
1879 , -1
1880 , -1
1881 , -1
1882 , -1
1883 , -1
1884 , -1
1885 , -1
1886 , -1
1887 , -1
1888 , -1
1889 , -1
1890 , -1
1891 , -1
1892 , -1
1893 , -1
1894 , -1
1895 , -1
1896 , -1
1897 , -1
1898 , -1
1899 , -1
1900 , -1
1901 , -1
1902 , -1
1903 , -1
1904 , -1
1905 , -1
1906 , -1
1907 , -1
1908 , -1
1909 , -1
1910 , -1
1911 , -1
1912 , -1
1913 , -1
1914 , -1
1915 , -1
1916 , -1
1917 , -1
1918 , -1
1919 , -1
1920 , -1
1921 , -1
1922 , -1
1923 , -1
1924 , -1
1925 , -1
1926 , -1
1927 , -1
1928 , -1
1929 , -1
1930 , 223 /* ProductSummary */
1931 , 129 /* InstrumentSummary */
1932 , 239 /* SnapshotOrder */
1934 static const uint32_t tid2size[] = {
1935 16 /* Heartbeat */
1939 , 32 /* PacketHeader */
2034 , 56 /* OrderAdd */
2035 , 80 /* OrderModify */
2036 , 64 /* OrderDelete */
2037 , 24 /* OrderMassDelete */
2038 , 56 /* FullOrderExecution */
2039 , 56 /* PartialOrderExecution */
2040 , 72 /* OrderModifySamePrio */
2134 , 424 /* TradeReversal */
2135 , 56 /* TradeReport */
2136 , 80 /* ExecutionSummary */
2234 , 24 /* ProductStateChange */
2235 , 48 /* InstrumentStateChange */
2236 , 800 /* MassInstrumentStateChange */
2334 , 680 /* AddComplexInstrument */
2434 , 64 /* AuctionBBO */
2435 , 56 /* AuctionClearingPrice */
2436 , 48 /* CrossRequest */
2437 , 40 /* QuoteRequest */
2438 , 64 /* TopOfBook */
2534 , 24 /* ProductSummary */
2535 , 424 /* InstrumentSummary */
2536 , 40 /* SnapshotOrder */
2538 static const unsigned char usages[] = {
2539 // AddComplexInstrument
2540 //// MessageHeaderComp
2541 0 // BodyLen#0
2542 , 0 // TemplateID#1
2543 , 0 // MsgSeqNum#2
2545 , 0 // SecurityID#3
2546 , 0 // TransactTime#4
2547 , 1 // SecuritySubType#5
2548 , 0 // ProductComplex#6
2549 , 0 // ImpliedMarketIndicator#7
2550 , 1 // LegRatioMultiplier#8
2551 , 0 // NoLegs#9
2552 //// InstrmtLegGrpComp
2553 , 0 // LegSymbol#10
2554 , 0 // LegSecurityID#11
2555 , 1 // LegPrice#12
2556 , 0 // LegRatioQty#13
2557 , 0 // LegSecurityType#14
2558 , 0 // LegSide#15
2560 // AuctionBBO
2561 //// MessageHeaderComp
2562 , 0 // BodyLen#16
2563 , 0 // TemplateID#17
2564 , 0 // MsgSeqNum#18
2566 , 0 // TransactTime#19
2567 , 0 // SecurityID#20
2568 , 1 // BidPx#21
2569 , 1 // OfferPx#22
2570 , 1 // BidSize#23
2571 , 1 // OfferSize#24
2572 , 1 // PotentialSecurityTradingEvent#25
2573 , 1 // BidOrdType#26
2574 , 1 // OfferOrdType#27
2575 // AuctionClearingPrice
2576 //// MessageHeaderComp
2577 , 0 // BodyLen#28
2578 , 0 // TemplateID#29
2579 , 0 // MsgSeqNum#30
2581 , 0 // TransactTime#31
2582 , 0 // SecurityID#32
2583 , 0 // LastPx#33
2584 , 1 // LastQty#34
2585 , 1 // ImbalanceQty#35
2586 , 1 // SecurityTradingStatus#36
2587 , 1 // PotentialSecurityTradingEvent#37
2588 // CrossRequest
2589 //// MessageHeaderComp
2590 , 0 // BodyLen#38
2591 , 0 // TemplateID#39
2592 , 0 // MsgSeqNum#40
2594 , 0 // SecurityID#41
2595 , 1 // LastPx#42
2596 , 1 // LastQty#43
2597 , 1 // Side#44
2598 , 0 // CrossRequestType#45
2599 , 1 // InputSource#46
2600 , 0 // TransactTime#47
2601 // ExecutionSummary
2602 //// MessageHeaderComp
2603 , 0 // BodyLen#48
2604 , 0 // TemplateID#49
2605 , 0 // MsgSeqNum#50
2607 , 0 // SecurityID#51
2608 , 1 // AggressorTime#52
2609 , 1 // RequestTime#53
2610 , 0 // ExecID#54
2611 , 0 // LastQty#55
2612 , 0 // AggressorSide#56
2613 , 1 // TradeCondition#57
2614 , 0 // LastPx#58
2615 , 1 // RestingHiddenQty#59
2616 , 0 // RestingCxlQty#60
2617 // FullOrderExecution
2618 //// MessageHeaderComp
2619 , 0 // BodyLen#61
2620 , 0 // TemplateID#62
2621 , 0 // MsgSeqNum#63
2623 , 0 // Side#64
2624 , 1 // OrdType#65
2625 , 1 // AlgorithmicTradeIndicator#66
2626 , 0 // TrdMatchID#67
2627 , 1 // Price#68
2628 , 0 // TrdRegTSTimePriority#69
2629 , 0 // SecurityID#70
2630 , 0 // LastQty#71
2631 , 0 // LastPx#72
2632 // Heartbeat
2633 //// MessageHeaderComp
2634 , 0 // BodyLen#73
2635 , 0 // TemplateID#74
2636 , 2 // MsgSeqNum#75
2638 , 0 // LastMsgSeqNumProcessed#76
2639 // InstrumentStateChange
2640 //// MessageHeaderComp
2641 , 0 // BodyLen#77
2642 , 0 // TemplateID#78
2643 , 0 // MsgSeqNum#79
2645 , 0 // SecurityID#80
2646 , 0 // SecurityStatus#81
2647 , 0 // SecurityTradingStatus#82
2648 , 0 // MarketCondition#83
2649 , 0 // FastMarketIndicator#84
2650 , 1 // SecurityTradingEvent#85
2651 , 1 // SoldOutIndicator#86
2652 , 1 // HighPx#87
2653 , 1 // LowPx#88
2654 , 0 // TransactTime#89
2655 // InstrumentSummary
2656 //// MessageHeaderComp
2657 , 0 // BodyLen#90
2658 , 0 // TemplateID#91
2659 , 0 // MsgSeqNum#92
2661 , 0 // SecurityID#93
2662 , 0 // LastUpdateTime#94
2663 , 1 // TrdRegTSExecutionTime#95
2664 , 0 // TotNoOrders#96
2665 , 0 // SecurityStatus#97
2666 , 0 // SecurityTradingStatus#98
2667 , 0 // MarketCondition#99
2668 , 0 // FastMarketIndicator#100
2669 , 1 // SecurityTradingEvent#101
2670 , 1 // SoldOutIndicator#102
2671 , 1 // HighPx#103
2672 , 1 // LowPx#104
2673 , 0 // ProductComplex#105
2674 , 0 // NoMDEntries#106
2675 //// MDInstrumentEntryGrpComp
2676 , 1 // MDEntryPx#107
2677 , 1 // MDEntrySize#108
2678 , 0 // MDEntryType#109
2679 , 1 // TradeCondition#110
2681 // MassInstrumentStateChange
2682 //// MessageHeaderComp
2683 , 0 // BodyLen#111
2684 , 0 // TemplateID#112
2685 , 0 // MsgSeqNum#113
2687 , 0 // InstrumentScopeProductComplex#114
2688 , 0 // SecurityMassStatus#115
2689 , 0 // SecurityMassTradingStatus#116
2690 , 0 // MassMarketCondition#117
2691 , 0 // FastMarketIndicator#118
2692 , 1 // SecurityMassTradingEvent#119
2693 , 1 // MassSoldOutIndicator#120
2694 , 0 // TransactTime#121
2695 , 0 // LastFragment#122
2696 , 0 // NoRelatedSym#123
2697 //// SecMassStatGrpComp
2698 , 0 // SecurityID#124
2699 , 1 // HighPx#125
2700 , 1 // LowPx#126
2701 , 0 // SecurityStatus#127
2702 , 0 // SecurityTradingStatus#128
2703 , 0 // MarketCondition#129
2704 , 1 // SecurityTradingEvent#130
2705 , 1 // SoldOutIndicator#131
2707 // OrderAdd
2708 //// MessageHeaderComp
2709 , 0 // BodyLen#132
2710 , 0 // TemplateID#133
2711 , 0 // MsgSeqNum#134
2713 , 1 // TrdRegTSTimeIn#135
2714 , 0 // SecurityID#136
2715 //// OrderDetailsComp
2716 , 0 // TrdRegTSTimePriority#137
2717 , 0 // DisplayQty#138
2718 , 0 // Side#139
2719 , 1 // OrdType#140
2720 , 1 // Price#141
2722 // OrderDelete
2723 //// MessageHeaderComp
2724 , 0 // BodyLen#142
2725 , 0 // TemplateID#143
2726 , 0 // MsgSeqNum#144
2728 , 1 // TrdRegTSTimeIn#145
2729 , 0 // TransactTime#146
2730 , 0 // SecurityID#147
2731 //// OrderDetailsComp
2732 , 0 // TrdRegTSTimePriority#148
2733 , 0 // DisplayQty#149
2734 , 0 // Side#150
2735 , 1 // OrdType#151
2736 , 1 // Price#152
2738 // OrderMassDelete
2739 //// MessageHeaderComp
2740 , 0 // BodyLen#153
2741 , 0 // TemplateID#154
2742 , 0 // MsgSeqNum#155
2744 , 0 // SecurityID#156
2745 , 0 // TransactTime#157
2746 // OrderModify
2747 //// MessageHeaderComp
2748 , 0 // BodyLen#158
2749 , 0 // TemplateID#159
2750 , 0 // MsgSeqNum#160
2752 , 0 // TrdRegTSTimeIn#161
2753 , 0 // TrdRegTSPrevTimePriority#162
2754 , 1 // PrevPrice#163
2755 , 0 // PrevDisplayQty#164
2756 , 0 // SecurityID#165
2757 //// OrderDetailsComp
2758 , 0 // TrdRegTSTimePriority#166
2759 , 0 // DisplayQty#167
2760 , 0 // Side#168
2761 , 1 // OrdType#169
2762 , 1 // Price#170
2764 // OrderModifySamePrio
2765 //// MessageHeaderComp
2766 , 0 // BodyLen#171
2767 , 0 // TemplateID#172
2768 , 0 // MsgSeqNum#173
2770 , 0 // TrdRegTSTimeIn#174
2771 , 0 // TransactTime#175
2772 , 0 // PrevDisplayQty#176
2773 , 0 // SecurityID#177
2774 //// OrderDetailsComp
2775 , 0 // TrdRegTSTimePriority#178
2776 , 0 // DisplayQty#179
2777 , 0 // Side#180
2778 , 1 // OrdType#181
2779 , 1 // Price#182
2781 // PacketHeader
2782 //// MessageHeaderComp
2783 , 0 // BodyLen#183
2784 , 0 // TemplateID#184
2785 , 2 // MsgSeqNum#185
2787 , 0 // ApplSeqNum#186
2788 , 0 // MarketSegmentID#187
2789 , 0 // PartitionID#188
2790 , 0 // CompletionIndicator#189
2791 , 0 // ApplSeqResetIndicator#190
2792 , 1 // DSCP#191
2793 , 0 // TransactTime#192
2794 // PartialOrderExecution
2795 //// MessageHeaderComp
2796 , 0 // BodyLen#193
2797 , 0 // TemplateID#194
2798 , 0 // MsgSeqNum#195
2800 , 0 // Side#196
2801 , 1 // OrdType#197
2802 , 1 // AlgorithmicTradeIndicator#198
2803 , 0 // TrdMatchID#199
2804 , 1 // Price#200
2805 , 0 // TrdRegTSTimePriority#201
2806 , 0 // SecurityID#202
2807 , 0 // LastQty#203
2808 , 0 // LastPx#204
2809 // ProductStateChange
2810 //// MessageHeaderComp
2811 , 0 // BodyLen#205
2812 , 0 // TemplateID#206
2813 , 0 // MsgSeqNum#207
2815 , 0 // TradingSessionID#208
2816 , 0 // TradingSessionSubID#209
2817 , 0 // TradSesStatus#210
2818 , 1 // MarketCondition#211
2819 , 0 // FastMarketIndicator#212
2820 , 0 // TransactTime#213
2821 // ProductSummary
2822 //// MessageHeaderComp
2823 , 0 // BodyLen#214
2824 , 0 // TemplateID#215
2825 , 0 // MsgSeqNum#216
2827 , 0 // LastMsgSeqNumProcessed#217
2828 , 1 // TradingSessionID#218
2829 , 1 // TradingSessionSubID#219
2830 , 1 // TradSesStatus#220
2831 , 1 // MarketCondition#221
2832 , 0 // FastMarketIndicator#222
2833 // QuoteRequest
2834 //// MessageHeaderComp
2835 , 0 // BodyLen#223
2836 , 0 // TemplateID#224
2837 , 0 // MsgSeqNum#225
2839 , 0 // SecurityID#226
2840 , 1 // LastQty#227
2841 , 1 // Side#228
2842 , 0 // TransactTime#229
2843 // SnapshotOrder
2844 //// MessageHeaderComp
2845 , 0 // BodyLen#230
2846 , 0 // TemplateID#231
2847 , 0 // MsgSeqNum#232
2849 //// OrderDetailsComp
2850 , 0 // TrdRegTSTimePriority#233
2851 , 0 // DisplayQty#234
2852 , 0 // Side#235
2853 , 1 // OrdType#236
2854 , 1 // Price#237
2856 // TopOfBook
2857 //// MessageHeaderComp
2858 , 0 // BodyLen#238
2859 , 0 // TemplateID#239
2860 , 0 // MsgSeqNum#240
2862 , 0 // TransactTime#241
2863 , 0 // SecurityID#242
2864 , 1 // BidPx#243
2865 , 1 // OfferPx#244
2866 , 1 // BidSize#245
2867 , 1 // OfferSize#246
2868 , 1 // NumberOfBuyOrders#247
2869 , 1 // NumberOfSellOrders#248
2870 // TradeReport
2871 //// MessageHeaderComp
2872 , 0 // BodyLen#249
2873 , 0 // TemplateID#250
2874 , 0 // MsgSeqNum#251
2876 , 0 // SecurityID#252
2877 , 0 // TransactTime#253
2878 , 0 // LastQty#254
2879 , 0 // LastPx#255
2880 , 1 // TrdMatchID#256
2881 , 1 // MatchType#257
2882 , 1 // MatchSubType#258
2883 , 1 // AlgorithmicTradeIndicator#259
2884 , 1 // TradeCondition#260
2885 // TradeReversal
2886 //// MessageHeaderComp
2887 , 0 // BodyLen#261
2888 , 0 // TemplateID#262
2889 , 0 // MsgSeqNum#263
2891 , 0 // SecurityID#264
2892 , 0 // TransactTime#265
2893 , 0 // LastQty#266
2894 , 0 // LastPx#267
2895 , 1 // TrdRegTSExecutionTime#268
2896 , 0 // TrdMatchID#269
2897 , 1 // TradeCondition#270
2898 , 0 // NoMDEntries#271
2899 //// MDTradeEntryGrpComp
2900 , 1 // MDEntryPx#272
2901 , 1 // MDEntrySize#273
2902 , 0 // MDEntryType#274
2904 , 0 // filler
2906 static const int16_t tid2uidx[] = {
2907 73 /* Heartbeat */
2908 , -1
2909 , -1
2910 , -1
2911 , 183 /* PacketHeader */
2912 , -1
2913 , -1
2914 , -1
2915 , -1
2916 , -1
2917 , -1
2918 , -1
2919 , -1
2920 , -1
2921 , -1
2922 , -1
2923 , -1
2924 , -1
2925 , -1
2926 , -1
2927 , -1
2928 , -1
2929 , -1
2930 , -1
2931 , -1
2932 , -1
2933 , -1
2934 , -1
2935 , -1
2936 , -1
2937 , -1
2938 , -1
2939 , -1
2940 , -1
2941 , -1
2942 , -1
2943 , -1
2944 , -1
2945 , -1
2946 , -1
2947 , -1
2948 , -1
2949 , -1
2950 , -1
2951 , -1
2952 , -1
2953 , -1
2954 , -1
2955 , -1
2956 , -1
2957 , -1
2958 , -1
2959 , -1
2960 , -1
2961 , -1
2962 , -1
2963 , -1
2964 , -1
2965 , -1
2966 , -1
2967 , -1
2968 , -1
2969 , -1
2970 , -1
2971 , -1
2972 , -1
2973 , -1
2974 , -1
2975 , -1
2976 , -1
2977 , -1
2978 , -1
2979 , -1
2980 , -1
2981 , -1
2982 , -1
2983 , -1
2984 , -1
2985 , -1
2986 , -1
2987 , -1
2988 , -1
2989 , -1
2990 , -1
2991 , -1
2992 , -1
2993 , -1
2994 , -1
2995 , -1
2996 , -1
2997 , -1
2998 , -1
2999 , -1
3000 , -1
3001 , -1
3002 , -1
3003 , -1
3004 , -1
3005 , -1
3006 , 132 /* OrderAdd */
3007 , 158 /* OrderModify */
3008 , 142 /* OrderDelete */
3009 , 153 /* OrderMassDelete */
3010 , 61 /* FullOrderExecution */
3011 , 193 /* PartialOrderExecution */
3012 , 171 /* OrderModifySamePrio */
3013 , -1
3014 , -1
3015 , -1
3016 , -1
3017 , -1
3018 , -1
3019 , -1
3020 , -1
3021 , -1
3022 , -1
3023 , -1
3024 , -1
3025 , -1
3026 , -1
3027 , -1
3028 , -1
3029 , -1
3030 , -1
3031 , -1
3032 , -1
3033 , -1
3034 , -1
3035 , -1
3036 , -1
3037 , -1
3038 , -1
3039 , -1
3040 , -1
3041 , -1
3042 , -1
3043 , -1
3044 , -1
3045 , -1
3046 , -1
3047 , -1
3048 , -1
3049 , -1
3050 , -1
3051 , -1
3052 , -1
3053 , -1
3054 , -1
3055 , -1
3056 , -1
3057 , -1
3058 , -1
3059 , -1
3060 , -1
3061 , -1
3062 , -1
3063 , -1
3064 , -1
3065 , -1
3066 , -1
3067 , -1
3068 , -1
3069 , -1
3070 , -1
3071 , -1
3072 , -1
3073 , -1
3074 , -1
3075 , -1
3076 , -1
3077 , -1
3078 , -1
3079 , -1
3080 , -1
3081 , -1
3082 , -1
3083 , -1
3084 , -1
3085 , -1
3086 , -1
3087 , -1
3088 , -1
3089 , -1
3090 , -1
3091 , -1
3092 , -1
3093 , -1
3094 , -1
3095 , -1
3096 , -1
3097 , -1
3098 , -1
3099 , -1
3100 , -1
3101 , -1
3102 , -1
3103 , -1
3104 , -1
3105 , -1
3106 , 261 /* TradeReversal */
3107 , 249 /* TradeReport */
3108 , 48 /* ExecutionSummary */
3109 , -1
3110 , -1
3111 , -1
3112 , -1
3113 , -1
3114 , -1
3115 , -1
3116 , -1
3117 , -1
3118 , -1
3119 , -1
3120 , -1
3121 , -1
3122 , -1
3123 , -1
3124 , -1
3125 , -1
3126 , -1
3127 , -1
3128 , -1
3129 , -1
3130 , -1
3131 , -1
3132 , -1
3133 , -1
3134 , -1
3135 , -1
3136 , -1
3137 , -1
3138 , -1
3139 , -1
3140 , -1
3141 , -1
3142 , -1
3143 , -1
3144 , -1
3145 , -1
3146 , -1
3147 , -1
3148 , -1
3149 , -1
3150 , -1
3151 , -1
3152 , -1
3153 , -1
3154 , -1
3155 , -1
3156 , -1
3157 , -1
3158 , -1
3159 , -1
3160 , -1
3161 , -1
3162 , -1
3163 , -1
3164 , -1
3165 , -1
3166 , -1
3167 , -1
3168 , -1
3169 , -1
3170 , -1
3171 , -1
3172 , -1
3173 , -1
3174 , -1
3175 , -1
3176 , -1
3177 , -1
3178 , -1
3179 , -1
3180 , -1
3181 , -1
3182 , -1
3183 , -1
3184 , -1
3185 , -1
3186 , -1
3187 , -1
3188 , -1
3189 , -1
3190 , -1
3191 , -1
3192 , -1
3193 , -1
3194 , -1
3195 , -1
3196 , -1
3197 , -1
3198 , -1
3199 , -1
3200 , -1
3201 , -1
3202 , -1
3203 , -1
3204 , -1
3205 , -1
3206 , 205 /* ProductStateChange */
3207 , 77 /* InstrumentStateChange */
3208 , 111 /* MassInstrumentStateChange */
3209 , -1
3210 , -1
3211 , -1
3212 , -1
3213 , -1
3214 , -1
3215 , -1
3216 , -1
3217 , -1
3218 , -1
3219 , -1
3220 , -1
3221 , -1
3222 , -1
3223 , -1
3224 , -1
3225 , -1
3226 , -1
3227 , -1
3228 , -1
3229 , -1
3230 , -1
3231 , -1
3232 , -1
3233 , -1
3234 , -1
3235 , -1
3236 , -1
3237 , -1
3238 , -1
3239 , -1
3240 , -1
3241 , -1
3242 , -1
3243 , -1
3244 , -1
3245 , -1
3246 , -1
3247 , -1
3248 , -1
3249 , -1
3250 , -1
3251 , -1
3252 , -1
3253 , -1
3254 , -1
3255 , -1
3256 , -1
3257 , -1
3258 , -1
3259 , -1
3260 , -1
3261 , -1
3262 , -1
3263 , -1
3264 , -1
3265 , -1
3266 , -1
3267 , -1
3268 , -1
3269 , -1
3270 , -1
3271 , -1
3272 , -1
3273 , -1
3274 , -1
3275 , -1
3276 , -1
3277 , -1
3278 , -1
3279 , -1
3280 , -1
3281 , -1
3282 , -1
3283 , -1
3284 , -1
3285 , -1
3286 , -1
3287 , -1
3288 , -1
3289 , -1
3290 , -1
3291 , -1
3292 , -1
3293 , -1
3294 , -1
3295 , -1
3296 , -1
3297 , -1
3298 , -1
3299 , -1
3300 , -1
3301 , -1
3302 , -1
3303 , -1
3304 , -1
3305 , -1
3306 , 0 /* AddComplexInstrument */
3307 , -1
3308 , -1
3309 , -1
3310 , -1
3311 , -1
3312 , -1
3313 , -1
3314 , -1
3315 , -1
3316 , -1
3317 , -1
3318 , -1
3319 , -1
3320 , -1
3321 , -1
3322 , -1
3323 , -1
3324 , -1
3325 , -1
3326 , -1
3327 , -1
3328 , -1
3329 , -1
3330 , -1
3331 , -1
3332 , -1
3333 , -1
3334 , -1
3335 , -1
3336 , -1
3337 , -1
3338 , -1
3339 , -1
3340 , -1
3341 , -1
3342 , -1
3343 , -1
3344 , -1
3345 , -1
3346 , -1
3347 , -1
3348 , -1
3349 , -1
3350 , -1
3351 , -1
3352 , -1
3353 , -1
3354 , -1
3355 , -1
3356 , -1
3357 , -1
3358 , -1
3359 , -1
3360 , -1
3361 , -1
3362 , -1
3363 , -1
3364 , -1
3365 , -1
3366 , -1
3367 , -1
3368 , -1
3369 , -1
3370 , -1
3371 , -1
3372 , -1
3373 , -1
3374 , -1
3375 , -1
3376 , -1
3377 , -1
3378 , -1
3379 , -1
3380 , -1
3381 , -1
3382 , -1
3383 , -1
3384 , -1
3385 , -1
3386 , -1
3387 , -1
3388 , -1
3389 , -1
3390 , -1
3391 , -1
3392 , -1
3393 , -1
3394 , -1
3395 , -1
3396 , -1
3397 , -1
3398 , -1
3399 , -1
3400 , -1
3401 , -1
3402 , -1
3403 , -1
3404 , -1
3405 , -1
3406 , 16 /* AuctionBBO */
3407 , 28 /* AuctionClearingPrice */
3408 , 38 /* CrossRequest */
3409 , 223 /* QuoteRequest */
3410 , 238 /* TopOfBook */
3411 , -1
3412 , -1
3413 , -1
3414 , -1
3415 , -1
3416 , -1
3417 , -1
3418 , -1
3419 , -1
3420 , -1
3421 , -1
3422 , -1
3423 , -1
3424 , -1
3425 , -1
3426 , -1
3427 , -1
3428 , -1
3429 , -1
3430 , -1
3431 , -1
3432 , -1
3433 , -1
3434 , -1
3435 , -1
3436 , -1
3437 , -1
3438 , -1
3439 , -1
3440 , -1
3441 , -1
3442 , -1
3443 , -1
3444 , -1
3445 , -1
3446 , -1
3447 , -1
3448 , -1
3449 , -1
3450 , -1
3451 , -1
3452 , -1
3453 , -1
3454 , -1
3455 , -1
3456 , -1
3457 , -1
3458 , -1
3459 , -1
3460 , -1
3461 , -1
3462 , -1
3463 , -1
3464 , -1
3465 , -1
3466 , -1
3467 , -1
3468 , -1
3469 , -1
3470 , -1
3471 , -1
3472 , -1
3473 , -1
3474 , -1
3475 , -1
3476 , -1
3477 , -1
3478 , -1
3479 , -1
3480 , -1
3481 , -1
3482 , -1
3483 , -1
3484 , -1
3485 , -1
3486 , -1
3487 , -1
3488 , -1
3489 , -1
3490 , -1
3491 , -1
3492 , -1
3493 , -1
3494 , -1
3495 , -1
3496 , -1
3497 , -1
3498 , -1
3499 , -1
3500 , -1
3501 , -1
3502 , -1
3503 , -1
3504 , -1
3505 , -1
3506 , 214 /* ProductSummary */
3507 , 90 /* InstrumentSummary */
3508 , 230 /* SnapshotOrder */
3510 static int * const dscp_bits[] = {
3511 &hf_eobi_dscp_exec_summary,
3512 &hf_eobi_dscp_improved,
3513 &hf_eobi_dscp_widened,
3514 NULL
3516 if (templateid < 13001 || templateid > 13602) {
3517 proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_template, tvb, 2, 4,
3518 "Template ID out of range: %" PRIu16, templateid);
3519 return tvb_captured_length(tvb);
3521 int fidx = tid2fidx[templateid - 13001];
3522 if (fidx == -1) {
3523 proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_template, tvb, 2, 4,
3524 "Unallocated Template ID: %" PRIu16, templateid);
3525 return tvb_captured_length(tvb);
3527 if (bodylen != tid2size[templateid - 13001]) {
3528 proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_length, tvb, 0, 2,
3529 "Unexpected BodyLen value of %" PRIu32 ", expected: %" PRIu32, bodylen, tid2size[templateid - 13001]);
3531 int uidx = tid2uidx[templateid - 13001];
3532 DISSECTOR_ASSERT_CMPINT(uidx, >=, 0);
3533 DISSECTOR_ASSERT_CMPUINT(((size_t)uidx), <, array_length(usages));
3535 int old_fidx = 0;
3536 int old_uidx = 0;
3537 unsigned top = 1;
3538 unsigned counter[8] = {0};
3539 unsigned off = 0;
3540 unsigned struct_off = 0;
3541 unsigned repeats = 0;
3542 proto_tree *t = root;
3543 while (top) {
3544 DISSECTOR_ASSERT_CMPINT(fidx, >=, 0);
3545 DISSECTOR_ASSERT_CMPUINT(((size_t)fidx), <, array_length(fields));
3546 DISSECTOR_ASSERT_CMPINT(uidx, >=, 0);
3547 DISSECTOR_ASSERT_CMPUINT(((size_t)uidx), <, array_length(usages));
3549 switch (fields[fidx].type) {
3550 case ETI_EOF:
3551 DISSECTOR_ASSERT_CMPUINT(top, >=, 1);
3552 DISSECTOR_ASSERT_CMPUINT(top, <=, 2);
3553 if (t != root)
3554 proto_item_set_len(t, off - struct_off);
3555 if (repeats) {
3556 --repeats;
3557 fidx = fields[old_fidx].field_handle_idx;
3558 uidx = old_uidx;
3559 t = proto_tree_add_subtree(root, tvb, off, -1, ett_eobi[fields[old_fidx].ett_idx], NULL, &struct_names[fields[old_fidx].size]);
3560 struct_off = off;
3561 } else {
3562 fidx = old_fidx + 1;
3563 t = root;
3564 --top;
3566 break;
3567 case ETI_VAR_STRUCT:
3568 case ETI_STRUCT:
3569 DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, array_length(counter));
3570 repeats = fields[fidx].type == ETI_VAR_STRUCT ? counter[fields[fidx].counter_off] : 1;
3571 if (repeats) {
3572 --repeats;
3573 t = proto_tree_add_subtree(root, tvb, off, -1, ett_eobi[fields[fidx].ett_idx], NULL, &struct_names[fields[fidx].size]);
3574 struct_off = off;
3575 old_fidx = fidx;
3576 old_uidx = uidx;
3577 fidx = fields[fidx].field_handle_idx;
3578 DISSECTOR_ASSERT_CMPUINT(top, ==, 1);
3579 ++top;
3580 } else {
3581 ++fidx;
3583 break;
3584 case ETI_PADDING:
3585 off += fields[fidx].size;
3586 ++fidx;
3587 break;
3588 case ETI_CHAR:
3589 proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_ASCII);
3590 off += fields[fidx].size;
3591 ++fidx;
3592 ++uidx;
3593 break;
3594 case ETI_STRING:
3596 uint8_t c = tvb_get_uint8(tvb, off);
3597 if (c)
3598 proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_ASCII);
3599 else {
3600 proto_item *e = proto_tree_add_string(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, "NO_VALUE ('0x00...')");
3601 if (!usages[uidx])
3602 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3605 off += fields[fidx].size;
3606 ++fidx;
3607 ++uidx;
3608 break;
3609 case ETI_VAR_STRING:
3610 DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, array_length(counter));
3611 proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, counter[fields[fidx].counter_off], ENC_ASCII);
3612 off += counter[fields[fidx].counter_off];
3613 ++fidx;
3614 ++uidx;
3615 break;
3616 case ETI_COUNTER:
3617 DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, array_length(counter));
3618 DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, <=, 2);
3620 switch (fields[fidx].size) {
3621 case 1:
3623 uint8_t x = tvb_get_uint8(tvb, off);
3624 if (x == UINT8_MAX) {
3625 proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xff)");
3626 counter[fields[fidx].counter_off] = 0;
3627 } else {
3628 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu8, x);
3629 if (x > fields[fidx].ett_idx) {
3630 counter[fields[fidx].counter_off] = fields[fidx].ett_idx;
3631 expert_add_info_format(pinfo, e, &ei_eobi_counter_overflow, "Counter overflow: %" PRIu8 " > %" PRIu16, x, fields[fidx].ett_idx);
3632 } else {
3633 counter[fields[fidx].counter_off] = x;
3637 break;
3638 case 2:
3640 uint16_t x = tvb_get_letohs(tvb, off);
3641 if (x == UINT16_MAX) {
3642 proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xffff)");
3643 counter[fields[fidx].counter_off] = 0;
3644 } else {
3645 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu16, x);
3646 if (x > fields[fidx].ett_idx) {
3647 counter[fields[fidx].counter_off] = fields[fidx].ett_idx;
3648 expert_add_info_format(pinfo, e, &ei_eobi_counter_overflow, "Counter overflow: %" PRIu16 " > %" PRIu16, x, fields[fidx].ett_idx);
3649 } else {
3650 counter[fields[fidx].counter_off] = x;
3654 break;
3657 off += fields[fidx].size;
3658 ++fidx;
3659 ++uidx;
3660 break;
3661 case ETI_UINT:
3662 switch (fields[fidx].size) {
3663 case 1:
3665 uint8_t x = tvb_get_uint8(tvb, off);
3666 if (x == UINT8_MAX) {
3667 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xff)");
3668 if (!usages[uidx])
3669 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3670 } else {
3671 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu8, x);
3672 if (usages[uidx] == 2)
3673 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3676 break;
3677 case 2:
3679 uint16_t x = tvb_get_letohs(tvb, off);
3680 if (x == UINT16_MAX) {
3681 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xffff)");
3682 if (!usages[uidx])
3683 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3684 } else {
3685 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu16, x);
3686 if (usages[uidx] == 2)
3687 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3690 break;
3691 case 4:
3693 uint32_t x = tvb_get_letohl(tvb, off);
3694 if (x == UINT32_MAX) {
3695 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xffffffff)");
3696 if (!usages[uidx])
3697 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3698 } else {
3699 proto_item *e = proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu32, x);
3700 if (usages[uidx] == 2)
3701 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3704 break;
3705 case 8:
3707 uint64_t x = tvb_get_letoh64(tvb, off);
3708 if (x == UINT64_MAX) {
3709 proto_item *e = proto_tree_add_uint64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xffffffffffffffff)");
3710 if (!usages[uidx])
3711 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3712 } else {
3713 proto_item *e = proto_tree_add_uint64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIu64, x);
3714 if (usages[uidx] == 2)
3715 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3718 break;
3720 off += fields[fidx].size;
3721 ++fidx;
3722 ++uidx;
3723 break;
3724 case ETI_INT:
3725 switch (fields[fidx].size) {
3726 case 1:
3728 int8_t x = tvb_get_int8(tvb, off);
3729 if (x == INT8_MIN) {
3730 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0x80)");
3731 if (!usages[uidx])
3732 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3733 } else {
3734 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIi8, x);
3735 if (usages[uidx] == 2)
3736 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3739 break;
3740 case 2:
3742 int16_t x = tvb_get_letohis(tvb, off);
3743 if (x == INT16_MIN) {
3744 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0x8000)");
3745 if (!usages[uidx])
3746 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3747 } else {
3748 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIi16, x);
3749 if (usages[uidx] == 2)
3750 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3753 break;
3754 case 4:
3756 int32_t x = tvb_get_letohil(tvb, off);
3757 if (x == INT32_MIN) {
3758 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0x80000000)");
3759 if (!usages[uidx])
3760 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3761 } else {
3762 proto_item *e = proto_tree_add_int_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIi32, x);
3763 if (usages[uidx] == 2)
3764 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3767 break;
3768 case 8:
3770 int64_t x = tvb_get_letohi64(tvb, off);
3771 if (x == INT64_MIN) {
3772 proto_item *e = proto_tree_add_int64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0x8000000000000000)");
3773 if (!usages[uidx])
3774 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3775 } else {
3776 proto_item *e = proto_tree_add_int64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%" PRIi64, x);
3777 if (usages[uidx] == 2)
3778 expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set");
3781 break;
3783 off += fields[fidx].size;
3784 ++fidx;
3785 ++uidx;
3786 break;
3787 case ETI_UINT_ENUM:
3788 case ETI_INT_ENUM:
3789 proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_LITTLE_ENDIAN);
3790 off += fields[fidx].size;
3791 ++fidx;
3792 ++uidx;
3793 break;
3794 case ETI_FIXED_POINT:
3795 DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 8);
3796 DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, >, 0);
3797 DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <=, 16);
3799 int64_t x = tvb_get_letohi64(tvb, off);
3800 if (x == INT64_MIN) {
3801 proto_item *e = proto_tree_add_int64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0x8000000000000000)");
3802 if (!usages[uidx])
3803 expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing");
3804 } else {
3805 unsigned slack = fields[fidx].counter_off + 1;
3806 if (x < 0)
3807 slack += 1;
3808 char s[21];
3809 int n = snprintf(s, sizeof s, "%0*" PRIi64, slack, x);
3810 DISSECTOR_ASSERT_CMPUINT(n, >, 0);
3811 unsigned k = n - fields[fidx].counter_off;
3812 proto_tree_add_int64_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "%.*s.%s", k, s, s + k);
3815 off += fields[fidx].size;
3816 ++fidx;
3817 ++uidx;
3818 break;
3819 case ETI_TIMESTAMP_NS:
3820 DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 8);
3821 proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_LITTLE_ENDIAN | ENC_TIME_NSECS);
3822 off += fields[fidx].size;
3823 ++fidx;
3824 ++uidx;
3825 break;
3826 case ETI_DSCP:
3827 DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 1);
3828 proto_tree_add_bitmask(t, tvb, off, hf_eobi[fields[fidx].field_handle_idx], ett_eobi_dscp, dscp_bits, ENC_LITTLE_ENDIAN);
3829 off += fields[fidx].size;
3830 ++fidx;
3831 ++uidx;
3832 break;
3836 return tvb_captured_length(tvb);
3839 /* determine PDU length of protocol EOBI */
3840 static unsigned
3841 get_eobi_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
3843 return (unsigned)tvb_get_letohs(tvb, offset);
3846 static int
3847 dissect_eobi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
3848 void *data)
3850 return udp_dissect_pdus(tvb, pinfo, tree, 4, NULL,
3851 get_eobi_message_len, dissect_eobi_message, data);
3854 void
3855 proto_register_eobi(void)
3857 static hf_register_info hf[] ={
3858 { &hf_eobi[AGGRESSORSIDE_FH_IDX],
3859 { "AggressorSide", "eobi.aggressorside",
3860 FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0,
3861 NULL, HFILL }
3863 , { &hf_eobi[AGGRESSORTIME_FH_IDX],
3864 { "AggressorTime", "eobi.aggressortime",
3865 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
3866 NULL, HFILL }
3868 , { &hf_eobi[ALGORITHMICTRADEINDICATOR_FH_IDX],
3869 { "AlgorithmicTradeIndicator", "eobi.algorithmictradeindicator",
3870 FT_UINT8, BASE_DEC, VALS(algorithmic_trade_indicator_vals), 0x0,
3871 NULL, HFILL }
3873 , { &hf_eobi[APPLSEQNUM_FH_IDX],
3874 { "ApplSeqNum", "eobi.applseqnum",
3875 FT_UINT32, BASE_DEC, NULL, 0x0,
3876 NULL, HFILL }
3878 , { &hf_eobi[APPLSEQRESETINDICATOR_FH_IDX],
3879 { "ApplSeqResetIndicator", "eobi.applseqresetindicator",
3880 FT_UINT8, BASE_DEC, VALS(appl_seq_reset_indicator_vals), 0x0,
3881 NULL, HFILL }
3883 , { &hf_eobi[BIDORDTYPE_FH_IDX],
3884 { "BidOrdType", "eobi.bidordtype",
3885 FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0,
3886 NULL, HFILL }
3888 , { &hf_eobi[BIDPX_FH_IDX],
3889 { "BidPx", "eobi.bidpx",
3890 FT_INT64, BASE_DEC, NULL, 0x0,
3891 NULL, HFILL }
3893 , { &hf_eobi[BIDSIZE_FH_IDX],
3894 { "BidSize", "eobi.bidsize",
3895 FT_INT64, BASE_DEC, NULL, 0x0,
3896 NULL, HFILL }
3898 , { &hf_eobi[BODYLEN_FH_IDX],
3899 { "BodyLen", "eobi.bodylen",
3900 FT_UINT16, BASE_DEC, NULL, 0x0,
3901 NULL, HFILL }
3903 , { &hf_eobi[COMPLETIONINDICATOR_FH_IDX],
3904 { "CompletionIndicator", "eobi.completionindicator",
3905 FT_UINT8, BASE_DEC, VALS(completion_indicator_vals), 0x0,
3906 NULL, HFILL }
3908 , { &hf_eobi[CROSSREQUESTTYPE_FH_IDX],
3909 { "CrossRequestType", "eobi.crossrequesttype",
3910 FT_UINT8, BASE_DEC, VALS(cross_request_type_vals), 0x0,
3911 NULL, HFILL }
3913 , { &hf_eobi[DSCP_FH_IDX],
3914 { "DSCP", "eobi.dscp",
3915 FT_UINT8, BASE_HEX, NULL, 0x0,
3916 NULL, HFILL }
3918 , { &hf_eobi[DISPLAYQTY_FH_IDX],
3919 { "DisplayQty", "eobi.displayqty",
3920 FT_INT64, BASE_DEC, NULL, 0x0,
3921 NULL, HFILL }
3923 , { &hf_eobi[EXECID_FH_IDX],
3924 { "ExecID", "eobi.execid",
3925 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
3926 NULL, HFILL }
3928 , { &hf_eobi[FASTMARKETINDICATOR_FH_IDX],
3929 { "FastMarketIndicator", "eobi.fastmarketindicator",
3930 FT_UINT8, BASE_DEC, VALS(fast_market_indicator_vals), 0x0,
3931 NULL, HFILL }
3933 , { &hf_eobi[HIGHPX_FH_IDX],
3934 { "HighPx", "eobi.highpx",
3935 FT_INT64, BASE_DEC, NULL, 0x0,
3936 NULL, HFILL }
3938 , { &hf_eobi[IMBALANCEQTY_FH_IDX],
3939 { "ImbalanceQty", "eobi.imbalanceqty",
3940 FT_INT64, BASE_DEC, NULL, 0x0,
3941 NULL, HFILL }
3943 , { &hf_eobi[IMPLIEDMARKETINDICATOR_FH_IDX],
3944 { "ImpliedMarketIndicator", "eobi.impliedmarketindicator",
3945 FT_UINT8, BASE_DEC, VALS(implied_market_indicator_vals), 0x0,
3946 NULL, HFILL }
3948 , { &hf_eobi[INPUTSOURCE_FH_IDX],
3949 { "InputSource", "eobi.inputsource",
3950 FT_UINT8, BASE_DEC, VALS(input_source_vals), 0x0,
3951 NULL, HFILL }
3953 , { &hf_eobi[INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX],
3954 { "InstrumentScopeProductComplex", "eobi.instrumentscopeproductcomplex",
3955 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &instrument_scope_product_complex_vals_ext, 0x0,
3956 NULL, HFILL }
3958 , { &hf_eobi[LASTFRAGMENT_FH_IDX],
3959 { "LastFragment", "eobi.lastfragment",
3960 FT_UINT8, BASE_DEC, VALS(last_fragment_vals), 0x0,
3961 NULL, HFILL }
3963 , { &hf_eobi[LASTMSGSEQNUMPROCESSED_FH_IDX],
3964 { "LastMsgSeqNumProcessed", "eobi.lastmsgseqnumprocessed",
3965 FT_UINT32, BASE_DEC, NULL, 0x0,
3966 NULL, HFILL }
3968 , { &hf_eobi[LASTPX_FH_IDX],
3969 { "LastPx", "eobi.lastpx",
3970 FT_INT64, BASE_DEC, NULL, 0x0,
3971 NULL, HFILL }
3973 , { &hf_eobi[LASTQTY_FH_IDX],
3974 { "LastQty", "eobi.lastqty",
3975 FT_INT64, BASE_DEC, NULL, 0x0,
3976 NULL, HFILL }
3978 , { &hf_eobi[LASTUPDATETIME_FH_IDX],
3979 { "LastUpdateTime", "eobi.lastupdatetime",
3980 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
3981 NULL, HFILL }
3983 , { &hf_eobi[LEGPRICE_FH_IDX],
3984 { "LegPrice", "eobi.legprice",
3985 FT_INT64, BASE_DEC, NULL, 0x0,
3986 NULL, HFILL }
3988 , { &hf_eobi[LEGRATIOMULTIPLIER_FH_IDX],
3989 { "LegRatioMultiplier", "eobi.legratiomultiplier",
3990 FT_UINT32, BASE_DEC, NULL, 0x0,
3991 NULL, HFILL }
3993 , { &hf_eobi[LEGRATIOQTY_FH_IDX],
3994 { "LegRatioQty", "eobi.legratioqty",
3995 FT_INT32, BASE_DEC, NULL, 0x0,
3996 NULL, HFILL }
3998 , { &hf_eobi[LEGSECURITYID_FH_IDX],
3999 { "LegSecurityID", "eobi.legsecurityid",
4000 FT_INT64, BASE_DEC, NULL, 0x0,
4001 NULL, HFILL }
4003 , { &hf_eobi[LEGSECURITYTYPE_FH_IDX],
4004 { "LegSecurityType", "eobi.legsecuritytype",
4005 FT_UINT8, BASE_DEC, VALS(leg_security_type_vals), 0x0,
4006 NULL, HFILL }
4008 , { &hf_eobi[LEGSIDE_FH_IDX],
4009 { "LegSide", "eobi.legside",
4010 FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0,
4011 NULL, HFILL }
4013 , { &hf_eobi[LEGSYMBOL_FH_IDX],
4014 { "LegSymbol", "eobi.legsymbol",
4015 FT_INT32, BASE_DEC, NULL, 0x0,
4016 NULL, HFILL }
4018 , { &hf_eobi[LOWPX_FH_IDX],
4019 { "LowPx", "eobi.lowpx",
4020 FT_INT64, BASE_DEC, NULL, 0x0,
4021 NULL, HFILL }
4023 , { &hf_eobi[MDENTRYPX_FH_IDX],
4024 { "MDEntryPx", "eobi.mdentrypx",
4025 FT_INT64, BASE_DEC, NULL, 0x0,
4026 NULL, HFILL }
4028 , { &hf_eobi[MDENTRYSIZE_FH_IDX],
4029 { "MDEntrySize", "eobi.mdentrysize",
4030 FT_INT64, BASE_DEC, NULL, 0x0,
4031 NULL, HFILL }
4033 , { &hf_eobi[MDENTRYTYPE_FH_IDX],
4034 { "MDEntryType", "eobi.mdentrytype",
4035 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &mdentry_type_vals_ext, 0x0,
4036 NULL, HFILL }
4038 , { &hf_eobi[MARKETCONDITION_FH_IDX],
4039 { "MarketCondition", "eobi.marketcondition",
4040 FT_UINT8, BASE_DEC, VALS(market_condition_vals), 0x0,
4041 NULL, HFILL }
4043 , { &hf_eobi[MARKETSEGMENTID_FH_IDX],
4044 { "MarketSegmentID", "eobi.marketsegmentid",
4045 FT_INT32, BASE_DEC, NULL, 0x0,
4046 NULL, HFILL }
4048 , { &hf_eobi[MASSMARKETCONDITION_FH_IDX],
4049 { "MassMarketCondition", "eobi.massmarketcondition",
4050 FT_UINT8, BASE_DEC, VALS(market_condition_vals), 0x0,
4051 NULL, HFILL }
4053 , { &hf_eobi[MASSSOLDOUTINDICATOR_FH_IDX],
4054 { "MassSoldOutIndicator", "eobi.masssoldoutindicator",
4055 FT_UINT8, BASE_DEC, VALS(mass_sold_out_indicator_vals), 0x0,
4056 NULL, HFILL }
4058 , { &hf_eobi[MATCHSUBTYPE_FH_IDX],
4059 { "MatchSubType", "eobi.matchsubtype",
4060 FT_UINT8, BASE_DEC, VALS(match_sub_type_vals), 0x0,
4061 NULL, HFILL }
4063 , { &hf_eobi[MATCHTYPE_FH_IDX],
4064 { "MatchType", "eobi.matchtype",
4065 FT_UINT8, BASE_DEC, VALS(match_type_vals), 0x0,
4066 NULL, HFILL }
4068 , { &hf_eobi[MSGSEQNUM_FH_IDX],
4069 { "MsgSeqNum", "eobi.msgseqnum",
4070 FT_UINT32, BASE_DEC, NULL, 0x0,
4071 NULL, HFILL }
4073 , { &hf_eobi[NOLEGS_FH_IDX],
4074 { "NoLegs", "eobi.nolegs",
4075 FT_UINT8, BASE_DEC, NULL, 0x0,
4076 NULL, HFILL }
4078 , { &hf_eobi[NOMDENTRIES_FH_IDX],
4079 { "NoMDEntries", "eobi.nomdentries",
4080 FT_UINT8, BASE_DEC, NULL, 0x0,
4081 NULL, HFILL }
4083 , { &hf_eobi[NORELATEDSYM_FH_IDX],
4084 { "NoRelatedSym", "eobi.norelatedsym",
4085 FT_UINT8, BASE_DEC, NULL, 0x0,
4086 NULL, HFILL }
4088 , { &hf_eobi[NUMBEROFBUYORDERS_FH_IDX],
4089 { "NumberOfBuyOrders", "eobi.numberofbuyorders",
4090 FT_UINT16, BASE_DEC, NULL, 0x0,
4091 NULL, HFILL }
4093 , { &hf_eobi[NUMBEROFSELLORDERS_FH_IDX],
4094 { "NumberOfSellOrders", "eobi.numberofsellorders",
4095 FT_UINT16, BASE_DEC, NULL, 0x0,
4096 NULL, HFILL }
4098 , { &hf_eobi[OFFERORDTYPE_FH_IDX],
4099 { "OfferOrdType", "eobi.offerordtype",
4100 FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0,
4101 NULL, HFILL }
4103 , { &hf_eobi[OFFERPX_FH_IDX],
4104 { "OfferPx", "eobi.offerpx",
4105 FT_INT64, BASE_DEC, NULL, 0x0,
4106 NULL, HFILL }
4108 , { &hf_eobi[OFFERSIZE_FH_IDX],
4109 { "OfferSize", "eobi.offersize",
4110 FT_INT64, BASE_DEC, NULL, 0x0,
4111 NULL, HFILL }
4113 , { &hf_eobi[ORDTYPE_FH_IDX],
4114 { "OrdType", "eobi.ordtype",
4115 FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0,
4116 NULL, HFILL }
4118 , { &hf_eobi[PARTITIONID_FH_IDX],
4119 { "PartitionID", "eobi.partitionid",
4120 FT_UINT8, BASE_DEC, NULL, 0x0,
4121 NULL, HFILL }
4123 , { &hf_eobi[POTENTIALSECURITYTRADINGEVENT_FH_IDX],
4124 { "PotentialSecurityTradingEvent", "eobi.potentialsecuritytradingevent",
4125 FT_UINT8, BASE_DEC, VALS(potential_security_trading_event_vals), 0x0,
4126 NULL, HFILL }
4128 , { &hf_eobi[PREVDISPLAYQTY_FH_IDX],
4129 { "PrevDisplayQty", "eobi.prevdisplayqty",
4130 FT_INT64, BASE_DEC, NULL, 0x0,
4131 NULL, HFILL }
4133 , { &hf_eobi[PREVPRICE_FH_IDX],
4134 { "PrevPrice", "eobi.prevprice",
4135 FT_INT64, BASE_DEC, NULL, 0x0,
4136 NULL, HFILL }
4138 , { &hf_eobi[PRICE_FH_IDX],
4139 { "Price", "eobi.price",
4140 FT_INT64, BASE_DEC, NULL, 0x0,
4141 NULL, HFILL }
4143 , { &hf_eobi[PRODUCTCOMPLEX_FH_IDX],
4144 { "ProductComplex", "eobi.productcomplex",
4145 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &instrument_scope_product_complex_vals_ext, 0x0,
4146 NULL, HFILL }
4148 , { &hf_eobi[REQUESTTIME_FH_IDX],
4149 { "RequestTime", "eobi.requesttime",
4150 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4151 NULL, HFILL }
4153 , { &hf_eobi[RESTINGCXLQTY_FH_IDX],
4154 { "RestingCxlQty", "eobi.restingcxlqty",
4155 FT_INT64, BASE_DEC, NULL, 0x0,
4156 NULL, HFILL }
4158 , { &hf_eobi[RESTINGHIDDENQTY_FH_IDX],
4159 { "RestingHiddenQty", "eobi.restinghiddenqty",
4160 FT_INT64, BASE_DEC, NULL, 0x0,
4161 NULL, HFILL }
4163 , { &hf_eobi[SECURITYID_FH_IDX],
4164 { "SecurityID", "eobi.securityid",
4165 FT_INT64, BASE_DEC, NULL, 0x0,
4166 NULL, HFILL }
4168 , { &hf_eobi[SECURITYMASSSTATUS_FH_IDX],
4169 { "SecurityMassStatus", "eobi.securitymassstatus",
4170 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_status_vals_ext, 0x0,
4171 NULL, HFILL }
4173 , { &hf_eobi[SECURITYMASSTRADINGEVENT_FH_IDX],
4174 { "SecurityMassTradingEvent", "eobi.securitymasstradingevent",
4175 FT_UINT8, BASE_DEC, VALS(security_mass_trading_event_vals), 0x0,
4176 NULL, HFILL }
4178 , { &hf_eobi[SECURITYMASSTRADINGSTATUS_FH_IDX],
4179 { "SecurityMassTradingStatus", "eobi.securitymasstradingstatus",
4180 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_trading_status_vals_ext, 0x0,
4181 NULL, HFILL }
4183 , { &hf_eobi[SECURITYSTATUS_FH_IDX],
4184 { "SecurityStatus", "eobi.securitystatus",
4185 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_status_vals_ext, 0x0,
4186 NULL, HFILL }
4188 , { &hf_eobi[SECURITYSUBTYPE_FH_IDX],
4189 { "SecuritySubType", "eobi.securitysubtype",
4190 FT_INT32, BASE_DEC, NULL, 0x0,
4191 NULL, HFILL }
4193 , { &hf_eobi[SECURITYTRADINGEVENT_FH_IDX],
4194 { "SecurityTradingEvent", "eobi.securitytradingevent",
4195 FT_UINT8, BASE_DEC, VALS(security_mass_trading_event_vals), 0x0,
4196 NULL, HFILL }
4198 , { &hf_eobi[SECURITYTRADINGSTATUS_FH_IDX],
4199 { "SecurityTradingStatus", "eobi.securitytradingstatus",
4200 FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_trading_status_vals_ext, 0x0,
4201 NULL, HFILL }
4203 , { &hf_eobi[SIDE_FH_IDX],
4204 { "Side", "eobi.side",
4205 FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0,
4206 NULL, HFILL }
4208 , { &hf_eobi[SOLDOUTINDICATOR_FH_IDX],
4209 { "SoldOutIndicator", "eobi.soldoutindicator",
4210 FT_UINT8, BASE_DEC, VALS(mass_sold_out_indicator_vals), 0x0,
4211 NULL, HFILL }
4213 , { &hf_eobi[TEMPLATEID_FH_IDX],
4214 { "TemplateID", "eobi.templateid",
4215 FT_UINT16, BASE_DEC, NULL, 0x0,
4216 NULL, HFILL }
4218 , { &hf_eobi[TOTNOORDERS_FH_IDX],
4219 { "TotNoOrders", "eobi.totnoorders",
4220 FT_UINT16, BASE_DEC, NULL, 0x0,
4221 NULL, HFILL }
4223 , { &hf_eobi[TRADSESSTATUS_FH_IDX],
4224 { "TradSesStatus", "eobi.tradsesstatus",
4225 FT_UINT8, BASE_DEC, VALS(trad_ses_status_vals), 0x0,
4226 NULL, HFILL }
4228 , { &hf_eobi[TRADECONDITION_FH_IDX],
4229 { "TradeCondition", "eobi.tradecondition",
4230 FT_UINT16, BASE_DEC, VALS(trade_condition_vals), 0x0,
4231 NULL, HFILL }
4233 , { &hf_eobi[TRADINGSESSIONID_FH_IDX],
4234 { "TradingSessionID", "eobi.tradingsessionid",
4235 FT_UINT8, BASE_DEC, VALS(trading_session_id_vals), 0x0,
4236 NULL, HFILL }
4238 , { &hf_eobi[TRADINGSESSIONSUBID_FH_IDX],
4239 { "TradingSessionSubID", "eobi.tradingsessionsubid",
4240 FT_UINT8, BASE_DEC, VALS(trading_session_sub_id_vals), 0x0,
4241 NULL, HFILL }
4243 , { &hf_eobi[TRANSACTTIME_FH_IDX],
4244 { "TransactTime", "eobi.transacttime",
4245 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4246 NULL, HFILL }
4248 , { &hf_eobi[TRDMATCHID_FH_IDX],
4249 { "TrdMatchID", "eobi.trdmatchid",
4250 FT_UINT32, BASE_DEC, NULL, 0x0,
4251 NULL, HFILL }
4253 , { &hf_eobi[TRDREGTSEXECUTIONTIME_FH_IDX],
4254 { "TrdRegTSExecutionTime", "eobi.trdregtsexecutiontime",
4255 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4256 NULL, HFILL }
4258 , { &hf_eobi[TRDREGTSPREVTIMEPRIORITY_FH_IDX],
4259 { "TrdRegTSPrevTimePriority", "eobi.trdregtsprevtimepriority",
4260 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4261 NULL, HFILL }
4263 , { &hf_eobi[TRDREGTSTIMEIN_FH_IDX],
4264 { "TrdRegTSTimeIn", "eobi.trdregtstimein",
4265 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4266 NULL, HFILL }
4268 , { &hf_eobi[TRDREGTSTIMEPRIORITY_FH_IDX],
4269 { "TrdRegTSTimePriority", "eobi.trdregtstimepriority",
4270 FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
4271 NULL, HFILL }
4273 , { &hf_eobi_dscp_exec_summary,
4274 { "DSCP_ExecSummary", "eobi.dscp_execsummary",
4275 FT_BOOLEAN, 8, NULL, 0x10,
4276 NULL, HFILL }
4278 , { &hf_eobi_dscp_improved,
4279 { "DSCP_Improved", "eobi.dscp_improved",
4280 FT_BOOLEAN, 8, NULL, 0x20,
4281 NULL, HFILL }
4283 , { &hf_eobi_dscp_widened,
4284 { "DSCP_Widened", "eobi.dscp_widened",
4285 FT_BOOLEAN, 8, NULL, 0x40,
4286 NULL, HFILL }
4289 static ei_register_info ei[] = {
4291 &ei_eobi_counter_overflow,
4292 { "eobi.counter_overflow", PI_PROTOCOL, PI_WARN, "Counter Overflow", EXPFILL }
4295 &ei_eobi_invalid_template,
4296 { "eobi.invalid_template", PI_PROTOCOL, PI_ERROR, "Invalid Template ID", EXPFILL }
4299 &ei_eobi_invalid_length,
4300 { "eobi.invalid_length", PI_PROTOCOL, PI_ERROR, "Invalid Body Length", EXPFILL }
4303 &ei_eobi_missing,
4304 { "eobi.missing", PI_PROTOCOL, PI_WARN, "A required value is missing", EXPFILL }
4307 &ei_eobi_overused,
4308 { "eobi.overused", PI_PROTOCOL, PI_WARN, "An unused value is set", EXPFILL }
4311 proto_eobi = proto_register_protocol("Enhanced Order Book Interface 10.0",
4312 "EOBI", "eobi");
4313 expert_module_t *expert_eobi = expert_register_protocol(proto_eobi);
4314 expert_register_field_array(expert_eobi, ei, array_length(ei));
4315 proto_register_field_array(proto_eobi, hf, array_length(hf));
4316 static int * const ett[] = { &ett_eobi[0], &ett_eobi[1], &ett_eobi[2], &ett_eobi[3], &ett_eobi[4], &ett_eobi[5], &ett_eobi[6], &ett_eobi_dscp };
4317 proto_register_subtree_array(ett, array_length(ett));
4318 proto_disable_by_default(proto_eobi);
4320 eobi_handle = register_dissector("eobi", dissect_eobi, proto_eobi);
4323 void
4324 proto_reg_handoff_eobi(void)
4326 // cf. N7 Network Access Guide, e.g.
4327 // https://www.xetra.com/xetra-en/technology/t7/system-documentation/release10-0/Release-10.0-2692700?frag=2692724
4328 // https://www.xetra.com/resource/blob/2762078/388b727972b5122945eedf0e63c36920/data/N7-Network-Access-Guide-v2.0.59.pdf
4331 static const int ports[] = {
4332 59000, // Snapshot EUREX US-allowed PROD
4333 59001, // Incremental EUREX US-allowed PROD
4334 59032, // Snapshot EUREX US-restricted PROD
4335 59033, // Incremental EUREX US-restricted PROD
4336 59500, // Snapshot EUREX US-allowed SIMU
4337 59501, // Incremental EUREX US-allowed SIMU
4338 59532, // Snapshot EUREX US-restricted SIMU
4339 59533, // Incremental EUREX US-restricted SIMU
4341 57000, // Snapshot FX US-allowed PROD
4342 57001, // Incremental FX US-allowed PROD
4343 57032, // Snapshot FX US-restricted PROD
4344 57033, // Incremental FX US-restricted PROD
4345 57500, // Snapshot FX US-allowed SIMU
4346 57501, // Incremental FX US-allowed SIMU
4347 57532, // Snapshot FX US-restricted SIMU
4348 57533, // Incremental FX US-restricted SIMU
4350 59000, // Snapshot Xetra PROD
4351 59001, // Incremental Xetra PROD
4352 59500, // Snapshot Xetra SIMU
4353 59501, // Incremental Xetra SIMU
4355 56000, // Snapshot Boerse Frankfurt PROD
4356 56001, // Incremental Boerse Frankfurt PROD
4357 56500, // Snapshot Boerse Frankfurt SIMU
4358 56501 // Incremental Boerse Frankfurt SIMU
4360 for (unsigned i = 0; i < array_length(ports); ++i)
4361 dissector_add_uint("udp.port", ports[i], eobi_handle);