1 /* packet-lbm.h 2 * Definitions for LBM packet dissection 3 * 4 * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved. 5 * 6 * Wireshark - Network traffic analyzer 7 * By Gerald Combs <gerald@wireshark.org> 8 * Copyright 1998 Gerald Combs 9 * 10 * SPDX-License-Identifier: GPL-2.0-or-later 11 */ 12 13 #ifndef PACKET_LBM_H_INCLUDED 14 #define PACKET_LBM_H_INCLUDED 15 16 /* A list of the taps etc. made available by these dissectors: 17 Taps: 18 lbm_stream 19 - A packet is queued for each UIM (unicast immediate message) LBMC message (or fragment) 20 - The data associated with each tap entry is described by lbm_uim_stream_tap_info_t 21 - A single packet may generate multiple tap entries (in the case that a single packet 22 contains multiple LBMC messages) 23 - An LBMC message that spans multiple packets will cause a single entry to be queued, 24 corresponding to the last packet spanned 25 lbm_uim 26 - A packet is queued for each complete (possibly reassembled) UIM message 27 - The data associated with each tap entry is described by lbm_uim_stream_info_t 28 - A single packet may generate multiple tap entries (in the case that a single packet 29 contains multiple complete UIM messages) 30 - An complete UIM message that spans multiple packets will cause a single entry to be queued, 31 corresponding to the last packet spanned 32 lbm_lbmr_topic_advertisement 33 - A packet is queued for each LBMR topic advertisement (TIR) 34 - The data associated with each tap entry is described by lbm_lbmr_topic_advertisement_tap_info_t 35 - A single LBMR message (which may span multiple IP frames, reassembled into a single UDP packet) 36 may generate multiple tap entries (in the case that a single LBMR message contains multiple topic 37 advertisements) 38 lbm_lbmr_topic_query 39 - A packet is queued for each LBMR topic query (TQR) 40 - The data associated with each tap entry is described by lbm_lbmr_topic_query_tap_info_t 41 - A single LBMR message (which may span multiple IP frames, reassembled into a single UDP packet) 42 may generate multiple tap entries (in the case that a single LBMR message contains multiple topic 43 queries) 44 lbm_lbmr_pattern_query 45 - A packet is queued for each LBMR pattern query (TQR specifying a pattern) 46 - The data associated with each tap entry is described by lbm_lbmr_pattern_query_tap_info_t 47 - A single LBMR message (which may span multiple IP frames, reassembled into a single UDP packet) 48 may generate multiple tap entries (in the case that a single LBMR message contains multiple pattern 49 queries) 50 lbm_lbmr_queue_advertisement 51 - A packet is queued for each LBMR queue advertisement (QIR) 52 - The data associated with each tap entry is described by lbm_lbmr_queue_advertisement_tap_info_t 53 - A single LBMR message (which may span multiple IP frames, reassembled into a single UDP packet) 54 may generate multiple tap entries (in the case that a single LBMR message contains multiple queue 55 advertisements) 56 lbm_lbmr_queue_query 57 - A packet is queued for each LBMR queue query (QQR) 58 - The data associated with each tap entry is described by lbm_lbmr_queue_query_tap_info_t 59 - A single LBMR message (which may span multiple IP frames, reassembled into a single UDP packet) 60 may generate multiple tap entries (in the case that a single LBMR message contains multiple queue 61 queries) 62 lbm_lbtrm 63 - A packet is queued for each LBTRM transport message 64 - The data associated with each tap entry is described by lbm_lbtrm_tap_info_t 65 - A single LBTRM transport message (which may span multiple IP frames, reassembled into a single UDP 66 packet) will generate a single tap entry 67 lbm_lbtru 68 - A packet is queued for each LBTRU transport message 69 - The data associated with each tap entry is described by lbm_lbtru_tap_info_t 70 - A single LBTRU transport message (which may span multiple IP frames, reassembled into a single UDP 71 packet) will generate a single tap entry 72 Heuristic subdissector tables: 73 lbm_msg_payload 74 - If the LBMC preference "Use heuristic sub-dissectors" is enabled, the dissector will call any dissector 75 registered in this table via heur_dissector_add(). This allows a customer plugin to dissect the 76 actual payload of their messages. 77 */ 78 79 #if defined(__FreeBSD__) 80 #include <sys/types.h> 81 #include <netinet/in.h> 82 #endif 83 #include <stddef.h> 84 85 #ifdef HAVE_NETINET_IN_H 86 # include <netinet/in.h> 87 #endif 88 89 #ifdef _WIN32 90 #include <winsock2.h> 91 #endif 92 93 typedef guint8 lbm_uint8_t; 94 typedef guint16 lbm_uint16_t; 95 typedef guint32 lbm_uint32_t; 96 typedef guint64 lbm_uint64_t; 97 #define SIZEOF(TYPE, MEMBER) (gint)(sizeof(((TYPE *)0)->MEMBER)) 98 #define OFFSETOF(TYPE, MEMBER) (gint)(offsetof(TYPE, MEMBER)) 99 #define STRINGIZE(a) #a 100 #define MAKESTRING(a) STRINGIZE(a) 101 #define LBM_OTID_BLOCK_SZ 32 102 #define LBM_CONTEXT_INSTANCE_BLOCK_SZ 8 103 #define LBM_HMAC_BLOCK_SZ 20 104 105 /* UAT macros for IPV4 fields. */ 106 #define UAT_IPV4_CB_DEF(basename,field_name,rec_t) \ 107 static gboolean basename ## _ ## field_name ## _chk_cb(void * u1 _U_, const char * strptr, unsigned len _U_, const void * u2 _U_, const void * u3 _U_, char ** err) \ 108 { \ 109 guint32 addr; \ 110 if (!ws_inet_pton4(strptr, &addr)) \ 111 { \ 112 *err = g_strdup("invalid address"); \ 113 return (FALSE); \ 114 } \ 115 return (TRUE); \ 116 } \ 117 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* u1 _U_, const void* u2 _U_) \ 118 { \ 119 guint32 addr; \ 120 char* new_buf = g_strndup(buf,len); \ 121 g_free((((rec_t*)rec)->field_name)); \ 122 (((rec_t*)rec)->field_name) = new_buf; \ 123 ws_inet_pton4(new_buf, &addr); \ 124 (((rec_t*)rec)->field_name ## _val_h) = g_ntohl(addr); \ 125 } \ 126 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* u1 _U_, const void* u2 _U_) \ 127 {\ 128 if (((rec_t*)rec)->field_name ) \ 129 { \ 130 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \ 131 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \ 132 } \ 133 else \ 134 { \ 135 *out_ptr = g_strdup(""); \ 136 *out_len = 0; \ 137 } \ 138 } 139 140 #define UAT_FLD_IPV4(basename,field_name,title,desc) \ 141 {#field_name, title, PT_TXTMOD_STRING,{basename ## _ ## field_name ## _chk_cb,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 142 143 /* UAT macros for IPV4 Multicast fields. */ 144 #define UAT_IPV4_MC_CB_DEF(basename,field_name,rec_t) \ 145 static gboolean basename ## _ ## field_name ## _chk_cb(void * u1 _U_, const char * strptr, unsigned len _U_, const void * u2 _U_, const void * u3 _U_, char ** err) \ 146 { \ 147 guint32 addr; \ 148 if (!ws_inet_pton4(strptr, &addr)) \ 149 { \ 150 *err = g_strdup("invalid address"); \ 151 return (FALSE); \ 152 } \ 153 if (!IN_MULTICAST(g_ntohl(addr)) && (g_ntohl(addr) != 0)) \ 154 { \ 155 *err = g_strdup("invalid multicast address"); \ 156 return (FALSE); \ 157 } \ 158 return (TRUE); \ 159 } \ 160 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* u1 _U_, const void* u2 _U_) \ 161 { \ 162 guint32 addr; \ 163 char* new_buf = g_strndup(buf,len); \ 164 g_free((((rec_t*)rec)->field_name)); \ 165 (((rec_t*)rec)->field_name) = new_buf; \ 166 ws_inet_pton4(new_buf, &addr); \ 167 (((rec_t*)rec)->field_name ## _val_h) = g_ntohl(addr); \ 168 } \ 169 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* u1 _U_, const void* u2 _U_) \ 170 {\ 171 if (((rec_t*)rec)->field_name ) \ 172 { \ 173 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \ 174 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \ 175 } \ 176 else \ 177 { \ 178 *out_ptr = g_strdup(""); \ 179 *out_len = 0; \ 180 } \ 181 } 182 183 #define UAT_FLD_IPV4_MC(basename,field_name,title,desc) \ 184 {#field_name, title, PT_TXTMOD_STRING,{basename ## _ ## field_name ## _chk_cb,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 185 186 typedef struct 187 { 188 guint32 domain; 189 address addr; 190 guint16 port; 191 } lbm_uim_stream_destination_t; 192 193 typedef struct 194 { 195 guint8 ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ]; 196 } lbm_uim_stream_ctxinst_t; 197 198 typedef enum 199 { 200 lbm_uim_instance_stream, 201 lbm_uim_domain_stream 202 } lbm_uim_stream_type_t; 203 204 typedef struct 205 { 206 lbm_uim_stream_type_t type; 207 union 208 { 209 lbm_uim_stream_destination_t dest; 210 lbm_uim_stream_ctxinst_t ctxinst; 211 } stream_info; 212 } lbm_uim_stream_endpoint_t; 213 214 typedef struct 215 { 216 guint64 channel; 217 guint32 substream_id; 218 guint32 bytes; 219 lbm_uim_stream_endpoint_t endpoint_a; 220 lbm_uim_stream_endpoint_t endpoint_b; 221 } lbm_uim_stream_tap_info_t; 222 223 typedef struct 224 { 225 gchar * transport; 226 guint8 type; 227 gboolean retransmission; 228 guint32 sqn; 229 guint8 ncf_reason; 230 guint16 num_sqns; 231 guint32 * sqns; 232 } lbm_lbtrm_tap_info_t; 233 234 typedef struct 235 { 236 gchar * transport; 237 guint8 type; 238 gboolean retransmission; 239 guint32 sqn; 240 guint8 ncf_reason; 241 guint16 num_sqns; 242 guint16 creq_type; 243 guint16 rst_type; 244 guint32 * sqns; 245 } lbm_lbtru_tap_info_t; 246 247 typedef struct 248 { 249 guint16 size; 250 guint8 topic_length; 251 guint8 source_length; 252 guint32 topic_index; 253 char topic[256]; 254 char source[256]; 255 } lbm_lbmr_topic_advertisement_tap_info_t; 256 257 typedef struct 258 { 259 guint16 size; 260 guint8 topic_length; 261 char topic[256]; 262 } lbm_lbmr_topic_query_tap_info_t; 263 264 typedef struct 265 { 266 guint16 size; 267 guint8 type; 268 guint8 pattern_length; 269 char pattern[256]; 270 } lbm_lbmr_pattern_query_tap_info_t; 271 272 #define LBMR_WILDCARD_PATTERN_TYPE_PCRE 1 273 #define LBMR_WILDCARD_PATTERN_TYPE_REGEX 2 274 275 typedef struct 276 { 277 guint16 size; 278 guint16 port; 279 guint8 queue_length; 280 guint8 topic_length; 281 char queue[256]; 282 char topic[256]; 283 } lbm_lbmr_queue_advertisement_tap_info_t; 284 285 typedef struct 286 { 287 guint16 size; 288 guint8 queue_length; 289 char queue[256]; 290 } lbm_lbmr_queue_query_tap_info_t; 291 292 #define LBM_TOPIC_OPT_EXFUNC_FFLAG_LJ 0x00000001 293 #define LBM_TOPIC_OPT_EXFUNC_FFLAG_UME 0x00000002 294 #define LBM_TOPIC_OPT_EXFUNC_FFLAG_UMQ 0x00000004 295 #define LBM_TOPIC_OPT_EXFUNC_FFLAG_ULB 0x00000008 296 297 /* LBT-RM packet types */ 298 #define LBTRM_PACKET_TYPE_DATA 0x00 299 #define LBTRM_PACKET_TYPE_SM 0x02 300 #define LBTRM_PACKET_TYPE_NAK 0x03 301 #define LBTRM_PACKET_TYPE_NCF 0x04 302 303 /* LBT-RM NCF reason types */ 304 #define LBTRM_NCF_REASON_NO_RETRY 0x0 305 #define LBTRM_NCF_REASON_IGNORED 0x1 306 #define LBTRM_NCF_REASON_RX_DELAY 0x2 307 #define LBTRM_NCF_REASON_SHED 0x3 308 309 /* LBT-RU packet types */ 310 #define LBTRU_PACKET_TYPE_DATA 0x00 311 #define LBTRU_PACKET_TYPE_SM 0x02 312 #define LBTRU_PACKET_TYPE_NAK 0x03 313 #define LBTRU_PACKET_TYPE_NCF 0x04 314 #define LBTRU_PACKET_TYPE_ACK 0x05 315 #define LBTRU_PACKET_TYPE_CREQ 0x06 316 #define LBTRU_PACKET_TYPE_RST 0x07 317 318 /* LBT-RU NCF reason types */ 319 #define LBTRU_NCF_REASON_NO_RETRY 0x0 320 #define LBTRU_NCF_REASON_IGNORED 0x1 321 #define LBTRU_NCF_REASON_RX_DELAY 0x2 322 #define LBTRU_NCF_REASON_SHED 0x3 323 324 /* LBT-RU CREQ types */ 325 #define LBTRU_CREQ_REQUEST_SYN 0x0 326 327 /* LBT-RU RST reasons */ 328 #define LBTRU_RST_REASON_DEFAULT 0x0 329 330 gboolean lbmc_test_lbmc_header(tvbuff_t * tvb, int offset); 331 int lbmc_dissect_lbmc_packet(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, const char * tag_name, guint64 channel); 332 int lbmc_get_minimum_length(void); 333 guint16 lbmc_get_message_length(tvbuff_t * tvb, int offset); 334 gboolean lbmpdm_verify_payload(tvbuff_t * tvb, int offset, int * encoding, int * length); 335 int lbmpdm_dissect_lbmpdm_payload(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, guint64 channel); 336 int lbmpdm_get_minimum_length(void); 337 int lbmr_dissect_umq_qmgmt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree); 338 339 extern const true_false_string lbm_ignore_flag; 340 extern const value_string lbm_wildcard_pattern_type[]; 341 extern const value_string lbm_wildcard_pattern_type_short[]; 342 343 /*----------------------------------------------------------------------------*/ 344 /* Channel interface. */ 345 /*----------------------------------------------------------------------------*/ 346 #define LBM_CHANNEL_NO_CHANNEL (~((guint64) 0)) 347 348 #define LBM_CHANNEL_TRANSPORT_LBTTCP 0x00 349 #define LBM_CHANNEL_TRANSPORT_LBTRU 0x01 350 #define LBM_CHANNEL_TRANSPORT_LBTRM 0x02 351 #define LBM_CHANNEL_TRANSPORT_LBTIPC 0x03 352 #define LBM_CHANNEL_TRANSPORT_LBTRDMA 0x04 353 #define LBM_CHANNEL_TRANSPORT_LBTSMX 0x05 354 #define LBM_CHANNEL_STREAM_TCP 0x10 355 #define LBM_CHANNEL_TCP 0x20 356 357 #define LBM_CHANNEL_VALUE_MASK G_GUINT64_CONSTANT(0xfffffffffffff000) 358 #define LBM_CHANNEL_VALUE_SHIFT_COUNT 12 359 360 void lbm_channel_reset(void); 361 guint64 lbm_channel_assign(guint8 channel_type); 362 gboolean lbm_channel_is_transport(guint64 channel); 363 guint8 lbm_channel_type(guint64 channel); 364 guint64 lbm_channel_assign_unknown_transport_source_lbttcp(void); 365 guint64 lbm_channel_assign_unknown_transport_client_lbttcp(void); 366 guint64 lbm_channel_assign_unknown_stream_tcp(void); 367 gboolean lbm_channel_is_unknown_transport_lbttcp(guint64 channel); 368 gboolean lbm_channel_is_unknown_transport_source_lbttcp(guint64 channel); 369 gboolean lbm_channel_is_unknown_transport_client_lbttcp(guint64 channel); 370 gboolean lbm_channel_is_unknown_stream_tcp(guint64 channel); 371 gboolean lbm_channel_is_known(guint64 channel); 372 373 #define LBM_CHANNEL_ID(ch) ((ch & LBM_CHANNEL_VALUE_MASK) >> LBM_CHANNEL_VALUE_SHIFT_COUNT) 374 375 /*----------------------------------------------------------------------------*/ 376 /* Frame/SQN interface. */ 377 /*----------------------------------------------------------------------------*/ 378 typedef struct 379 { 380 guint32 frame; 381 guint8 type; 382 guint32 sqn; 383 guint32 previous_frame; 384 guint32 previous_type_frame; 385 guint32 next_frame; 386 guint32 next_type_frame; 387 gboolean retransmission; 388 guint32 sqn_gap; 389 guint32 ooo_gap; 390 gboolean duplicate; 391 } lbm_transport_frame_t; 392 393 typedef struct 394 { 395 guint32 frame; 396 gboolean retransmission; 397 } lbm_transport_sqn_frame_t; 398 399 typedef struct 400 { 401 guint32 sqn; 402 guint32 frame_count; 403 wmem_tree_t * frame; /* List of lbm_transport_sqn_frame_t */ 404 } lbm_transport_sqn_t; 405 406 lbm_transport_frame_t * lbm_transport_frame_add(wmem_tree_t * list, guint8 type, guint32 frame, guint32 sqn, gboolean retransmission); 407 lbm_transport_sqn_t * lbm_transport_sqn_add(wmem_tree_t * list, lbm_transport_frame_t * frame); 408 409 /*----------------------------------------------------------------------------*/ 410 /* Topic interface. */ 411 /*----------------------------------------------------------------------------*/ 412 void lbm_topic_init(void); 413 const char * lbm_topic_find(guint64 channel, guint32 topic_index); 414 void lbm_topic_add(guint64 channel, guint32 topic_index, const char * name); 415 416 #endif 417 418 /* 419 * Editor modelines - https://www.wireshark.org/tools/modelines.html 420 * 421 * Local variables: 422 * c-basic-offset: 4 423 * tab-width: 8 424 * indent-tabs-mode: nil 425 * End: 426 * 427 * vi: set shiftwidth=4 tabstop=8 expandtab: 428 * :indentSize=4:tabSize=8:noTabs=true: 429 */ 430