1 // auto-generated by Georg Sauthoff's eti2wireshark.py
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.
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
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
36 #include <stdio.h> // snprintf()
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
{
60 , AGGRESSORTIME_FH_IDX
61 , ALGORITHMICTRADEINDICATOR_FH_IDX
63 , APPLSEQRESETINDICATOR_FH_IDX
68 , COMPLETIONINDICATOR_FH_IDX
69 , CROSSREQUESTTYPE_FH_IDX
73 , FASTMARKETINDICATOR_FH_IDX
76 , IMPLIEDMARKETINDICATOR_FH_IDX
78 , INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX
80 , LASTMSGSEQNUMPROCESSED_FH_IDX
83 , LASTUPDATETIME_FH_IDX
85 , LEGRATIOMULTIPLIER_FH_IDX
87 , LEGSECURITYID_FH_IDX
88 , LEGSECURITYTYPE_FH_IDX
95 , MARKETCONDITION_FH_IDX
96 , MARKETSEGMENTID_FH_IDX
97 , MASSMARKETCONDITION_FH_IDX
98 , MASSSOLDOUTINDICATOR_FH_IDX
104 , NORELATEDSYM_FH_IDX
105 , NUMBEROFBUYORDERS_FH_IDX
106 , NUMBEROFSELLORDERS_FH_IDX
107 , OFFERORDTYPE_FH_IDX
112 , POTENTIALSECURITYTRADINGEVENT_FH_IDX
113 , PREVDISPLAYQTY_FH_IDX
116 , PRODUCTCOMPLEX_FH_IDX
118 , RESTINGCXLQTY_FH_IDX
119 , RESTINGHIDDENQTY_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
129 , SOLDOUTINDICATOR_FH_IDX
132 , TRADSESSTATUS_FH_IDX
133 , TRADECONDITION_FH_IDX
134 , TRADINGSESSIONID_FH_IDX
135 , TRADINGSESSIONSUBID_FH_IDX
136 , TRANSACTTIME_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" },
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
752 { 0xFF, "NO_VALUE" },
755 static const value_string algorithmic_trade_indicator_vals
[] = { // AlgorithmicTradeIndicator
756 { 1, "AlgorithmicTrade" },
757 { 0xFF, "NO_VALUE" },
760 static const value_string appl_seq_reset_indicator_vals
[] = { // ApplSeqResetIndicator
763 { 0xFF, "NO_VALUE" },
766 static const value_string bid_ord_type_vals
[] = { // BidOrdType
768 { 0xFF, "NO_VALUE" },
771 static const value_string completion_indicator_vals
[] = { // CompletionIndicator
774 { 0xFF, "NO_VALUE" },
777 static const value_string cross_request_type_vals
[] = { // CrossRequestType
778 { 1, "CrossAnnouncement" },
779 { 2, "LiquidityImprovementCross" },
780 { 0xFF, "NO_VALUE" },
783 static const value_string fast_market_indicator_vals
[] = { // FastMarketIndicator
786 { 0xFF, "NO_VALUE" },
789 static const value_string implied_market_indicator_vals
[] = { // ImpliedMarketIndicator
791 { 3, "ImpliedInOut" },
792 { 0xFF, "NO_VALUE" },
795 static const value_string input_source_vals
[] = { // InputSource
796 { 1, "CLIPClientBroker" },
797 { 0xFF, "NO_VALUE" },
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" },
810 { 0xFF, "NO_VALUE" },
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
817 { 0xFF, "NO_VALUE" },
820 static const value_string leg_security_type_vals
[] = { // LegSecurityType
821 { 1, "LegSecurityMultiLeg" },
822 { 2, "LegSecurityUnderlyingLeg" },
823 { 0xFF, "NO_VALUE" },
826 // LegSide aliased by AggressorSide
827 static const value_string mdentry_type_vals
[] = { // MDEntryType
829 { 4, "OpeningPrice" },
830 { 5, "ClosingPrice" },
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" },
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
847 { 0xFF, "NO_VALUE" },
850 // MassMarketCondition aliased by MarketCondition
851 static const value_string mass_sold_out_indicator_vals
[] = { // MassSoldOutIndicator
853 { 0xFF, "NO_VALUE" },
856 static const value_string match_sub_type_vals
[] = { // MatchSubType
857 { 1, "OpeningAuction" },
858 { 2, "ClosingAuction" },
859 { 3, "IntradayAuction" },
860 { 4, "CircuitBreakerAuction" },
862 { 0xFF, "NO_VALUE" },
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" },
874 // OfferOrdType aliased by BidOrdType
875 // OrdType aliased by BidOrdType
876 static const value_string potential_security_trading_event_vals
[] = { // PotentialSecurityTradingEvent
878 { 10, "PriceVolatilityAuctionIsExtended" },
879 { 0xFF, "NO_VALUE" },
882 // ProductComplex aliased by InstrumentScopeProductComplex
883 static const value_string security_mass_status_vals
[] = { // SecurityMassStatus
888 { 7, "KnockOutRevoked" },
890 { 11, "PendingDeletion" },
891 { 12, "KnockedOutAndSuspended" },
892 { 0xFF, "NO_VALUE" },
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" },
902 static const value_string security_mass_trading_status_vals
[] = { // SecurityMassTradingStatus
903 { 2, "TradingHalt" },
904 { 7, "MarketImbalanceBuy" },
905 { 8, "MarketImbalanceSell" },
907 { 201, "Restricted" },
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" },
923 { 217, "TradeAtClose" },
924 { 0xFF, "NO_VALUE" },
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
937 { 0xFF, "NO_VALUE" },
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" },
950 static const value_string trading_session_id_vals
[] = { // TradingSessionID
956 { 0xFF, "NO_VALUE" },
959 static const value_string trading_session_sub_id_vals
[] = { // TradingSessionSubID
963 { 5, "PostTrading" },
965 { 0xFF, "NO_VALUE" },
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 */
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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
[] = {
1335 , 192 /* PacketHeader */
1430 , 162 /* OrderAdd */
1431 , 177 /* OrderModify */
1432 , 167 /* OrderDelete */
1433 , 173 /* OrderMassDelete */
1434 , 100 /* FullOrderExecution */
1435 , 202 /* PartialOrderExecution */
1436 , 185 /* OrderModifySamePrio */
1530 , 266 /* TradeReversal */
1531 , 253 /* TradeReport */
1532 , 86 /* ExecutionSummary */
1630 , 214 /* ProductStateChange */
1631 , 116 /* InstrumentStateChange */
1632 , 147 /* MassInstrumentStateChange */
1730 , 42 /* AddComplexInstrument */
1830 , 54 /* AuctionBBO */
1831 , 66 /* AuctionClearingPrice */
1832 , 76 /* CrossRequest */
1833 , 232 /* QuoteRequest */
1834 , 242 /* TopOfBook */
1930 , 223 /* ProductSummary */
1931 , 129 /* InstrumentSummary */
1932 , 239 /* SnapshotOrder */
1934 static const uint32_t tid2size
[] = {
1939 , 32 /* PacketHeader */
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
2546 , 0 // TransactTime#4
2547 , 1 // SecuritySubType#5
2548 , 0 // ProductComplex#6
2549 , 0 // ImpliedMarketIndicator#7
2550 , 1 // LegRatioMultiplier#8
2552 //// InstrmtLegGrpComp
2554 , 0 // LegSecurityID#11
2556 , 0 // LegRatioQty#13
2557 , 0 // LegSecurityType#14
2561 //// MessageHeaderComp
2563 , 0 // TemplateID#17
2566 , 0 // TransactTime#19
2567 , 0 // SecurityID#20
2572 , 1 // PotentialSecurityTradingEvent#25
2573 , 1 // BidOrdType#26
2574 , 1 // OfferOrdType#27
2575 // AuctionClearingPrice
2576 //// MessageHeaderComp
2578 , 0 // TemplateID#29
2581 , 0 // TransactTime#31
2582 , 0 // SecurityID#32
2585 , 1 // ImbalanceQty#35
2586 , 1 // SecurityTradingStatus#36
2587 , 1 // PotentialSecurityTradingEvent#37
2589 //// MessageHeaderComp
2591 , 0 // TemplateID#39
2594 , 0 // SecurityID#41
2598 , 0 // CrossRequestType#45
2599 , 1 // InputSource#46
2600 , 0 // TransactTime#47
2602 //// MessageHeaderComp
2604 , 0 // TemplateID#49
2607 , 0 // SecurityID#51
2608 , 1 // AggressorTime#52
2609 , 1 // RequestTime#53
2612 , 0 // AggressorSide#56
2613 , 1 // TradeCondition#57
2615 , 1 // RestingHiddenQty#59
2616 , 0 // RestingCxlQty#60
2617 // FullOrderExecution
2618 //// MessageHeaderComp
2620 , 0 // TemplateID#62
2625 , 1 // AlgorithmicTradeIndicator#66
2626 , 0 // TrdMatchID#67
2628 , 0 // TrdRegTSTimePriority#69
2629 , 0 // SecurityID#70
2633 //// MessageHeaderComp
2635 , 0 // TemplateID#74
2638 , 0 // LastMsgSeqNumProcessed#76
2639 // InstrumentStateChange
2640 //// MessageHeaderComp
2642 , 0 // TemplateID#78
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
2654 , 0 // TransactTime#89
2655 // InstrumentSummary
2656 //// MessageHeaderComp
2658 , 0 // TemplateID#91
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
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
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
2701 , 0 // SecurityStatus#127
2702 , 0 // SecurityTradingStatus#128
2703 , 0 // MarketCondition#129
2704 , 1 // SecurityTradingEvent#130
2705 , 1 // SoldOutIndicator#131
2708 //// MessageHeaderComp
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
2723 //// MessageHeaderComp
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
2739 //// MessageHeaderComp
2741 , 0 // TemplateID#154
2742 , 0 // MsgSeqNum#155
2744 , 0 // SecurityID#156
2745 , 0 // TransactTime#157
2747 //// MessageHeaderComp
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
2764 // OrderModifySamePrio
2765 //// MessageHeaderComp
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
2782 //// MessageHeaderComp
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
2793 , 0 // TransactTime#192
2794 // PartialOrderExecution
2795 //// MessageHeaderComp
2797 , 0 // TemplateID#194
2798 , 0 // MsgSeqNum#195
2802 , 1 // AlgorithmicTradeIndicator#198
2803 , 0 // TrdMatchID#199
2805 , 0 // TrdRegTSTimePriority#201
2806 , 0 // SecurityID#202
2809 // ProductStateChange
2810 //// MessageHeaderComp
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
2822 //// MessageHeaderComp
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
2834 //// MessageHeaderComp
2836 , 0 // TemplateID#224
2837 , 0 // MsgSeqNum#225
2839 , 0 // SecurityID#226
2842 , 0 // TransactTime#229
2844 //// MessageHeaderComp
2846 , 0 // TemplateID#231
2847 , 0 // MsgSeqNum#232
2849 //// OrderDetailsComp
2850 , 0 // TrdRegTSTimePriority#233
2851 , 0 // DisplayQty#234
2857 //// MessageHeaderComp
2859 , 0 // TemplateID#239
2860 , 0 // MsgSeqNum#240
2862 , 0 // TransactTime#241
2863 , 0 // SecurityID#242
2867 , 1 // OfferSize#246
2868 , 1 // NumberOfBuyOrders#247
2869 , 1 // NumberOfSellOrders#248
2871 //// MessageHeaderComp
2873 , 0 // TemplateID#250
2874 , 0 // MsgSeqNum#251
2876 , 0 // SecurityID#252
2877 , 0 // TransactTime#253
2880 , 1 // TrdMatchID#256
2881 , 1 // MatchType#257
2882 , 1 // MatchSubType#258
2883 , 1 // AlgorithmicTradeIndicator#259
2884 , 1 // TradeCondition#260
2886 //// MessageHeaderComp
2888 , 0 // TemplateID#262
2889 , 0 // MsgSeqNum#263
2891 , 0 // SecurityID#264
2892 , 0 // TransactTime#265
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
2906 static const int16_t tid2uidx
[] = {
2911 , 183 /* PacketHeader */
3006 , 132 /* OrderAdd */
3007 , 158 /* OrderModify */
3008 , 142 /* OrderDelete */
3009 , 153 /* OrderMassDelete */
3010 , 61 /* FullOrderExecution */
3011 , 193 /* PartialOrderExecution */
3012 , 171 /* OrderModifySamePrio */
3106 , 261 /* TradeReversal */
3107 , 249 /* TradeReport */
3108 , 48 /* ExecutionSummary */
3206 , 205 /* ProductStateChange */
3207 , 77 /* InstrumentStateChange */
3208 , 111 /* MassInstrumentStateChange */
3306 , 0 /* AddComplexInstrument */
3406 , 16 /* AuctionBBO */
3407 , 28 /* AuctionClearingPrice */
3408 , 38 /* CrossRequest */
3409 , 223 /* QuoteRequest */
3410 , 238 /* TopOfBook */
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
,
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];
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
));
3538 unsigned counter
[8] = {0};
3540 unsigned struct_off
= 0;
3541 unsigned repeats
= 0;
3542 proto_tree
*t
= root
;
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
) {
3551 DISSECTOR_ASSERT_CMPUINT(top
, >=, 1);
3552 DISSECTOR_ASSERT_CMPUINT(top
, <=, 2);
3554 proto_item_set_len(t
, off
- struct_off
);
3557 fidx
= fields
[old_fidx
].field_handle_idx
;
3559 t
= proto_tree_add_subtree(root
, tvb
, off
, -1, ett_eobi
[fields
[old_fidx
].ett_idx
], NULL
, &struct_names
[fields
[old_fidx
].size
]);
3562 fidx
= old_fidx
+ 1;
3567 case ETI_VAR_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;
3573 t
= proto_tree_add_subtree(root
, tvb
, off
, -1, ett_eobi
[fields
[fidx
].ett_idx
], NULL
, &struct_names
[fields
[fidx
].size
]);
3577 fidx
= fields
[fidx
].field_handle_idx
;
3578 DISSECTOR_ASSERT_CMPUINT(top
, ==, 1);
3585 off
+= fields
[fidx
].size
;
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
;
3596 uint8_t c
= tvb_get_uint8(tvb
, off
);
3598 proto_tree_add_item(t
, hf_eobi
[fields
[fidx
].field_handle_idx
], tvb
, off
, fields
[fidx
].size
, ENC_ASCII
);
3600 proto_item
*e
= proto_tree_add_string(t
, hf_eobi
[fields
[fidx
].field_handle_idx
], tvb
, off
, fields
[fidx
].size
, "NO_VALUE ('0x00...')");
3602 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
3605 off
+= fields
[fidx
].size
;
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
];
3617 DISSECTOR_ASSERT_CMPUINT(fields
[fidx
].counter_off
, <, array_length(counter
));
3618 DISSECTOR_ASSERT_CMPUINT(fields
[fidx
].size
, <=, 2);
3620 switch (fields
[fidx
].size
) {
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;
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
);
3633 counter
[fields
[fidx
].counter_off
] = x
;
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;
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
);
3650 counter
[fields
[fidx
].counter_off
] = x
;
3657 off
+= fields
[fidx
].size
;
3662 switch (fields
[fidx
].size
) {
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)");
3669 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3683 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3697 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3711 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
3720 off
+= fields
[fidx
].size
;
3725 switch (fields
[fidx
].size
) {
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)");
3732 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3746 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3760 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
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)");
3774 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
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");
3783 off
+= fields
[fidx
].size
;
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
;
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)");
3803 expert_add_info_format(pinfo
, e
, &ei_eobi_missing
, "required value is missing");
3805 unsigned slack
= fields
[fidx
].counter_off
+ 1;
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
;
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
;
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
;
3836 return tvb_captured_length(tvb
);
3839 /* determine PDU length of protocol EOBI */
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
);
3847 dissect_eobi(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
,
3850 return udp_dissect_pdus(tvb
, pinfo
, tree
, 4, NULL
,
3851 get_eobi_message_len
, dissect_eobi_message
, data
);
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,
3863 , { &hf_eobi
[AGGRESSORTIME_FH_IDX
],
3864 { "AggressorTime", "eobi.aggressortime",
3865 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
3868 , { &hf_eobi
[ALGORITHMICTRADEINDICATOR_FH_IDX
],
3869 { "AlgorithmicTradeIndicator", "eobi.algorithmictradeindicator",
3870 FT_UINT8
, BASE_DEC
, VALS(algorithmic_trade_indicator_vals
), 0x0,
3873 , { &hf_eobi
[APPLSEQNUM_FH_IDX
],
3874 { "ApplSeqNum", "eobi.applseqnum",
3875 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3878 , { &hf_eobi
[APPLSEQRESETINDICATOR_FH_IDX
],
3879 { "ApplSeqResetIndicator", "eobi.applseqresetindicator",
3880 FT_UINT8
, BASE_DEC
, VALS(appl_seq_reset_indicator_vals
), 0x0,
3883 , { &hf_eobi
[BIDORDTYPE_FH_IDX
],
3884 { "BidOrdType", "eobi.bidordtype",
3885 FT_UINT8
, BASE_DEC
, VALS(bid_ord_type_vals
), 0x0,
3888 , { &hf_eobi
[BIDPX_FH_IDX
],
3889 { "BidPx", "eobi.bidpx",
3890 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3893 , { &hf_eobi
[BIDSIZE_FH_IDX
],
3894 { "BidSize", "eobi.bidsize",
3895 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3898 , { &hf_eobi
[BODYLEN_FH_IDX
],
3899 { "BodyLen", "eobi.bodylen",
3900 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
3903 , { &hf_eobi
[COMPLETIONINDICATOR_FH_IDX
],
3904 { "CompletionIndicator", "eobi.completionindicator",
3905 FT_UINT8
, BASE_DEC
, VALS(completion_indicator_vals
), 0x0,
3908 , { &hf_eobi
[CROSSREQUESTTYPE_FH_IDX
],
3909 { "CrossRequestType", "eobi.crossrequesttype",
3910 FT_UINT8
, BASE_DEC
, VALS(cross_request_type_vals
), 0x0,
3913 , { &hf_eobi
[DSCP_FH_IDX
],
3914 { "DSCP", "eobi.dscp",
3915 FT_UINT8
, BASE_HEX
, NULL
, 0x0,
3918 , { &hf_eobi
[DISPLAYQTY_FH_IDX
],
3919 { "DisplayQty", "eobi.displayqty",
3920 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3923 , { &hf_eobi
[EXECID_FH_IDX
],
3924 { "ExecID", "eobi.execid",
3925 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
3928 , { &hf_eobi
[FASTMARKETINDICATOR_FH_IDX
],
3929 { "FastMarketIndicator", "eobi.fastmarketindicator",
3930 FT_UINT8
, BASE_DEC
, VALS(fast_market_indicator_vals
), 0x0,
3933 , { &hf_eobi
[HIGHPX_FH_IDX
],
3934 { "HighPx", "eobi.highpx",
3935 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3938 , { &hf_eobi
[IMBALANCEQTY_FH_IDX
],
3939 { "ImbalanceQty", "eobi.imbalanceqty",
3940 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3943 , { &hf_eobi
[IMPLIEDMARKETINDICATOR_FH_IDX
],
3944 { "ImpliedMarketIndicator", "eobi.impliedmarketindicator",
3945 FT_UINT8
, BASE_DEC
, VALS(implied_market_indicator_vals
), 0x0,
3948 , { &hf_eobi
[INPUTSOURCE_FH_IDX
],
3949 { "InputSource", "eobi.inputsource",
3950 FT_UINT8
, BASE_DEC
, VALS(input_source_vals
), 0x0,
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,
3958 , { &hf_eobi
[LASTFRAGMENT_FH_IDX
],
3959 { "LastFragment", "eobi.lastfragment",
3960 FT_UINT8
, BASE_DEC
, VALS(last_fragment_vals
), 0x0,
3963 , { &hf_eobi
[LASTMSGSEQNUMPROCESSED_FH_IDX
],
3964 { "LastMsgSeqNumProcessed", "eobi.lastmsgseqnumprocessed",
3965 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3968 , { &hf_eobi
[LASTPX_FH_IDX
],
3969 { "LastPx", "eobi.lastpx",
3970 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3973 , { &hf_eobi
[LASTQTY_FH_IDX
],
3974 { "LastQty", "eobi.lastqty",
3975 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3978 , { &hf_eobi
[LASTUPDATETIME_FH_IDX
],
3979 { "LastUpdateTime", "eobi.lastupdatetime",
3980 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
3983 , { &hf_eobi
[LEGPRICE_FH_IDX
],
3984 { "LegPrice", "eobi.legprice",
3985 FT_INT64
, BASE_DEC
, NULL
, 0x0,
3988 , { &hf_eobi
[LEGRATIOMULTIPLIER_FH_IDX
],
3989 { "LegRatioMultiplier", "eobi.legratiomultiplier",
3990 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
3993 , { &hf_eobi
[LEGRATIOQTY_FH_IDX
],
3994 { "LegRatioQty", "eobi.legratioqty",
3995 FT_INT32
, BASE_DEC
, NULL
, 0x0,
3998 , { &hf_eobi
[LEGSECURITYID_FH_IDX
],
3999 { "LegSecurityID", "eobi.legsecurityid",
4000 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4003 , { &hf_eobi
[LEGSECURITYTYPE_FH_IDX
],
4004 { "LegSecurityType", "eobi.legsecuritytype",
4005 FT_UINT8
, BASE_DEC
, VALS(leg_security_type_vals
), 0x0,
4008 , { &hf_eobi
[LEGSIDE_FH_IDX
],
4009 { "LegSide", "eobi.legside",
4010 FT_UINT8
, BASE_DEC
, VALS(aggressor_side_vals
), 0x0,
4013 , { &hf_eobi
[LEGSYMBOL_FH_IDX
],
4014 { "LegSymbol", "eobi.legsymbol",
4015 FT_INT32
, BASE_DEC
, NULL
, 0x0,
4018 , { &hf_eobi
[LOWPX_FH_IDX
],
4019 { "LowPx", "eobi.lowpx",
4020 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4023 , { &hf_eobi
[MDENTRYPX_FH_IDX
],
4024 { "MDEntryPx", "eobi.mdentrypx",
4025 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4028 , { &hf_eobi
[MDENTRYSIZE_FH_IDX
],
4029 { "MDEntrySize", "eobi.mdentrysize",
4030 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4033 , { &hf_eobi
[MDENTRYTYPE_FH_IDX
],
4034 { "MDEntryType", "eobi.mdentrytype",
4035 FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &mdentry_type_vals_ext
, 0x0,
4038 , { &hf_eobi
[MARKETCONDITION_FH_IDX
],
4039 { "MarketCondition", "eobi.marketcondition",
4040 FT_UINT8
, BASE_DEC
, VALS(market_condition_vals
), 0x0,
4043 , { &hf_eobi
[MARKETSEGMENTID_FH_IDX
],
4044 { "MarketSegmentID", "eobi.marketsegmentid",
4045 FT_INT32
, BASE_DEC
, NULL
, 0x0,
4048 , { &hf_eobi
[MASSMARKETCONDITION_FH_IDX
],
4049 { "MassMarketCondition", "eobi.massmarketcondition",
4050 FT_UINT8
, BASE_DEC
, VALS(market_condition_vals
), 0x0,
4053 , { &hf_eobi
[MASSSOLDOUTINDICATOR_FH_IDX
],
4054 { "MassSoldOutIndicator", "eobi.masssoldoutindicator",
4055 FT_UINT8
, BASE_DEC
, VALS(mass_sold_out_indicator_vals
), 0x0,
4058 , { &hf_eobi
[MATCHSUBTYPE_FH_IDX
],
4059 { "MatchSubType", "eobi.matchsubtype",
4060 FT_UINT8
, BASE_DEC
, VALS(match_sub_type_vals
), 0x0,
4063 , { &hf_eobi
[MATCHTYPE_FH_IDX
],
4064 { "MatchType", "eobi.matchtype",
4065 FT_UINT8
, BASE_DEC
, VALS(match_type_vals
), 0x0,
4068 , { &hf_eobi
[MSGSEQNUM_FH_IDX
],
4069 { "MsgSeqNum", "eobi.msgseqnum",
4070 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
4073 , { &hf_eobi
[NOLEGS_FH_IDX
],
4074 { "NoLegs", "eobi.nolegs",
4075 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
4078 , { &hf_eobi
[NOMDENTRIES_FH_IDX
],
4079 { "NoMDEntries", "eobi.nomdentries",
4080 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
4083 , { &hf_eobi
[NORELATEDSYM_FH_IDX
],
4084 { "NoRelatedSym", "eobi.norelatedsym",
4085 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
4088 , { &hf_eobi
[NUMBEROFBUYORDERS_FH_IDX
],
4089 { "NumberOfBuyOrders", "eobi.numberofbuyorders",
4090 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4093 , { &hf_eobi
[NUMBEROFSELLORDERS_FH_IDX
],
4094 { "NumberOfSellOrders", "eobi.numberofsellorders",
4095 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4098 , { &hf_eobi
[OFFERORDTYPE_FH_IDX
],
4099 { "OfferOrdType", "eobi.offerordtype",
4100 FT_UINT8
, BASE_DEC
, VALS(bid_ord_type_vals
), 0x0,
4103 , { &hf_eobi
[OFFERPX_FH_IDX
],
4104 { "OfferPx", "eobi.offerpx",
4105 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4108 , { &hf_eobi
[OFFERSIZE_FH_IDX
],
4109 { "OfferSize", "eobi.offersize",
4110 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4113 , { &hf_eobi
[ORDTYPE_FH_IDX
],
4114 { "OrdType", "eobi.ordtype",
4115 FT_UINT8
, BASE_DEC
, VALS(bid_ord_type_vals
), 0x0,
4118 , { &hf_eobi
[PARTITIONID_FH_IDX
],
4119 { "PartitionID", "eobi.partitionid",
4120 FT_UINT8
, BASE_DEC
, NULL
, 0x0,
4123 , { &hf_eobi
[POTENTIALSECURITYTRADINGEVENT_FH_IDX
],
4124 { "PotentialSecurityTradingEvent", "eobi.potentialsecuritytradingevent",
4125 FT_UINT8
, BASE_DEC
, VALS(potential_security_trading_event_vals
), 0x0,
4128 , { &hf_eobi
[PREVDISPLAYQTY_FH_IDX
],
4129 { "PrevDisplayQty", "eobi.prevdisplayqty",
4130 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4133 , { &hf_eobi
[PREVPRICE_FH_IDX
],
4134 { "PrevPrice", "eobi.prevprice",
4135 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4138 , { &hf_eobi
[PRICE_FH_IDX
],
4139 { "Price", "eobi.price",
4140 FT_INT64
, BASE_DEC
, NULL
, 0x0,
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,
4148 , { &hf_eobi
[REQUESTTIME_FH_IDX
],
4149 { "RequestTime", "eobi.requesttime",
4150 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4153 , { &hf_eobi
[RESTINGCXLQTY_FH_IDX
],
4154 { "RestingCxlQty", "eobi.restingcxlqty",
4155 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4158 , { &hf_eobi
[RESTINGHIDDENQTY_FH_IDX
],
4159 { "RestingHiddenQty", "eobi.restinghiddenqty",
4160 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4163 , { &hf_eobi
[SECURITYID_FH_IDX
],
4164 { "SecurityID", "eobi.securityid",
4165 FT_INT64
, BASE_DEC
, NULL
, 0x0,
4168 , { &hf_eobi
[SECURITYMASSSTATUS_FH_IDX
],
4169 { "SecurityMassStatus", "eobi.securitymassstatus",
4170 FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &security_mass_status_vals_ext
, 0x0,
4173 , { &hf_eobi
[SECURITYMASSTRADINGEVENT_FH_IDX
],
4174 { "SecurityMassTradingEvent", "eobi.securitymasstradingevent",
4175 FT_UINT8
, BASE_DEC
, VALS(security_mass_trading_event_vals
), 0x0,
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,
4183 , { &hf_eobi
[SECURITYSTATUS_FH_IDX
],
4184 { "SecurityStatus", "eobi.securitystatus",
4185 FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &security_mass_status_vals_ext
, 0x0,
4188 , { &hf_eobi
[SECURITYSUBTYPE_FH_IDX
],
4189 { "SecuritySubType", "eobi.securitysubtype",
4190 FT_INT32
, BASE_DEC
, NULL
, 0x0,
4193 , { &hf_eobi
[SECURITYTRADINGEVENT_FH_IDX
],
4194 { "SecurityTradingEvent", "eobi.securitytradingevent",
4195 FT_UINT8
, BASE_DEC
, VALS(security_mass_trading_event_vals
), 0x0,
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,
4203 , { &hf_eobi
[SIDE_FH_IDX
],
4204 { "Side", "eobi.side",
4205 FT_UINT8
, BASE_DEC
, VALS(aggressor_side_vals
), 0x0,
4208 , { &hf_eobi
[SOLDOUTINDICATOR_FH_IDX
],
4209 { "SoldOutIndicator", "eobi.soldoutindicator",
4210 FT_UINT8
, BASE_DEC
, VALS(mass_sold_out_indicator_vals
), 0x0,
4213 , { &hf_eobi
[TEMPLATEID_FH_IDX
],
4214 { "TemplateID", "eobi.templateid",
4215 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4218 , { &hf_eobi
[TOTNOORDERS_FH_IDX
],
4219 { "TotNoOrders", "eobi.totnoorders",
4220 FT_UINT16
, BASE_DEC
, NULL
, 0x0,
4223 , { &hf_eobi
[TRADSESSTATUS_FH_IDX
],
4224 { "TradSesStatus", "eobi.tradsesstatus",
4225 FT_UINT8
, BASE_DEC
, VALS(trad_ses_status_vals
), 0x0,
4228 , { &hf_eobi
[TRADECONDITION_FH_IDX
],
4229 { "TradeCondition", "eobi.tradecondition",
4230 FT_UINT16
, BASE_DEC
, VALS(trade_condition_vals
), 0x0,
4233 , { &hf_eobi
[TRADINGSESSIONID_FH_IDX
],
4234 { "TradingSessionID", "eobi.tradingsessionid",
4235 FT_UINT8
, BASE_DEC
, VALS(trading_session_id_vals
), 0x0,
4238 , { &hf_eobi
[TRADINGSESSIONSUBID_FH_IDX
],
4239 { "TradingSessionSubID", "eobi.tradingsessionsubid",
4240 FT_UINT8
, BASE_DEC
, VALS(trading_session_sub_id_vals
), 0x0,
4243 , { &hf_eobi
[TRANSACTTIME_FH_IDX
],
4244 { "TransactTime", "eobi.transacttime",
4245 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4248 , { &hf_eobi
[TRDMATCHID_FH_IDX
],
4249 { "TrdMatchID", "eobi.trdmatchid",
4250 FT_UINT32
, BASE_DEC
, NULL
, 0x0,
4253 , { &hf_eobi
[TRDREGTSEXECUTIONTIME_FH_IDX
],
4254 { "TrdRegTSExecutionTime", "eobi.trdregtsexecutiontime",
4255 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4258 , { &hf_eobi
[TRDREGTSPREVTIMEPRIORITY_FH_IDX
],
4259 { "TrdRegTSPrevTimePriority", "eobi.trdregtsprevtimepriority",
4260 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4263 , { &hf_eobi
[TRDREGTSTIMEIN_FH_IDX
],
4264 { "TrdRegTSTimeIn", "eobi.trdregtstimein",
4265 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4268 , { &hf_eobi
[TRDREGTSTIMEPRIORITY_FH_IDX
],
4269 { "TrdRegTSTimePriority", "eobi.trdregtstimepriority",
4270 FT_ABSOLUTE_TIME
, ABSOLUTE_TIME_UTC
, NULL
, 0x0,
4273 , { &hf_eobi_dscp_exec_summary
,
4274 { "DSCP_ExecSummary", "eobi.dscp_execsummary",
4275 FT_BOOLEAN
, 8, NULL
, 0x10,
4278 , { &hf_eobi_dscp_improved
,
4279 { "DSCP_Improved", "eobi.dscp_improved",
4280 FT_BOOLEAN
, 8, NULL
, 0x20,
4283 , { &hf_eobi_dscp_widened
,
4284 { "DSCP_Widened", "eobi.dscp_widened",
4285 FT_BOOLEAN
, 8, NULL
, 0x40,
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
}
4304 { "eobi.missing", PI_PROTOCOL
, PI_WARN
, "A required value is missing", EXPFILL
}
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",
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
);
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
);