Wireshark 4.7.0
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
packet-lbm.h
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 <[email protected]>
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#include <epan/tfs.h>
94
95typedef uint8_t lbm_uint8_t;
96typedef uint16_t lbm_uint16_t;
97typedef uint32_t lbm_uint32_t;
98typedef uint64_t lbm_uint64_t;
99#define SIZEOF(TYPE, MEMBER) (int)(sizeof(((TYPE *)0)->MEMBER))
100#define OFFSETOF(TYPE, MEMBER) (int)(offsetof(TYPE, MEMBER))
101#define STRINGIZE(a) #a
102#define MAKESTRING(a) STRINGIZE(a)
103#define LBM_OTID_BLOCK_SZ 32
104#define LBM_CONTEXT_INSTANCE_BLOCK_SZ 8
105#define LBM_HMAC_BLOCK_SZ 20
106
107/* UAT macros for IPV4 fields. */
108#define UAT_IPV4_CB_DEF(basename,field_name,rec_t) \
109 static bool basename ## _ ## field_name ## _chk_cb(void * u1 _U_, const char * strptr, unsigned len _U_, const void * u2 _U_, const void * u3 _U_, char ** err) \
110 { \
111 uint32_t addr; \
112 if (!ws_inet_pton4(strptr, &addr)) \
113 { \
114 *err = g_strdup("invalid address"); \
115 return false; \
116 } \
117 return true; \
118 } \
119 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* u1 _U_, const void* u2 _U_) \
120 { \
121 uint32_t addr; \
122 char* new_buf = g_strndup(buf,len); \
123 g_free((((rec_t*)rec)->field_name)); \
124 (((rec_t*)rec)->field_name) = new_buf; \
125 ws_inet_pton4(new_buf, &addr); \
126 (((rec_t*)rec)->field_name ## _val_h) = g_ntohl(addr); \
127 } \
128 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* u1 _U_, const void* u2 _U_) \
129 {\
130 if (((rec_t*)rec)->field_name ) \
131 { \
132 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \
133 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \
134 } \
135 else \
136 { \
137 *out_ptr = g_strdup(""); \
138 *out_len = 0; \
139 } \
140 }
141
142#define UAT_FLD_IPV4(basename,field_name,title,desc) \
143 {#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}
144
145/* UAT macros for IPV4 Multicast fields. */
146#define UAT_IPV4_MC_CB_DEF(basename,field_name,rec_t) \
147 static bool basename ## _ ## field_name ## _chk_cb(void * u1 _U_, const char * strptr, unsigned len _U_, const void * u2 _U_, const void * u3 _U_, char ** err) \
148 { \
149 uint32_t addr; \
150 if (!ws_inet_pton4(strptr, &addr)) \
151 { \
152 *err = g_strdup("invalid address"); \
153 return false; \
154 } \
155 if (!IN_MULTICAST(g_ntohl(addr)) && (g_ntohl(addr) != 0)) \
156 { \
157 *err = g_strdup("invalid multicast address"); \
158 return false; \
159 } \
160 return true; \
161 } \
162 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* u1 _U_, const void* u2 _U_) \
163 { \
164 uint32_t addr; \
165 char* new_buf = g_strndup(buf,len); \
166 g_free((((rec_t*)rec)->field_name)); \
167 (((rec_t*)rec)->field_name) = new_buf; \
168 ws_inet_pton4(new_buf, &addr); \
169 (((rec_t*)rec)->field_name ## _val_h) = g_ntohl(addr); \
170 } \
171 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* u1 _U_, const void* u2 _U_) \
172 {\
173 if (((rec_t*)rec)->field_name ) \
174 { \
175 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \
176 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \
177 } \
178 else \
179 { \
180 *out_ptr = g_strdup(""); \
181 *out_len = 0; \
182 } \
183 }
184
185#define UAT_FLD_IPV4_MC(basename,field_name,title,desc) \
186 {#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}
187
188typedef struct
189{
190 uint32_t domain;
191 address addr;
192 uint16_t port;
194
195typedef struct
196{
197 uint8_t ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
199
200typedef enum
201{
202 lbm_uim_instance_stream,
203 lbm_uim_domain_stream
204} lbm_uim_stream_type_t;
205
206typedef struct
207{
208 lbm_uim_stream_type_t type;
209 union
210 {
213 } stream_info;
215
216/* PUBLIC_HEADER: These appear to be used by custom dissectors and should be in the "install" target */
217typedef struct
218{
219 uint64_t channel;
220 uint32_t substream_id;
221 uint32_t bytes;
222 lbm_uim_stream_endpoint_t endpoint_a;
223 lbm_uim_stream_endpoint_t endpoint_b;
225
226typedef struct
227{
228 char * transport;
229 uint8_t type;
230 bool retransmission;
231 uint32_t sqn;
232 uint8_t ncf_reason;
233 uint16_t num_sqns;
234 uint32_t * sqns;
236
237typedef struct
238{
239 char * transport;
240 uint8_t type;
241 bool retransmission;
242 uint32_t sqn;
243 uint8_t ncf_reason;
244 uint16_t num_sqns;
245 uint16_t creq_type;
246 uint16_t rst_type;
247 uint32_t * sqns;
249
250typedef struct
251{
252 uint16_t size;
253 uint8_t topic_length;
254 uint8_t source_length;
255 uint32_t topic_index;
256 char topic[256];
257 char source[256];
259
260typedef struct
261{
262 uint16_t size;
263 uint8_t topic_length;
264 char topic[256];
266
267typedef struct
268{
269 uint16_t size;
270 uint8_t type;
271 uint8_t pattern_length;
272 char pattern[256];
274
275#define LBMR_WILDCARD_PATTERN_TYPE_PCRE 1
276#define LBMR_WILDCARD_PATTERN_TYPE_REGEX 2
277
278typedef struct
279{
280 uint16_t size;
281 uint16_t port;
282 uint8_t queue_length;
283 uint8_t topic_length;
284 char queue[256];
285 char topic[256];
287
288typedef struct
289{
290 uint16_t size;
291 uint8_t queue_length;
292 char queue[256];
294
295#define LBM_TOPIC_OPT_EXFUNC_FFLAG_LJ 0x00000001
296#define LBM_TOPIC_OPT_EXFUNC_FFLAG_UME 0x00000002
297#define LBM_TOPIC_OPT_EXFUNC_FFLAG_UMQ 0x00000004
298#define LBM_TOPIC_OPT_EXFUNC_FFLAG_ULB 0x00000008
299
300/* LBT-RM packet types */
301#define LBTRM_PACKET_TYPE_DATA 0x00
302#define LBTRM_PACKET_TYPE_SM 0x02
303#define LBTRM_PACKET_TYPE_NAK 0x03
304#define LBTRM_PACKET_TYPE_NCF 0x04
305
306/* LBT-RM NCF reason types */
307#define LBTRM_NCF_REASON_NO_RETRY 0x0
308#define LBTRM_NCF_REASON_IGNORED 0x1
309#define LBTRM_NCF_REASON_RX_DELAY 0x2
310#define LBTRM_NCF_REASON_SHED 0x3
311
312/* LBT-RU packet types */
313#define LBTRU_PACKET_TYPE_DATA 0x00
314#define LBTRU_PACKET_TYPE_SM 0x02
315#define LBTRU_PACKET_TYPE_NAK 0x03
316#define LBTRU_PACKET_TYPE_NCF 0x04
317#define LBTRU_PACKET_TYPE_ACK 0x05
318#define LBTRU_PACKET_TYPE_CREQ 0x06
319#define LBTRU_PACKET_TYPE_RST 0x07
320
321/* LBT-RU NCF reason types */
322#define LBTRU_NCF_REASON_NO_RETRY 0x0
323#define LBTRU_NCF_REASON_IGNORED 0x1
324#define LBTRU_NCF_REASON_RX_DELAY 0x2
325#define LBTRU_NCF_REASON_SHED 0x3
326
327/* LBT-RU CREQ types */
328#define LBTRU_CREQ_REQUEST_SYN 0x0
329
330/* LBT-RU RST reasons */
331#define LBTRU_RST_REASON_DEFAULT 0x0
332
333bool lbmc_test_lbmc_header(tvbuff_t * tvb, int offset);
334int lbmc_dissect_lbmc_packet(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, const char * tag_name, uint64_t channel);
335int lbmc_get_minimum_length(void);
336uint16_t lbmc_get_message_length(tvbuff_t * tvb, int offset);
337bool lbmpdm_verify_payload(tvbuff_t * tvb, int offset, int * encoding, uint32_t* length);
338int lbmpdm_dissect_lbmpdm_payload(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, uint64_t channel);
339int lbmpdm_get_minimum_length(void);
340int lbmr_dissect_umq_qmgmt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree);
341
342extern const true_false_string lbm_ignore_flag;
343extern const value_string lbm_wildcard_pattern_type[];
344extern const value_string lbm_wildcard_pattern_type_short[];
345
346/*----------------------------------------------------------------------------*/
347/* Channel interface. */
348/*----------------------------------------------------------------------------*/
349#define LBM_CHANNEL_NO_CHANNEL (~((uint64_t) 0))
350
351#define LBM_CHANNEL_TRANSPORT_LBTTCP 0x00
352#define LBM_CHANNEL_TRANSPORT_LBTRU 0x01
353#define LBM_CHANNEL_TRANSPORT_LBTRM 0x02
354#define LBM_CHANNEL_TRANSPORT_LBTIPC 0x03
355#define LBM_CHANNEL_TRANSPORT_LBTRDMA 0x04
356#define LBM_CHANNEL_TRANSPORT_LBTSMX 0x05
357#define LBM_CHANNEL_STREAM_TCP 0x10
358#define LBM_CHANNEL_TCP 0x20
359
360#define LBM_CHANNEL_VALUE_MASK UINT64_C(0xfffffffffffff000)
361#define LBM_CHANNEL_VALUE_SHIFT_COUNT 12
362
363void lbm_channel_reset(void);
364uint64_t lbm_channel_assign(uint8_t channel_type);
365bool lbm_channel_is_transport(uint64_t channel);
366uint8_t lbm_channel_type(uint64_t channel);
367uint64_t lbm_channel_assign_unknown_transport_source_lbttcp(void);
368uint64_t lbm_channel_assign_unknown_transport_client_lbttcp(void);
369uint64_t lbm_channel_assign_unknown_stream_tcp(void);
370bool lbm_channel_is_unknown_transport_lbttcp(uint64_t channel);
371bool lbm_channel_is_unknown_transport_source_lbttcp(uint64_t channel);
372bool lbm_channel_is_unknown_transport_client_lbttcp(uint64_t channel);
373bool lbm_channel_is_unknown_stream_tcp(uint64_t channel);
374bool lbm_channel_is_known(uint64_t channel);
375
376#define LBM_CHANNEL_ID(ch) ((ch & LBM_CHANNEL_VALUE_MASK) >> LBM_CHANNEL_VALUE_SHIFT_COUNT)
377
378/*----------------------------------------------------------------------------*/
379/* Frame/SQN interface. */
380/*----------------------------------------------------------------------------*/
381typedef struct
382{
383 uint32_t frame;
384 uint8_t type;
385 uint32_t sqn;
386 uint32_t previous_frame;
387 uint32_t previous_type_frame;
388 uint32_t next_frame;
389 uint32_t next_type_frame;
390 bool retransmission;
391 uint32_t sqn_gap;
392 uint32_t ooo_gap;
393 bool duplicate;
395
396typedef struct
397{
398 uint32_t frame;
399 bool retransmission;
401
402typedef struct
403{
404 uint32_t sqn;
405 uint32_t frame_count;
406 wmem_tree_t * frame; /* List of lbm_transport_sqn_frame_t */
408
409lbm_transport_frame_t * lbm_transport_frame_add(wmem_tree_t * list, uint8_t type, uint32_t frame, uint32_t sqn, bool retransmission);
410lbm_transport_sqn_t * lbm_transport_sqn_add(wmem_tree_t * list, lbm_transport_frame_t * frame);
411
412/*----------------------------------------------------------------------------*/
413/* Topic interface. */
414/*----------------------------------------------------------------------------*/
415void lbm_topic_init(void);
416const char * lbm_topic_find(uint64_t channel, uint32_t topic_index);
417void lbm_topic_add(uint64_t channel, uint32_t topic_index, const char * name);
418
419#endif
420
421/*
422 * Editor modelines - https://www.wireshark.org/tools/modelines.html
423 *
424 * Local variables:
425 * c-basic-offset: 4
426 * tab-width: 8
427 * indent-tabs-mode: nil
428 * End:
429 *
430 * vi: set shiftwidth=4 tabstop=8 expandtab:
431 * :indentSize=4:tabSize=8:noTabs=true:
432 */
Definition address.h:58
Definition packet_info.h:43
Definition proto.h:907
Mapping between a 32-bit integer value and its string representation.
Definition value_string.h:33
Internal representation of a wmem balanced tree.
Definition wmem_tree-int.h:81
Definition packet-lbm.h:268
Definition packet-lbm.h:279
Definition packet-lbm.h:289
Definition packet-lbm.h:251
Definition packet-lbm.h:261
Definition packet-lbm.h:227
Definition packet-lbm.h:238
Definition packet-lbm.h:382
Definition packet-lbm.h:397
Definition packet-lbm.h:403
Definition packet-lbm.h:196
Definition packet-lbm.h:189
Definition packet-lbm.h:207
Definition packet-lbm.h:218
Definition tfs.h:27
Definition tvbuff-int.h:35