diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-eobi.c | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-eobi.c')
-rw-r--r-- | epan/dissectors/packet-eobi.c | 4361 |
1 files changed, 4361 insertions, 0 deletions
diff --git a/epan/dissectors/packet-eobi.c b/epan/dissectors/packet-eobi.c new file mode 100644 index 00000000..38f5bb0e --- /dev/null +++ b/epan/dissectors/packet-eobi.c @@ -0,0 +1,4361 @@ +// auto-generated by Georg Sauthoff's eti2wireshark.py + +/* packet-eti.c + * Routines for EOBI dissection + * Copyright 2021, Georg Sauthoff <mail@gms.tf> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * The Enhanced Order Book Interface 10.0 (EOBI) is an electronic trading protocol + * that is used by a few exchanges (Eurex, Xetra, ...). + * + * It's a Length-Tag based protocol consisting of mostly fix sized + * request/response messages. + * + * Links: + * https://en.wikipedia.org/wiki/List_of_electronic_trading_protocols#Europe + * https://github.com/gsauthof/python-eti#protocol-descriptions + * https://github.com/gsauthof/python-eti#protocol-introduction + * + */ + +#include <config.h> + + +#include <epan/packet.h> // Should be first Wireshark include (other than config.h) +#include "packet-udp.h" // udp_dissect_pdus() +#include <epan/expert.h> // expert info + +#include <inttypes.h> +#include <stdio.h> // snprintf() + + +/* Prototypes */ +/* (Required to prevent [-Wmissing-prototypes] warnings */ +void proto_reg_handoff_eobi(void); +void proto_register_eobi(void); + +static dissector_handle_t eobi_handle; + +static int proto_eobi = -1; +static expert_field ei_eobi_counter_overflow = EI_INIT; +static expert_field ei_eobi_invalid_template = EI_INIT; +static expert_field ei_eobi_invalid_length = EI_INIT; +static expert_field ei_eobi_missing = EI_INIT; +static expert_field ei_eobi_overused = EI_INIT; + +static int hf_eobi[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; +static int hf_eobi_dscp_exec_summary = -1; +static int hf_eobi_dscp_improved = -1; +static int hf_eobi_dscp_widened = -1; +enum Field_Handle_Index { + AGGRESSORSIDE_FH_IDX + , AGGRESSORTIME_FH_IDX + , ALGORITHMICTRADEINDICATOR_FH_IDX + , APPLSEQNUM_FH_IDX + , APPLSEQRESETINDICATOR_FH_IDX + , BIDORDTYPE_FH_IDX + , BIDPX_FH_IDX + , BIDSIZE_FH_IDX + , BODYLEN_FH_IDX + , COMPLETIONINDICATOR_FH_IDX + , CROSSREQUESTTYPE_FH_IDX + , DSCP_FH_IDX + , DISPLAYQTY_FH_IDX + , EXECID_FH_IDX + , FASTMARKETINDICATOR_FH_IDX + , HIGHPX_FH_IDX + , IMBALANCEQTY_FH_IDX + , IMPLIEDMARKETINDICATOR_FH_IDX + , INPUTSOURCE_FH_IDX + , INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX + , LASTFRAGMENT_FH_IDX + , LASTMSGSEQNUMPROCESSED_FH_IDX + , LASTPX_FH_IDX + , LASTQTY_FH_IDX + , LASTUPDATETIME_FH_IDX + , LEGPRICE_FH_IDX + , LEGRATIOMULTIPLIER_FH_IDX + , LEGRATIOQTY_FH_IDX + , LEGSECURITYID_FH_IDX + , LEGSECURITYTYPE_FH_IDX + , LEGSIDE_FH_IDX + , LEGSYMBOL_FH_IDX + , LOWPX_FH_IDX + , MDENTRYPX_FH_IDX + , MDENTRYSIZE_FH_IDX + , MDENTRYTYPE_FH_IDX + , MARKETCONDITION_FH_IDX + , MARKETSEGMENTID_FH_IDX + , MASSMARKETCONDITION_FH_IDX + , MASSSOLDOUTINDICATOR_FH_IDX + , MATCHSUBTYPE_FH_IDX + , MATCHTYPE_FH_IDX + , MSGSEQNUM_FH_IDX + , NOLEGS_FH_IDX + , NOMDENTRIES_FH_IDX + , NORELATEDSYM_FH_IDX + , NUMBEROFBUYORDERS_FH_IDX + , NUMBEROFSELLORDERS_FH_IDX + , OFFERORDTYPE_FH_IDX + , OFFERPX_FH_IDX + , OFFERSIZE_FH_IDX + , ORDTYPE_FH_IDX + , PARTITIONID_FH_IDX + , POTENTIALSECURITYTRADINGEVENT_FH_IDX + , PREVDISPLAYQTY_FH_IDX + , PREVPRICE_FH_IDX + , PRICE_FH_IDX + , PRODUCTCOMPLEX_FH_IDX + , REQUESTTIME_FH_IDX + , RESTINGCXLQTY_FH_IDX + , RESTINGHIDDENQTY_FH_IDX + , SECURITYID_FH_IDX + , SECURITYMASSSTATUS_FH_IDX + , SECURITYMASSTRADINGEVENT_FH_IDX + , SECURITYMASSTRADINGSTATUS_FH_IDX + , SECURITYSTATUS_FH_IDX + , SECURITYSUBTYPE_FH_IDX + , SECURITYTRADINGEVENT_FH_IDX + , SECURITYTRADINGSTATUS_FH_IDX + , SIDE_FH_IDX + , SOLDOUTINDICATOR_FH_IDX + , TEMPLATEID_FH_IDX + , TOTNOORDERS_FH_IDX + , TRADSESSTATUS_FH_IDX + , TRADECONDITION_FH_IDX + , TRADINGSESSIONID_FH_IDX + , TRADINGSESSIONSUBID_FH_IDX + , TRANSACTTIME_FH_IDX + , TRDMATCHID_FH_IDX + , TRDREGTSEXECUTIONTIME_FH_IDX + , TRDREGTSPREVTIMEPRIORITY_FH_IDX + , TRDREGTSTIMEIN_FH_IDX + , TRDREGTSTIMEPRIORITY_FH_IDX +}; +static const value_string template_id_vals[] = { // TemplateID + { 13001, "Heartbeat" }, + { 13002, "Unknown" }, + { 13003, "Unknown" }, + { 13004, "Unknown" }, + { 13005, "PacketHeader" }, + { 13006, "Unknown" }, + { 13007, "Unknown" }, + { 13008, "Unknown" }, + { 13009, "Unknown" }, + { 13010, "Unknown" }, + { 13011, "Unknown" }, + { 13012, "Unknown" }, + { 13013, "Unknown" }, + { 13014, "Unknown" }, + { 13015, "Unknown" }, + { 13016, "Unknown" }, + { 13017, "Unknown" }, + { 13018, "Unknown" }, + { 13019, "Unknown" }, + { 13020, "Unknown" }, + { 13021, "Unknown" }, + { 13022, "Unknown" }, + { 13023, "Unknown" }, + { 13024, "Unknown" }, + { 13025, "Unknown" }, + { 13026, "Unknown" }, + { 13027, "Unknown" }, + { 13028, "Unknown" }, + { 13029, "Unknown" }, + { 13030, "Unknown" }, + { 13031, "Unknown" }, + { 13032, "Unknown" }, + { 13033, "Unknown" }, + { 13034, "Unknown" }, + { 13035, "Unknown" }, + { 13036, "Unknown" }, + { 13037, "Unknown" }, + { 13038, "Unknown" }, + { 13039, "Unknown" }, + { 13040, "Unknown" }, + { 13041, "Unknown" }, + { 13042, "Unknown" }, + { 13043, "Unknown" }, + { 13044, "Unknown" }, + { 13045, "Unknown" }, + { 13046, "Unknown" }, + { 13047, "Unknown" }, + { 13048, "Unknown" }, + { 13049, "Unknown" }, + { 13050, "Unknown" }, + { 13051, "Unknown" }, + { 13052, "Unknown" }, + { 13053, "Unknown" }, + { 13054, "Unknown" }, + { 13055, "Unknown" }, + { 13056, "Unknown" }, + { 13057, "Unknown" }, + { 13058, "Unknown" }, + { 13059, "Unknown" }, + { 13060, "Unknown" }, + { 13061, "Unknown" }, + { 13062, "Unknown" }, + { 13063, "Unknown" }, + { 13064, "Unknown" }, + { 13065, "Unknown" }, + { 13066, "Unknown" }, + { 13067, "Unknown" }, + { 13068, "Unknown" }, + { 13069, "Unknown" }, + { 13070, "Unknown" }, + { 13071, "Unknown" }, + { 13072, "Unknown" }, + { 13073, "Unknown" }, + { 13074, "Unknown" }, + { 13075, "Unknown" }, + { 13076, "Unknown" }, + { 13077, "Unknown" }, + { 13078, "Unknown" }, + { 13079, "Unknown" }, + { 13080, "Unknown" }, + { 13081, "Unknown" }, + { 13082, "Unknown" }, + { 13083, "Unknown" }, + { 13084, "Unknown" }, + { 13085, "Unknown" }, + { 13086, "Unknown" }, + { 13087, "Unknown" }, + { 13088, "Unknown" }, + { 13089, "Unknown" }, + { 13090, "Unknown" }, + { 13091, "Unknown" }, + { 13092, "Unknown" }, + { 13093, "Unknown" }, + { 13094, "Unknown" }, + { 13095, "Unknown" }, + { 13096, "Unknown" }, + { 13097, "Unknown" }, + { 13098, "Unknown" }, + { 13099, "Unknown" }, + { 13100, "OrderAdd" }, + { 13101, "OrderModify" }, + { 13102, "OrderDelete" }, + { 13103, "OrderMassDelete" }, + { 13104, "FullOrderExecution" }, + { 13105, "PartialOrderExecution" }, + { 13106, "OrderModifySamePrio" }, + { 13107, "Unknown" }, + { 13108, "Unknown" }, + { 13109, "Unknown" }, + { 13110, "Unknown" }, + { 13111, "Unknown" }, + { 13112, "Unknown" }, + { 13113, "Unknown" }, + { 13114, "Unknown" }, + { 13115, "Unknown" }, + { 13116, "Unknown" }, + { 13117, "Unknown" }, + { 13118, "Unknown" }, + { 13119, "Unknown" }, + { 13120, "Unknown" }, + { 13121, "Unknown" }, + { 13122, "Unknown" }, + { 13123, "Unknown" }, + { 13124, "Unknown" }, + { 13125, "Unknown" }, + { 13126, "Unknown" }, + { 13127, "Unknown" }, + { 13128, "Unknown" }, + { 13129, "Unknown" }, + { 13130, "Unknown" }, + { 13131, "Unknown" }, + { 13132, "Unknown" }, + { 13133, "Unknown" }, + { 13134, "Unknown" }, + { 13135, "Unknown" }, + { 13136, "Unknown" }, + { 13137, "Unknown" }, + { 13138, "Unknown" }, + { 13139, "Unknown" }, + { 13140, "Unknown" }, + { 13141, "Unknown" }, + { 13142, "Unknown" }, + { 13143, "Unknown" }, + { 13144, "Unknown" }, + { 13145, "Unknown" }, + { 13146, "Unknown" }, + { 13147, "Unknown" }, + { 13148, "Unknown" }, + { 13149, "Unknown" }, + { 13150, "Unknown" }, + { 13151, "Unknown" }, + { 13152, "Unknown" }, + { 13153, "Unknown" }, + { 13154, "Unknown" }, + { 13155, "Unknown" }, + { 13156, "Unknown" }, + { 13157, "Unknown" }, + { 13158, "Unknown" }, + { 13159, "Unknown" }, + { 13160, "Unknown" }, + { 13161, "Unknown" }, + { 13162, "Unknown" }, + { 13163, "Unknown" }, + { 13164, "Unknown" }, + { 13165, "Unknown" }, + { 13166, "Unknown" }, + { 13167, "Unknown" }, + { 13168, "Unknown" }, + { 13169, "Unknown" }, + { 13170, "Unknown" }, + { 13171, "Unknown" }, + { 13172, "Unknown" }, + { 13173, "Unknown" }, + { 13174, "Unknown" }, + { 13175, "Unknown" }, + { 13176, "Unknown" }, + { 13177, "Unknown" }, + { 13178, "Unknown" }, + { 13179, "Unknown" }, + { 13180, "Unknown" }, + { 13181, "Unknown" }, + { 13182, "Unknown" }, + { 13183, "Unknown" }, + { 13184, "Unknown" }, + { 13185, "Unknown" }, + { 13186, "Unknown" }, + { 13187, "Unknown" }, + { 13188, "Unknown" }, + { 13189, "Unknown" }, + { 13190, "Unknown" }, + { 13191, "Unknown" }, + { 13192, "Unknown" }, + { 13193, "Unknown" }, + { 13194, "Unknown" }, + { 13195, "Unknown" }, + { 13196, "Unknown" }, + { 13197, "Unknown" }, + { 13198, "Unknown" }, + { 13199, "Unknown" }, + { 13200, "TradeReversal" }, + { 13201, "TradeReport" }, + { 13202, "ExecutionSummary" }, + { 13203, "Unknown" }, + { 13204, "Unknown" }, + { 13205, "Unknown" }, + { 13206, "Unknown" }, + { 13207, "Unknown" }, + { 13208, "Unknown" }, + { 13209, "Unknown" }, + { 13210, "Unknown" }, + { 13211, "Unknown" }, + { 13212, "Unknown" }, + { 13213, "Unknown" }, + { 13214, "Unknown" }, + { 13215, "Unknown" }, + { 13216, "Unknown" }, + { 13217, "Unknown" }, + { 13218, "Unknown" }, + { 13219, "Unknown" }, + { 13220, "Unknown" }, + { 13221, "Unknown" }, + { 13222, "Unknown" }, + { 13223, "Unknown" }, + { 13224, "Unknown" }, + { 13225, "Unknown" }, + { 13226, "Unknown" }, + { 13227, "Unknown" }, + { 13228, "Unknown" }, + { 13229, "Unknown" }, + { 13230, "Unknown" }, + { 13231, "Unknown" }, + { 13232, "Unknown" }, + { 13233, "Unknown" }, + { 13234, "Unknown" }, + { 13235, "Unknown" }, + { 13236, "Unknown" }, + { 13237, "Unknown" }, + { 13238, "Unknown" }, + { 13239, "Unknown" }, + { 13240, "Unknown" }, + { 13241, "Unknown" }, + { 13242, "Unknown" }, + { 13243, "Unknown" }, + { 13244, "Unknown" }, + { 13245, "Unknown" }, + { 13246, "Unknown" }, + { 13247, "Unknown" }, + { 13248, "Unknown" }, + { 13249, "Unknown" }, + { 13250, "Unknown" }, + { 13251, "Unknown" }, + { 13252, "Unknown" }, + { 13253, "Unknown" }, + { 13254, "Unknown" }, + { 13255, "Unknown" }, + { 13256, "Unknown" }, + { 13257, "Unknown" }, + { 13258, "Unknown" }, + { 13259, "Unknown" }, + { 13260, "Unknown" }, + { 13261, "Unknown" }, + { 13262, "Unknown" }, + { 13263, "Unknown" }, + { 13264, "Unknown" }, + { 13265, "Unknown" }, + { 13266, "Unknown" }, + { 13267, "Unknown" }, + { 13268, "Unknown" }, + { 13269, "Unknown" }, + { 13270, "Unknown" }, + { 13271, "Unknown" }, + { 13272, "Unknown" }, + { 13273, "Unknown" }, + { 13274, "Unknown" }, + { 13275, "Unknown" }, + { 13276, "Unknown" }, + { 13277, "Unknown" }, + { 13278, "Unknown" }, + { 13279, "Unknown" }, + { 13280, "Unknown" }, + { 13281, "Unknown" }, + { 13282, "Unknown" }, + { 13283, "Unknown" }, + { 13284, "Unknown" }, + { 13285, "Unknown" }, + { 13286, "Unknown" }, + { 13287, "Unknown" }, + { 13288, "Unknown" }, + { 13289, "Unknown" }, + { 13290, "Unknown" }, + { 13291, "Unknown" }, + { 13292, "Unknown" }, + { 13293, "Unknown" }, + { 13294, "Unknown" }, + { 13295, "Unknown" }, + { 13296, "Unknown" }, + { 13297, "Unknown" }, + { 13298, "Unknown" }, + { 13299, "Unknown" }, + { 13300, "ProductStateChange" }, + { 13301, "InstrumentStateChange" }, + { 13302, "MassInstrumentStateChange" }, + { 13303, "Unknown" }, + { 13304, "Unknown" }, + { 13305, "Unknown" }, + { 13306, "Unknown" }, + { 13307, "Unknown" }, + { 13308, "Unknown" }, + { 13309, "Unknown" }, + { 13310, "Unknown" }, + { 13311, "Unknown" }, + { 13312, "Unknown" }, + { 13313, "Unknown" }, + { 13314, "Unknown" }, + { 13315, "Unknown" }, + { 13316, "Unknown" }, + { 13317, "Unknown" }, + { 13318, "Unknown" }, + { 13319, "Unknown" }, + { 13320, "Unknown" }, + { 13321, "Unknown" }, + { 13322, "Unknown" }, + { 13323, "Unknown" }, + { 13324, "Unknown" }, + { 13325, "Unknown" }, + { 13326, "Unknown" }, + { 13327, "Unknown" }, + { 13328, "Unknown" }, + { 13329, "Unknown" }, + { 13330, "Unknown" }, + { 13331, "Unknown" }, + { 13332, "Unknown" }, + { 13333, "Unknown" }, + { 13334, "Unknown" }, + { 13335, "Unknown" }, + { 13336, "Unknown" }, + { 13337, "Unknown" }, + { 13338, "Unknown" }, + { 13339, "Unknown" }, + { 13340, "Unknown" }, + { 13341, "Unknown" }, + { 13342, "Unknown" }, + { 13343, "Unknown" }, + { 13344, "Unknown" }, + { 13345, "Unknown" }, + { 13346, "Unknown" }, + { 13347, "Unknown" }, + { 13348, "Unknown" }, + { 13349, "Unknown" }, + { 13350, "Unknown" }, + { 13351, "Unknown" }, + { 13352, "Unknown" }, + { 13353, "Unknown" }, + { 13354, "Unknown" }, + { 13355, "Unknown" }, + { 13356, "Unknown" }, + { 13357, "Unknown" }, + { 13358, "Unknown" }, + { 13359, "Unknown" }, + { 13360, "Unknown" }, + { 13361, "Unknown" }, + { 13362, "Unknown" }, + { 13363, "Unknown" }, + { 13364, "Unknown" }, + { 13365, "Unknown" }, + { 13366, "Unknown" }, + { 13367, "Unknown" }, + { 13368, "Unknown" }, + { 13369, "Unknown" }, + { 13370, "Unknown" }, + { 13371, "Unknown" }, + { 13372, "Unknown" }, + { 13373, "Unknown" }, + { 13374, "Unknown" }, + { 13375, "Unknown" }, + { 13376, "Unknown" }, + { 13377, "Unknown" }, + { 13378, "Unknown" }, + { 13379, "Unknown" }, + { 13380, "Unknown" }, + { 13381, "Unknown" }, + { 13382, "Unknown" }, + { 13383, "Unknown" }, + { 13384, "Unknown" }, + { 13385, "Unknown" }, + { 13386, "Unknown" }, + { 13387, "Unknown" }, + { 13388, "Unknown" }, + { 13389, "Unknown" }, + { 13390, "Unknown" }, + { 13391, "Unknown" }, + { 13392, "Unknown" }, + { 13393, "Unknown" }, + { 13394, "Unknown" }, + { 13395, "Unknown" }, + { 13396, "Unknown" }, + { 13397, "Unknown" }, + { 13398, "Unknown" }, + { 13399, "Unknown" }, + { 13400, "AddComplexInstrument" }, + { 13401, "Unknown" }, + { 13402, "Unknown" }, + { 13403, "Unknown" }, + { 13404, "Unknown" }, + { 13405, "Unknown" }, + { 13406, "Unknown" }, + { 13407, "Unknown" }, + { 13408, "Unknown" }, + { 13409, "Unknown" }, + { 13410, "Unknown" }, + { 13411, "Unknown" }, + { 13412, "Unknown" }, + { 13413, "Unknown" }, + { 13414, "Unknown" }, + { 13415, "Unknown" }, + { 13416, "Unknown" }, + { 13417, "Unknown" }, + { 13418, "Unknown" }, + { 13419, "Unknown" }, + { 13420, "Unknown" }, + { 13421, "Unknown" }, + { 13422, "Unknown" }, + { 13423, "Unknown" }, + { 13424, "Unknown" }, + { 13425, "Unknown" }, + { 13426, "Unknown" }, + { 13427, "Unknown" }, + { 13428, "Unknown" }, + { 13429, "Unknown" }, + { 13430, "Unknown" }, + { 13431, "Unknown" }, + { 13432, "Unknown" }, + { 13433, "Unknown" }, + { 13434, "Unknown" }, + { 13435, "Unknown" }, + { 13436, "Unknown" }, + { 13437, "Unknown" }, + { 13438, "Unknown" }, + { 13439, "Unknown" }, + { 13440, "Unknown" }, + { 13441, "Unknown" }, + { 13442, "Unknown" }, + { 13443, "Unknown" }, + { 13444, "Unknown" }, + { 13445, "Unknown" }, + { 13446, "Unknown" }, + { 13447, "Unknown" }, + { 13448, "Unknown" }, + { 13449, "Unknown" }, + { 13450, "Unknown" }, + { 13451, "Unknown" }, + { 13452, "Unknown" }, + { 13453, "Unknown" }, + { 13454, "Unknown" }, + { 13455, "Unknown" }, + { 13456, "Unknown" }, + { 13457, "Unknown" }, + { 13458, "Unknown" }, + { 13459, "Unknown" }, + { 13460, "Unknown" }, + { 13461, "Unknown" }, + { 13462, "Unknown" }, + { 13463, "Unknown" }, + { 13464, "Unknown" }, + { 13465, "Unknown" }, + { 13466, "Unknown" }, + { 13467, "Unknown" }, + { 13468, "Unknown" }, + { 13469, "Unknown" }, + { 13470, "Unknown" }, + { 13471, "Unknown" }, + { 13472, "Unknown" }, + { 13473, "Unknown" }, + { 13474, "Unknown" }, + { 13475, "Unknown" }, + { 13476, "Unknown" }, + { 13477, "Unknown" }, + { 13478, "Unknown" }, + { 13479, "Unknown" }, + { 13480, "Unknown" }, + { 13481, "Unknown" }, + { 13482, "Unknown" }, + { 13483, "Unknown" }, + { 13484, "Unknown" }, + { 13485, "Unknown" }, + { 13486, "Unknown" }, + { 13487, "Unknown" }, + { 13488, "Unknown" }, + { 13489, "Unknown" }, + { 13490, "Unknown" }, + { 13491, "Unknown" }, + { 13492, "Unknown" }, + { 13493, "Unknown" }, + { 13494, "Unknown" }, + { 13495, "Unknown" }, + { 13496, "Unknown" }, + { 13497, "Unknown" }, + { 13498, "Unknown" }, + { 13499, "Unknown" }, + { 13500, "AuctionBBO" }, + { 13501, "AuctionClearingPrice" }, + { 13502, "CrossRequest" }, + { 13503, "QuoteRequest" }, + { 13504, "TopOfBook" }, + { 13505, "Unknown" }, + { 13506, "Unknown" }, + { 13507, "Unknown" }, + { 13508, "Unknown" }, + { 13509, "Unknown" }, + { 13510, "Unknown" }, + { 13511, "Unknown" }, + { 13512, "Unknown" }, + { 13513, "Unknown" }, + { 13514, "Unknown" }, + { 13515, "Unknown" }, + { 13516, "Unknown" }, + { 13517, "Unknown" }, + { 13518, "Unknown" }, + { 13519, "Unknown" }, + { 13520, "Unknown" }, + { 13521, "Unknown" }, + { 13522, "Unknown" }, + { 13523, "Unknown" }, + { 13524, "Unknown" }, + { 13525, "Unknown" }, + { 13526, "Unknown" }, + { 13527, "Unknown" }, + { 13528, "Unknown" }, + { 13529, "Unknown" }, + { 13530, "Unknown" }, + { 13531, "Unknown" }, + { 13532, "Unknown" }, + { 13533, "Unknown" }, + { 13534, "Unknown" }, + { 13535, "Unknown" }, + { 13536, "Unknown" }, + { 13537, "Unknown" }, + { 13538, "Unknown" }, + { 13539, "Unknown" }, + { 13540, "Unknown" }, + { 13541, "Unknown" }, + { 13542, "Unknown" }, + { 13543, "Unknown" }, + { 13544, "Unknown" }, + { 13545, "Unknown" }, + { 13546, "Unknown" }, + { 13547, "Unknown" }, + { 13548, "Unknown" }, + { 13549, "Unknown" }, + { 13550, "Unknown" }, + { 13551, "Unknown" }, + { 13552, "Unknown" }, + { 13553, "Unknown" }, + { 13554, "Unknown" }, + { 13555, "Unknown" }, + { 13556, "Unknown" }, + { 13557, "Unknown" }, + { 13558, "Unknown" }, + { 13559, "Unknown" }, + { 13560, "Unknown" }, + { 13561, "Unknown" }, + { 13562, "Unknown" }, + { 13563, "Unknown" }, + { 13564, "Unknown" }, + { 13565, "Unknown" }, + { 13566, "Unknown" }, + { 13567, "Unknown" }, + { 13568, "Unknown" }, + { 13569, "Unknown" }, + { 13570, "Unknown" }, + { 13571, "Unknown" }, + { 13572, "Unknown" }, + { 13573, "Unknown" }, + { 13574, "Unknown" }, + { 13575, "Unknown" }, + { 13576, "Unknown" }, + { 13577, "Unknown" }, + { 13578, "Unknown" }, + { 13579, "Unknown" }, + { 13580, "Unknown" }, + { 13581, "Unknown" }, + { 13582, "Unknown" }, + { 13583, "Unknown" }, + { 13584, "Unknown" }, + { 13585, "Unknown" }, + { 13586, "Unknown" }, + { 13587, "Unknown" }, + { 13588, "Unknown" }, + { 13589, "Unknown" }, + { 13590, "Unknown" }, + { 13591, "Unknown" }, + { 13592, "Unknown" }, + { 13593, "Unknown" }, + { 13594, "Unknown" }, + { 13595, "Unknown" }, + { 13596, "Unknown" }, + { 13597, "Unknown" }, + { 13598, "Unknown" }, + { 13599, "Unknown" }, + { 13600, "ProductSummary" }, + { 13601, "InstrumentSummary" }, + { 13602, "SnapshotOrder" }, + { 0, NULL } +}; +static value_string_ext template_id_vals_ext = VALUE_STRING_EXT_INIT(template_id_vals); +static const value_string aggressor_side_vals[] = { // AggressorSide + { 1, "Buy" }, + { 2, "Sell" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string algorithmic_trade_indicator_vals[] = { // AlgorithmicTradeIndicator + { 1, "AlgorithmicTrade" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string appl_seq_reset_indicator_vals[] = { // ApplSeqResetIndicator + { 0, "NoReset" }, + { 1, "Reset" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string bid_ord_type_vals[] = { // BidOrdType + { 1, "Market" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string completion_indicator_vals[] = { // CompletionIndicator + { 0, "Incomplete" }, + { 1, "Complete" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string cross_request_type_vals[] = { // CrossRequestType + { 1, "CrossAnnouncement" }, + { 2, "LiquidityImprovementCross" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string fast_market_indicator_vals[] = { // FastMarketIndicator + { 0, "No" }, + { 1, "Yes" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string implied_market_indicator_vals[] = { // ImpliedMarketIndicator + { 0, "NotImplied" }, + { 3, "ImpliedInOut" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string input_source_vals[] = { // InputSource + { 1, "CLIPClientBroker" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string instrument_scope_product_complex_vals[] = { // InstrumentScopeProductComplex + { 1, "SimpleInstrument" }, + { 2, "StandardOptionStrategy" }, + { 3, "NonStandardOptionStrategy" }, + { 4, "VolatilityStrategy" }, + { 5, "FuturesSpread" }, + { 6, "InterProductSpread" }, + { 7, "StandardFuturesStrategy" }, + { 8, "PackAndBundle" }, + { 9, "Strip" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static value_string_ext instrument_scope_product_complex_vals_ext = VALUE_STRING_EXT_INIT(instrument_scope_product_complex_vals); +static const value_string last_fragment_vals[] = { // LastFragment + { 0, "N" }, + { 1, "Y" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string leg_security_type_vals[] = { // LegSecurityType + { 1, "LegSecurityMultiLeg" }, + { 2, "LegSecurityUnderlyingLeg" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +// LegSide aliased by AggressorSide +static const value_string mdentry_type_vals[] = { // MDEntryType + { 2, "Trade" }, + { 4, "OpeningPrice" }, + { 5, "ClosingPrice" }, + { 7, "HighPrice" }, + { 8, "LowPrice" }, + { 66, "TradeVolume" }, + { 101, "PreviousClosingPrice" }, + { 200, "OpeningAuction" }, + { 201, "IntradayAuction" }, + { 202, "CircuitBreakerAuction" }, + { 203, "ClosingAuction" }, + { 204, "IPOAuction" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static value_string_ext mdentry_type_vals_ext = VALUE_STRING_EXT_INIT(mdentry_type_vals); +static const value_string market_condition_vals[] = { // MarketCondition + { 0, "Normal" }, + { 1, "Stressed" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +// MassMarketCondition aliased by MarketCondition +static const value_string mass_sold_out_indicator_vals[] = { // MassSoldOutIndicator + { 1, "SoldOut" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string match_sub_type_vals[] = { // MatchSubType + { 1, "OpeningAuction" }, + { 2, "ClosingAuction" }, + { 3, "IntradayAuction" }, + { 4, "CircuitBreakerAuction" }, + { 5, "IPOAuction" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string match_type_vals[] = { // MatchType + { 3, "ConfirmedTradeReport" }, + { 5, "CrossAuction" }, + { 7, "CallAuction" }, + { 13, "LiquidityImprovementCross" }, + { 14, "ContinuousAuction" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +// OfferOrdType aliased by BidOrdType +// OrdType aliased by BidOrdType +static const value_string potential_security_trading_event_vals[] = { // PotentialSecurityTradingEvent + { 0, "None" }, + { 10, "PriceVolatilityAuctionIsExtended" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +// ProductComplex aliased by InstrumentScopeProductComplex +static const value_string security_mass_status_vals[] = { // SecurityMassStatus + { 1, "Active" }, + { 2, "Inactive" }, + { 4, "Expired" }, + { 6, "KnockedOut" }, + { 7, "KnockOutRevoked" }, + { 9, "Suspended" }, + { 11, "PendingDeletion" }, + { 12, "KnockedOutAndSuspended" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static value_string_ext security_mass_status_vals_ext = VALUE_STRING_EXT_INIT(security_mass_status_vals); +static const value_string security_mass_trading_event_vals[] = { // SecurityMassTradingEvent + { 10, "PriceVolatilityAuctionIsExtended" }, + { 11, "PriceVolatilityAuctionIsExtendedAgain" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string security_mass_trading_status_vals[] = { // SecurityMassTradingStatus + { 2, "TradingHalt" }, + { 7, "MarketImbalanceBuy" }, + { 8, "MarketImbalanceSell" }, + { 200, "Closed" }, + { 201, "Restricted" }, + { 202, "Book" }, + { 203, "Continuous" }, + { 204, "OpeningAuction" }, + { 205, "OpeningAuctionFreeze" }, + { 206, "IntradayAuction" }, + { 207, "IntradayAuctionFreeze" }, + { 208, "CircuitBreakerAuction" }, + { 209, "CircuitBreakerAuctionFreeze" }, + { 210, "ClosingAuction" }, + { 211, "ClosingAuctionFreeze" }, + { 212, "IPOAuction" }, + { 213, "IPOAuctionFreeze" }, + { 214, "PreCall" }, + { 215, "Call" }, + { 216, "Freeze" }, + { 217, "TradeAtClose" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static value_string_ext security_mass_trading_status_vals_ext = VALUE_STRING_EXT_INIT(security_mass_trading_status_vals); +// SecurityStatus aliased by SecurityMassStatus +// SecurityTradingEvent aliased by SecurityMassTradingEvent +// SecurityTradingStatus aliased by SecurityMassTradingStatus +// Side aliased by AggressorSide +// SoldOutIndicator aliased by MassSoldOutIndicator +static const value_string trad_ses_status_vals[] = { // TradSesStatus + { 1, "Halted" }, + { 2, "Open" }, + { 3, "Closed" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string trade_condition_vals[] = { // TradeCondition + { 1, "ImpliedTrade" }, + { 107, "OutOfSequence" }, + { 155, "MidpointPrice" }, + { 156, "TradingOnTermsOfIssue" }, + { 596, "SpecialAuction" }, + { 624, "TradeAtClose" }, + { 0xFFFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string trading_session_id_vals[] = { // TradingSessionID + { 1, "Day" }, + { 3, "Morning" }, + { 5, "Evening" }, + { 6, "AfterHours" }, + { 7, "Holiday" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; +static const value_string trading_session_sub_id_vals[] = { // TradingSessionSubID + { 1, "PreTrading" }, + { 3, "Continuous" }, + { 4, "Closing" }, + { 5, "PostTrading" }, + { 7, "Quiescent" }, + { 0xFF, "NO_VALUE" }, + { 0, NULL } +}; + +enum ETI_Type { + ETI_EOF, + ETI_PADDING, + ETI_UINT, + ETI_INT, + ETI_UINT_ENUM, + ETI_INT_ENUM, + ETI_COUNTER, + ETI_FIXED_POINT, + ETI_TIMESTAMP_NS, + ETI_CHAR, + ETI_STRING, + ETI_VAR_STRING, + ETI_STRUCT, + ETI_VAR_STRUCT, + ETI_DSCP +}; + +struct ETI_Field { + uint8_t type; + uint8_t counter_off; // offset into counter array + // if ETI_COUNTER => storage + // if ETI_VAR_STRING or ETI_VAR_STRUCT => load + // to get length or repeat count + // if ETI_FIXED_POINT: #fractional digits + uint16_t size; // or offset into struct_names if ETI_STRUCT/ETI_VAR_STRUCT + uint16_t field_handle_idx; // or index into fields array if ETI_STRUCT/ETI_VAR_STRUT + uint16_t ett_idx; // index into ett array if ETI_STRUCT/ETI_VAR_STRUCT + // or max value if ETI_COUNTER +}; + +static gint ett_eobi[] = { -1, -1, -1, -1, -1, -1, -1 }; +static gint ett_eobi_dscp = -1; +/* This method dissects fully reassembled messages */ +static int +dissect_eobi_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "EOBI"); + col_clear(pinfo->cinfo, COL_INFO); + guint16 templateid = tvb_get_letohs(tvb, 2); + const char *template_str = val_to_str_ext(templateid, &template_id_vals_ext, "Unknown EOBI template: 0x%04x"); + col_add_fstr(pinfo->cinfo, COL_INFO, "%s", template_str); + + /* create display subtree for the protocol */ + proto_item *ti = proto_tree_add_item(tree, proto_eobi, tvb, 0, -1, ENC_NA); + guint32 bodylen= tvb_get_letohs(tvb, 0); + proto_item_append_text(ti, ", %s (%" PRIu16 "), BodyLen: %u", template_str, templateid, bodylen); + proto_tree *root = proto_item_add_subtree(ti, ett_eobi[0]); + + static const char struct_names[] = "InstrmtLegGrp\0MDInstrumentEntryGrp\0MDTradeEntryGrp\0MessageHeader\0OrderDetails\0SecMassStatGrp"; + static const struct ETI_Field fields[] = { + // InstrmtLegGrpComp@0 + { ETI_INT, 0, 4, LEGSYMBOL_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_INT, 0, 8, LEGSECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LEGPRICE_FH_IDX, 0 } + , { ETI_INT, 0, 4, LEGRATIOQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, LEGSECURITYTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, LEGSIDE_FH_IDX, 0 } + , { ETI_PADDING, 0, 2, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // MDInstrumentEntryGrpComp@9 + , { ETI_FIXED_POINT, 8, 8, MDENTRYPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, MDENTRYSIZE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MDENTRYTYPE_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // MDTradeEntryGrpComp@16 + , { ETI_FIXED_POINT, 8, 8, MDENTRYPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, MDENTRYSIZE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MDENTRYTYPE_FH_IDX, 0 } + , { ETI_PADDING, 0, 7, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // MessageHeaderComp@21 + , { ETI_UINT, 0, 2, BODYLEN_FH_IDX, 0 } + , { ETI_UINT, 0, 2, TEMPLATEID_FH_IDX, 0 } + , { ETI_UINT, 0, 4, MSGSEQNUM_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // OrderDetailsComp@25 + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, DISPLAYQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 } + , { ETI_PADDING, 0, 6, 0, 0 } + , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // SecMassStatGrpComp@32 + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 3, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // AddComplexInstrument@42 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_INT, 0, 4, SECURITYSUBTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, PRODUCTCOMPLEX_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, IMPLIEDMARKETINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 2, 0, 0 } + , { ETI_UINT, 0, 4, LEGRATIOMULTIPLIER_FH_IDX, 0 } + , { ETI_COUNTER, 0, 1, NOLEGS_FH_IDX, 20 } // <- counter@0 + , { ETI_PADDING, 0, 3, 0, 0 } + , { ETI_VAR_STRUCT, 0, 0, 0, 1 } // InstrmtLegGrp + , { ETI_EOF, 0, 0, 0, 0 } + // AuctionBBO@54 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, BIDPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, OFFERPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, BIDSIZE_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, OFFERSIZE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, POTENTIALSECURITYTRADINGEVENT_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, BIDORDTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, OFFERORDTYPE_FH_IDX, 0 } + , { ETI_PADDING, 0, 5, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // AuctionClearingPrice@66 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, IMBALANCEQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, POTENTIALSECURITYTRADINGEVENT_FH_IDX, 0 } + , { ETI_PADDING, 0, 6, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // CrossRequest@76 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, CROSSREQUESTTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, INPUTSOURCE_FH_IDX, 0 } + , { ETI_PADDING, 0, 5, 0, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // ExecutionSummary@86 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, AGGRESSORTIME_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, REQUESTTIME_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, EXECID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, AGGRESSORSIDE_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, RESTINGHIDDENQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, RESTINGCXLQTY_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // FullOrderExecution@100 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // Heartbeat@112 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT, 0, 4, LASTMSGSEQNUMPROCESSED_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // InstrumentStateChange@116 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 2, 0, 0 } + , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // InstrumentSummary@129 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, LASTUPDATETIME_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSEXECUTIONTIME_FH_IDX, 0 } + , { ETI_COUNTER, 0, 2, TOTNOORDERS_FH_IDX, 65534 } // <- counter@0 + , { ETI_UINT_ENUM, 0, 1, SECURITYSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYTRADINGEVENT_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SOLDOUTINDICATOR_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, HIGHPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LOWPX_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, PRODUCTCOMPLEX_FH_IDX, 0 } + , { ETI_COUNTER, 1, 1, NOMDENTRIES_FH_IDX, 15 } // <- counter@1 + , { ETI_PADDING, 0, 6, 0, 0 } + , { ETI_VAR_STRUCT, 1, 14, 9, 2 } // MDInstrumentEntryGrp + , { ETI_EOF, 0, 0, 0, 0 } + // MassInstrumentStateChange@147 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT_ENUM, 0, 1, INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYMASSSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYMASSTRADINGSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MASSMARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SECURITYMASSTRADINGEVENT_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MASSSOLDOUTINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, LASTFRAGMENT_FH_IDX, 0 } + , { ETI_COUNTER, 0, 1, NORELATEDSYM_FH_IDX, 24 } // <- counter@0 + , { ETI_PADDING, 0, 6, 0, 0 } + , { ETI_VAR_STRUCT, 0, 78, 32, 6 } // SecMassStatGrp + , { ETI_EOF, 0, 0, 0, 0 } + // OrderAdd@162 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails + , { ETI_EOF, 0, 0, 0, 0 } + // OrderDelete@167 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails + , { ETI_EOF, 0, 0, 0, 0 } + // OrderMassDelete@173 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // OrderModify@177 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSPREVTIMEPRIORITY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, PREVPRICE_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, PREVDISPLAYQTY_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails + , { ETI_EOF, 0, 0, 0, 0 } + // OrderModifySamePrio@185 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEIN_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, PREVDISPLAYQTY_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails + , { ETI_EOF, 0, 0, 0, 0 } + // PacketHeader@192 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT, 0, 4, APPLSEQNUM_FH_IDX, 0 } + , { ETI_INT, 0, 4, MARKETSEGMENTID_FH_IDX, 0 } + , { ETI_UINT, 0, 1, PARTITIONID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, COMPLETIONINDICATOR_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, APPLSEQRESETINDICATOR_FH_IDX, 0 } + , { ETI_DSCP, 0, 1, DSCP_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // PartialOrderExecution@202 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ORDTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, PRICE_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSTIMEPRIORITY_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // ProductStateChange@214 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONSUBID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, TRADSESSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 3, 0, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // ProductSummary@223 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_UINT, 0, 4, LASTMSGSEQNUMPROCESSED_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, TRADINGSESSIONSUBID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, TRADSESSTATUS_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MARKETCONDITION_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, FASTMARKETINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 7, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // QuoteRequest@232 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, SIDE_FH_IDX, 0 } + , { ETI_PADDING, 0, 7, 0, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // SnapshotOrder@239 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_STRUCT, 0, 65, 25, 5 } // OrderDetails + , { ETI_EOF, 0, 0, 0, 0 } + // TopOfBook@242 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, BIDPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, OFFERPX_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, BIDSIZE_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, OFFERSIZE_FH_IDX, 0 } + , { ETI_UINT, 0, 2, NUMBEROFBUYORDERS_FH_IDX, 0 } + , { ETI_UINT, 0, 2, NUMBEROFSELLORDERS_FH_IDX, 0 } + , { ETI_PADDING, 0, 4, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // TradeReport@253 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MATCHTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, MATCHSUBTYPE_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 1, ALGORITHMICTRADEINDICATOR_FH_IDX, 0 } + , { ETI_PADDING, 0, 1, 0, 0 } + , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 } + , { ETI_PADDING, 0, 6, 0, 0 } + , { ETI_EOF, 0, 0, 0, 0 } + // TradeReversal@266 + , { ETI_STRUCT, 0, 51, 21, 4 } // MessageHeader + , { ETI_INT, 0, 8, SECURITYID_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRANSACTTIME_FH_IDX, 0 } + , { ETI_FIXED_POINT, 4, 8, LASTQTY_FH_IDX, 0 } + , { ETI_FIXED_POINT, 8, 8, LASTPX_FH_IDX, 0 } + , { ETI_TIMESTAMP_NS, 0, 8, TRDREGTSEXECUTIONTIME_FH_IDX, 0 } + , { ETI_UINT, 0, 4, TRDMATCHID_FH_IDX, 0 } + , { ETI_UINT_ENUM, 0, 2, TRADECONDITION_FH_IDX, 0 } + , { ETI_PADDING, 0, 2, 0, 0 } + , { ETI_COUNTER, 0, 1, NOMDENTRIES_FH_IDX, 15 } // <- counter@0 + , { ETI_PADDING, 0, 7, 0, 0 } + , { ETI_VAR_STRUCT, 0, 35, 16, 3 } // MDTradeEntryGrp + , { ETI_EOF, 0, 0, 0, 0 } + }; + static const int16_t tid2fidx[] = { + 112 /* Heartbeat */ + , -1 + , -1 + , -1 + , 192 /* PacketHeader */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 162 /* OrderAdd */ + , 177 /* OrderModify */ + , 167 /* OrderDelete */ + , 173 /* OrderMassDelete */ + , 100 /* FullOrderExecution */ + , 202 /* PartialOrderExecution */ + , 185 /* OrderModifySamePrio */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 266 /* TradeReversal */ + , 253 /* TradeReport */ + , 86 /* ExecutionSummary */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 214 /* ProductStateChange */ + , 116 /* InstrumentStateChange */ + , 147 /* MassInstrumentStateChange */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 42 /* AddComplexInstrument */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 54 /* AuctionBBO */ + , 66 /* AuctionClearingPrice */ + , 76 /* CrossRequest */ + , 232 /* QuoteRequest */ + , 242 /* TopOfBook */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 223 /* ProductSummary */ + , 129 /* InstrumentSummary */ + , 239 /* SnapshotOrder */ + }; + static const uint32_t tid2size[] = { + 16 /* Heartbeat */ + , 0 + , 0 + , 0 + , 32 /* PacketHeader */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 56 /* OrderAdd */ + , 80 /* OrderModify */ + , 64 /* OrderDelete */ + , 24 /* OrderMassDelete */ + , 56 /* FullOrderExecution */ + , 56 /* PartialOrderExecution */ + , 72 /* OrderModifySamePrio */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 424 /* TradeReversal */ + , 56 /* TradeReport */ + , 80 /* ExecutionSummary */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 24 /* ProductStateChange */ + , 48 /* InstrumentStateChange */ + , 800 /* MassInstrumentStateChange */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 680 /* AddComplexInstrument */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 64 /* AuctionBBO */ + , 56 /* AuctionClearingPrice */ + , 48 /* CrossRequest */ + , 40 /* QuoteRequest */ + , 64 /* TopOfBook */ + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 24 /* ProductSummary */ + , 424 /* InstrumentSummary */ + , 40 /* SnapshotOrder */ + }; + static const unsigned char usages[] = { + // AddComplexInstrument + //// MessageHeaderComp + 0 // BodyLen#0 + , 0 // TemplateID#1 + , 0 // MsgSeqNum#2 + /// + , 0 // SecurityID#3 + , 0 // TransactTime#4 + , 1 // SecuritySubType#5 + , 0 // ProductComplex#6 + , 0 // ImpliedMarketIndicator#7 + , 1 // LegRatioMultiplier#8 + , 0 // NoLegs#9 + //// InstrmtLegGrpComp + , 0 // LegSymbol#10 + , 0 // LegSecurityID#11 + , 1 // LegPrice#12 + , 0 // LegRatioQty#13 + , 0 // LegSecurityType#14 + , 0 // LegSide#15 + /// + // AuctionBBO + //// MessageHeaderComp + , 0 // BodyLen#16 + , 0 // TemplateID#17 + , 0 // MsgSeqNum#18 + /// + , 0 // TransactTime#19 + , 0 // SecurityID#20 + , 1 // BidPx#21 + , 1 // OfferPx#22 + , 1 // BidSize#23 + , 1 // OfferSize#24 + , 1 // PotentialSecurityTradingEvent#25 + , 1 // BidOrdType#26 + , 1 // OfferOrdType#27 + // AuctionClearingPrice + //// MessageHeaderComp + , 0 // BodyLen#28 + , 0 // TemplateID#29 + , 0 // MsgSeqNum#30 + /// + , 0 // TransactTime#31 + , 0 // SecurityID#32 + , 0 // LastPx#33 + , 1 // LastQty#34 + , 1 // ImbalanceQty#35 + , 1 // SecurityTradingStatus#36 + , 1 // PotentialSecurityTradingEvent#37 + // CrossRequest + //// MessageHeaderComp + , 0 // BodyLen#38 + , 0 // TemplateID#39 + , 0 // MsgSeqNum#40 + /// + , 0 // SecurityID#41 + , 1 // LastPx#42 + , 1 // LastQty#43 + , 1 // Side#44 + , 0 // CrossRequestType#45 + , 1 // InputSource#46 + , 0 // TransactTime#47 + // ExecutionSummary + //// MessageHeaderComp + , 0 // BodyLen#48 + , 0 // TemplateID#49 + , 0 // MsgSeqNum#50 + /// + , 0 // SecurityID#51 + , 1 // AggressorTime#52 + , 1 // RequestTime#53 + , 0 // ExecID#54 + , 0 // LastQty#55 + , 0 // AggressorSide#56 + , 1 // TradeCondition#57 + , 0 // LastPx#58 + , 1 // RestingHiddenQty#59 + , 0 // RestingCxlQty#60 + // FullOrderExecution + //// MessageHeaderComp + , 0 // BodyLen#61 + , 0 // TemplateID#62 + , 0 // MsgSeqNum#63 + /// + , 0 // Side#64 + , 1 // OrdType#65 + , 1 // AlgorithmicTradeIndicator#66 + , 0 // TrdMatchID#67 + , 1 // Price#68 + , 0 // TrdRegTSTimePriority#69 + , 0 // SecurityID#70 + , 0 // LastQty#71 + , 0 // LastPx#72 + // Heartbeat + //// MessageHeaderComp + , 0 // BodyLen#73 + , 0 // TemplateID#74 + , 2 // MsgSeqNum#75 + /// + , 0 // LastMsgSeqNumProcessed#76 + // InstrumentStateChange + //// MessageHeaderComp + , 0 // BodyLen#77 + , 0 // TemplateID#78 + , 0 // MsgSeqNum#79 + /// + , 0 // SecurityID#80 + , 0 // SecurityStatus#81 + , 0 // SecurityTradingStatus#82 + , 0 // MarketCondition#83 + , 0 // FastMarketIndicator#84 + , 1 // SecurityTradingEvent#85 + , 1 // SoldOutIndicator#86 + , 1 // HighPx#87 + , 1 // LowPx#88 + , 0 // TransactTime#89 + // InstrumentSummary + //// MessageHeaderComp + , 0 // BodyLen#90 + , 0 // TemplateID#91 + , 0 // MsgSeqNum#92 + /// + , 0 // SecurityID#93 + , 0 // LastUpdateTime#94 + , 1 // TrdRegTSExecutionTime#95 + , 0 // TotNoOrders#96 + , 0 // SecurityStatus#97 + , 0 // SecurityTradingStatus#98 + , 0 // MarketCondition#99 + , 0 // FastMarketIndicator#100 + , 1 // SecurityTradingEvent#101 + , 1 // SoldOutIndicator#102 + , 1 // HighPx#103 + , 1 // LowPx#104 + , 0 // ProductComplex#105 + , 0 // NoMDEntries#106 + //// MDInstrumentEntryGrpComp + , 1 // MDEntryPx#107 + , 1 // MDEntrySize#108 + , 0 // MDEntryType#109 + , 1 // TradeCondition#110 + /// + // MassInstrumentStateChange + //// MessageHeaderComp + , 0 // BodyLen#111 + , 0 // TemplateID#112 + , 0 // MsgSeqNum#113 + /// + , 0 // InstrumentScopeProductComplex#114 + , 0 // SecurityMassStatus#115 + , 0 // SecurityMassTradingStatus#116 + , 0 // MassMarketCondition#117 + , 0 // FastMarketIndicator#118 + , 1 // SecurityMassTradingEvent#119 + , 1 // MassSoldOutIndicator#120 + , 0 // TransactTime#121 + , 0 // LastFragment#122 + , 0 // NoRelatedSym#123 + //// SecMassStatGrpComp + , 0 // SecurityID#124 + , 1 // HighPx#125 + , 1 // LowPx#126 + , 0 // SecurityStatus#127 + , 0 // SecurityTradingStatus#128 + , 0 // MarketCondition#129 + , 1 // SecurityTradingEvent#130 + , 1 // SoldOutIndicator#131 + /// + // OrderAdd + //// MessageHeaderComp + , 0 // BodyLen#132 + , 0 // TemplateID#133 + , 0 // MsgSeqNum#134 + /// + , 1 // TrdRegTSTimeIn#135 + , 0 // SecurityID#136 + //// OrderDetailsComp + , 0 // TrdRegTSTimePriority#137 + , 0 // DisplayQty#138 + , 0 // Side#139 + , 1 // OrdType#140 + , 1 // Price#141 + /// + // OrderDelete + //// MessageHeaderComp + , 0 // BodyLen#142 + , 0 // TemplateID#143 + , 0 // MsgSeqNum#144 + /// + , 1 // TrdRegTSTimeIn#145 + , 0 // TransactTime#146 + , 0 // SecurityID#147 + //// OrderDetailsComp + , 0 // TrdRegTSTimePriority#148 + , 0 // DisplayQty#149 + , 0 // Side#150 + , 1 // OrdType#151 + , 1 // Price#152 + /// + // OrderMassDelete + //// MessageHeaderComp + , 0 // BodyLen#153 + , 0 // TemplateID#154 + , 0 // MsgSeqNum#155 + /// + , 0 // SecurityID#156 + , 0 // TransactTime#157 + // OrderModify + //// MessageHeaderComp + , 0 // BodyLen#158 + , 0 // TemplateID#159 + , 0 // MsgSeqNum#160 + /// + , 0 // TrdRegTSTimeIn#161 + , 0 // TrdRegTSPrevTimePriority#162 + , 1 // PrevPrice#163 + , 0 // PrevDisplayQty#164 + , 0 // SecurityID#165 + //// OrderDetailsComp + , 0 // TrdRegTSTimePriority#166 + , 0 // DisplayQty#167 + , 0 // Side#168 + , 1 // OrdType#169 + , 1 // Price#170 + /// + // OrderModifySamePrio + //// MessageHeaderComp + , 0 // BodyLen#171 + , 0 // TemplateID#172 + , 0 // MsgSeqNum#173 + /// + , 0 // TrdRegTSTimeIn#174 + , 0 // TransactTime#175 + , 0 // PrevDisplayQty#176 + , 0 // SecurityID#177 + //// OrderDetailsComp + , 0 // TrdRegTSTimePriority#178 + , 0 // DisplayQty#179 + , 0 // Side#180 + , 1 // OrdType#181 + , 1 // Price#182 + /// + // PacketHeader + //// MessageHeaderComp + , 0 // BodyLen#183 + , 0 // TemplateID#184 + , 2 // MsgSeqNum#185 + /// + , 0 // ApplSeqNum#186 + , 0 // MarketSegmentID#187 + , 0 // PartitionID#188 + , 0 // CompletionIndicator#189 + , 0 // ApplSeqResetIndicator#190 + , 1 // DSCP#191 + , 0 // TransactTime#192 + // PartialOrderExecution + //// MessageHeaderComp + , 0 // BodyLen#193 + , 0 // TemplateID#194 + , 0 // MsgSeqNum#195 + /// + , 0 // Side#196 + , 1 // OrdType#197 + , 1 // AlgorithmicTradeIndicator#198 + , 0 // TrdMatchID#199 + , 1 // Price#200 + , 0 // TrdRegTSTimePriority#201 + , 0 // SecurityID#202 + , 0 // LastQty#203 + , 0 // LastPx#204 + // ProductStateChange + //// MessageHeaderComp + , 0 // BodyLen#205 + , 0 // TemplateID#206 + , 0 // MsgSeqNum#207 + /// + , 0 // TradingSessionID#208 + , 0 // TradingSessionSubID#209 + , 0 // TradSesStatus#210 + , 1 // MarketCondition#211 + , 0 // FastMarketIndicator#212 + , 0 // TransactTime#213 + // ProductSummary + //// MessageHeaderComp + , 0 // BodyLen#214 + , 0 // TemplateID#215 + , 0 // MsgSeqNum#216 + /// + , 0 // LastMsgSeqNumProcessed#217 + , 1 // TradingSessionID#218 + , 1 // TradingSessionSubID#219 + , 1 // TradSesStatus#220 + , 1 // MarketCondition#221 + , 0 // FastMarketIndicator#222 + // QuoteRequest + //// MessageHeaderComp + , 0 // BodyLen#223 + , 0 // TemplateID#224 + , 0 // MsgSeqNum#225 + /// + , 0 // SecurityID#226 + , 1 // LastQty#227 + , 1 // Side#228 + , 0 // TransactTime#229 + // SnapshotOrder + //// MessageHeaderComp + , 0 // BodyLen#230 + , 0 // TemplateID#231 + , 0 // MsgSeqNum#232 + /// + //// OrderDetailsComp + , 0 // TrdRegTSTimePriority#233 + , 0 // DisplayQty#234 + , 0 // Side#235 + , 1 // OrdType#236 + , 1 // Price#237 + /// + // TopOfBook + //// MessageHeaderComp + , 0 // BodyLen#238 + , 0 // TemplateID#239 + , 0 // MsgSeqNum#240 + /// + , 0 // TransactTime#241 + , 0 // SecurityID#242 + , 1 // BidPx#243 + , 1 // OfferPx#244 + , 1 // BidSize#245 + , 1 // OfferSize#246 + , 1 // NumberOfBuyOrders#247 + , 1 // NumberOfSellOrders#248 + // TradeReport + //// MessageHeaderComp + , 0 // BodyLen#249 + , 0 // TemplateID#250 + , 0 // MsgSeqNum#251 + /// + , 0 // SecurityID#252 + , 0 // TransactTime#253 + , 0 // LastQty#254 + , 0 // LastPx#255 + , 1 // TrdMatchID#256 + , 1 // MatchType#257 + , 1 // MatchSubType#258 + , 1 // AlgorithmicTradeIndicator#259 + , 1 // TradeCondition#260 + // TradeReversal + //// MessageHeaderComp + , 0 // BodyLen#261 + , 0 // TemplateID#262 + , 0 // MsgSeqNum#263 + /// + , 0 // SecurityID#264 + , 0 // TransactTime#265 + , 0 // LastQty#266 + , 0 // LastPx#267 + , 1 // TrdRegTSExecutionTime#268 + , 0 // TrdMatchID#269 + , 1 // TradeCondition#270 + , 0 // NoMDEntries#271 + //// MDTradeEntryGrpComp + , 1 // MDEntryPx#272 + , 1 // MDEntrySize#273 + , 0 // MDEntryType#274 + /// + , 0 // filler + }; + static const int16_t tid2uidx[] = { + 73 /* Heartbeat */ + , -1 + , -1 + , -1 + , 183 /* PacketHeader */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 132 /* OrderAdd */ + , 158 /* OrderModify */ + , 142 /* OrderDelete */ + , 153 /* OrderMassDelete */ + , 61 /* FullOrderExecution */ + , 193 /* PartialOrderExecution */ + , 171 /* OrderModifySamePrio */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 261 /* TradeReversal */ + , 249 /* TradeReport */ + , 48 /* ExecutionSummary */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 205 /* ProductStateChange */ + , 77 /* InstrumentStateChange */ + , 111 /* MassInstrumentStateChange */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 0 /* AddComplexInstrument */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 16 /* AuctionBBO */ + , 28 /* AuctionClearingPrice */ + , 38 /* CrossRequest */ + , 223 /* QuoteRequest */ + , 238 /* TopOfBook */ + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 214 /* ProductSummary */ + , 90 /* InstrumentSummary */ + , 230 /* SnapshotOrder */ + }; + static int * const dscp_bits[] = { + &hf_eobi_dscp_exec_summary, + &hf_eobi_dscp_improved, + &hf_eobi_dscp_widened, + NULL + }; + if (templateid < 13001 || templateid > 13602) { + proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_template, tvb, 2, 4, + "Template ID out of range: %" PRIu16, templateid); + return tvb_captured_length(tvb); + } + int fidx = tid2fidx[templateid - 13001]; + if (fidx == -1) { + proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_template, tvb, 2, 4, + "Unallocated Template ID: %" PRIu16, templateid); + return tvb_captured_length(tvb); + } + if (bodylen != tid2size[templateid - 13001]) { + proto_tree_add_expert_format(root, pinfo, &ei_eobi_invalid_length, tvb, 0, 2, + "Unexpected BodyLen value of %" PRIu32 ", expected: %" PRIu32, bodylen, tid2size[templateid - 13001]); + } + int uidx = tid2uidx[templateid - 13001]; + DISSECTOR_ASSERT_CMPINT(uidx, >=, 0); + DISSECTOR_ASSERT_CMPUINT(((size_t)uidx), <, (sizeof usages / sizeof usages[0])); + + int old_fidx = 0; + int old_uidx = 0; + unsigned top = 1; + unsigned counter[8] = {0}; + unsigned off = 0; + unsigned struct_off = 0; + unsigned repeats = 0; + proto_tree *t = root; + while (top) { + DISSECTOR_ASSERT_CMPINT(fidx, >=, 0); + DISSECTOR_ASSERT_CMPUINT(((size_t)fidx), <, (sizeof fields / sizeof fields[0])); + DISSECTOR_ASSERT_CMPINT(uidx, >=, 0); + DISSECTOR_ASSERT_CMPUINT(((size_t)uidx), <, (sizeof usages / sizeof usages[0])); + + switch (fields[fidx].type) { + case ETI_EOF: + DISSECTOR_ASSERT_CMPUINT(top, >=, 1); + DISSECTOR_ASSERT_CMPUINT(top, <=, 2); + if (t != root) + proto_item_set_len(t, off - struct_off); + if (repeats) { + --repeats; + fidx = fields[old_fidx].field_handle_idx; + uidx = old_uidx; + t = proto_tree_add_subtree(root, tvb, off, -1, ett_eobi[fields[old_fidx].ett_idx], NULL, &struct_names[fields[old_fidx].size]); + struct_off = off; + } else { + fidx = old_fidx + 1; + t = root; + --top; + } + break; + case ETI_VAR_STRUCT: + case ETI_STRUCT: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, sizeof counter / sizeof counter[0]); + repeats = fields[fidx].type == ETI_VAR_STRUCT ? counter[fields[fidx].counter_off] : 1; + if (repeats) { + --repeats; + t = proto_tree_add_subtree(root, tvb, off, -1, ett_eobi[fields[fidx].ett_idx], NULL, &struct_names[fields[fidx].size]); + struct_off = off; + old_fidx = fidx; + old_uidx = uidx; + fidx = fields[fidx].field_handle_idx; + DISSECTOR_ASSERT_CMPUINT(top, ==, 1); + ++top; + } else { + ++fidx; + } + break; + case ETI_PADDING: + off += fields[fidx].size; + ++fidx; + break; + case ETI_CHAR: + proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_ASCII); + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_STRING: + { + guint8 c = tvb_get_guint8(tvb, off); + if (c) + proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_ASCII); + else { + proto_item *e = proto_tree_add_string(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, "NO_VALUE ('0x00...')"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } + } + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_VAR_STRING: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, sizeof counter / sizeof counter[0]); + proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, counter[fields[fidx].counter_off], ENC_ASCII); + off += counter[fields[fidx].counter_off]; + ++fidx; + ++uidx; + break; + case ETI_COUNTER: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <, sizeof counter / sizeof counter[0]); + DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, <=, 2); + { + switch (fields[fidx].size) { + case 1: + { + guint8 x = tvb_get_guint8(tvb, off); + if (x == UINT8_MAX) { + proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xff)"); + counter[fields[fidx].counter_off] = 0; + } else { + 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); + if (x > fields[fidx].ett_idx) { + counter[fields[fidx].counter_off] = fields[fidx].ett_idx; + expert_add_info_format(pinfo, e, &ei_eobi_counter_overflow, "Counter overflow: %" PRIu8 " > %" PRIu16, x, fields[fidx].ett_idx); + } else { + counter[fields[fidx].counter_off] = x; + } + } + } + break; + case 2: + { + guint16 x = tvb_get_letohs(tvb, off); + if (x == UINT16_MAX) { + proto_tree_add_uint_format_value(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, x, "NO_VALUE (0xffff)"); + counter[fields[fidx].counter_off] = 0; + } else { + 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); + if (x > fields[fidx].ett_idx) { + counter[fields[fidx].counter_off] = fields[fidx].ett_idx; + expert_add_info_format(pinfo, e, &ei_eobi_counter_overflow, "Counter overflow: %" PRIu16 " > %" PRIu16, x, fields[fidx].ett_idx); + } else { + counter[fields[fidx].counter_off] = x; + } + } + } + break; + } + } + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_UINT: + switch (fields[fidx].size) { + case 1: + { + guint8 x = tvb_get_guint8(tvb, off); + if (x == UINT8_MAX) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 2: + { + guint16 x = tvb_get_letohs(tvb, off); + if (x == UINT16_MAX) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 4: + { + guint32 x = tvb_get_letohl(tvb, off); + if (x == UINT32_MAX) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 8: + { + guint64 x = tvb_get_letoh64(tvb, off); + if (x == UINT64_MAX) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + } + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_INT: + switch (fields[fidx].size) { + case 1: + { + gint8 x = tvb_get_gint8(tvb, off); + if (x == INT8_MIN) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 2: + { + gint16 x = tvb_get_letohis(tvb, off); + if (x == INT16_MIN) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 4: + { + gint32 x = tvb_get_letohil(tvb, off); + if (x == INT32_MIN) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + case 8: + { + gint64 x = tvb_get_letohi64(tvb, off); + if (x == INT64_MIN) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + 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); + if (usages[uidx] == 2) + expert_add_info_format(pinfo, e, &ei_eobi_overused, "unused value is set"); + } + } + break; + } + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_UINT_ENUM: + case ETI_INT_ENUM: + proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_LITTLE_ENDIAN); + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_FIXED_POINT: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 8); + DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, >, 0); + DISSECTOR_ASSERT_CMPUINT(fields[fidx].counter_off, <=, 16); + { + gint64 x = tvb_get_letohi64(tvb, off); + if (x == INT64_MIN) { + 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)"); + if (!usages[uidx]) + expert_add_info_format(pinfo, e, &ei_eobi_missing, "required value is missing"); + } else { + unsigned slack = fields[fidx].counter_off + 1; + if (x < 0) + slack += 1; + char s[21]; + int n = snprintf(s, sizeof s, "%0*" PRIi64, slack, x); + DISSECTOR_ASSERT_CMPUINT(n, >, 0); + unsigned k = n - fields[fidx].counter_off; + 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); + } + } + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_TIMESTAMP_NS: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 8); + proto_tree_add_item(t, hf_eobi[fields[fidx].field_handle_idx], tvb, off, fields[fidx].size, ENC_LITTLE_ENDIAN | ENC_TIME_NSECS); + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + case ETI_DSCP: + DISSECTOR_ASSERT_CMPUINT(fields[fidx].size, ==, 1); + proto_tree_add_bitmask(t, tvb, off, hf_eobi[fields[fidx].field_handle_idx], ett_eobi_dscp, dscp_bits, ENC_LITTLE_ENDIAN); + off += fields[fidx].size; + ++fidx; + ++uidx; + break; + } + } + + return tvb_captured_length(tvb); +} + +/* determine PDU length of protocol EOBI */ +static guint +get_eobi_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_) +{ + return (guint)tvb_get_letohs(tvb, offset); +} + +static int +dissect_eobi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + void *data) +{ + return udp_dissect_pdus(tvb, pinfo, tree, 4, NULL, + get_eobi_message_len, dissect_eobi_message, data); +} + +void +proto_register_eobi(void) +{ + static hf_register_info hf[] ={ + { &hf_eobi[AGGRESSORSIDE_FH_IDX], + { "AggressorSide", "eobi.aggressorside", + FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[AGGRESSORTIME_FH_IDX], + { "AggressorTime", "eobi.aggressortime", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[ALGORITHMICTRADEINDICATOR_FH_IDX], + { "AlgorithmicTradeIndicator", "eobi.algorithmictradeindicator", + FT_UINT8, BASE_DEC, VALS(algorithmic_trade_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[APPLSEQNUM_FH_IDX], + { "ApplSeqNum", "eobi.applseqnum", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[APPLSEQRESETINDICATOR_FH_IDX], + { "ApplSeqResetIndicator", "eobi.applseqresetindicator", + FT_UINT8, BASE_DEC, VALS(appl_seq_reset_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[BIDORDTYPE_FH_IDX], + { "BidOrdType", "eobi.bidordtype", + FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[BIDPX_FH_IDX], + { "BidPx", "eobi.bidpx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[BIDSIZE_FH_IDX], + { "BidSize", "eobi.bidsize", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[BODYLEN_FH_IDX], + { "BodyLen", "eobi.bodylen", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[COMPLETIONINDICATOR_FH_IDX], + { "CompletionIndicator", "eobi.completionindicator", + FT_UINT8, BASE_DEC, VALS(completion_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[CROSSREQUESTTYPE_FH_IDX], + { "CrossRequestType", "eobi.crossrequesttype", + FT_UINT8, BASE_DEC, VALS(cross_request_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[DSCP_FH_IDX], + { "DSCP", "eobi.dscp", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[DISPLAYQTY_FH_IDX], + { "DisplayQty", "eobi.displayqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[EXECID_FH_IDX], + { "ExecID", "eobi.execid", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[FASTMARKETINDICATOR_FH_IDX], + { "FastMarketIndicator", "eobi.fastmarketindicator", + FT_UINT8, BASE_DEC, VALS(fast_market_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[HIGHPX_FH_IDX], + { "HighPx", "eobi.highpx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[IMBALANCEQTY_FH_IDX], + { "ImbalanceQty", "eobi.imbalanceqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[IMPLIEDMARKETINDICATOR_FH_IDX], + { "ImpliedMarketIndicator", "eobi.impliedmarketindicator", + FT_UINT8, BASE_DEC, VALS(implied_market_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[INPUTSOURCE_FH_IDX], + { "InputSource", "eobi.inputsource", + FT_UINT8, BASE_DEC, VALS(input_source_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[INSTRUMENTSCOPEPRODUCTCOMPLEX_FH_IDX], + { "InstrumentScopeProductComplex", "eobi.instrumentscopeproductcomplex", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &instrument_scope_product_complex_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LASTFRAGMENT_FH_IDX], + { "LastFragment", "eobi.lastfragment", + FT_UINT8, BASE_DEC, VALS(last_fragment_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[LASTMSGSEQNUMPROCESSED_FH_IDX], + { "LastMsgSeqNumProcessed", "eobi.lastmsgseqnumprocessed", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LASTPX_FH_IDX], + { "LastPx", "eobi.lastpx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LASTQTY_FH_IDX], + { "LastQty", "eobi.lastqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LASTUPDATETIME_FH_IDX], + { "LastUpdateTime", "eobi.lastupdatetime", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGPRICE_FH_IDX], + { "LegPrice", "eobi.legprice", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGRATIOMULTIPLIER_FH_IDX], + { "LegRatioMultiplier", "eobi.legratiomultiplier", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGRATIOQTY_FH_IDX], + { "LegRatioQty", "eobi.legratioqty", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGSECURITYID_FH_IDX], + { "LegSecurityID", "eobi.legsecurityid", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGSECURITYTYPE_FH_IDX], + { "LegSecurityType", "eobi.legsecuritytype", + FT_UINT8, BASE_DEC, VALS(leg_security_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGSIDE_FH_IDX], + { "LegSide", "eobi.legside", + FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[LEGSYMBOL_FH_IDX], + { "LegSymbol", "eobi.legsymbol", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[LOWPX_FH_IDX], + { "LowPx", "eobi.lowpx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[MDENTRYPX_FH_IDX], + { "MDEntryPx", "eobi.mdentrypx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[MDENTRYSIZE_FH_IDX], + { "MDEntrySize", "eobi.mdentrysize", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[MDENTRYTYPE_FH_IDX], + { "MDEntryType", "eobi.mdentrytype", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &mdentry_type_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[MARKETCONDITION_FH_IDX], + { "MarketCondition", "eobi.marketcondition", + FT_UINT8, BASE_DEC, VALS(market_condition_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[MARKETSEGMENTID_FH_IDX], + { "MarketSegmentID", "eobi.marketsegmentid", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[MASSMARKETCONDITION_FH_IDX], + { "MassMarketCondition", "eobi.massmarketcondition", + FT_UINT8, BASE_DEC, VALS(market_condition_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[MASSSOLDOUTINDICATOR_FH_IDX], + { "MassSoldOutIndicator", "eobi.masssoldoutindicator", + FT_UINT8, BASE_DEC, VALS(mass_sold_out_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[MATCHSUBTYPE_FH_IDX], + { "MatchSubType", "eobi.matchsubtype", + FT_UINT8, BASE_DEC, VALS(match_sub_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[MATCHTYPE_FH_IDX], + { "MatchType", "eobi.matchtype", + FT_UINT8, BASE_DEC, VALS(match_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[MSGSEQNUM_FH_IDX], + { "MsgSeqNum", "eobi.msgseqnum", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[NOLEGS_FH_IDX], + { "NoLegs", "eobi.nolegs", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[NOMDENTRIES_FH_IDX], + { "NoMDEntries", "eobi.nomdentries", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[NORELATEDSYM_FH_IDX], + { "NoRelatedSym", "eobi.norelatedsym", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[NUMBEROFBUYORDERS_FH_IDX], + { "NumberOfBuyOrders", "eobi.numberofbuyorders", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[NUMBEROFSELLORDERS_FH_IDX], + { "NumberOfSellOrders", "eobi.numberofsellorders", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[OFFERORDTYPE_FH_IDX], + { "OfferOrdType", "eobi.offerordtype", + FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[OFFERPX_FH_IDX], + { "OfferPx", "eobi.offerpx", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[OFFERSIZE_FH_IDX], + { "OfferSize", "eobi.offersize", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[ORDTYPE_FH_IDX], + { "OrdType", "eobi.ordtype", + FT_UINT8, BASE_DEC, VALS(bid_ord_type_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[PARTITIONID_FH_IDX], + { "PartitionID", "eobi.partitionid", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[POTENTIALSECURITYTRADINGEVENT_FH_IDX], + { "PotentialSecurityTradingEvent", "eobi.potentialsecuritytradingevent", + FT_UINT8, BASE_DEC, VALS(potential_security_trading_event_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[PREVDISPLAYQTY_FH_IDX], + { "PrevDisplayQty", "eobi.prevdisplayqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[PREVPRICE_FH_IDX], + { "PrevPrice", "eobi.prevprice", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[PRICE_FH_IDX], + { "Price", "eobi.price", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[PRODUCTCOMPLEX_FH_IDX], + { "ProductComplex", "eobi.productcomplex", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &instrument_scope_product_complex_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[REQUESTTIME_FH_IDX], + { "RequestTime", "eobi.requesttime", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[RESTINGCXLQTY_FH_IDX], + { "RestingCxlQty", "eobi.restingcxlqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[RESTINGHIDDENQTY_FH_IDX], + { "RestingHiddenQty", "eobi.restinghiddenqty", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYID_FH_IDX], + { "SecurityID", "eobi.securityid", + FT_INT64, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYMASSSTATUS_FH_IDX], + { "SecurityMassStatus", "eobi.securitymassstatus", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_status_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYMASSTRADINGEVENT_FH_IDX], + { "SecurityMassTradingEvent", "eobi.securitymasstradingevent", + FT_UINT8, BASE_DEC, VALS(security_mass_trading_event_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYMASSTRADINGSTATUS_FH_IDX], + { "SecurityMassTradingStatus", "eobi.securitymasstradingstatus", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_trading_status_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYSTATUS_FH_IDX], + { "SecurityStatus", "eobi.securitystatus", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_status_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYSUBTYPE_FH_IDX], + { "SecuritySubType", "eobi.securitysubtype", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYTRADINGEVENT_FH_IDX], + { "SecurityTradingEvent", "eobi.securitytradingevent", + FT_UINT8, BASE_DEC, VALS(security_mass_trading_event_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[SECURITYTRADINGSTATUS_FH_IDX], + { "SecurityTradingStatus", "eobi.securitytradingstatus", + FT_UINT8, BASE_DEC| BASE_EXT_STRING, &security_mass_trading_status_vals_ext, 0x0, + NULL, HFILL } + } + , { &hf_eobi[SIDE_FH_IDX], + { "Side", "eobi.side", + FT_UINT8, BASE_DEC, VALS(aggressor_side_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[SOLDOUTINDICATOR_FH_IDX], + { "SoldOutIndicator", "eobi.soldoutindicator", + FT_UINT8, BASE_DEC, VALS(mass_sold_out_indicator_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[TEMPLATEID_FH_IDX], + { "TemplateID", "eobi.templateid", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TOTNOORDERS_FH_IDX], + { "TotNoOrders", "eobi.totnoorders", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRADSESSTATUS_FH_IDX], + { "TradSesStatus", "eobi.tradsesstatus", + FT_UINT8, BASE_DEC, VALS(trad_ses_status_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRADECONDITION_FH_IDX], + { "TradeCondition", "eobi.tradecondition", + FT_UINT16, BASE_DEC, VALS(trade_condition_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRADINGSESSIONID_FH_IDX], + { "TradingSessionID", "eobi.tradingsessionid", + FT_UINT8, BASE_DEC, VALS(trading_session_id_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRADINGSESSIONSUBID_FH_IDX], + { "TradingSessionSubID", "eobi.tradingsessionsubid", + FT_UINT8, BASE_DEC, VALS(trading_session_sub_id_vals), 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRANSACTTIME_FH_IDX], + { "TransactTime", "eobi.transacttime", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRDMATCHID_FH_IDX], + { "TrdMatchID", "eobi.trdmatchid", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRDREGTSEXECUTIONTIME_FH_IDX], + { "TrdRegTSExecutionTime", "eobi.trdregtsexecutiontime", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRDREGTSPREVTIMEPRIORITY_FH_IDX], + { "TrdRegTSPrevTimePriority", "eobi.trdregtsprevtimepriority", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRDREGTSTIMEIN_FH_IDX], + { "TrdRegTSTimeIn", "eobi.trdregtstimein", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi[TRDREGTSTIMEPRIORITY_FH_IDX], + { "TrdRegTSTimePriority", "eobi.trdregtstimepriority", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, + NULL, HFILL } + } + , { &hf_eobi_dscp_exec_summary, + { "DSCP_ExecSummary", "eobi.dscp_execsummary", + FT_BOOLEAN, 8, NULL, 0x10, + NULL, HFILL } + } + , { &hf_eobi_dscp_improved, + { "DSCP_Improved", "eobi.dscp_improved", + FT_BOOLEAN, 8, NULL, 0x20, + NULL, HFILL } + } + , { &hf_eobi_dscp_widened, + { "DSCP_Widened", "eobi.dscp_widened", + FT_BOOLEAN, 8, NULL, 0x40, + NULL, HFILL } + } + }; + static ei_register_info ei[] = { + { + &ei_eobi_counter_overflow, + { "eobi.counter_overflow", PI_PROTOCOL, PI_WARN, "Counter Overflow", EXPFILL } + }, + { + &ei_eobi_invalid_template, + { "eobi.invalid_template", PI_PROTOCOL, PI_ERROR, "Invalid Template ID", EXPFILL } + }, + { + &ei_eobi_invalid_length, + { "eobi.invalid_length", PI_PROTOCOL, PI_ERROR, "Invalid Body Length", EXPFILL } + }, + { + &ei_eobi_missing, + { "eobi.missing", PI_PROTOCOL, PI_WARN, "A required value is missing", EXPFILL } + }, + { + &ei_eobi_overused, + { "eobi.overused", PI_PROTOCOL, PI_WARN, "An unused value is set", EXPFILL } + } + }; + proto_eobi = proto_register_protocol("Enhanced Order Book Interface 10.0", + "EOBI", "eobi"); + expert_module_t *expert_eobi = expert_register_protocol(proto_eobi); + expert_register_field_array(expert_eobi, ei, array_length(ei)); + proto_register_field_array(proto_eobi, hf, array_length(hf)); + static gint * 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 }; + proto_register_subtree_array(ett, array_length(ett)); + proto_disable_by_default(proto_eobi); + + eobi_handle = register_dissector("eobi", dissect_eobi, proto_eobi); +} + +void +proto_reg_handoff_eobi(void) +{ + // cf. N7 Network Access Guide, e.g. + // https://www.xetra.com/xetra-en/technology/t7/system-documentation/release10-0/Release-10.0-2692700?frag=2692724 + // https://www.xetra.com/resource/blob/2762078/388b727972b5122945eedf0e63c36920/data/N7-Network-Access-Guide-v2.0.59.pdf + + + static const int ports[] = { + 59000, // Snapshot EUREX US-allowed PROD + 59001, // Incremental EUREX US-allowed PROD + 59032, // Snapshot EUREX US-restricted PROD + 59033, // Incremental EUREX US-restricted PROD + 59500, // Snapshot EUREX US-allowed SIMU + 59501, // Incremental EUREX US-allowed SIMU + 59532, // Snapshot EUREX US-restricted SIMU + 59533, // Incremental EUREX US-restricted SIMU + + 57000, // Snapshot FX US-allowed PROD + 57001, // Incremental FX US-allowed PROD + 57032, // Snapshot FX US-restricted PROD + 57033, // Incremental FX US-restricted PROD + 57500, // Snapshot FX US-allowed SIMU + 57501, // Incremental FX US-allowed SIMU + 57532, // Snapshot FX US-restricted SIMU + 57533, // Incremental FX US-restricted SIMU + + 59000, // Snapshot Xetra PROD + 59001, // Incremental Xetra PROD + 59500, // Snapshot Xetra SIMU + 59501, // Incremental Xetra SIMU + + 56000, // Snapshot Boerse Frankfurt PROD + 56001, // Incremental Boerse Frankfurt PROD + 56500, // Snapshot Boerse Frankfurt SIMU + 56501 // Incremental Boerse Frankfurt SIMU + }; + for (unsigned i = 0; i < sizeof ports / sizeof ports[0]; ++i) + dissector_add_uint("udp.port", ports[i], eobi_handle); +} |