epan/dissectors/pidl/ C99 drsuapi
[wireshark-sm.git] / epan / dissectors / packet-lbmr.c
blobb6034d57308b6237e6242343684bc09db5118d42
1 /* packet-lbmr.c
2 * Routines for LBM Topic Resolution Packet dissection
4 * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved.
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * SPDX-License-Identifier: GPL-2.0-or-later
13 #include "config.h"
15 #include <epan/packet.h>
16 #include <epan/address.h>
17 #include <epan/strutil.h>
18 #include <epan/prefs.h>
19 #include <epan/tap.h>
20 #include <epan/stats_tree.h>
21 #include <epan/expert.h>
22 #include <epan/uat.h>
23 #include <epan/to_str.h>
24 #include <wsutil/pint.h>
25 #include "packet-lbm.h"
26 #include "packet-lbtru.h"
27 #include "packet-lbtrm.h"
28 #include "packet-lbttcp.h"
30 #define LBMR_MAX_NAMELEN 256
32 void proto_register_lbmr(void);
33 void proto_reg_handoff_lbmr(void);
35 /*----------------------------------------------------------------------------*/
36 /* LBT-IPC transport management. */
37 /*----------------------------------------------------------------------------*/
39 typedef struct
41 uint32_t host_id;
42 uint32_t session_id;
43 uint16_t xport_id;
44 uint64_t channel;
45 } lbtipc_transport_t;
47 static wmem_tree_t * lbtipc_transport_table;
49 #define LBTIPC_KEY_ELEMENT_COUNT 3
50 #define LBTIPC_KEY_ELEMENT_HOST_ID 0
51 #define LBTIPC_KEY_ELEMENT_SESSION_ID 1
52 #define LBTIPC_KEY_ELEMENT_XPORT_ID 2
54 static void lbtipc_transport_init(void)
56 lbtipc_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
59 static lbtipc_transport_t * lbtipc_transport_find(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
61 lbtipc_transport_t * entry = NULL;
62 uint32_t keyval[LBTIPC_KEY_ELEMENT_COUNT];
63 wmem_tree_key_t tkey[2];
65 keyval[LBTIPC_KEY_ELEMENT_HOST_ID] = host_id;
66 keyval[LBTIPC_KEY_ELEMENT_SESSION_ID] = session_id;
67 keyval[LBTIPC_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
68 tkey[0].length = LBTIPC_KEY_ELEMENT_COUNT;
69 tkey[0].key = keyval;
70 tkey[1].length = 0;
71 tkey[1].key = NULL;
72 entry = (lbtipc_transport_t *) wmem_tree_lookup32_array(lbtipc_transport_table, tkey);
73 return (entry);
76 static lbtipc_transport_t * lbtipc_transport_add(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
78 lbtipc_transport_t * entry;
79 uint32_t keyval[LBTIPC_KEY_ELEMENT_COUNT];
80 wmem_tree_key_t tkey[2];
82 entry = lbtipc_transport_find(host_id, session_id, xport_id);
83 if (entry != NULL)
85 return (entry);
87 entry = wmem_new(wmem_file_scope(), lbtipc_transport_t);
88 entry->host_id = host_id;
89 entry->session_id = session_id;
90 entry->xport_id = xport_id;
91 entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTIPC);
92 keyval[LBTIPC_KEY_ELEMENT_HOST_ID] = host_id;
93 keyval[LBTIPC_KEY_ELEMENT_SESSION_ID] = session_id;
94 keyval[LBTIPC_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
95 tkey[0].length = LBTIPC_KEY_ELEMENT_COUNT;
96 tkey[0].key = keyval;
97 tkey[1].length = 0;
98 tkey[1].key = NULL;
99 wmem_tree_insert32_array(lbtipc_transport_table, tkey, (void *) entry);
100 return (entry);
103 static char * lbtipc_transport_source_string(uint32_t host_id _U_, uint32_t session_id, uint16_t xport_id)
105 return (wmem_strdup_printf(wmem_file_scope(), "LBT-IPC:%x:%" PRIu16, session_id, xport_id));
108 /*----------------------------------------------------------------------------*/
109 /* LBT-SMX transport management. */
110 /*----------------------------------------------------------------------------*/
112 typedef struct
114 uint32_t host_id;
115 uint32_t session_id;
116 uint16_t xport_id;
117 uint64_t channel;
118 } lbtsmx_transport_t;
120 static wmem_tree_t * lbtsmx_transport_table;
122 #define LBTSMX_KEY_ELEMENT_COUNT 3
123 #define LBTSMX_KEY_ELEMENT_HOST_ID 0
124 #define LBTSMX_KEY_ELEMENT_SESSION_ID 1
125 #define LBTSMX_KEY_ELEMENT_XPORT_ID 2
127 static void lbtsmx_transport_init(void)
129 lbtsmx_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
132 static lbtsmx_transport_t * lbtsmx_transport_find(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
134 lbtsmx_transport_t * entry = NULL;
135 uint32_t keyval[LBTSMX_KEY_ELEMENT_COUNT];
136 wmem_tree_key_t tkey[2];
138 keyval[LBTSMX_KEY_ELEMENT_HOST_ID] = host_id;
139 keyval[LBTSMX_KEY_ELEMENT_SESSION_ID] = session_id;
140 keyval[LBTSMX_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
141 tkey[0].length = LBTSMX_KEY_ELEMENT_COUNT;
142 tkey[0].key = keyval;
143 tkey[1].length = 0;
144 tkey[1].key = NULL;
145 entry = (lbtsmx_transport_t *) wmem_tree_lookup32_array(lbtsmx_transport_table, tkey);
146 return (entry);
149 static lbtsmx_transport_t * lbtsmx_transport_add(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
151 lbtsmx_transport_t * entry;
152 uint32_t keyval[LBTSMX_KEY_ELEMENT_COUNT];
153 wmem_tree_key_t tkey[2];
155 entry = lbtsmx_transport_find(host_id, session_id, xport_id);
156 if (entry != NULL)
158 return (entry);
160 entry = wmem_new(wmem_file_scope(), lbtsmx_transport_t);
161 entry->host_id = host_id;
162 entry->session_id = session_id;
163 entry->xport_id = xport_id;
164 entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTSMX);
165 keyval[LBTSMX_KEY_ELEMENT_HOST_ID] = host_id;
166 keyval[LBTSMX_KEY_ELEMENT_SESSION_ID] = session_id;
167 keyval[LBTSMX_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
168 tkey[0].length = LBTSMX_KEY_ELEMENT_COUNT;
169 tkey[0].key = keyval;
170 tkey[1].length = 0;
171 tkey[1].key = NULL;
172 wmem_tree_insert32_array(lbtsmx_transport_table, tkey, (void *) entry);
173 return (entry);
176 static char * lbtsmx_transport_source_string(uint32_t host_id _U_, uint32_t session_id, uint16_t xport_id)
178 return (wmem_strdup_printf(wmem_file_scope(), "LBT-SMX:%x:%" PRIu16, session_id, xport_id));
181 /*----------------------------------------------------------------------------*/
182 /* LBT-RDMA transport management. */
183 /*----------------------------------------------------------------------------*/
185 typedef struct
187 address source_address;
188 uint32_t session_id;
189 uint16_t port;
190 uint64_t channel;
191 } lbtrdma_transport_t;
193 static wmem_tree_t * lbtrdma_transport_table;
195 #define LBTRDMA_KEY_ELEMENT_COUNT 3
196 #define LBTRDMA_KEY_ELEMENT_SOURCE_ADDRESS 0
197 #define LBTRDMA_KEY_ELEMENT_SESSION_ID 1
198 #define LBTRDMA_KEY_ELEMENT_PORT 2
200 static void lbtrdma_transport_init(void)
202 lbtrdma_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
205 static void lbtrdma_transport_build_key(uint32_t * key_value, wmem_tree_key_t * key, const lbtrdma_transport_t * transport)
207 uint32_t val;
209 memcpy(&val, transport->source_address.data, sizeof(uint32_t));
210 key_value[LBTRDMA_KEY_ELEMENT_SOURCE_ADDRESS] = val;
211 key_value[LBTRDMA_KEY_ELEMENT_SESSION_ID] = transport->session_id;
212 key_value[LBTRDMA_KEY_ELEMENT_PORT] = (uint32_t) transport->port;
213 key[0].length = LBTRDMA_KEY_ELEMENT_COUNT;
214 key[0].key = key_value;
215 key[1].length = 0;
216 key[1].key = NULL;
219 static lbtrdma_transport_t * lbtrdma_transport_find(const address * source_address, uint32_t session_id, uint16_t port)
221 lbtrdma_transport_t key;
222 lbtrdma_transport_t * entry = NULL;
223 uint32_t keyval[LBTRDMA_KEY_ELEMENT_COUNT];
224 wmem_tree_key_t tkey[2];
226 memset((void *)&key, 0, sizeof(lbtrdma_transport_t));
227 copy_address_shallow(&(key.source_address), source_address);
228 key.session_id = session_id;
229 key.port = port;
230 lbtrdma_transport_build_key(keyval, tkey, &key);
231 entry = (lbtrdma_transport_t *) wmem_tree_lookup32_array(lbtrdma_transport_table, tkey);
232 return (entry);
235 static lbtrdma_transport_t * lbtrdma_transport_add(const address * source_address, uint32_t session_id, uint16_t port)
237 lbtrdma_transport_t * entry;
238 uint32_t keyval[LBTRDMA_KEY_ELEMENT_COUNT];
239 wmem_tree_key_t tkey[2];
241 entry = lbtrdma_transport_find(source_address, session_id, port);
242 if (entry != NULL)
244 return (entry);
246 entry = wmem_new(wmem_file_scope(), lbtrdma_transport_t);
247 copy_address_wmem(wmem_file_scope(), &(entry->source_address), source_address);
248 entry->session_id = session_id;
249 entry->port = port;
250 entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTRDMA);
251 lbtrdma_transport_build_key(keyval, tkey, entry);
252 wmem_tree_insert32_array(lbtrdma_transport_table, tkey, (void *) entry);
253 return (entry);
256 static char * lbtrdma_transport_source_string(const address * source_address _U_, uint32_t session_id, uint16_t port)
258 return (wmem_strdup_printf(wmem_file_scope(), "LBT-RDMA:%x:%" PRIu16, session_id, port));
261 /*----------------------------------------------------------------------------*/
262 /* Packet layouts. */
263 /*----------------------------------------------------------------------------*/
265 /* LBMR main header. */
266 typedef struct
268 lbm_uint8_t ver_type;
269 lbm_uint8_t tqrs;
270 lbm_uint16_t tirs;
271 } lbmr_hdr_t;
272 #define O_LBMR_HDR_T_VER_TYPE OFFSETOF(lbmr_hdr_t, ver_type)
273 #define L_LBMR_HDR_T_VER_TYPE SIZEOF(lbmr_hdr_t, ver_type)
274 #define O_LBMR_HDR_T_TQRS OFFSETOF(lbmr_hdr_t, tqrs)
275 #define L_LBMR_HDR_T_TQRS SIZEOF(lbmr_hdr_t, tqrs)
276 #define O_LBMR_HDR_T_TIRS OFFSETOF(lbmr_hdr_t, tirs)
277 #define L_LBMR_HDR_T_TIRS SIZEOF(lbmr_hdr_t, tirs)
278 #define L_LBMR_HDR_T (int) sizeof(lbmr_hdr_t)
280 #define LBMR_HDR_VER_VER_MASK 0xf0
281 #define LBMR_HDR_VER_TYPE_MASK 0x07
282 #define LBMR_HDR_VER(x) (((x) & LBMR_HDR_VER_VER_MASK) >> 4)
283 #define LBMR_HDR_TYPE(x) ((x) & LBMR_HDR_VER_TYPE_MASK)
285 #define LBMR_HDR_TYPE_NORMAL 0x0
286 #define LBMR_HDR_TYPE_WC_TQRS 0x1
287 #define LBMR_HDR_TYPE_UCAST_RCV_ALIVE 0x2
288 #define LBMR_HDR_TYPE_UCAST_SRC_ALIVE 0x3
289 #define LBMR_HDR_TYPE_TOPIC_MGMT 0x4
290 #define LBMR_HDR_TYPE_QUEUE_RES 0x6
291 #define LBMR_HDR_TYPE_EXT 0x7
292 #define LBMR_HDR_TYPE_OPTS_MASK 0x8
294 /* LBMR extended header. */
295 typedef struct
297 lbm_uint8_t ver_type;
298 lbm_uint8_t ext_type;
299 lbm_uint16_t dep;
300 } lbmr_hdr_ext_type_t;
301 #define O_LBMR_HDR_EXT_TYPE_T_VER_TYPE OFFSETOF(lbmr_hdr_ext_type_t, ver_type)
302 #define L_LBMR_HDR_EXT_TYPE_T_VER_TYPE SIZEOF(lbmr_hdr_ext_type_t, ver_type)
303 #define O_LBMR_HDR_EXT_TYPE_T_EXT_TYPE OFFSETOF(lbmr_hdr_ext_type_t, ext_type)
304 #define L_LBMR_HDR_EXT_TYPE_T_EXT_TYPE SIZEOF(lbmr_hdr_ext_type_t, ext_type)
305 #define O_LBMR_HDR_EXT_TYPE_T_DEP OFFSETOF(lbmr_hdr_ext_type_t, dep)
306 #define L_LBMR_HDR_EXT_TYPE_T_DEP SIZEOF(lbmr_hdr_ext_type_t, dep)
307 #define L_LBMR_HDR_EXT_TYPE_T (int) sizeof(lbmr_hdr_ext_type_t)
309 #define LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT 0x1
310 #define LBMR_HDR_EXT_TYPE_UMQ_QUEUE_MGMT 0x2
311 #define LBMR_HDR_EXT_TYPE_CONTEXT_INFO 0x3
312 #define LBMR_HDR_EXT_TYPE_TOPIC_RES_REQUEST 0x4
313 #define LBMR_HDR_EXT_TYPE_TNWG_MSG 0x5
314 #define LBMR_HDR_EXT_TYPE_REMOTE_DOMAIN_ROUTE 0x6
315 #define LBMR_HDR_EXT_TYPE_REMOTE_CONTEXT_INFO 0x7
317 /* LBMR topic information record */
318 typedef struct
320 lbm_uint8_t transport;
321 lbm_uint8_t tlen;
322 lbm_uint16_t ttl;
323 lbm_uint32_t idx;
324 } lbmr_tir_t;
325 #define O_LBMR_TIR_T_TRANSPORT OFFSETOF(lbmr_tir_t, transport)
326 #define L_LBMR_TIR_T_TRANSPORT SIZEOF(lbmr_tir_t, transport)
327 #define O_LBMR_TIR_T_TLEN OFFSETOF(lbmr_tir_t, tlen)
328 #define L_LBMR_TIR_T_TLEN SIZEOF(lbmr_tir_t, tlen)
329 #define O_LBMR_TIR_T_TTL OFFSETOF(lbmr_tir_t, ttl)
330 #define L_LBMR_TIR_T_TTL SIZEOF(lbmr_tir_t, ttl)
331 #define O_LBMR_TIR_T_INDEX OFFSETOF(lbmr_tir_t, idx)
332 #define L_LBMR_TIR_T_INDEX SIZEOF(lbmr_tir_t, idx)
333 #define L_LBMR_TIR_T (int) sizeof(lbmr_tir_t)
335 /* LBMR topic information record TCP option data */
336 typedef struct
338 lbm_uint32_t ip;
339 lbm_uint16_t port;
340 } lbmr_tir_tcp_t;
341 #define O_LBMR_TIR_TCP_T_IP OFFSETOF(lbmr_tir_tcp_t, ip)
342 #define L_LBMR_TIR_TCP_T_IP SIZEOF(lbmr_tir_tcp_t, ip)
343 #define O_LBMR_TIR_TCP_T_PORT OFFSETOF(lbmr_tir_tcp_t, port)
344 #define L_LBMR_TIR_TCP_T_PORT SIZEOF(lbmr_tir_tcp_t, port)
345 #define L_LBMR_TIR_TCP_T 6
347 typedef struct {
348 lbm_uint32_t ip;
349 lbm_uint32_t session_id;
350 lbm_uint16_t port;
351 } lbmr_tir_tcp_with_sid_t;
352 #define O_LBMR_TIR_TCP_WITH_SID_T_IP OFFSETOF(lbmr_tir_tcp_with_sid_t, ip)
353 #define L_LBMR_TIR_TCP_WITH_SID_T_IP SIZEOF(lbmr_tir_tcp_with_sid_t, ip)
354 #define O_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID OFFSETOF(lbmr_tir_tcp_with_sid_t, session_id)
355 #define L_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID SIZEOF(lbmr_tir_tcp_with_sid_t, session_id)
356 #define O_LBMR_TIR_TCP_WITH_SID_T_PORT OFFSETOF(lbmr_tir_tcp_with_sid_t, port)
357 #define L_LBMR_TIR_TCP_WITH_SID_T_PORT SIZEOF(lbmr_tir_tcp_with_sid_t, port)
358 #define L_LBMR_TIR_TCP_WITH_SID_T 10
360 /* LBMR topic information record LBT-RM option data */
361 typedef struct
363 lbm_uint32_t src_addr;
364 lbm_uint32_t mcast_addr;
365 lbm_uint32_t session_id;
366 lbm_uint16_t udp_dest_port;
367 lbm_uint16_t src_ucast_port;
368 } lbmr_tir_lbtrm_t;
369 #define O_LBMR_TIR_LBTRM_T_SRC_ADDR OFFSETOF(lbmr_tir_lbtrm_t, src_addr)
370 #define L_LBMR_TIR_LBTRM_T_SRC_ADDR SIZEOF(lbmr_tir_lbtrm_t, src_addr)
371 #define O_LBMR_TIR_LBTRM_T_MCAST_ADDR OFFSETOF(lbmr_tir_lbtrm_t, mcast_addr)
372 #define L_LBMR_TIR_LBTRM_T_MCAST_ADDR SIZEOF(lbmr_tir_lbtrm_t, mcast_addr)
373 #define O_LBMR_TIR_LBTRM_T_SESSION_ID OFFSETOF(lbmr_tir_lbtrm_t, session_id)
374 #define L_LBMR_TIR_LBTRM_T_SESSION_ID SIZEOF(lbmr_tir_lbtrm_t, session_id)
375 #define O_LBMR_TIR_LBTRM_T_UDP_DEST_PORT OFFSETOF(lbmr_tir_lbtrm_t, udp_dest_port)
376 #define L_LBMR_TIR_LBTRM_T_UDP_DEST_PORT SIZEOF(lbmr_tir_lbtrm_t, udp_dest_port)
377 #define O_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT OFFSETOF(lbmr_tir_lbtrm_t, src_ucast_port)
378 #define L_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT SIZEOF(lbmr_tir_lbtrm_t, src_ucast_port)
379 #define L_LBMR_TIR_LBTRM_T (int) sizeof(lbmr_tir_lbtrm_t)
381 /* LBMR topic information record LBT-RU option data */
382 typedef struct
384 lbm_uint32_t ip;
385 lbm_uint16_t port;
386 } lbmr_tir_lbtru_t;
387 #define O_LBMR_TIR_LBTRU_T_IP OFFSETOF(lbmr_tir_lbtru_t, ip)
388 #define L_LBMR_TIR_LBTRU_T_IP SIZEOF(lbmr_tir_lbtru_t, ip)
389 #define O_LBMR_TIR_LBTRU_T_PORT OFFSETOF(lbmr_tir_lbtru_t, port)
390 #define L_LBMR_TIR_LBTRU_T_PORT SIZEOF(lbmr_tir_lbtru_t, port)
391 #define L_LBMR_TIR_LBTRU_T 6
393 typedef struct
395 lbm_uint32_t ip;
396 lbm_uint32_t session_id;
397 lbm_uint16_t port;
398 } lbmr_tir_lbtru_with_sid_t;
399 #define O_LBMR_TIR_LBTRU_WITH_SID_T_IP OFFSETOF(lbmr_tir_lbtru_with_sid_t, ip)
400 #define L_LBMR_TIR_LBTRU_WITH_SID_T_IP SIZEOF(lbmr_tir_lbtru_with_sid_t, ip)
401 #define O_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID OFFSETOF(lbmr_tir_lbtru_with_sid_t, session_id)
402 #define L_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID SIZEOF(lbmr_tir_lbtru_with_sid_t, session_id)
403 #define O_LBMR_TIR_LBTRU_WITH_SID_T_PORT OFFSETOF(lbmr_tir_lbtru_with_sid_t, port)
404 #define L_LBMR_TIR_LBTRU_WITH_SID_T_PORT SIZEOF(lbmr_tir_lbtru_with_sid_t, port)
405 #define L_LBMR_TIR_LBTRU_WITH_SID_T 10
407 /* LBMR topic information record LBT-IPC option data */
408 typedef struct
410 lbm_uint32_t host_id;
411 lbm_uint32_t session_id;
412 lbm_uint16_t xport_id;
413 } lbmr_tir_lbtipc_t;
414 #define O_LBMR_TIR_LBTIPC_T_HOST_ID OFFSETOF(lbmr_tir_lbtipc_t, host_id)
415 #define L_LBMR_TIR_LBTIPC_T_HOST_ID SIZEOF(lbmr_tir_lbtipc_t, host_id)
416 #define O_LBMR_TIR_LBTIPC_T_SESSION_ID OFFSETOF(lbmr_tir_lbtipc_t, session_id)
417 #define L_LBMR_TIR_LBTIPC_T_SESSION_ID SIZEOF(lbmr_tir_lbtipc_t, session_id)
418 #define O_LBMR_TIR_LBTIPC_T_XPORT_ID OFFSETOF(lbmr_tir_lbtipc_t, xport_id)
419 #define L_LBMR_TIR_LBTIPC_T_XPORT_ID SIZEOF(lbmr_tir_lbtipc_t, xport_id)
420 #define L_LBMR_TIR_LBTIPC_T 10
422 /* LBMR topic information record LBT-RDMA option data */
423 typedef struct
425 lbm_uint32_t ip;
426 lbm_uint32_t session_id;
427 lbm_uint16_t port;
428 } lbmr_tir_lbtrdma_t;
429 #define O_LBMR_TIR_LBTRDMA_T_IP OFFSETOF(lbmr_tir_lbtrdma_t, ip)
430 #define L_LBMR_TIR_LBTRDMA_T_IP SIZEOF(lbmr_tir_lbtrdma_t, ip)
431 #define O_LBMR_TIR_LBTRDMA_T_SESSION_ID OFFSETOF(lbmr_tir_lbtrdma_t, session_id)
432 #define L_LBMR_TIR_LBTRDMA_T_SESSION_ID SIZEOF(lbmr_tir_lbtrdma_t, session_id)
433 #define O_LBMR_TIR_LBTRDMA_T_PORT OFFSETOF(lbmr_tir_lbtrdma_t, port)
434 #define L_LBMR_TIR_LBTRDMA_T_PORT SIZEOF(lbmr_tir_lbtrdma_t, port)
435 #define L_LBMR_TIR_LBTRDMA_T 10
437 /* LBMR topic information record LBT-SMX option data */
438 typedef struct
440 lbm_uint32_t host_id;
441 lbm_uint32_t session_id;
442 lbm_uint16_t xport_id;
443 } lbmr_tir_lbtsmx_t;
444 #define O_LBMR_TIR_LBTSMX_T_HOST_ID OFFSETOF(lbmr_tir_lbtsmx_t, host_id)
445 #define L_LBMR_TIR_LBTSMX_T_HOST_ID SIZEOF(lbmr_tir_lbtsmx_t, host_id)
446 #define O_LBMR_TIR_LBTSMX_T_SESSION_ID OFFSETOF(lbmr_tir_lbtsmx_t, session_id)
447 #define L_LBMR_TIR_LBTSMX_T_SESSION_ID SIZEOF(lbmr_tir_lbtsmx_t, session_id)
448 #define O_LBMR_TIR_LBTSMX_T_XPORT_ID OFFSETOF(lbmr_tir_lbtsmx_t, xport_id)
449 #define L_LBMR_TIR_LBTSMX_T_XPORT_ID SIZEOF(lbmr_tir_lbtsmx_t, xport_id)
450 #define L_LBMR_TIR_LBTSMX_T 10
452 #define LBMR_TIR_TRANSPORT 0x7F
453 #define LBMR_TIR_OPTIONS 0x80
455 /* LBMR topic option */
456 typedef struct
458 lbm_uint8_t type;
459 lbm_uint8_t len;
460 lbm_uint16_t flags;
461 } lbmr_topic_opt_t;
462 #define O_LBMR_TOPIC_OPT_T_TYPE OFFSETOF(lbmr_topic_opt_t, type)
463 #define L_LBMR_TOPIC_OPT_T_TYPE SIZEOF(lbmr_topic_opt_t, type)
464 #define O_LBMR_TOPIC_OPT_T_LEN OFFSETOF(lbmr_topic_opt_t, len)
465 #define L_LBMR_TOPIC_OPT_T_LEN SIZEOF(lbmr_topic_opt_t, len)
466 #define O_LBMR_TOPIC_OPT_T_FLAGS OFFSETOF(lbmr_topic_opt_t, flags)
467 #define L_LBMR_TOPIC_OPT_T_FLAGS SIZEOF(lbmr_topic_opt_t, flags)
468 #define L_LBMR_TOPIC_OPT_T (int) sizeof(lbmr_topic_opt_t)
470 #define LBMR_TOPIC_OPT_FLAG_IGNORE 0x8000
472 /* LBMR topic option length */
473 typedef struct
475 lbm_uint8_t type;
476 lbm_uint8_t len;
477 lbm_uint16_t total_len;
478 } lbmr_topic_opt_len_t;
479 #define O_LBMR_TOPIC_OPT_LEN_T_TYPE OFFSETOF(lbmr_topic_opt_len_t, type)
480 #define L_LBMR_TOPIC_OPT_LEN_T_TYPE SIZEOF(lbmr_topic_opt_len_t, type)
481 #define O_LBMR_TOPIC_OPT_LEN_T_LEN OFFSETOF(lbmr_topic_opt_len_t, len)
482 #define L_LBMR_TOPIC_OPT_LEN_T_LEN SIZEOF(lbmr_topic_opt_len_t, len)
483 #define O_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN OFFSETOF(lbmr_topic_opt_len_t, total_len)
484 #define L_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN SIZEOF(lbmr_topic_opt_len_t, total_len)
485 #define L_LBMR_TOPIC_OPT_LEN_T (int) sizeof(lbmr_topic_opt_len_t)
487 #define LBMR_TOPIC_OPT_LEN_TYPE 0x00
488 #define LBMR_TOPIC_OPT_LEN_SZ 4
490 /* LBMR topic UME option */
491 typedef struct
493 lbm_uint8_t type;
494 lbm_uint8_t len;
495 lbm_uint16_t flags;
496 lbm_uint16_t store_tcp_port;
497 lbm_uint16_t src_tcp_port;
498 lbm_uint32_t store_tcp_addr;
499 lbm_uint32_t src_tcp_addr;
500 lbm_uint32_t src_reg_id;
501 lbm_uint32_t transport_idx;
502 lbm_uint32_t high_seqnum;
503 lbm_uint32_t low_seqnum;
504 } lbmr_topic_opt_ume_t;
505 #define O_LBMR_TOPIC_OPT_UME_T_TYPE OFFSETOF(lbmr_topic_opt_ume_t, type)
506 #define L_LBMR_TOPIC_OPT_UME_T_TYPE SIZEOF(lbmr_topic_opt_ume_t, type)
507 #define O_LBMR_TOPIC_OPT_UME_T_LEN OFFSETOF(lbmr_topic_opt_ume_t, len)
508 #define L_LBMR_TOPIC_OPT_UME_T_LEN SIZEOF(lbmr_topic_opt_ume_t, len)
509 #define O_LBMR_TOPIC_OPT_UME_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_t, flags)
510 #define L_LBMR_TOPIC_OPT_UME_T_FLAGS SIZEOF(lbmr_topic_opt_ume_t, flags)
511 #define O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_t, store_tcp_port)
512 #define L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT SIZEOF(lbmr_topic_opt_ume_t, store_tcp_port)
513 #define O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_t, src_tcp_port)
514 #define L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_ume_t, src_tcp_port)
515 #define O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR OFFSETOF(lbmr_topic_opt_ume_t, store_tcp_addr)
516 #define L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR SIZEOF(lbmr_topic_opt_ume_t, store_tcp_addr)
517 #define O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR OFFSETOF(lbmr_topic_opt_ume_t, src_tcp_addr)
518 #define L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR SIZEOF(lbmr_topic_opt_ume_t, src_tcp_addr)
519 #define O_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID OFFSETOF(lbmr_topic_opt_ume_t, src_reg_id)
520 #define L_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID SIZEOF(lbmr_topic_opt_ume_t, src_reg_id)
521 #define O_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX OFFSETOF(lbmr_topic_opt_ume_t, transport_idx)
522 #define L_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX SIZEOF(lbmr_topic_opt_ume_t, transport_idx)
523 #define O_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM OFFSETOF(lbmr_topic_opt_ume_t, high_seqnum)
524 #define L_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM SIZEOF(lbmr_topic_opt_ume_t, high_seqnum)
525 #define O_LBMR_TOPIC_OPT_UME_T_LOW_SEQNUM OFFSETOF(lbmr_topic_opt_ume_t, low_seqnum)
526 #define L_LBMR_TOPIC_OPT_UME_T_LOW_SEQNUM SIZEOF(lbmr_topic_opt_ume_t, low_seqnum)
527 #define L_LBMR_TOPIC_OPT_UME_T (int) sizeof(lbmr_topic_opt_ume_t)
529 #define LBMR_TOPIC_OPT_UME_TYPE 0x01
530 #define LBMR_TOPIC_OPT_UME_FLAG_IGNORE 0x8000
531 #define LBMR_TOPIC_OPT_UME_FLAG_LATEJOIN 0x4000
532 #define LBMR_TOPIC_OPT_UME_FLAG_STORE 0x2000
533 #define LBMR_TOPIC_OPT_UME_FLAG_QCCAP 0x1000
534 #define LBMR_TOPIC_OPT_UME_FLAG_ACKTOSRC 0x800
535 #define LBMR_TOPIC_OPT_UME_SZ 32
537 /* LBMR topic UME store option */
538 typedef struct
540 lbm_uint8_t type;
541 lbm_uint8_t len;
542 lbm_uint8_t flags;
543 lbm_uint8_t grp_idx;
544 lbm_uint16_t store_tcp_port;
545 lbm_uint16_t store_idx;
546 lbm_uint32_t store_ip_addr;
547 lbm_uint32_t src_reg_id;
548 } lbmr_topic_opt_ume_store_t;
549 #define O_LBMR_TOPIC_OPT_UME_STORE_T_TYPE OFFSETOF(lbmr_topic_opt_ume_store_t, type)
550 #define L_LBMR_TOPIC_OPT_UME_STORE_T_TYPE SIZEOF(lbmr_topic_opt_ume_store_t, type)
551 #define O_LBMR_TOPIC_OPT_UME_STORE_T_LEN OFFSETOF(lbmr_topic_opt_ume_store_t, len)
552 #define L_LBMR_TOPIC_OPT_UME_STORE_T_LEN SIZEOF(lbmr_topic_opt_ume_store_t, len)
553 #define O_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_store_t, flags)
554 #define L_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS SIZEOF(lbmr_topic_opt_ume_store_t, flags)
555 #define O_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX OFFSETOF(lbmr_topic_opt_ume_store_t, grp_idx)
556 #define L_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX SIZEOF(lbmr_topic_opt_ume_store_t, grp_idx)
557 #define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_store_t, store_tcp_port)
558 #define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT SIZEOF(lbmr_topic_opt_ume_store_t, store_tcp_port)
559 #define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX OFFSETOF(lbmr_topic_opt_ume_store_t, store_idx)
560 #define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX SIZEOF(lbmr_topic_opt_ume_store_t, store_idx)
561 #define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR OFFSETOF(lbmr_topic_opt_ume_store_t, store_ip_addr)
562 #define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR SIZEOF(lbmr_topic_opt_ume_store_t, store_ip_addr)
563 #define O_LBMR_TOPIC_OPT_UME_STORE_T_SRC_REG_ID OFFSETOF(lbmr_topic_opt_ume_store_t, src_reg_id)
564 #define L_LBMR_TOPIC_OPT_UME_STORE_T_SRC_REG_ID SIZEOF(lbmr_topic_opt_ume_store_t, src_reg_id)
565 #define L_LBMR_TOPIC_OPT_UME_STORE_T (int) sizeof(lbmr_topic_opt_ume_store_t)
567 #define LBMR_TOPIC_OPT_UME_STORE_TYPE 0x02
568 #define LBMR_TOPIC_OPT_UME_STORE_FLAG_IGNORE 0x80
569 #define LBMR_TOPIC_OPT_UME_STORE_SZ 16
571 /* LBMR topic UME store group option */
572 typedef struct
574 lbm_uint8_t type;
575 lbm_uint8_t len;
576 lbm_uint8_t flags;
577 lbm_uint8_t grp_idx;
578 lbm_uint16_t grp_sz;
579 lbm_uint16_t reserved;
580 } lbmr_topic_opt_ume_store_group_t;
581 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE OFFSETOF(lbmr_topic_opt_ume_store_group_t, type)
582 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE SIZEOF(lbmr_topic_opt_ume_store_group_t, type)
583 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN OFFSETOF(lbmr_topic_opt_ume_store_group_t, len)
584 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN SIZEOF(lbmr_topic_opt_ume_store_group_t, len)
585 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_store_group_t, flags)
586 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS SIZEOF(lbmr_topic_opt_ume_store_group_t, flags)
587 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX OFFSETOF(lbmr_topic_opt_ume_store_group_t, grp_idx)
588 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX SIZEOF(lbmr_topic_opt_ume_store_group_t, grp_idx)
589 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ OFFSETOF(lbmr_topic_opt_ume_store_group_t, grp_sz)
590 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ SIZEOF(lbmr_topic_opt_ume_store_group_t, grp_sz)
591 #define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_RESERVED OFFSETOF(lbmr_topic_opt_ume_store_group_t, reserved)
592 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_RESERVED SIZEOF(lbmr_topic_opt_ume_store_group_t, reserved)
593 #define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T (int) sizeof(lbmr_topic_opt_ume_store_group_t)
595 #define LBMR_TOPIC_OPT_UME_STORE_GROUP_TYPE 0x03
596 #define LBMR_TOPIC_OPT_UME_STORE_GROUP_FLAG_IGNORE 0x80
597 #define LBMR_TOPIC_OPT_UME_STORE_GROUP_SZ 8
599 /* LBMR topic latejoin option */
600 typedef struct
602 lbm_uint8_t type;
603 lbm_uint8_t len;
604 lbm_uint16_t flags;
605 lbm_uint16_t src_tcp_port;
606 lbm_uint16_t reserved;
607 lbm_uint32_t src_ip_addr;
608 lbm_uint32_t transport_idx;
609 lbm_uint32_t high_seqnum;
610 lbm_uint32_t low_seqnum;
611 } lbmr_topic_opt_latejoin_t;
612 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE OFFSETOF(lbmr_topic_opt_latejoin_t, type)
613 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE SIZEOF(lbmr_topic_opt_latejoin_t, type)
614 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_LEN OFFSETOF(lbmr_topic_opt_latejoin_t, len)
615 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_LEN SIZEOF(lbmr_topic_opt_latejoin_t, len)
616 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS OFFSETOF(lbmr_topic_opt_latejoin_t, flags)
617 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS SIZEOF(lbmr_topic_opt_latejoin_t, flags)
618 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_latejoin_t, src_tcp_port)
619 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_latejoin_t, src_tcp_port)
620 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED OFFSETOF(lbmr_topic_opt_latejoin_t, reserved)
621 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED SIZEOF(lbmr_topic_opt_latejoin_t, reserved)
622 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_latejoin_t, src_ip_addr)
623 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_latejoin_t, src_ip_addr)
624 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX OFFSETOF(lbmr_topic_opt_latejoin_t, transport_idx)
625 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX SIZEOF(lbmr_topic_opt_latejoin_t, transport_idx)
626 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM OFFSETOF(lbmr_topic_opt_latejoin_t, high_seqnum)
627 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM SIZEOF(lbmr_topic_opt_latejoin_t, high_seqnum)
628 #define O_LBMR_TOPIC_OPT_LATEJOIN_T_LOW_SEQNUM OFFSETOF(lbmr_topic_opt_latejoin_t, low_seqnum)
629 #define L_LBMR_TOPIC_OPT_LATEJOIN_T_LOW_SEQNUM SIZEOF(lbmr_topic_opt_latejoin_t, low_seqnum)
630 #define L_LBMR_TOPIC_OPT_LATEJOIN_T (int) sizeof(lbmr_topic_opt_latejoin_t)
632 #define LBMR_TOPIC_OPT_LATEJOIN_TYPE 0x04
633 #define LBMR_TOPIC_OPT_LATEJOIN_FLAG_IGNORE 0x8000
634 #define LBMR_TOPIC_OPT_LATEJOIN_FLAG_ACKTOSRC 0x4000
635 #define LBMR_TOPIC_OPT_LATEJOIN_SZ 24
637 /* LBMR topic queue control option */
638 typedef struct
640 lbm_uint8_t type;
641 lbm_uint8_t len;
642 lbm_uint16_t flags;
643 lbm_uint32_t rcr_idx;
644 } lbmr_topic_opt_umq_rcridx_t;
645 #define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE OFFSETOF(lbmr_topic_opt_umq_rcridx_t, type)
646 #define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE SIZEOF(lbmr_topic_opt_umq_rcridx_t, type)
647 #define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN OFFSETOF(lbmr_topic_opt_umq_rcridx_t, len)
648 #define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN SIZEOF(lbmr_topic_opt_umq_rcridx_t, len)
649 #define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS OFFSETOF(lbmr_topic_opt_umq_rcridx_t, flags)
650 #define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS SIZEOF(lbmr_topic_opt_umq_rcridx_t, flags)
651 #define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_RCR_IDX OFFSETOF(lbmr_topic_opt_umq_rcridx_t, rcr_idx)
652 #define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_RCR_IDX SIZEOF(lbmr_topic_opt_umq_rcridx_t, rcr_idx)
653 #define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T (int) sizeof(lbmr_topic_opt_umq_rcridx_t)
655 #define LBMR_TOPIC_OPT_UMQ_RCRIDX_TYPE 0x05
656 #define LBMR_TOPIC_OPT_UMQ_RCRIDX_SZ 8
657 #define LBMR_TOPIC_OPT_UMQ_RCRIDX_FLAG_IGNORE 0x8000
659 #define LBMR_TOPIC_OPT_UMQ_QINFO_TYPE 0x06
660 #define LBMR_TOPIC_OPT_UMQ_FLAG_IGNORE 0x8000
661 #define LBMR_TOPIC_OPT_UMQ_FLAG_QUEUE 0x4000
662 #define LBMR_TOPIC_OPT_UMQ_FLAG_RCVLISTEN 0x2000
663 #define LBMR_TOPIC_OPT_UMQ_FLAG_CONTROL 0x1000
664 #define LBMR_TOPIC_OPT_UMQ_FLAG_SRCRCVLISTEN 0x0800
665 #define LBMR_TOPIC_OPT_UMQ_FLAG_PARTICIPANTS_ONLY 0x0400
666 #define LBMR_TOPIC_OPT_UMQ_MAX_QNAME_LEN 252
668 /* LBMR topic ULB option */
669 typedef struct
671 lbm_uint8_t type;
672 lbm_uint8_t len;
673 lbm_uint16_t flags;
674 lbm_uint32_t queue_id;
675 lbm_uint8_t regid[8];
676 lbm_uint32_t ulb_src_id;
677 lbm_uint32_t src_ip_addr;
678 lbm_uint16_t src_tcp_port;
679 lbm_uint16_t reserved;
680 } lbmr_topic_opt_ulb_t;
681 #define O_LBMR_TOPIC_OPT_ULB_T_TYPE OFFSETOF(lbmr_topic_opt_ulb_t, type)
682 #define L_LBMR_TOPIC_OPT_ULB_T_TYPE SIZEOF(lbmr_topic_opt_ulb_t, type)
683 #define O_LBMR_TOPIC_OPT_ULB_T_LEN OFFSETOF(lbmr_topic_opt_ulb_t, len)
684 #define L_LBMR_TOPIC_OPT_ULB_T_LEN SIZEOF(lbmr_topic_opt_ulb_t, len)
685 #define O_LBMR_TOPIC_OPT_ULB_T_FLAGS OFFSETOF(lbmr_topic_opt_ulb_t, flags)
686 #define L_LBMR_TOPIC_OPT_ULB_T_FLAGS SIZEOF(lbmr_topic_opt_ulb_t, flags)
687 #define O_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID OFFSETOF(lbmr_topic_opt_ulb_t, queue_id)
688 #define L_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID SIZEOF(lbmr_topic_opt_ulb_t, queue_id)
689 #define O_LBMR_TOPIC_OPT_ULB_T_REGID OFFSETOF(lbmr_topic_opt_ulb_t, regid)
690 #define L_LBMR_TOPIC_OPT_ULB_T_REGID SIZEOF(lbmr_topic_opt_ulb_t, regid)
691 #define O_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID OFFSETOF(lbmr_topic_opt_ulb_t, ulb_src_id)
692 #define L_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID SIZEOF(lbmr_topic_opt_ulb_t, ulb_src_id)
693 #define O_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_ulb_t, src_ip_addr)
694 #define L_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_ulb_t, src_ip_addr)
695 #define O_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_ulb_t, src_tcp_port)
696 #define L_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_ulb_t, src_tcp_port)
697 #define O_LBMR_TOPIC_OPT_ULB_T_RESERVED OFFSETOF(lbmr_topic_opt_ulb_t, reserved)
698 #define L_LBMR_TOPIC_OPT_ULB_T_RESERVED SIZEOF(lbmr_topic_opt_ulb_t, reserved)
699 #define L_LBMR_TOPIC_OPT_ULB_T (int) sizeof(lbmr_topic_opt_ulb_t)
701 #define LBMR_TOPIC_OPT_ULB_TYPE 0x0B
702 #define LBMR_TOPIC_OPT_ULB_FLAG_IGNORE 0x8000
703 #define LBMR_TOPIC_OPT_ULB_SZ 28
705 /* LBMR topic cost option */
706 typedef struct
708 lbm_uint8_t type;
709 lbm_uint8_t len;
710 lbm_uint8_t flags;
711 lbm_uint8_t hop_count;
712 lbm_uint32_t cost;
713 } lbmr_topic_opt_cost_t;
714 #define O_LBMR_TOPIC_OPT_COST_T_TYPE OFFSETOF(lbmr_topic_opt_cost_t, type)
715 #define L_LBMR_TOPIC_OPT_COST_T_TYPE SIZEOF(lbmr_topic_opt_cost_t, type)
716 #define O_LBMR_TOPIC_OPT_COST_T_LEN OFFSETOF(lbmr_topic_opt_cost_t, len)
717 #define L_LBMR_TOPIC_OPT_COST_T_LEN SIZEOF(lbmr_topic_opt_cost_t, len)
718 #define O_LBMR_TOPIC_OPT_COST_T_FLAGS OFFSETOF(lbmr_topic_opt_cost_t, flags)
719 #define L_LBMR_TOPIC_OPT_COST_T_FLAGS SIZEOF(lbmr_topic_opt_cost_t, flags)
720 #define O_LBMR_TOPIC_OPT_COST_T_HOP_COUNT OFFSETOF(lbmr_topic_opt_cost_t, hop_count)
721 #define L_LBMR_TOPIC_OPT_COST_T_HOP_COUNT SIZEOF(lbmr_topic_opt_cost_t, hop_count)
722 #define O_LBMR_TOPIC_OPT_COST_T_COST OFFSETOF(lbmr_topic_opt_cost_t, cost)
723 #define L_LBMR_TOPIC_OPT_COST_T_COST SIZEOF(lbmr_topic_opt_cost_t, cost)
724 #define L_LBMR_TOPIC_OPT_COST_T (int) sizeof(lbmr_topic_opt_cost_t)
726 #define LBMR_TOPIC_OPT_COST_TYPE 0x07
727 #define LBMR_TOPIC_OPT_COST_FLAG_IGNORE 0x80
728 #define LBMR_TOPIC_OPT_COST_SZ 8
730 /* LBMR topic originating transport ID option */
731 typedef struct
733 lbm_uint8_t type;
734 lbm_uint8_t len;
735 lbm_uint16_t flags;
736 lbm_uint8_t originating_transport[LBM_OTID_BLOCK_SZ];
737 } lbmr_topic_opt_otid_t;
738 #define O_LBMR_TOPIC_OPT_OTID_T_TYPE OFFSETOF(lbmr_topic_opt_otid_t, type)
739 #define L_LBMR_TOPIC_OPT_OTID_T_TYPE SIZEOF(lbmr_topic_opt_otid_t, type)
740 #define O_LBMR_TOPIC_OPT_OTID_T_LEN OFFSETOF(lbmr_topic_opt_otid_t, len)
741 #define L_LBMR_TOPIC_OPT_OTID_T_LEN SIZEOF(lbmr_topic_opt_otid_t, len)
742 #define O_LBMR_TOPIC_OPT_OTID_T_FLAGS OFFSETOF(lbmr_topic_opt_otid_t, flags)
743 #define L_LBMR_TOPIC_OPT_OTID_T_FLAGS SIZEOF(lbmr_topic_opt_otid_t, flags)
744 #define O_LBMR_TOPIC_OPT_OTID_T_ORIGINATING_TRANSPORT OFFSETOF(lbmr_topic_opt_otid_t, originating_transport)
745 #define L_LBMR_TOPIC_OPT_OTID_T_ORIGINATING_TRANSPORT SIZEOF(lbmr_topic_opt_otid_t, originating_transport)
746 #define L_LBMR_TOPIC_OPT_OTID_T (int) sizeof(lbmr_topic_opt_otid_t)
748 #define LBMR_TOPIC_OPT_OTID_TYPE 0x08
749 #define LBMR_TOPIC_OPT_OTID_FLAG_IGNORE 0x8000
750 #define LBMR_TOPIC_OPT_OTID_SZ 36
752 /* LBMR topic context instance transport option */
753 typedef struct
755 lbm_uint8_t type;
756 lbm_uint8_t len;
757 lbm_uint8_t flags;
758 lbm_uint8_t res;
759 lbm_uint8_t ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
760 } lbmr_topic_opt_ctxinst_t;
761 #define O_LBMR_TOPIC_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinst_t, type)
762 #define L_LBMR_TOPIC_OPT_CTXINST_T_TYPE SIZEOF(lbmr_topic_opt_ctxinst_t, type)
763 #define O_LBMR_TOPIC_OPT_CTXINST_T_LEN OFFSETOF(lbmr_topic_opt_ctxinst_t, len)
764 #define L_LBMR_TOPIC_OPT_CTXINST_T_LEN SIZEOF(lbmr_topic_opt_ctxinst_t, len)
765 #define O_LBMR_TOPIC_OPT_CTXINST_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinst_t, flags)
766 #define L_LBMR_TOPIC_OPT_CTXINST_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinst_t, flags)
767 #define O_LBMR_TOPIC_OPT_CTXINST_T_RES OFFSETOF(lbmr_topic_opt_ctxinst_t, res)
768 #define L_LBMR_TOPIC_OPT_CTXINST_T_RES SIZEOF(lbmr_topic_opt_ctxinst_t, res)
769 #define O_LBMR_TOPIC_OPT_CTXINST_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinst_t, ctxinst)
770 #define L_LBMR_TOPIC_OPT_CTXINST_T_CTXINST SIZEOF(lbmr_topic_opt_ctxinst_t, ctxinst)
771 #define L_LBMR_TOPIC_OPT_CTXINST_T (int) sizeof(lbmr_topic_opt_ctxinst_t)
773 #define LBMR_TOPIC_OPT_CTXINST_TYPE 0x09
774 #define LBMR_TOPIC_OPT_CTXINST_FLAG_IGNORE 0x80
775 #define LBMR_TOPIC_OPT_CTXINST_SZ 12
777 /* LBMR topic context instance store transport option */
778 typedef struct
780 lbm_uint8_t type;
781 lbm_uint8_t len;
782 lbm_uint8_t flags;
783 lbm_uint8_t idx;
784 lbm_uint8_t ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
785 } lbmr_topic_opt_ctxinsts_t;
786 #define O_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinsts_t, type)
787 #define L_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE SIZEOF(lbmr_topic_opt_ctxinsts_t, type)
788 #define O_LBMR_TOPIC_OPT_CTXINSTS_T_LEN OFFSETOF(lbmr_topic_opt_ctxinsts_t, len)
789 #define L_LBMR_TOPIC_OPT_CTXINSTS_T_LEN SIZEOF(lbmr_topic_opt_ctxinsts_t, len)
790 #define O_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinsts_t, flags)
791 #define L_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinsts_t, flags)
792 #define O_LBMR_TOPIC_OPT_CTXINSTS_T_IDX OFFSETOF(lbmr_topic_opt_ctxinsts_t, idx)
793 #define L_LBMR_TOPIC_OPT_CTXINSTS_T_IDX SIZEOF(lbmr_topic_opt_ctxinsts_t, idx)
794 #define O_LBMR_TOPIC_OPT_CTXINSTS_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinsts_t, ctxinst)
795 #define L_LBMR_TOPIC_OPT_CTXINSTS_T_CTXINST SIZEOF(lbmr_topic_opt_ctxinsts_t, ctxinst)
796 #define L_LBMR_TOPIC_OPT_CTXINSTS_T (int) sizeof(lbmr_topic_opt_ctxinsts_t)
798 #define LBMR_TOPIC_OPT_CTXINSTS_TYPE 0x0A
799 #define LBMR_TOPIC_OPT_CTXINSTS_FLAG_IGNORE 0x80
800 #define LBMR_TOPIC_OPT_CTXINSTS_SZ 12
802 /* LBMR topic context instance queue transport option */
803 typedef struct
805 lbm_uint8_t type;
806 lbm_uint8_t len;
807 lbm_uint8_t flags;
808 lbm_uint8_t idx;
809 lbm_uint8_t ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
810 } lbmr_topic_opt_ctxinstq_t;
811 #define O_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinstq_t, type)
812 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE SIZEOF(lbmr_topic_opt_ctxinstq_t, type)
813 #define O_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN OFFSETOF(lbmr_topic_opt_ctxinstq_t, len)
814 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN SIZEOF(lbmr_topic_opt_ctxinstq_t, len)
815 #define O_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinstq_t, flags)
816 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinstq_t, flags)
817 #define O_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX OFFSETOF(lbmr_topic_opt_ctxinstq_t, idx)
818 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX SIZEOF(lbmr_topic_opt_ctxinstq_t, idx)
819 #define O_LBMR_TOPIC_OPT_CTXINSTQ_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinstq_t, ctxinst)
820 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T_CTXINST SIZEOF(lbmr_topic_opt_ctxinstq_t, ctxinst)
821 #define L_LBMR_TOPIC_OPT_CTXINSTQ_T (int) sizeof(lbmr_topic_opt_ctxinstq_t)
823 #define LBMR_TOPIC_OPT_CTXINSTQ_TYPE 0x0C
824 #define LBMR_TOPIC_OPT_CTXINSTQ_FLAG_IGNORE 0x80
825 #define LBMR_TOPIC_OPT_CTXINSTQ_SZ 12
827 /* LBMR topic domain ID option */
828 typedef struct
830 lbm_uint8_t type;
831 lbm_uint8_t len;
832 lbm_uint16_t flags;
833 lbm_uint32_t domain_id;
834 } lbmr_topic_opt_domain_id_t;
835 #define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE OFFSETOF(lbmr_topic_opt_domain_id_t, type)
836 #define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE SIZEOF(lbmr_topic_opt_domain_id_t, type)
837 #define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN OFFSETOF(lbmr_topic_opt_domain_id_t, len)
838 #define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN SIZEOF(lbmr_topic_opt_domain_id_t, len)
839 #define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS OFFSETOF(lbmr_topic_opt_domain_id_t, flags)
840 #define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS SIZEOF(lbmr_topic_opt_domain_id_t, flags)
841 #define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_DOMAIN_ID OFFSETOF(lbmr_topic_opt_domain_id_t, domain_id)
842 #define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_DOMAIN_ID SIZEOF(lbmr_topic_opt_domain_id_t, domain_id)
843 #define L_LBMR_TOPIC_OPT_DOMAIN_ID_T (int) sizeof(lbmr_topic_opt_domain_id_t)
845 #define LBMR_TOPIC_OPT_DOMAIN_ID_TYPE 0x0D
846 #define LBMR_TOPIC_OPT_DOMAIN_ID_FLAG_IGNORE 0x8000
847 #define LBMR_TOPIC_OPT_DOMAIN_ID_SZ 8
849 /* LBMR topic extended functionality option */
850 typedef struct
852 lbm_uint8_t type;
853 lbm_uint8_t len;
854 lbm_uint16_t flags;
855 lbm_uint16_t src_tcp_port;
856 lbm_uint16_t reserved;
857 lbm_uint32_t src_ip_addr;
858 lbm_uint32_t functionality_flags;
859 } lbmr_topic_opt_exfunc_t;
860 #define O_LBMR_TOPIC_OPT_EXFUNC_T_TYPE OFFSETOF(lbmr_topic_opt_exfunc_t, type)
861 #define L_LBMR_TOPIC_OPT_EXFUNC_T_TYPE SIZEOF(lbmr_topic_opt_exfunc_t, type)
862 #define O_LBMR_TOPIC_OPT_EXFUNC_T_LEN OFFSETOF(lbmr_topic_opt_exfunc_t, len)
863 #define L_LBMR_TOPIC_OPT_EXFUNC_T_LEN SIZEOF(lbmr_topic_opt_exfunc_t, len)
864 #define O_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS OFFSETOF(lbmr_topic_opt_exfunc_t, flags)
865 #define L_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS SIZEOF(lbmr_topic_opt_exfunc_t, flags)
866 #define O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_exfunc_t, src_tcp_port)
867 #define L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_exfunc_t, src_tcp_port)
868 #define O_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED OFFSETOF(lbmr_topic_opt_exfunc_t, reserved)
869 #define L_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED SIZEOF(lbmr_topic_opt_exfunc_t, reserved)
870 #define O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_exfunc_t, src_ip_addr)
871 #define L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_exfunc_t, src_ip_addr)
872 #define O_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS OFFSETOF(lbmr_topic_opt_exfunc_t, functionality_flags)
873 #define L_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS SIZEOF(lbmr_topic_opt_exfunc_t, functionality_flags)
874 #define L_LBMR_TOPIC_OPT_EXFUNC_T (int) sizeof(lbmr_topic_opt_exfunc_t)
876 #define LBMR_TOPIC_OPT_EXFUNC_TYPE 0x0E
877 #define LBMR_TOPIC_OPT_EXFUNC_FLAG_IGNORE 0x8000
878 #define LBMR_TOPIC_OPT_EXFUNC_SZ 16
880 /* Transports */
881 #define LBMR_TRANSPORT_TCP 0x00
882 #define LBMR_TRANSPORT_LBTRU 0x01
883 #define LBMR_TRANSPORT_TCP6 0x02
884 #define LBMR_TRANSPORT_LBTSMX 0x4
885 #define LBMR_TRANSPORT_LBTRM 0x10
886 #define LBMR_TRANSPORT_LBTIPC 0x40
887 #define LBMR_TRANSPORT_LBTRDMA 0x20
888 #define LBMR_TRANSPORT_PGM 0x11
890 #define LBMR_TRANSPORT_OPTION_MASK 0x80
892 /* LBMR context info */
893 typedef struct
895 lbm_uint8_t ver_type;
896 lbm_uint8_t ext_type;
897 lbm_uint8_t len;
898 lbm_uint8_t hop_count;
899 lbm_uint16_t flags;
900 lbm_uint16_t port;
901 lbm_uint32_t ip;
902 lbm_uint8_t instance[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
903 } lbmr_ctxinfo_t;
904 #define O_LBMR_CTXINFO_T_VER_TYPE OFFSETOF(lbmr_ctxinfo_t, ver_type)
905 #define L_LBMR_CTXINFO_T_VER_TYPE SIZEOF(lbmr_ctxinfo_t, ver_type)
906 #define O_LBMR_CTXINFO_T_EXT_TYPE OFFSETOF(lbmr_ctxinfo_t, ext_type)
907 #define L_LBMR_CTXINFO_T_EXT_TYPE SIZEOF(lbmr_ctxinfo_t, ext_type)
908 #define O_LBMR_CTXINFO_T_LEN OFFSETOF(lbmr_ctxinfo_t, len)
909 #define L_LBMR_CTXINFO_T_LEN SIZEOF(lbmr_ctxinfo_t, len)
910 #define O_LBMR_CTXINFO_T_HOP_COUNT OFFSETOF(lbmr_ctxinfo_t, hop_count)
911 #define L_LBMR_CTXINFO_T_HOP_COUNT SIZEOF(lbmr_ctxinfo_t, hop_count)
912 #define O_LBMR_CTXINFO_T_FLAGS OFFSETOF(lbmr_ctxinfo_t, flags)
913 #define L_LBMR_CTXINFO_T_FLAGS SIZEOF(lbmr_ctxinfo_t, flags)
914 #define O_LBMR_CTXINFO_T_PORT OFFSETOF(lbmr_ctxinfo_t, port)
915 #define L_LBMR_CTXINFO_T_PORT SIZEOF(lbmr_ctxinfo_t, port)
916 #define O_LBMR_CTXINFO_T_IP OFFSETOF(lbmr_ctxinfo_t, ip)
917 #define L_LBMR_CTXINFO_T_IP SIZEOF(lbmr_ctxinfo_t, ip)
918 #define O_LBMR_CTXINFO_T_INSTANCE OFFSETOF(lbmr_ctxinfo_t, instance)
919 #define L_LBMR_CTXINFO_T_INSTANCE SIZEOF(lbmr_ctxinfo_t, instance)
920 #define L_LBMR_CTXINFO_T (int) sizeof(lbmr_ctxinfo_t)
922 #define LBMR_CTXINFO_QUERY_FLAG 0x8000
923 #define LBMR_CTXINFO_IP_FLAG 0x4000
924 #define LBMR_CTXINFO_INSTANCE_FLAG 0x2000
925 #define LBMR_CTXINFO_TNWG_SRC_FLAG 0x1000
926 #define LBMR_CTXINFO_TNWG_RCV_FLAG 0x0800
927 #define LBMR_CTXINFO_PROXY_FLAG 0x0400
928 #define LBMR_CTXINFO_NAME_FLAG 0x0001
930 /* LBMR topic resolution request */
931 typedef struct
933 lbm_uint8_t ver_type;
934 lbm_uint8_t ext_type;
935 lbm_uint16_t flags;
936 } lbmr_topic_res_request_t;
937 #define O_LBMR_TOPIC_RES_REQUEST_T_VER_TYPE OFFSETOF(lbmr_topic_res_request_t, ver_type)
938 #define L_LBMR_TOPIC_RES_REQUEST_T_VER_TYPE SIZEOF(lbmr_topic_res_request_t, ver_type)
939 #define O_LBMR_TOPIC_RES_REQUEST_T_EXT_TYPE OFFSETOF(lbmr_topic_res_request_t, ext_type)
940 #define L_LBMR_TOPIC_RES_REQUEST_T_EXT_TYPE SIZEOF(lbmr_topic_res_request_t, ext_type)
941 #define O_LBMR_TOPIC_RES_REQUEST_T_FLAGS OFFSETOF(lbmr_topic_res_request_t, flags)
942 #define L_LBMR_TOPIC_RES_REQUEST_T_FLAGS SIZEOF(lbmr_topic_res_request_t, flags)
943 #define L_LBMR_TOPIC_RES_REQUEST_T (int) sizeof(lbmr_topic_res_request_t)
945 #define LBM_TOPIC_RES_REQUEST_GW_REMOTE_INTEREST 0x40
946 #define LBM_TOPIC_RES_REQUEST_CONTEXT_QUERY 0x20
947 #define LBM_TOPIC_RES_REQUEST_CONTEXT_ADVERTISEMENT 0x10
948 #define LBM_TOPIC_RES_REQUEST_RESERVED1 0x08
949 #define LBM_TOPIC_RES_REQUEST_ADVERTISEMENT 0x04
950 #define LBM_TOPIC_RES_REQUEST_QUERY 0x02
951 #define LBM_TOPIC_RES_REQUEST_WILDCARD_QUERY 0x01
953 /* LBMR topic management block */
954 typedef struct
956 lbm_uint16_t len;
957 lbm_uint16_t tmrs;
958 } lbmr_tmb_t;
959 #define O_LBMR_TMB_T_LEN OFFSETOF(lbmr_tmb_t, len)
960 #define L_LBMR_TMB_T_LEN SIZEOF(lbmr_tmb_t, len)
961 #define O_LBMR_TMB_T_TMRS OFFSETOF(lbmr_tmb_t, tmrs)
962 #define L_LBMR_TMB_T_TMRS SIZEOF(lbmr_tmb_t, tmrs)
963 #define L_LBMR_TMB_T (int) sizeof(lbmr_tmb_t)
965 /* LBMR topic management record */
966 typedef struct
968 lbm_uint16_t len;
969 lbm_uint8_t type;
970 lbm_uint8_t flags;
971 } lbmr_tmr_t;
972 #define O_LBMR_TMR_T_LEN OFFSETOF(lbmr_tmr_t, len)
973 #define L_LBMR_TMR_T_LEN SIZEOF(lbmr_tmr_t, len)
974 #define O_LBMR_TMR_T_TYPE OFFSETOF(lbmr_tmr_t, type)
975 #define L_LBMR_TMR_T_TYPE SIZEOF(lbmr_tmr_t, type)
976 #define O_LBMR_TMR_T_FLAGS OFFSETOF(lbmr_tmr_t, flags)
977 #define L_LBMR_TMR_T_FLAGS SIZEOF(lbmr_tmr_t, flags)
978 #define L_LBMR_TMR_T (int) sizeof(lbmr_tmr_t)
980 #define LBMR_TMR_LEAVE_TOPIC 0x00
981 #define LBMR_TMR_TOPIC_USE 0x01
983 #define LBMR_TMR_FLAG_RESPONSE 0x80
984 #define LBMR_TMR_FLAG_WILDCARD_PCRE 0x40
985 #define LBMR_TMR_FLAG_WILDCARD_REGEX 0x20
986 #define LBMR_TMR_FLAG_WILDCARD_MASK (LBMR_TMR_FLAG_WILDCARD_PCRE | LBMR_TMR_FLAG_WILDCARD_REGEX)
988 /* LBMR queue information record */
989 typedef struct
991 lbm_uint32_t queue_id;
992 lbm_uint32_t queue_ver;
993 lbm_uint32_t queue_prev_ver;
994 lbm_uint16_t grp_blks;
995 lbm_uint16_t queue_blks;
996 } lbmr_qir_t;
997 #define O_LBMR_QIR_T_QUEUE_ID OFFSETOF(lbmr_qir_t, queue_id)
998 #define L_LBMR_QIR_T_QUEUE_ID SIZEOF(lbmr_qir_t, queue_id)
999 #define O_LBMR_QIR_T_QUEUE_VER OFFSETOF(lbmr_qir_t, queue_ver)
1000 #define L_LBMR_QIR_T_QUEUE_VER SIZEOF(lbmr_qir_t, queue_ver)
1001 #define O_LBMR_QIR_T_QUEUE_PREV_VER OFFSETOF(lbmr_qir_t, queue_prev_ver)
1002 #define L_LBMR_QIR_T_QUEUE_PREV_VER SIZEOF(lbmr_qir_t, queue_prev_ver)
1003 #define O_LBMR_QIR_T_GRP_BLKS OFFSETOF(lbmr_qir_t, grp_blks)
1004 #define L_LBMR_QIR_T_GRP_BLKS SIZEOF(lbmr_qir_t, grp_blks)
1005 #define O_LBMR_QIR_T_QUEUE_BLKS OFFSETOF(lbmr_qir_t, queue_blks)
1006 #define L_LBMR_QIR_T_QUEUE_BLKS SIZEOF(lbmr_qir_t, queue_blks)
1007 #define L_LBMR_QIR_T (int) sizeof(lbmr_qir_t)
1009 #define LBMR_QIR_OPTIONS 0x8000
1010 #define LBMR_QIR_GRP_BLOCKS_MASK 0x7fff
1012 /* LBMR queue group block record */
1013 typedef struct
1015 lbm_uint16_t grp_idx;
1016 lbm_uint16_t grp_sz;
1017 } lbmr_qir_grp_blk_t;
1018 #define O_LBMR_QIR_GRP_BLK_T_GRP_IDX OFFSETOF(lbmr_qir_grp_blk_t, grp_idx)
1019 #define L_LBMR_QIR_GRP_BLK_T_GRP_IDX SIZEOF(lbmr_qir_grp_blk_t, grp_idx)
1020 #define O_LBMR_QIR_GRP_BLK_T_GRP_SZ OFFSETOF(lbmr_qir_grp_blk_t, grp_sz)
1021 #define L_LBMR_QIR_GRP_BLK_T_GRP_SZ SIZEOF(lbmr_qir_grp_blk_t, grp_sz)
1022 #define L_LBMR_QIR_GRP_BLK_T (int) sizeof(lbmr_qir_grp_blk_t)
1024 /* LBMR queue block record */
1025 typedef struct
1027 lbm_uint32_t ip;
1028 lbm_uint16_t port;
1029 lbm_uint16_t idx;
1030 lbm_uint16_t grp_idx;
1031 lbm_uint16_t reserved;
1032 } lbmr_qir_queue_blk_t;
1033 #define O_LBMR_QIR_QUEUE_BLK_T_IP OFFSETOF(lbmr_qir_queue_blk_t, ip)
1034 #define L_LBMR_QIR_QUEUE_BLK_T_IP SIZEOF(lbmr_qir_queue_blk_t, ip)
1035 #define O_LBMR_QIR_QUEUE_BLK_T_PORT OFFSETOF(lbmr_qir_queue_blk_t, port)
1036 #define L_LBMR_QIR_QUEUE_BLK_T_PORT SIZEOF(lbmr_qir_queue_blk_t, port)
1037 #define O_LBMR_QIR_QUEUE_BLK_T_IDX OFFSETOF(lbmr_qir_queue_blk_t, idx)
1038 #define L_LBMR_QIR_QUEUE_BLK_T_IDX SIZEOF(lbmr_qir_queue_blk_t, idx)
1039 #define O_LBMR_QIR_QUEUE_BLK_T_GRP_IDX OFFSETOF(lbmr_qir_queue_blk_t, grp_idx)
1040 #define L_LBMR_QIR_QUEUE_BLK_T_GRP_IDX SIZEOF(lbmr_qir_queue_blk_t, grp_idx)
1041 #define O_LBMR_QIR_QUEUE_BLK_T_RESERVED OFFSETOF(lbmr_qir_queue_blk_t, reserved)
1042 #define L_LBMR_QIR_QUEUE_BLK_T_RESERVED SIZEOF(lbmr_qir_queue_blk_t, reserved)
1043 #define L_LBMR_QIR_QUEUE_BLK_T (int) sizeof(lbmr_qir_queue_blk_t)
1045 #define LBMR_QIR_QUEUE_BLK_FLAG_MASTER 0x8000
1047 /* LBMR packet option header */
1048 typedef struct
1050 lbm_uint8_t type;
1051 lbm_uint8_t len;
1052 lbm_uint16_t flags;
1053 } lbmr_lbmr_opt_hdr_t;
1054 #define O_LBMR_LBMR_OPT_HDR_T_TYPE OFFSETOF(lbmr_lbmr_opt_hdr_t, type)
1055 #define L_LBMR_LBMR_OPT_HDR_T_TYPE SIZEOF(lbmr_lbmr_opt_hdr_t, type)
1056 #define O_LBMR_LBMR_OPT_HDR_T_LEN OFFSETOF(lbmr_lbmr_opt_hdr_t, len)
1057 #define L_LBMR_LBMR_OPT_HDR_T_LEN SIZEOF(lbmr_lbmr_opt_hdr_t, len)
1058 #define O_LBMR_LBMR_OPT_HDR_T_FLAGS OFFSETOF(lbmr_lbmr_opt_hdr_t, flags)
1059 #define L_LBMR_LBMR_OPT_HDR_T_FLAGS SIZEOF(lbmr_lbmr_opt_hdr_t, flags)
1060 #define L_LBMR_LBMR_OPT_HDR_T (int) sizeof(lbmr_lbmr_opt_hdr_t)
1062 #define LBMR_LBMR_OPT_HDR_FLAG_IGNORE 0x8000
1063 #define LBMR_LBMR_OPT_HDR_FLAG_VIRAL 0x0001
1065 /* LBMR packet option length header */
1066 typedef struct
1068 lbm_uint8_t type;
1069 lbm_uint8_t len;
1070 lbm_uint16_t total_len;
1071 } lbmr_lbmr_opt_len_t;
1072 #define O_LBMR_LBMR_OPT_LEN_T_TYPE OFFSETOF(lbmr_lbmr_opt_len_t, type)
1073 #define L_LBMR_LBMR_OPT_LEN_T_TYPE SIZEOF(lbmr_lbmr_opt_len_t, type)
1074 #define O_LBMR_LBMR_OPT_LEN_T_LEN OFFSETOF(lbmr_lbmr_opt_len_t, len)
1075 #define L_LBMR_LBMR_OPT_LEN_T_LEN SIZEOF(lbmr_lbmr_opt_len_t, len)
1076 #define O_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN OFFSETOF(lbmr_lbmr_opt_len_t, total_len)
1077 #define L_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN SIZEOF(lbmr_lbmr_opt_len_t, total_len)
1078 #define L_LBMR_LBMR_OPT_LEN_T (int) sizeof(lbmr_lbmr_opt_len_t)
1080 #define LBMR_LBMR_OPT_LEN_TYPE 0x80
1082 /* LBMR packet option source ID header */
1083 typedef struct
1085 lbm_uint8_t type;
1086 lbm_uint8_t len;
1087 lbm_uint16_t flags;
1088 lbm_uint8_t src_id[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
1089 } lbmr_lbmr_opt_src_id_t;
1090 #define O_LBMR_LBMR_OPT_SRC_ID_T_TYPE OFFSETOF(lbmr_lbmr_opt_src_id_t, type)
1091 #define L_LBMR_LBMR_OPT_SRC_ID_T_TYPE SIZEOF(lbmr_lbmr_opt_src_id_t, type)
1092 #define O_LBMR_LBMR_OPT_SRC_ID_T_LEN OFFSETOF(lbmr_lbmr_opt_src_id_t, len)
1093 #define L_LBMR_LBMR_OPT_SRC_ID_T_LEN SIZEOF(lbmr_lbmr_opt_src_id_t, len)
1094 #define O_LBMR_LBMR_OPT_SRC_ID_T_FLAGS OFFSETOF(lbmr_lbmr_opt_src_id_t, flags)
1095 #define L_LBMR_LBMR_OPT_SRC_ID_T_FLAGS SIZEOF(lbmr_lbmr_opt_src_id_t, flags)
1096 #define O_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID OFFSETOF(lbmr_lbmr_opt_src_id_t, src_id)
1097 #define L_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID SIZEOF(lbmr_lbmr_opt_src_id_t, src_id)
1098 #define L_LBMR_LBMR_OPT_SRC_ID_T (int) sizeof(lbmr_lbmr_opt_src_id_t)
1100 #define LBMR_LBMR_OPT_SRC_ID_TYPE 0x81
1101 #define LBMR_LBMR_OPT_SRC_ID_FLAG_IGNORE 0x8000
1103 /* LBMR packet option source type header */
1104 typedef struct
1106 lbm_uint8_t type;
1107 lbm_uint8_t len;
1108 lbm_uint8_t flags;
1109 lbm_uint8_t src_type;
1110 } lbmr_lbmr_opt_src_type_t;
1111 #define O_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE OFFSETOF(lbmr_lbmr_opt_src_type_t, type)
1112 #define L_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE SIZEOF(lbmr_lbmr_opt_src_type_t, type)
1113 #define O_LBMR_LBMR_OPT_SRC_TYPE_T_LEN OFFSETOF(lbmr_lbmr_opt_src_type_t, len)
1114 #define L_LBMR_LBMR_OPT_SRC_TYPE_T_LEN SIZEOF(lbmr_lbmr_opt_src_type_t, len)
1115 #define O_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS OFFSETOF(lbmr_lbmr_opt_src_type_t, flags)
1116 #define L_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS SIZEOF(lbmr_lbmr_opt_src_type_t, flags)
1117 #define O_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE OFFSETOF(lbmr_lbmr_opt_src_type_t, src_type)
1118 #define L_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE SIZEOF(lbmr_lbmr_opt_src_type_t, src_type)
1119 #define L_LBMR_LBMR_OPT_SRC_TYPE_T (int) sizeof(lbmr_lbmr_opt_src_type_t)
1121 #define LBMR_LBMR_OPT_SRC_TYPE_TYPE 0x82
1122 #define LBMR_LBMR_OPT_SRC_TYPE_SZ 4
1123 #define LBMR_LBMR_OPT_SRC_TYPE_FLAG_IGNORE 0x80
1125 #define LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_APPLICATION 0
1126 #define LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_TNWGD 1
1127 #define LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_STORE 2
1129 /* LBMR packet option version header */
1130 typedef struct
1132 lbm_uint8_t type;
1133 lbm_uint8_t len;
1134 lbm_uint16_t flags;
1135 lbm_uint32_t version;
1136 } lbmr_lbmr_opt_version_t;
1137 #define O_LBMR_LBMR_OPT_VERSION_T_TYPE OFFSETOF(lbmr_lbmr_opt_version_t, type)
1138 #define L_LBMR_LBMR_OPT_VERSION_T_TYPE SIZEOF(lbmr_lbmr_opt_version_t, type)
1139 #define O_LBMR_LBMR_OPT_VERSION_T_LEN OFFSETOF(lbmr_lbmr_opt_version_t, len)
1140 #define L_LBMR_LBMR_OPT_VERSION_T_LEN SIZEOF(lbmr_lbmr_opt_version_t, len)
1141 #define O_LBMR_LBMR_OPT_VERSION_T_FLAGS OFFSETOF(lbmr_lbmr_opt_version_t, flags)
1142 #define L_LBMR_LBMR_OPT_VERSION_T_FLAGS SIZEOF(lbmr_lbmr_opt_version_t, flags)
1143 #define O_LBMR_LBMR_OPT_VERSION_T_VERSION OFFSETOF(lbmr_lbmr_opt_version_t, version)
1144 #define L_LBMR_LBMR_OPT_VERSION_T_VERSION SIZEOF(lbmr_lbmr_opt_version_t, version)
1145 #define L_LBMR_LBMR_OPT_VERSION_T (int) sizeof(lbmr_lbmr_opt_version_t)
1147 #define LBMR_LBMR_OPT_VERSION_TYPE 0x83
1148 #define LBMR_LBMR_OPT_VERSIION_SZ 8
1149 #define LBMR_LBMR_OPT_VERSION_FLAG_IGNORE 0x8000
1150 #define LBMR_LBMR_OPT_VERSION_FLAG_UME 0x0001
1151 #define LBMR_LBMR_OPT_VERSION_FLAG_UMQ 0x0002
1153 /* LBMR packet option domain header */
1154 typedef struct
1156 lbm_uint8_t type;
1157 lbm_uint8_t len;
1158 lbm_uint16_t flags;
1159 lbm_uint32_t local_domain_id;
1160 } lbmr_lbmr_opt_local_domain_t;
1161 #define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE OFFSETOF(lbmr_lbmr_opt_local_domain_t, type)
1162 #define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE SIZEOF(lbmr_lbmr_opt_local_domain_t, type)
1163 #define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN OFFSETOF(lbmr_lbmr_opt_local_domain_t, len)
1164 #define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN SIZEOF(lbmr_lbmr_opt_local_domain_t, len)
1165 #define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS OFFSETOF(lbmr_lbmr_opt_local_domain_t, flags)
1166 #define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS SIZEOF(lbmr_lbmr_opt_local_domain_t, flags)
1167 #define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID OFFSETOF(lbmr_lbmr_opt_local_domain_t, local_domain_id)
1168 #define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID SIZEOF(lbmr_lbmr_opt_local_domain_t, local_domain_id)
1169 #define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T (int) sizeof(lbmr_lbmr_opt_local_domain_t)
1171 #define LBMR_LBMR_OPT_LOCAL_DOMAIN_TYPE 0x84
1172 #define LBMR_LBMR_OPT_LOCAL_DOMAIN_SZ 8
1173 #define LBMR_LBMR_OPT_LOCAL_DOMAIN_FLAG_IGNORE 0x8000
1175 /* LBMR (extended) proxy source election record */
1176 typedef struct
1178 lbm_uint8_t ver_type;
1179 lbm_uint8_t ext_type;
1180 lbm_uint16_t dep_type;
1181 lbm_uint16_t len;
1182 lbm_uint16_t flags;
1183 lbm_uint32_t source_ip;
1184 lbm_uint32_t store_ip;
1185 lbm_uint32_t transport_idx;
1186 lbm_uint32_t topic_idx;
1187 lbm_uint16_t source_port;
1188 lbm_uint16_t store_port;
1189 } lbmr_pser_t;
1190 #define O_LBMR_PSER_T_VER_TYPE OFFSETOF(lbmr_pser_t, ver_type)
1191 #define L_LBMR_PSER_T_VER_TYPE SIZEOF(lbmr_pser_t, ver_type)
1192 #define O_LBMR_PSER_T_EXT_TYPE OFFSETOF(lbmr_pser_t, ext_type)
1193 #define L_LBMR_PSER_T_EXT_TYPE SIZEOF(lbmr_pser_t, ext_type)
1194 #define O_LBMR_PSER_T_DEP_TYPE OFFSETOF(lbmr_pser_t, dep_type)
1195 #define L_LBMR_PSER_T_DEP_TYPE SIZEOF(lbmr_pser_t, dep_type)
1196 #define O_LBMR_PSER_T_LEN OFFSETOF(lbmr_pser_t, len)
1197 #define L_LBMR_PSER_T_LEN SIZEOF(lbmr_pser_t, len)
1198 #define O_LBMR_PSER_T_FLAGS OFFSETOF(lbmr_pser_t, flags)
1199 #define L_LBMR_PSER_T_FLAGS SIZEOF(lbmr_pser_t, flags)
1200 #define O_LBMR_PSER_T_SOURCE_IP OFFSETOF(lbmr_pser_t, source_ip)
1201 #define L_LBMR_PSER_T_SOURCE_IP SIZEOF(lbmr_pser_t, source_ip)
1202 #define O_LBMR_PSER_T_STORE_IP OFFSETOF(lbmr_pser_t, store_ip)
1203 #define L_LBMR_PSER_T_STORE_IP SIZEOF(lbmr_pser_t, store_ip)
1204 #define O_LBMR_PSER_T_TRANSPORT_IDX OFFSETOF(lbmr_pser_t, transport_idx)
1205 #define L_LBMR_PSER_T_TRANSPORT_IDX SIZEOF(lbmr_pser_t, transport_idx)
1206 #define O_LBMR_PSER_T_TOPIC_IDX OFFSETOF(lbmr_pser_t, topic_idx)
1207 #define L_LBMR_PSER_T_TOPIC_IDX SIZEOF(lbmr_pser_t, topic_idx)
1208 #define O_LBMR_PSER_T_SOURCE_PORT OFFSETOF(lbmr_pser_t, source_port)
1209 #define L_LBMR_PSER_T_SOURCE_PORT SIZEOF(lbmr_pser_t, source_port)
1210 #define O_LBMR_PSER_T_STORE_PORT OFFSETOF(lbmr_pser_t, store_port)
1211 #define L_LBMR_PSER_T_STORE_PORT SIZEOF(lbmr_pser_t, store_port)
1212 #define O_LBMR_PSER_T_TOPIC (O_LBMR_PSER_T_STORE_PORT + L_LBMR_PSER_T_STORE_PORT)
1213 #define L_LBMR_PSER_T (int) sizeof(lbmr_pser_t)
1215 #define LBMR_PSER_OPT_FLAG 0x8000
1216 #define LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT_DEP_ELECT 0
1217 #define LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT_DEP_REELECT 1
1219 typedef struct
1221 lbm_uint16_t type;
1222 lbm_uint16_t optlen;
1223 } lbmr_pser_optlen_t;
1224 #define O_LBMR_PSER_OPTLEN_T_TYPE OFFSETOF(lbmr_pser_optlen_t, type)
1225 #define L_LBMR_PSER_OPTLEN_T_TYPE SIZEOF(lbmr_pser_optlen_t, type)
1226 #define O_LBMR_PSER_OPTLEN_T_OPTLEN OFFSETOF(lbmr_pser_optlen_t, optlen)
1227 #define L_LBMR_PSER_OPTLEN_T_OPTLEN SIZEOF(lbmr_pser_optlen_t, optlen)
1228 #define L_LBMR_PSER_OPTLEN_T (int) sizeof(lbmr_pser_optlen_t)
1230 typedef struct
1232 lbm_uint8_t len;
1233 lbm_uint8_t type;
1234 } lbmr_pser_opt_hdr_t;
1235 #define O_LBMR_PSER_OPT_HDR_T_LEN OFFSETOF(lbmr_pser_opt_hdr_t, len)
1236 #define L_LBMR_PSER_OPT_HDR_T_LEN SIZEOF(lbmr_pser_opt_hdr_t, len)
1237 #define O_LBMR_PSER_OPT_HDR_T_TYPE OFFSETOF(lbmr_pser_opt_hdr_t, type)
1238 #define L_LBMR_PSER_OPT_HDR_T_TYPE SIZEOF(lbmr_pser_opt_hdr_t, type)
1239 #define L_LBMR_PSER_OPT_HDR_T (int) sizeof(lbmr_pser_opt_hdr_t)
1241 #define LBMR_PSER_OPT_SRC_CTXINST_TYPE 0x00
1242 #define LBMR_PSER_OPT_STORE_CTXINST_TYPE 0x01
1244 typedef struct
1246 lbm_uint8_t len;
1247 lbm_uint8_t type;
1248 lbm_uint8_t ctxinst[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
1249 } lbmr_pser_opt_ctxinst_t;
1250 #define O_LBMR_PSER_OPT_CTXINST_T_LEN OFFSETOF(lbmr_pser_opt_ctxinst_t, len)
1251 #define L_LBMR_PSER_OPT_CTXINST_T_LEN SIZEOF(lbmr_pser_opt_ctxinst_t, len)
1252 #define O_LBMR_PSER_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_pser_opt_ctxinst_t, type)
1253 #define L_LBMR_PSER_OPT_CTXINST_T_TYPE SIZEOF(lbmr_pser_opt_ctxinst_t, type)
1254 #define O_LBMR_PSER_OPT_CTXINST_T_CTXINST OFFSETOF(lbmr_pser_opt_ctxinst_t, ctxinst)
1255 #define L_LBMR_PSER_OPT_CTXINST_T_CTXINST SIZEOF(lbmr_pser_opt_ctxinst_t, ctxinst)
1256 #define L_LBMR_PSER_OPT_CTXINST_T (int) sizeof(lbmr_pser_opt_ctxinst_t)
1258 /* LBMR (extended) gateway message */
1259 typedef struct
1261 lbm_uint8_t ver_type;
1262 lbm_uint8_t ext_type;
1263 lbm_uint16_t len;
1264 lbm_uint16_t type;
1265 lbm_uint16_t reserved;
1266 } lbmr_tnwg_t;
1267 #define O_LBMR_TNWG_T_VER_TYPE OFFSETOF(lbmr_tnwg_t, ver_type)
1268 #define L_LBMR_TNWG_T_VER_TYPE SIZEOF(lbmr_tnwg_t, ver_type)
1269 #define O_LBMR_TNWG_T_EXT_TYPE OFFSETOF(lbmr_tnwg_t, ext_type)
1270 #define L_LBMR_TNWG_T_EXT_TYPE SIZEOF(lbmr_tnwg_t, ext_type)
1271 #define O_LBMR_TNWG_T_LEN OFFSETOF(lbmr_tnwg_t, len)
1272 #define L_LBMR_TNWG_T_LEN SIZEOF(lbmr_tnwg_t, len)
1273 #define O_LBMR_TNWG_T_TYPE OFFSETOF(lbmr_tnwg_t, type)
1274 #define L_LBMR_TNWG_T_TYPE SIZEOF(lbmr_tnwg_t, type)
1275 #define O_LBMR_TNWG_T_RESERVED OFFSETOF(lbmr_tnwg_t, reserved)
1276 #define L_LBMR_TNWG_T_RESERVED SIZEOF(lbmr_tnwg_t, reserved)
1277 #define L_LBMR_TNWG_T (int) sizeof(lbmr_tnwg_t)
1279 #define LBMR_TNWG_TYPE_INTEREST 0x0000
1280 #define LBMR_TNWG_TYPE_CTXINFO 0x0001
1281 #define LBMR_TNWG_TYPE_TRREQ 0x0002
1283 /* LBMR (extended) gateway message - interest header */
1284 typedef struct
1286 lbm_uint16_t len;
1287 lbm_uint16_t count;
1288 } lbmr_tnwg_interest_t;
1289 #define O_LBMR_TNWG_INTEREST_T_LEN OFFSETOF(lbmr_tnwg_interest_t, len)
1290 #define L_LBMR_TNWG_INTEREST_T_LEN SIZEOF(lbmr_tnwg_interest_t, len)
1291 #define O_LBMR_TNWG_INTEREST_T_COUNT OFFSETOF(lbmr_tnwg_interest_t, count)
1292 #define L_LBMR_TNWG_INTEREST_T_COUNT SIZEOF(lbmr_tnwg_interest_t, count)
1293 #define L_LBMR_TNWG_INTEREST_T (int) sizeof(lbmr_tnwg_interest_t)
1295 /* LBMR (extended) gateway message - interest record */
1296 typedef struct
1298 lbm_uint16_t len;
1299 lbm_uint8_t flags;
1300 lbm_uint8_t pattype;
1301 lbm_uint32_t domain_id;
1302 } lbmr_tnwg_interest_rec_t;
1303 #define O_LBMR_TNWG_INTEREST_REC_T_LEN OFFSETOF(lbmr_tnwg_interest_rec_t, len)
1304 #define L_LBMR_TNWG_INTEREST_REC_T_LEN SIZEOF(lbmr_tnwg_interest_rec_t, len)
1305 #define O_LBMR_TNWG_INTEREST_REC_T_FLAGS OFFSETOF(lbmr_tnwg_interest_rec_t, flags)
1306 #define L_LBMR_TNWG_INTEREST_REC_T_FLAGS SIZEOF(lbmr_tnwg_interest_rec_t, flags)
1307 #define O_LBMR_TNWG_INTEREST_REC_T_PATTYPE OFFSETOF(lbmr_tnwg_interest_rec_t, pattype)
1308 #define L_LBMR_TNWG_INTEREST_REC_T_PATTYPE SIZEOF(lbmr_tnwg_interest_rec_t, pattype)
1309 #define O_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID OFFSETOF(lbmr_tnwg_interest_rec_t, domain_id)
1310 #define L_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID SIZEOF(lbmr_tnwg_interest_rec_t, domain_id)
1311 #define L_LBMR_TNWG_INTEREST_REC_T (int) sizeof(lbmr_tnwg_interest_rec_t)
1313 #define LBMR_TNWG_INTEREST_REC_PATTERN_FLAG 0x80
1314 #define LBMR_TNWG_INTEREST_REC_CANCEL_FLAG 0x40
1315 #define LBMR_TNWG_INTEREST_REC_REFRESH_FLAG 0x20
1317 /* LBMR (extended) gateway message - ctxinfo header */
1318 typedef struct
1320 lbm_uint16_t len;
1321 lbm_uint8_t hop_count;
1322 lbm_uint8_t reserved;
1323 lbm_uint32_t flags1;
1324 lbm_uint32_t flags2;
1325 } lbmr_tnwg_ctxinfo_t;
1326 #define O_LBMR_TNWG_CTXINFO_T_LEN OFFSETOF(lbmr_tnwg_ctxinfo_t, len)
1327 #define L_LBMR_TNWG_CTXINFO_T_LEN SIZEOF(lbmr_tnwg_ctxinfo_t, len)
1328 #define O_LBMR_TNWG_CTXINFO_T_HOP_COUNT OFFSETOF(lbmr_tnwg_ctxinfo_t, hop_count)
1329 #define L_LBMR_TNWG_CTXINFO_T_HOP_COUNT SIZEOF(lbmr_tnwg_ctxinfo_t, hop_count)
1330 #define O_LBMR_TNWG_CTXINFO_T_RESERVED OFFSETOF(lbmr_tnwg_ctxinfo_t, reserved)
1331 #define L_LBMR_TNWG_CTXINFO_T_RESERVED SIZEOF(lbmr_tnwg_ctxinfo_t, reserved)
1332 #define O_LBMR_TNWG_CTXINFO_T_FLAGS1 OFFSETOF(lbmr_tnwg_ctxinfo_t, flags1)
1333 #define L_LBMR_TNWG_CTXINFO_T_FLAGS1 SIZEOF(lbmr_tnwg_ctxinfo_t, flags1)
1334 #define O_LBMR_TNWG_CTXINFO_T_FLAGS2 OFFSETOF(lbmr_tnwg_ctxinfo_t, flags2)
1335 #define L_LBMR_TNWG_CTXINFO_T_FLAGS2 SIZEOF(lbmr_tnwg_ctxinfo_t, flags2)
1336 #define L_LBMR_TNWG_CTXINFO_T (int) sizeof(lbmr_tnwg_ctxinfo_t)
1338 #define LBMR_TNWG_CTXINFO_QUERY_FLAG 0x80000000
1339 #define LBMR_TNWG_CTXINFO_TNWG_SRC_FLAG 0x40000000
1340 #define LBMR_TNWG_CTXINFO_TNWG_RCV_FLAG 0x20000000
1341 #define LBMR_TNWG_CTXINFO_PROXY_FLAG 0x10000000
1343 /* LBMR (extended) gateway message - topic res request header */
1344 typedef struct
1346 lbm_uint16_t len;
1347 } lbmr_tnwg_trreq_t;
1348 #define O_LBMR_TNWG_TRREQ_T_LEN OFFSETOF(lbmr_tnwg_trreq_t, len)
1349 #define L_LBMR_TNWG_TRREQ_T_LEN SIZEOF(lbmr_tnwg_trreq_t, len)
1350 #define L_LBMR_TNWG_TRREQ_T (int) sizeof(lbmr_tnwg_trreq_t)
1352 /* LBMR (extended) gateway message - basic option */
1353 typedef struct
1355 lbm_uint8_t type;
1356 lbm_uint8_t len;
1357 lbm_uint16_t flags;
1358 } lbmr_tnwg_opt_t;
1359 #define O_LBMR_TNWG_OPT_T_TYPE OFFSETOF(lbmr_tnwg_opt_t, type)
1360 #define L_LBMR_TNWG_OPT_T_TYPE SIZEOF(lbmr_tnwg_opt_t, type)
1361 #define O_LBMR_TNWG_OPT_T_LEN OFFSETOF(lbmr_tnwg_opt_t, len)
1362 #define L_LBMR_TNWG_OPT_T_LEN SIZEOF(lbmr_tnwg_opt_t, len)
1363 #define O_LBMR_TNWG_OPT_T_FLAGS OFFSETOF(lbmr_tnwg_opt_t, flags)
1364 #define L_LBMR_TNWG_OPT_T_FLAGS SIZEOF(lbmr_tnwg_opt_t, flags)
1365 #define L_LBMR_TNWG_OPT_T (int) sizeof(lbmr_tnwg_opt_t)
1367 #define LBMR_TNWG_OPT_IGNORE_FLAG 0x8000
1369 /* LBMR (extended) gateway message - ctxinst option */
1370 typedef struct
1372 lbm_uint8_t type;
1373 lbm_uint8_t len;
1374 lbm_uint16_t flags;
1375 lbm_uint8_t instance[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
1376 } lbmr_tnwg_opt_ctxinst_t;
1377 #define O_LBMR_TNWG_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_tnwg_opt_ctxinst_t, type)
1378 #define L_LBMR_TNWG_OPT_CTXINST_T_TYPE SIZEOF(lbmr_tnwg_opt_ctxinst_t, type)
1379 #define O_LBMR_TNWG_OPT_CTXINST_T_LEN OFFSETOF(lbmr_tnwg_opt_ctxinst_t, len)
1380 #define L_LBMR_TNWG_OPT_CTXINST_T_LEN SIZEOF(lbmr_tnwg_opt_ctxinst_t, len)
1381 #define O_LBMR_TNWG_OPT_CTXINST_T_FLAGS OFFSETOF(lbmr_tnwg_opt_ctxinst_t, flags)
1382 #define L_LBMR_TNWG_OPT_CTXINST_T_FLAGS SIZEOF(lbmr_tnwg_opt_ctxinst_t, flags)
1383 #define O_LBMR_TNWG_OPT_CTXINST_T_INSTANCE OFFSETOF(lbmr_tnwg_opt_ctxinst_t, instance)
1384 #define L_LBMR_TNWG_OPT_CTXINST_T_INSTANCE SIZEOF(lbmr_tnwg_opt_ctxinst_t, instance)
1385 #define L_LBMR_TNWG_OPT_CTXINST_T (int) sizeof(lbmr_tnwg_opt_ctxinst_t)
1387 #define LBMR_TNWG_OPT_CTXINST_TYPE 0x00
1389 /* LBMR (extended) gateway message - address option */
1390 typedef struct
1392 lbm_uint8_t type;
1393 lbm_uint8_t len;
1394 lbm_uint16_t flags;
1395 lbm_uint16_t port;
1396 lbm_uint16_t res;
1397 lbm_uint32_t ip;
1398 } lbmr_tnwg_opt_address_t;
1399 #define O_LBMR_TNWG_OPT_ADDRESS_T_TYPE OFFSETOF(lbmr_tnwg_opt_address_t, type)
1400 #define L_LBMR_TNWG_OPT_ADDRESS_T_TYPE SIZEOF(lbmr_tnwg_opt_address_t, type)
1401 #define O_LBMR_TNWG_OPT_ADDRESS_T_LEN OFFSETOF(lbmr_tnwg_opt_address_t, len)
1402 #define L_LBMR_TNWG_OPT_ADDRESS_T_LEN SIZEOF(lbmr_tnwg_opt_address_t, len)
1403 #define O_LBMR_TNWG_OPT_ADDRESS_T_FLAGS OFFSETOF(lbmr_tnwg_opt_address_t, flags)
1404 #define L_LBMR_TNWG_OPT_ADDRESS_T_FLAGS SIZEOF(lbmr_tnwg_opt_address_t, flags)
1405 #define O_LBMR_TNWG_OPT_ADDRESS_T_PORT OFFSETOF(lbmr_tnwg_opt_address_t, port)
1406 #define L_LBMR_TNWG_OPT_ADDRESS_T_PORT SIZEOF(lbmr_tnwg_opt_address_t, port)
1407 #define O_LBMR_TNWG_OPT_ADDRESS_T_RES OFFSETOF(lbmr_tnwg_opt_address_t, res)
1408 #define L_LBMR_TNWG_OPT_ADDRESS_T_RES SIZEOF(lbmr_tnwg_opt_address_t, res)
1409 #define O_LBMR_TNWG_OPT_ADDRESS_T_IP OFFSETOF(lbmr_tnwg_opt_address_t, ip)
1410 #define L_LBMR_TNWG_OPT_ADDRESS_T_IP SIZEOF(lbmr_tnwg_opt_address_t, ip)
1411 #define L_LBMR_TNWG_OPT_ADDRESS_T (int) sizeof(lbmr_tnwg_opt_address_t)
1413 #define LBMR_TNWG_OPT_ADDRESS_TYPE 0x01
1415 /* LBMR (extended) gateway message - domain option */
1416 typedef struct
1418 lbm_uint8_t type;
1419 lbm_uint8_t len;
1420 lbm_uint16_t flags;
1421 lbm_uint32_t domain_id;
1422 } lbmr_tnwg_opt_domain_t;
1423 #define O_LBMR_TNWG_OPT_DOMAIN_T_TYPE OFFSETOF(lbmr_tnwg_opt_domain_t, type)
1424 #define L_LBMR_TNWG_OPT_DOMAIN_T_TYPE SIZEOF(lbmr_tnwg_opt_domain_t, type)
1425 #define O_LBMR_TNWG_OPT_DOMAIN_T_LEN OFFSETOF(lbmr_tnwg_opt_domain_t, len)
1426 #define L_LBMR_TNWG_OPT_DOMAIN_T_LEN SIZEOF(lbmr_tnwg_opt_domain_t, len)
1427 #define O_LBMR_TNWG_OPT_DOMAIN_T_FLAGS OFFSETOF(lbmr_tnwg_opt_domain_t, flags)
1428 #define L_LBMR_TNWG_OPT_DOMAIN_T_FLAGS SIZEOF(lbmr_tnwg_opt_domain_t, flags)
1429 #define O_LBMR_TNWG_OPT_DOMAIN_T_DOMAIN_ID OFFSETOF(lbmr_tnwg_opt_domain_t, domain_id)
1430 #define L_LBMR_TNWG_OPT_DOMAIN_T_DOMAIN_ID SIZEOF(lbmr_tnwg_opt_domain_t, domain_id)
1431 #define L_LBMR_TNWG_OPT_DOMAIN_T (int) sizeof(lbmr_tnwg_opt_domain_t)
1433 #define LBMR_TNWG_OPT_DOMAIN_TYPE 0x02
1435 /* LBMR (extended) gateway message - name option (a base option) */
1436 #define LBMR_TNWG_OPT_NAME_TYPE 0x03
1438 /* LBMR (extended) remote domain route message */
1439 typedef struct
1441 lbm_uint8_t ver_type;
1442 lbm_uint8_t ext_type;
1443 lbm_uint16_t num_domains;
1444 lbm_uint32_t ip;
1445 lbm_uint16_t port;
1446 lbm_uint16_t route_index;
1447 lbm_uint32_t length;
1448 /* lbm_uint32_t domains[num_domains]; */
1449 } lbmr_remote_domain_route_hdr_t;
1450 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_VER_TYPE OFFSETOF(lbmr_remote_domain_route_hdr_t, ver_type)
1451 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_VER_TYPE SIZEOF(lbmr_remote_domain_route_hdr_t, ver_type)
1452 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_EXT_TYPE OFFSETOF(lbmr_remote_domain_route_hdr_t, ext_type)
1453 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_EXT_TYPE SIZEOF(lbmr_remote_domain_route_hdr_t, ext_type)
1454 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS OFFSETOF(lbmr_remote_domain_route_hdr_t, num_domains)
1455 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS SIZEOF(lbmr_remote_domain_route_hdr_t, num_domains)
1456 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP OFFSETOF(lbmr_remote_domain_route_hdr_t, ip)
1457 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP SIZEOF(lbmr_remote_domain_route_hdr_t, ip)
1458 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT OFFSETOF(lbmr_remote_domain_route_hdr_t, port)
1459 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT SIZEOF(lbmr_remote_domain_route_hdr_t, port)
1460 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX OFFSETOF(lbmr_remote_domain_route_hdr_t, route_index)
1461 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX SIZEOF(lbmr_remote_domain_route_hdr_t, route_index)
1462 #define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH OFFSETOF(lbmr_remote_domain_route_hdr_t, length)
1463 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH SIZEOF(lbmr_remote_domain_route_hdr_t, length)
1464 #define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T (int) sizeof(lbmr_remote_domain_route_hdr_t)
1466 /* LBMR (extended) remote context information message */
1467 typedef struct
1469 lbm_uint8_t ver_type;
1470 lbm_uint8_t ext_type;
1471 lbm_uint16_t len;
1472 lbm_uint16_t num_recs;
1473 lbm_uint16_t reserved;
1474 } lbmr_rctxinfo_t;
1475 #define O_LBMR_RCTXINFO_T_VER_TYPE OFFSETOF(lbmr_rctxinfo_t, ver_type)
1476 #define L_LBMR_RCTXINFO_T_VER_TYPE SIZEOF(lbmr_rctxinfo_t, ver_type)
1477 #define O_LBMR_RCTXINFO_T_EXT_TYPE OFFSETOF(lbmr_rctxinfo_t, ext_type)
1478 #define L_LBMR_RCTXINFO_T_EXT_TYPE SIZEOF(lbmr_rctxinfo_t, ext_type)
1479 #define O_LBMR_RCTXINFO_T_LEN OFFSETOF(lbmr_rctxinfo_t, len)
1480 #define L_LBMR_RCTXINFO_T_LEN SIZEOF(lbmr_rctxinfo_t, len)
1481 #define O_LBMR_RCTXINFO_T_NUM_RECS OFFSETOF(lbmr_rctxinfo_t, num_recs)
1482 #define L_LBMR_RCTXINFO_T_NUM_RECS SIZEOF(lbmr_rctxinfo_t, num_recs)
1483 #define O_LBMR_RCTXINFO_T_RESERVED OFFSETOF(lbmr_rctxinfo_t, reserved)
1484 #define L_LBMR_RCTXINFO_T_RESERVED SIZEOF(lbmr_rctxinfo_t, reserved)
1485 #define L_LBMR_RCTXINFO_T (int) sizeof(lbmr_rctxinfo_t)
1487 /* LBMR (extended) remote context information record */
1488 typedef struct
1490 lbm_uint16_t len;
1491 lbm_uint16_t flags;
1492 } lbmr_rctxinfo_rec_t;
1493 #define O_LBMR_RCTXINFO_REC_T_LEN OFFSETOF(lbmr_rctxinfo_rec_t, len)
1494 #define L_LBMR_RCTXINFO_REC_T_LEN SIZEOF(lbmr_rctxinfo_rec_t, len)
1495 #define O_LBMR_RCTXINFO_REC_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_t, flags)
1496 #define L_LBMR_RCTXINFO_REC_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_t, flags)
1497 #define L_LBMR_RCTXINFO_REC_T (int) sizeof(lbmr_rctxinfo_rec_t)
1499 #define LBMR_RCTXINFO_REC_FLAG_QUERY 0x8000
1501 /* LBMR (extended) remote context information record option */
1502 typedef struct
1504 lbm_uint8_t type;
1505 lbm_uint8_t len;
1506 lbm_uint16_t flags;
1507 } lbmr_rctxinfo_rec_opt_t;
1508 #define O_LBMR_RCTXINFO_REC_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_opt_t, type)
1509 #define L_LBMR_RCTXINFO_REC_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_opt_t, type)
1510 #define O_LBMR_RCTXINFO_REC_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_opt_t, len)
1511 #define L_LBMR_RCTXINFO_REC_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_opt_t, len)
1512 #define O_LBMR_RCTXINFO_REC_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_opt_t, flags)
1513 #define L_LBMR_RCTXINFO_REC_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_opt_t, flags)
1514 #define L_LBMR_RCTXINFO_REC_OPT_T (int) sizeof(lbmr_rctxinfo_rec_opt_t)
1516 /* LBMR (extended) remote context information record address option */
1517 typedef struct
1519 lbm_uint8_t type;
1520 lbm_uint8_t len;
1521 lbm_uint16_t flags;
1522 lbm_uint32_t domain_id;
1523 lbm_uint32_t ip;
1524 lbm_uint16_t port;
1525 lbm_uint16_t res;
1526 } lbmr_rctxinfo_rec_address_opt_t;
1527 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, type)
1528 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_address_opt_t, type)
1529 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, len)
1530 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_address_opt_t, len)
1531 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, flags)
1532 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_address_opt_t, flags)
1533 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, domain_id)
1534 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID SIZEOF(lbmr_rctxinfo_rec_address_opt_t, domain_id)
1535 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, ip)
1536 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP SIZEOF(lbmr_rctxinfo_rec_address_opt_t, ip)
1537 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, port)
1538 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT SIZEOF(lbmr_rctxinfo_rec_address_opt_t, port)
1539 #define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, res)
1540 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES SIZEOF(lbmr_rctxinfo_rec_address_opt_t, res)
1541 #define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T (int) sizeof(lbmr_rctxinfo_rec_address_opt_t)
1543 #define LBMR_RCTXINFO_OPT_ADDRESS_TYPE 0x01
1545 /* LBMR (extended) remote context information record instance option */
1546 typedef struct
1548 lbm_uint8_t type;
1549 lbm_uint8_t len;
1550 lbm_uint16_t flags;
1551 lbm_uint8_t instance[LBM_CONTEXT_INSTANCE_BLOCK_SZ];
1552 } lbmr_rctxinfo_rec_instance_opt_t;
1553 #define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, type)
1554 #define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, type)
1555 #define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, len)
1556 #define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, len)
1557 #define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, flags)
1558 #define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, flags)
1559 #define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, instance)
1560 #define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, instance)
1561 #define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T (int) sizeof(lbmr_rctxinfo_rec_instance_opt_t)
1563 #define LBMR_RCTXINFO_OPT_INSTANCE_TYPE 0x02
1565 /* LBMR (extended) remote context information record odomain option */
1566 typedef struct
1568 lbm_uint8_t type;
1569 lbm_uint8_t len;
1570 lbm_uint16_t flags;
1571 lbm_uint32_t domain_id;
1572 } lbmr_rctxinfo_rec_odomain_opt_t;
1573 #define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, type)
1574 #define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, type)
1575 #define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, len)
1576 #define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, len)
1577 #define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, flags)
1578 #define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, flags)
1579 #define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, domain_id)
1580 #define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, domain_id)
1581 #define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T (int) sizeof(lbmr_rctxinfo_rec_odomain_opt_t)
1583 #define LBMR_RCTXINFO_OPT_ODOMAIN_TYPE 0x03
1585 /* LBMR (extended) remote context information record name option */
1586 typedef struct
1588 lbm_uint8_t type;
1589 lbm_uint8_t len;
1590 lbm_uint16_t flags;
1591 } lbmr_rctxinfo_rec_name_opt_t;
1592 #define O_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, type)
1593 #define L_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_name_opt_t, type)
1594 #define O_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, len)
1595 #define L_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_name_opt_t, len)
1596 #define O_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, flags)
1597 #define L_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_name_opt_t, flags)
1598 #define L_LBMR_RCTXINFO_REC_NAME_OPT_T (int) sizeof(lbmr_rctxinfo_rec_name_opt_t)
1600 #define LBMR_RCTXINFO_OPT_NAME_TYPE 0x04
1602 /* Queue management headers (may appear in LBMR or LBMC packets) */
1603 typedef struct
1605 lbm_uint8_t ver_type;
1606 lbm_uint8_t ext_type;
1607 } lbmr_umq_qmgmt_hdr_t;
1608 #define O_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE OFFSETOF(lbmr_umq_qmgmt_hdr_t, ver_type)
1609 #define L_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE SIZEOF(lbmr_umq_qmgmt_hdr_t, ver_type)
1610 #define O_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE OFFSETOF(lbmr_umq_qmgmt_hdr_t, ext_type)
1611 #define L_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE SIZEOF(lbmr_umq_qmgmt_hdr_t, ext_type)
1612 #define L_LBMR_UMQ_QMGMT_HDR_T (int) sizeof(lbmr_umq_qmgmt_hdr_t)
1614 typedef struct
1616 lbm_uint8_t filler1;
1617 lbm_uint8_t filler2;
1618 lbm_uint8_t flags;
1619 lbm_uint8_t pckt_type;
1620 lbm_uint8_t cfgsig[20];
1621 lbm_uint32_t queue_id;
1622 lbm_uint32_t queue_ver;
1623 lbm_uint32_t ip;
1624 lbm_uint16_t port;
1625 lbm_uint16_t inst_idx;
1626 lbm_uint16_t grp_idx;
1627 lbm_uint16_t pckt_type_dep16;
1628 } umq_qmgmt_hdr_t;
1629 #define O_UMQ_QMGMT_HDR_T_FLAGS OFFSETOF(umq_qmgmt_hdr_t, flags)
1630 #define L_UMQ_QMGMT_HDR_T_FLAGS SIZEOF(umq_qmgmt_hdr_t, flags)
1631 #define O_UMQ_QMGMT_HDR_T_PCKT_TYPE OFFSETOF(umq_qmgmt_hdr_t, pckt_type)
1632 #define L_UMQ_QMGMT_HDR_T_PCKT_TYPE SIZEOF(umq_qmgmt_hdr_t, pckt_type)
1633 #define O_UMQ_QMGMT_HDR_T_CFGSIG OFFSETOF(umq_qmgmt_hdr_t, cfgsig)
1634 #define L_UMQ_QMGMT_HDR_T_CFGSIG SIZEOF(umq_qmgmt_hdr_t, cfgsig)
1635 #define O_UMQ_QMGMT_HDR_T_QUEUE_ID OFFSETOF(umq_qmgmt_hdr_t, queue_id)
1636 #define L_UMQ_QMGMT_HDR_T_QUEUE_ID SIZEOF(umq_qmgmt_hdr_t, queue_id)
1637 #define O_UMQ_QMGMT_HDR_T_QUEUE_VER OFFSETOF(umq_qmgmt_hdr_t, queue_ver)
1638 #define L_UMQ_QMGMT_HDR_T_QUEUE_VER SIZEOF(umq_qmgmt_hdr_t, queue_ver)
1639 #define O_UMQ_QMGMT_HDR_T_IP OFFSETOF(umq_qmgmt_hdr_t, ip)
1640 #define L_UMQ_QMGMT_HDR_T_IP SIZEOF(umq_qmgmt_hdr_t, ip)
1641 #define O_UMQ_QMGMT_HDR_T_PORT OFFSETOF(umq_qmgmt_hdr_t, port)
1642 #define L_UMQ_QMGMT_HDR_T_PORT SIZEOF(umq_qmgmt_hdr_t, port)
1643 #define O_UMQ_QMGMT_HDR_T_INST_IDX OFFSETOF(umq_qmgmt_hdr_t, inst_idx)
1644 #define L_UMQ_QMGMT_HDR_T_INST_IDX SIZEOF(umq_qmgmt_hdr_t, inst_idx)
1645 #define O_UMQ_QMGMT_HDR_T_GRP_IDX OFFSETOF(umq_qmgmt_hdr_t, grp_idx)
1646 #define L_UMQ_QMGMT_HDR_T_GRP_IDX SIZEOF(umq_qmgmt_hdr_t, grp_idx)
1647 #define O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16 OFFSETOF(umq_qmgmt_hdr_t, pckt_type_dep16)
1648 #define L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16 SIZEOF(umq_qmgmt_hdr_t, pckt_type_dep16)
1649 #define L_UMQ_QMGMT_HDR_T (int) sizeof(umq_qmgmt_hdr_t)
1651 #define UMQ_QMGMT_HDR_I_FLAG 0x80
1652 #define UMQ_QMGMT_HDR_N_FLAG 0x40
1653 #define UMQ_QMGMT_HDR_IL_L_FLAG 0x20
1654 #define UMQ_QMGMT_HDR_IL_K_FLAG 0x10
1656 typedef struct
1658 lbm_uint32_t highest_rcr_tsp;
1659 } umq_qmgmt_il_hdr_t;
1660 #define O_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_il_hdr_t, highest_rcr_tsp)
1661 #define L_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_il_hdr_t, highest_rcr_tsp)
1662 #define L_UMQ_QMGMT_IL_HDR_T (int) sizeof(umq_qmgmt_il_hdr_t)
1664 typedef struct
1666 lbm_uint32_t ip;
1667 lbm_uint16_t port;
1668 lbm_uint16_t inst_idx;
1669 lbm_uint16_t grp_idx;
1670 lbm_uint16_t flags;
1671 } umq_qmgmt_il_inst_hdr_t;
1672 #define O_UMQ_QMGMT_IL_INST_HDR_T_IP OFFSETOF(umq_qmgmt_il_inst_hdr_t, ip)
1673 #define L_UMQ_QMGMT_IL_INST_HDR_T_IP SIZEOF(umq_qmgmt_il_inst_hdr_t, ip)
1674 #define O_UMQ_QMGMT_IL_INST_HDR_T_PORT OFFSETOF(umq_qmgmt_il_inst_hdr_t, port)
1675 #define L_UMQ_QMGMT_IL_INST_HDR_T_PORT SIZEOF(umq_qmgmt_il_inst_hdr_t, port)
1676 #define O_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX OFFSETOF(umq_qmgmt_il_inst_hdr_t, inst_idx)
1677 #define L_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX SIZEOF(umq_qmgmt_il_inst_hdr_t, inst_idx)
1678 #define O_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX OFFSETOF(umq_qmgmt_il_inst_hdr_t, grp_idx)
1679 #define L_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX SIZEOF(umq_qmgmt_il_inst_hdr_t, grp_idx)
1680 #define O_UMQ_QMGMT_IL_INST_HDR_T_FLAGS OFFSETOF(umq_qmgmt_il_inst_hdr_t, flags)
1681 #define L_UMQ_QMGMT_IL_INST_HDR_T_FLAGS SIZEOF(umq_qmgmt_il_inst_hdr_t, flags)
1682 #define L_UMQ_QMGMT_IL_INST_HDR_T (int) sizeof(umq_qmgmt_il_inst_hdr_t)
1684 #define UMQ_QMGMT_HDR_IL_INST_M_FLAG 0x8000
1685 #define UMQ_QMGMT_HDR_IL_INST_Q_FLAG 0x4000
1686 #define UMQ_QMGMT_HDR_IL_INST_P_FLAG 0x2000
1688 typedef struct
1690 lbm_uint32_t queue_new_ver;
1691 } umq_qmgmt_ec_hdr_t;
1692 #define O_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER OFFSETOF(umq_qmgmt_ec_hdr_t, queue_new_ver)
1693 #define L_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER SIZEOF(umq_qmgmt_ec_hdr_t, queue_new_ver)
1694 #define L_UMQ_QMGMT_EC_HDR_T (int) sizeof(umq_qmgmt_ec_hdr_t)
1696 typedef struct
1698 lbm_uint32_t highest_rcr_tsp;
1699 lbm_uint32_t age;
1700 } umq_qmgmt_ev_hdr_t;
1701 #define O_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_ev_hdr_t, highest_rcr_tsp)
1702 #define L_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_ev_hdr_t, highest_rcr_tsp)
1703 #define O_UMQ_QMGMT_EV_HDR_T_AGE OFFSETOF(umq_qmgmt_ev_hdr_t, age)
1704 #define L_UMQ_QMGMT_EV_HDR_T_AGE SIZEOF(umq_qmgmt_ev_hdr_t, age)
1705 #define L_UMQ_QMGMT_EV_HDR_T (int) sizeof(umq_qmgmt_ev_hdr_t)
1707 typedef struct
1709 lbm_uint32_t highest_rcr_tsp;
1710 } umq_qmgmt_qro_hdr_t;
1711 #define O_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_qro_hdr_t, highest_rcr_tsp)
1712 #define L_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_qro_hdr_t, highest_rcr_tsp)
1713 #define L_UMQ_QMGMT_QRO_HDR_T (int) sizeof(umq_qmgmt_qro_hdr_t)
1715 #define UMQ_QMGMT_HDR_PCKT_TYPE_IL 0x1
1716 #define UMQ_QMGMT_HDR_PCKT_TYPE_JR 0x2
1717 #define UMQ_QMGMT_HDR_PCKT_TYPE_JREJ 0x3
1718 #define UMQ_QMGMT_HDR_PCKT_TYPE_IKA 0x4
1719 #define UMQ_QMGMT_HDR_PCKT_TYPE_EC 0x5
1720 #define UMQ_QMGMT_HDR_PCKT_TYPE_EV 0x6
1721 #define UMQ_QMGMT_HDR_PCKT_TYPE_CNIL 0x7
1722 #define UMQ_QMGMT_HDR_PCKT_TYPE_QRO 0x8
1724 #define LBMR_VERSION_0 0x00
1725 #define LBMR_VERSION_1 0x01
1726 #define LBMR_VERSION_GATEWAY LBMR_VERSION_1
1727 #define LBMR_VERSION LBMR_VERSION_0
1729 /*----------------------------------------------------------------------------*/
1730 /* Value translation tables. */
1731 /*----------------------------------------------------------------------------*/
1733 static const value_string lbmr_packet_type[] =
1735 { LBMR_HDR_TYPE_NORMAL, "NORMAL" },
1736 { LBMR_HDR_TYPE_WC_TQRS, "WC-TQR" },
1737 { LBMR_HDR_TYPE_UCAST_RCV_ALIVE, "Rcv Alive" },
1738 { LBMR_HDR_TYPE_UCAST_SRC_ALIVE, "Src Alive" },
1739 { LBMR_HDR_TYPE_TOPIC_MGMT, "Topic Mgmt" },
1740 { LBMR_HDR_TYPE_QUEUE_RES, "UMQ" },
1741 { LBMR_HDR_TYPE_EXT, "Extended" },
1742 { 0x0, NULL }
1745 static const value_string lbmr_ext_packet_type[] =
1747 { LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT, "Proxy Source Election" },
1748 { LBMR_HDR_EXT_TYPE_UMQ_QUEUE_MGMT, "Queue Management" },
1749 { LBMR_HDR_EXT_TYPE_CONTEXT_INFO, "Context Information" },
1750 { LBMR_HDR_EXT_TYPE_TOPIC_RES_REQUEST, "Topic Resolution Request" },
1751 { LBMR_HDR_EXT_TYPE_TNWG_MSG, "Gateway Message" },
1752 { LBMR_HDR_EXT_TYPE_REMOTE_DOMAIN_ROUTE, "Remote Domain Route" },
1753 { LBMR_HDR_EXT_TYPE_REMOTE_CONTEXT_INFO, "Remote Context Information" },
1754 { 0x0, NULL }
1757 static const value_string lbmr_transport_type[] =
1759 { LBMR_TRANSPORT_TCP, "TCP" },
1760 { LBMR_TRANSPORT_LBTSMX, "LBT-SMX" },
1761 { LBMR_TRANSPORT_LBTRU, "LBT-RU" },
1762 { LBMR_TRANSPORT_LBTRM, "LBT-RM" },
1763 { LBMR_TRANSPORT_LBTIPC, "LBT-IPC" },
1764 { LBMR_TRANSPORT_LBTRDMA, "LBT-RDMA" },
1765 { 0x0, NULL }
1768 static const value_string lbmr_tmr_type[] =
1770 { LBMR_TMR_LEAVE_TOPIC, "Leave Topic" },
1771 { LBMR_TMR_TOPIC_USE, "Topic Use" },
1772 { 0x0, NULL }
1775 static const value_string lbmr_topic_option_type[] =
1777 { LBMR_TOPIC_OPT_LEN_TYPE, "Option Length" },
1778 { LBMR_TOPIC_OPT_UME_TYPE, "UME" },
1779 { LBMR_TOPIC_OPT_UME_STORE_TYPE, "UME Store" },
1780 { LBMR_TOPIC_OPT_UME_STORE_GROUP_TYPE, "UME Store Group" },
1781 { LBMR_TOPIC_OPT_LATEJOIN_TYPE, "Late Join" },
1782 { LBMR_TOPIC_OPT_UMQ_RCRIDX_TYPE, "UMQ Receiver Control Record Index" },
1783 { LBMR_TOPIC_OPT_UMQ_QINFO_TYPE, "UMQ Queue Info" },
1784 { LBMR_TOPIC_OPT_COST_TYPE, "Cost" },
1785 { LBMR_TOPIC_OPT_OTID_TYPE, "Originating Transport" },
1786 { LBMR_TOPIC_OPT_CTXINST_TYPE, "Context Instance" },
1787 { LBMR_TOPIC_OPT_CTXINSTS_TYPE, "Store Context Instance" },
1788 { LBMR_TOPIC_OPT_ULB_TYPE, "UMQ ULB" },
1789 { LBMR_TOPIC_OPT_CTXINSTQ_TYPE, "Queue Context Instance" },
1790 { LBMR_TOPIC_OPT_DOMAIN_ID_TYPE, "Domain ID" },
1791 { LBMR_TOPIC_OPT_EXFUNC_TYPE, "Extended Functionality" },
1792 { 0x0, NULL }
1795 static const value_string lbmr_pser_dependent_type[] =
1797 { LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT_DEP_ELECT, "Election" },
1798 { LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT_DEP_REELECT, "Re-election" },
1799 { 0x0, NULL }
1802 static const value_string lbmr_option_type[] =
1804 { LBMR_LBMR_OPT_LEN_TYPE, "Option length" },
1805 { LBMR_LBMR_OPT_SRC_ID_TYPE, "Source ID" },
1806 { LBMR_LBMR_OPT_SRC_TYPE_TYPE, "Source type" },
1807 { LBMR_LBMR_OPT_VERSION_TYPE, "Version" },
1808 { LBMR_LBMR_OPT_LOCAL_DOMAIN_TYPE, "Local Domain" },
1809 { 0x0, NULL }
1812 static const value_string lbmr_pser_option_type[] =
1814 { LBMR_PSER_OPT_SRC_CTXINST_TYPE, "Source context instance" },
1815 { LBMR_PSER_OPT_STORE_CTXINST_TYPE, "Store context instance" },
1816 { 0x0, NULL }
1819 static const value_string lbmr_option_source_type[] =
1821 { LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_APPLICATION, "Application" },
1822 { LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_TNWGD, "Gateway" },
1823 { LBMR_LBMR_OPT_SRC_TYPE_SRC_TYPE_STORE, "Store" },
1824 { 0x0, NULL }
1827 static const value_string lbmr_tnwg_function_type[] =
1829 { LBMR_TNWG_TYPE_INTEREST, "Interest" },
1830 { LBMR_TNWG_TYPE_CTXINFO, "Context information" },
1831 { LBMR_TNWG_TYPE_TRREQ, "Topic res request" },
1832 { 0x0, NULL }
1835 static const value_string lbmr_tnwg_option_type[] =
1837 { LBMR_TNWG_OPT_CTXINST_TYPE, "Context instance" },
1838 { LBMR_TNWG_OPT_ADDRESS_TYPE, "Address" },
1839 { LBMR_TNWG_OPT_DOMAIN_TYPE, "Domain" },
1840 { LBMR_TNWG_OPT_NAME_TYPE, "Name" },
1841 { 0x0, NULL }
1844 static const value_string umq_qmgmt_packet_type[] =
1846 { UMQ_QMGMT_HDR_PCKT_TYPE_IL, "Instance List" },
1847 { UMQ_QMGMT_HDR_PCKT_TYPE_JR, "Join Request" },
1848 { UMQ_QMGMT_HDR_PCKT_TYPE_JREJ, "Join Request Rejection" },
1849 { UMQ_QMGMT_HDR_PCKT_TYPE_IKA, "Instance Keepalive" },
1850 { UMQ_QMGMT_HDR_PCKT_TYPE_EC, "Election Call" },
1851 { UMQ_QMGMT_HDR_PCKT_TYPE_EV, "Election Vote" },
1852 { UMQ_QMGMT_HDR_PCKT_TYPE_CNIL, "Confirm New Instance List" },
1853 { UMQ_QMGMT_HDR_PCKT_TYPE_QRO, "Queue resume operation" },
1854 { 0x0, NULL }
1857 static const value_string lbmr_rctxinfo_option_type[] =
1859 { LBMR_RCTXINFO_OPT_ADDRESS_TYPE, "Address" },
1860 { LBMR_RCTXINFO_OPT_INSTANCE_TYPE, "Instance" },
1861 { LBMR_RCTXINFO_OPT_ODOMAIN_TYPE, "Originating Domain" },
1862 { LBMR_RCTXINFO_OPT_NAME_TYPE, "Name" },
1863 { 0x0, NULL }
1866 /*----------------------------------------------------------------------------*/
1867 /* Preferences. */
1868 /*----------------------------------------------------------------------------*/
1870 /* Preferences default values. */
1871 #define LBMR_DEFAULT_MC_INCOMING_UDP_PORT 12965
1872 #define LBMR_DEFAULT_MC_INCOMING_UDP_PORT_STRING MAKESTRING(LBMR_DEFAULT_MC_INCOMING_UDP_PORT)
1873 #define LBMR_DEFAULT_MC_OUTGOING_UDP_PORT 12965
1874 #define LBMR_DEFAULT_MC_OUTGOING_UDP_PORT_STRING MAKESTRING(LBMR_DEFAULT_MC_OUTGOING_UDP_PORT)
1875 #define LBMR_DEFAULT_MC_INCOMING_ADDRESS "224.9.10.11"
1876 #define LBMR_DEFAULT_MC_OUTGOING_ADDRESS "224.9.10.11"
1877 #define LBMR_DEFAULT_UC_PORT_HIGH 14406
1878 #define LBMR_DEFAULT_UC_PORT_HIGH_STRING MAKESTRING(LBMR_DEFAULT_UC_PORT_HIGH)
1879 #define LBMR_DEFAULT_UC_PORT_LOW 14402
1880 #define LBMR_DEFAULT_UC_PORT_LOW_STRING MAKESTRING(LBMR_DEFAULT_UC_PORT_LOW)
1881 #define LBMR_DEFAULT_UC_DEST_PORT 15380
1882 #define LBMR_DEFAULT_UC_DEST_PORT_STRING MAKESTRING(LBMR_DEFAULT_UC_DEST_PORT)
1883 #define LBMR_DEFAULT_UC_ADDRESS "0.0.0.0"
1885 /* Global preferences variables (altered by the preferences dialog). */
1886 static uint32_t global_lbmr_mc_incoming_udp_port = LBMR_DEFAULT_MC_INCOMING_UDP_PORT;
1887 static uint32_t global_lbmr_mc_outgoing_udp_port = LBMR_DEFAULT_MC_OUTGOING_UDP_PORT;
1888 static const char * global_lbmr_mc_incoming_address = LBMR_DEFAULT_MC_INCOMING_ADDRESS;
1889 static const char * global_lbmr_mc_outgoing_address = LBMR_DEFAULT_MC_OUTGOING_ADDRESS;
1890 static uint32_t global_lbmr_uc_port_high = LBMR_DEFAULT_UC_PORT_HIGH;
1891 static uint32_t global_lbmr_uc_port_low = LBMR_DEFAULT_UC_PORT_LOW;
1892 static uint32_t global_lbmr_uc_dest_port = LBMR_DEFAULT_UC_DEST_PORT;
1893 static const char * global_lbmr_uc_address = LBMR_DEFAULT_UC_ADDRESS;
1894 static bool global_lbmr_use_tag;
1896 /* Local preferences variables (used by the dissector). */
1897 static uint32_t lbmr_mc_incoming_udp_port = LBMR_DEFAULT_MC_INCOMING_UDP_PORT;
1898 static uint32_t lbmr_mc_outgoing_udp_port = LBMR_DEFAULT_MC_OUTGOING_UDP_PORT;
1899 static uint32_t lbmr_mc_incoming_address_host;
1900 static uint32_t lbmr_mc_outgoing_address_host;
1901 static uint32_t lbmr_uc_port_high = LBMR_DEFAULT_UC_PORT_HIGH;
1902 static uint32_t lbmr_uc_port_low = LBMR_DEFAULT_UC_PORT_LOW;
1903 static uint32_t lbmr_uc_dest_port = LBMR_DEFAULT_UC_DEST_PORT;
1904 static uint32_t lbmr_uc_address_host;
1905 static bool lbmr_use_tag;
1907 typedef struct
1909 char * name;
1910 uint32_t mc_outgoing_udp_port;
1911 uint32_t mc_incoming_udp_port;
1912 char * mc_incoming_address;
1913 uint32_t mc_incoming_address_val_h;
1914 char * mc_outgoing_address;
1915 uint32_t mc_outgoing_address_val_h;
1916 uint32_t uc_port_high;
1917 uint32_t uc_port_low;
1918 uint32_t uc_dest_port;
1919 char * uc_address;
1920 uint32_t uc_address_val_h;
1921 } lbmr_tag_entry_t;
1923 static lbmr_tag_entry_t * lbmr_tag_entry;
1924 static unsigned lbmr_tag_count;
1926 UAT_CSTRING_CB_DEF(lbmr_tag, name, lbmr_tag_entry_t)
1927 UAT_DEC_CB_DEF(lbmr_tag, mc_outgoing_udp_port, lbmr_tag_entry_t)
1928 UAT_DEC_CB_DEF(lbmr_tag, mc_incoming_udp_port, lbmr_tag_entry_t)
1929 UAT_IPV4_MC_CB_DEF(lbmr_tag, mc_incoming_address, lbmr_tag_entry_t)
1930 UAT_IPV4_MC_CB_DEF(lbmr_tag, mc_outgoing_address, lbmr_tag_entry_t)
1931 UAT_DEC_CB_DEF(lbmr_tag, uc_port_high, lbmr_tag_entry_t)
1932 UAT_DEC_CB_DEF(lbmr_tag, uc_port_low, lbmr_tag_entry_t)
1933 UAT_DEC_CB_DEF(lbmr_tag, uc_dest_port, lbmr_tag_entry_t)
1934 UAT_IPV4_CB_DEF(lbmr_tag, uc_address, lbmr_tag_entry_t)
1935 static uat_field_t lbmr_tag_array[] =
1937 UAT_FLD_CSTRING(lbmr_tag, name, "Tag name", "Tag name"),
1938 UAT_FLD_DEC(lbmr_tag, mc_incoming_udp_port, "Incoming multicast UDP port", "Incoming UDP port"),
1939 UAT_FLD_IPV4_MC(lbmr_tag, mc_incoming_address, "Incoming multicast address", "Incoming multicast address"),
1940 UAT_FLD_DEC(lbmr_tag, mc_outgoing_udp_port, "Outgoing UDP port", "Outgoing UDP port"),
1941 UAT_FLD_IPV4_MC(lbmr_tag, mc_outgoing_address, "Outgoing multicast address", "Outgoing multicast address"),
1942 UAT_FLD_DEC(lbmr_tag, uc_port_low, "Unicast UDP port low", "Unicast UDP port low"),
1943 UAT_FLD_DEC(lbmr_tag, uc_port_high, "Unicast UDP port high", "Unicast UDP port high"),
1944 UAT_FLD_DEC(lbmr_tag, uc_dest_port, "Unicast UDP destination port", "Unicast UDP destination port"),
1945 UAT_FLD_IPV4(lbmr_tag, uc_address, "Unicast resolver address", "Unicast resolver address"),
1946 UAT_END_FIELDS
1949 /*----------------------------------------------------------------------------*/
1950 /* UAT callback functions. */
1951 /*----------------------------------------------------------------------------*/
1952 static bool lbmr_tag_update_cb(void * record, char * * error_string)
1954 lbmr_tag_entry_t * tag = (lbmr_tag_entry_t *)record;
1956 if (tag->name == NULL)
1958 *error_string = g_strdup("Tag name can't be empty");
1959 return false;
1961 else
1963 g_strstrip(tag->name);
1964 if (tag->name[0] == 0)
1966 *error_string = g_strdup("Tag name can't be empty");
1967 return false;
1970 return true;
1973 static void * lbmr_tag_copy_cb(void * destination, const void * source, size_t length _U_)
1975 const lbmr_tag_entry_t * src = (const lbmr_tag_entry_t *)source;
1976 lbmr_tag_entry_t * dest = (lbmr_tag_entry_t *)destination;
1978 dest->name = g_strdup(src->name);
1979 dest->mc_outgoing_udp_port = src->mc_outgoing_udp_port;
1980 dest->mc_incoming_udp_port = src->mc_incoming_udp_port;
1981 dest->mc_incoming_address = g_strdup(src->mc_incoming_address);
1982 dest->mc_incoming_address_val_h = src->mc_incoming_address_val_h;
1983 dest->mc_outgoing_address = g_strdup(src->mc_outgoing_address);
1984 dest->mc_outgoing_address_val_h = src->mc_outgoing_address_val_h;
1985 dest->uc_port_high = src->uc_port_high;
1986 dest->uc_port_low = src->uc_port_low;
1987 dest->uc_dest_port = src->uc_dest_port;
1988 dest->uc_address = g_strdup(src->uc_address);
1989 dest->uc_address_val_h = src->uc_address_val_h;
1990 return (dest);
1993 static void lbmr_tag_free_cb(void * record)
1995 lbmr_tag_entry_t * tag = (lbmr_tag_entry_t *)record;
1997 if (tag->name != NULL)
1999 g_free(tag->name);
2000 tag->name = NULL;
2002 if (tag->mc_incoming_address != NULL)
2004 g_free(tag->mc_incoming_address);
2005 tag->mc_incoming_address = NULL;
2007 if (tag->mc_outgoing_address != NULL)
2009 g_free(tag->mc_outgoing_address);
2010 tag->mc_outgoing_address = NULL;
2012 if (tag->uc_address != NULL)
2014 g_free(tag->uc_address);
2015 tag->uc_address = NULL;
2019 static tap_packet_status lbmr_match_packet(packet_info * pinfo, const lbmr_tag_entry_t * entry)
2021 uint32_t dest_addr_h;
2022 uint32_t src_addr_h;
2024 if ((pinfo->dst.type != AT_IPv4) || (pinfo->dst.len != 4) ||
2025 (pinfo->src.type != AT_IPv4) || (pinfo->src.len != 4))
2026 return (TAP_PACKET_DONT_REDRAW);
2027 dest_addr_h = pntoh32(pinfo->dst.data);
2028 src_addr_h = pntoh32(pinfo->src.data);
2030 if (IN_MULTICAST(dest_addr_h))
2032 /* Check multicast topic resolution values. */
2033 if ((dest_addr_h != entry->mc_incoming_address_val_h) && (dest_addr_h != entry->mc_outgoing_address_val_h))
2035 /* No match. */
2036 return (TAP_PACKET_DONT_REDRAW);
2038 /* Check for the correct port. */
2039 if ((dest_addr_h == entry->mc_incoming_address_val_h) && (pinfo->destport != entry->mc_incoming_udp_port))
2041 /* Wrong incoming port. */
2042 return (TAP_PACKET_DONT_REDRAW);
2044 if ((dest_addr_h == entry->mc_outgoing_address_val_h) && (pinfo->destport != entry->mc_outgoing_udp_port))
2046 /* Wrong outgoing port. */
2047 return (TAP_PACKET_DONT_REDRAW);
2049 /* Must be one of ours. */
2050 return (TAP_PACKET_REDRAW);
2052 else
2054 /* Check unicast topic resolution values. */
2055 /* Address should be either not specified, or match the src or dest address of the packet. */
2056 if ((entry->uc_address_val_h == 0) || (entry->uc_address_val_h == dest_addr_h) || (entry->uc_address_val_h == src_addr_h))
2058 if (((pinfo->destport == entry->uc_dest_port) || (pinfo->srcport == entry->uc_dest_port))
2059 && (((pinfo->destport <= entry->uc_port_high) && (pinfo->destport >= entry->uc_port_low))
2060 || ((pinfo->srcport <= entry->uc_port_high) && (pinfo->srcport >= entry->uc_port_low))))
2062 /* One of ours, so handle it. */
2063 return (TAP_PACKET_REDRAW);
2067 return (TAP_PACKET_DONT_REDRAW);
2070 static char * lbmr_tag_find(packet_info * pinfo)
2072 unsigned idx;
2073 lbmr_tag_entry_t * tag = NULL;
2075 if (!lbmr_use_tag)
2077 return (NULL);
2079 for (idx = 0; idx < lbmr_tag_count; ++idx)
2081 tag = &(lbmr_tag_entry[idx]);
2082 if (lbmr_match_packet(pinfo, tag))
2084 return tag->name;
2087 return (NULL);
2090 /*----------------------------------------------------------------------------*/
2091 /* Handles of all types. */
2092 /*----------------------------------------------------------------------------*/
2093 /* Protocol handle */
2094 static int proto_lbmr;
2096 /* Dissector handle */
2097 static dissector_handle_t lbmr_dissector_handle;
2099 /* Dissector tree handles */
2100 static int ett_lbmr;
2101 static int ett_lbmr_hdr;
2102 static int ett_lbmr_tqrs;
2103 static int ett_lbmr_tqr;
2104 static int ett_lbmr_tirs;
2105 static int ett_lbmr_tir;
2106 static int ett_lbmr_tir_tcp;
2107 static int ett_lbmr_tir_lbtrm;
2108 static int ett_lbmr_tir_lbtru;
2109 static int ett_lbmr_tir_lbtipc;
2110 static int ett_lbmr_tir_lbtrdma;
2111 static int ett_lbmr_tir_lbtsmx;
2112 static int ett_lbmr_topts;
2113 static int ett_lbmr_topt_len;
2114 static int ett_lbmr_topt_ume;
2115 static int ett_lbmr_topt_ume_flags;
2116 static int ett_lbmr_topt_ume_store;
2117 static int ett_lbmr_topt_ume_store_flags;
2118 static int ett_lbmr_topt_ume_store_group;
2119 static int ett_lbmr_topt_ume_store_group_flags;
2120 static int ett_lbmr_topt_latejoin;
2121 static int ett_lbmr_topt_latejoin_flags;
2122 static int ett_lbmr_topt_umq_rcridx;
2123 static int ett_lbmr_topt_umq_rcridx_flags;
2124 static int ett_lbmr_topt_umq_qinfo;
2125 static int ett_lbmr_topt_umq_qinfo_flags;
2126 static int ett_lbmr_topt_cost;
2127 static int ett_lbmr_topt_cost_flags;
2128 static int ett_lbmr_topt_otid;
2129 static int ett_lbmr_topt_otid_flags;
2130 static int ett_lbmr_topt_ctxinst;
2131 static int ett_lbmr_topt_ctxinst_flags;
2132 static int ett_lbmr_topt_ctxinsts;
2133 static int ett_lbmr_topt_ctxinsts_flags;
2134 static int ett_lbmr_topt_ulb;
2135 static int ett_lbmr_topt_ulb_flags;
2136 static int ett_lbmr_topt_ctxinstq;
2137 static int ett_lbmr_topt_ctxinstq_flags;
2138 static int ett_lbmr_topt_domain_id;
2139 static int ett_lbmr_topt_domain_id_flags;
2140 static int ett_lbmr_topt_exfunc;
2141 static int ett_lbmr_topt_exfunc_flags;
2142 static int ett_lbmr_topt_exfunc_functionality_flags;
2143 static int ett_lbmr_topt_unknown;
2144 static int ett_lbmr_tmb;
2145 static int ett_lbmr_tmrs;
2146 static int ett_lbmr_tmr;
2147 static int ett_lbmr_tmr_flags;
2148 static int ett_lbmr_pser_flags;
2149 static int ett_lbmr_pser_opts;
2150 static int ett_lbmr_pser_opt_len;
2151 static int ett_lbmr_pser_opt_ctxinst;
2152 static int ett_lbmr_qqrs;
2153 static int ett_lbmr_qirs;
2154 static int ett_lbmr_qir;
2155 static int ett_lbmr_qir_options;
2156 static int ett_lbmr_qir_grp_blk;
2157 static int ett_lbmr_qir_queue_blk;
2158 static int ett_lbmr_qir_grp;
2159 static int ett_lbmr_qir_queue;
2160 static int ett_lbmr_topic_res_request_flags;
2161 static int ett_lbmr_ctxinfo_flags;
2162 static int ett_lbmr_tnwg;
2163 static int ett_lbmr_tnwg_interest;
2164 static int ett_lbmr_tnwg_interest_rec;
2165 static int ett_lbmr_tnwg_interest_rec_flags;
2166 static int ett_lbmr_tnwg_ctxinfo;
2167 static int ett_lbmr_tnwg_ctxinfo_flags1;
2168 static int ett_lbmr_tnwg_trreq;
2169 static int ett_lbmr_tnwg_ctxinst_opt;
2170 static int ett_lbmr_tnwg_ctxinst_opt_flags;
2171 static int ett_lbmr_tnwg_address_opt;
2172 static int ett_lbmr_tnwg_address_opt_flags;
2173 static int ett_lbmr_tnwg_domain_opt;
2174 static int ett_lbmr_tnwg_domain_opt_flags;
2175 static int ett_lbmr_tnwg_name_opt;
2176 static int ett_lbmr_tnwg_name_opt_flags;
2177 static int ett_lbmr_tnwg_unknown_opt;
2178 static int ett_lbmr_tnwg_unknown_opt_flags;
2179 static int ett_lbmr_remote_domain_route_hdr;
2180 static int ett_lbmr_rctxinfo;
2181 static int ett_lbmr_rctxinfo_rec;
2182 static int ett_lbmr_rctxinfo_rec_flags;
2183 static int ett_lbmr_rctxinfo_rec_address;
2184 static int ett_lbmr_rctxinfo_rec_instance;
2185 static int ett_lbmr_rctxinfo_rec_odomain;
2186 static int ett_lbmr_rctxinfo_rec_name;
2187 static int ett_lbmr_rctxinfo_rec_unknown;
2188 static int ett_qmgmt_flags;
2189 static int ett_qmgmt_il;
2190 static int ett_qmgmt_il_inst;
2191 static int ett_qmgmt_il_inst_flags;
2192 static int ett_qmgmt_ec;
2193 static int ett_qmgmt_ev;
2194 static int ett_qmgmt_qro;
2195 static int ett_lbmr_opts;
2196 static int ett_lbmr_opt_src_id;
2197 static int ett_lbmr_opt_src_id_flags;
2198 static int ett_lbmr_opt_len;
2199 static int ett_lbmr_opt_src_type;
2200 static int ett_lbmr_opt_src_type_flags;
2201 static int ett_lbmr_opt_version;
2202 static int ett_lbmr_opt_version_flags;
2203 static int ett_lbmr_opt_local_domain;
2204 static int ett_lbmr_opt_local_domain_flags;
2205 static int ett_lbmr_opt_unknown;
2207 /* Dissector field handles */
2208 static int hf_lbmr_tag;
2209 static int hf_lbmr_hdr;
2210 static int hf_lbmr_hdr_ver;
2211 static int hf_lbmr_hdr_opt;
2212 static int hf_lbmr_hdr_type;
2213 static int hf_lbmr_hdr_tqrs;
2214 static int hf_lbmr_hdr_tirs;
2215 static int hf_lbmr_hdr_qqrs;
2216 static int hf_lbmr_hdr_qirs;
2217 static int hf_lbmr_hdr_ext_type;
2218 static int hf_lbmr_tqrs;
2219 static int hf_lbmr_tqr;
2220 static int hf_lbmr_tqr_pattern_type;
2221 static int hf_lbmr_tqr_pattern;
2222 static int hf_lbmr_tqr_name;
2223 static int hf_lbmr_tirs;
2224 static int hf_lbmr_tir;
2225 static int hf_lbmr_tir_transport_opts;
2226 static int hf_lbmr_tir_transport_type;
2227 static int hf_lbmr_tir_tlen;
2228 static int hf_lbmr_tir_ttl;
2229 static int hf_lbmr_tir_index;
2230 static int hf_lbmr_tir_name;
2231 static int hf_lbmr_tir_tcp;
2232 static int hf_lbmr_tir_tcp_ip;
2233 static int hf_lbmr_tir_tcp_session_id;
2234 static int hf_lbmr_tir_tcp_port;
2235 static int hf_lbmr_tir_lbtrm;
2236 static int hf_lbmr_tir_lbtrm_src_addr;
2237 static int hf_lbmr_tir_lbtrm_mcast_addr;
2238 static int hf_lbmr_tir_lbtrm_session_id;
2239 static int hf_lbmr_tir_lbtrm_udp_dest_port;
2240 static int hf_lbmr_tir_lbtrm_src_ucast_port;
2241 static int hf_lbmr_tir_lbtru;
2242 static int hf_lbmr_tir_lbtru_ip;
2243 static int hf_lbmr_tir_lbtru_port;
2244 static int hf_lbmr_tir_lbtru_session_id;
2245 static int hf_lbmr_tir_lbtipc;
2246 static int hf_lbmr_tir_lbtipc_host_id;
2247 static int hf_lbmr_tir_lbtipc_session_id;
2248 static int hf_lbmr_tir_lbtipc_xport_id;
2249 static int hf_lbmr_tir_lbtrdma;
2250 static int hf_lbmr_tir_lbtrdma_ip;
2251 static int hf_lbmr_tir_lbtrdma_session_id;
2252 static int hf_lbmr_tir_lbtrdma_port;
2253 static int hf_lbmr_tir_lbtsmx;
2254 static int hf_lbmr_tir_lbtsmx_host_id;
2255 static int hf_lbmr_tir_lbtsmx_session_id;
2256 static int hf_lbmr_tir_lbtsmx_xport_id;
2257 static int hf_lbmr_tir_channel;
2258 static int hf_lbmr_tir_unknown_transport;
2259 static int hf_lbmr_topts;
2260 static int hf_lbmr_topt_len;
2261 static int hf_lbmr_topt_len_type;
2262 static int hf_lbmr_topt_len_len;
2263 static int hf_lbmr_topt_len_total_len;
2264 static int hf_lbmr_topt_ume;
2265 static int hf_lbmr_topt_ume_type;
2266 static int hf_lbmr_topt_ume_len;
2267 static int hf_lbmr_topt_ume_flags;
2268 static int hf_lbmr_topt_ume_flags_ignore;
2269 static int hf_lbmr_topt_ume_flags_latejoin;
2270 static int hf_lbmr_topt_ume_flags_store;
2271 static int hf_lbmr_topt_ume_flags_qccap;
2272 static int hf_lbmr_topt_ume_flags_acktosrc;
2273 static int hf_lbmr_topt_ume_store_tcp_port;
2274 static int hf_lbmr_topt_ume_src_tcp_port;
2275 static int hf_lbmr_topt_ume_store_tcp_addr;
2276 static int hf_lbmr_topt_ume_src_tcp_addr;
2277 static int hf_lbmr_topt_ume_src_reg_id;
2278 static int hf_lbmr_topt_ume_transport_idx;
2279 static int hf_lbmr_topt_ume_high_seqnum;
2280 static int hf_lbmr_topt_ume_low_seqnum;
2281 static int hf_lbmr_topt_ume_store;
2282 static int hf_lbmr_topt_ume_store_type;
2283 static int hf_lbmr_topt_ume_store_len;
2284 static int hf_lbmr_topt_ume_store_flags;
2285 static int hf_lbmr_topt_ume_store_flags_ignore;
2286 static int hf_lbmr_topt_ume_store_grp_idx;
2287 static int hf_lbmr_topt_ume_store_store_tcp_port;
2288 static int hf_lbmr_topt_ume_store_store_idx;
2289 static int hf_lbmr_topt_ume_store_store_ip_addr;
2290 static int hf_lbmr_topt_ume_store_src_reg_id;
2291 static int hf_lbmr_topt_ume_store_group;
2292 static int hf_lbmr_topt_ume_store_group_type;
2293 static int hf_lbmr_topt_ume_store_group_len;
2294 static int hf_lbmr_topt_ume_store_group_flags;
2295 static int hf_lbmr_topt_ume_store_group_flags_ignore;
2296 static int hf_lbmr_topt_ume_store_group_grp_idx;
2297 static int hf_lbmr_topt_ume_store_group_grp_sz;
2298 static int hf_lbmr_topt_ume_store_group_reserved;
2299 static int hf_lbmr_topt_latejoin;
2300 static int hf_lbmr_topt_latejoin_type;
2301 static int hf_lbmr_topt_latejoin_len;
2302 static int hf_lbmr_topt_latejoin_flags;
2303 static int hf_lbmr_topt_latejoin_flags_ignore;
2304 static int hf_lbmr_topt_latejoin_flags_acktosrc;
2305 static int hf_lbmr_topt_latejoin_src_tcp_port;
2306 static int hf_lbmr_topt_latejoin_reserved;
2307 static int hf_lbmr_topt_latejoin_src_ip_addr;
2308 static int hf_lbmr_topt_latejoin_transport_idx;
2309 static int hf_lbmr_topt_latejoin_high_seqnum;
2310 static int hf_lbmr_topt_latejoin_low_seqnum;
2311 static int hf_lbmr_topt_umq_rcridx;
2312 static int hf_lbmr_topt_umq_rcridx_type;
2313 static int hf_lbmr_topt_umq_rcridx_len;
2314 static int hf_lbmr_topt_umq_rcridx_flags;
2315 static int hf_lbmr_topt_umq_rcridx_flags_ignore;
2316 static int hf_lbmr_topt_umq_rcridx_rcr_idx;
2317 static int hf_lbmr_topt_umq_qinfo;
2318 static int hf_lbmr_topt_umq_qinfo_type;
2319 static int hf_lbmr_topt_umq_qinfo_len;
2320 static int hf_lbmr_topt_umq_qinfo_flags;
2321 static int hf_lbmr_topt_umq_qinfo_flags_ignore;
2322 static int hf_lbmr_topt_umq_qinfo_flags_queue;
2323 static int hf_lbmr_topt_umq_qinfo_flags_rcvlisten;
2324 static int hf_lbmr_topt_umq_qinfo_flags_control;
2325 static int hf_lbmr_topt_umq_qinfo_flags_srcrcvlisten;
2326 static int hf_lbmr_topt_umq_qinfo_flags_participants_only;
2327 static int hf_lbmr_topt_umq_qinfo_queue;
2328 static int hf_lbmr_topt_cost;
2329 static int hf_lbmr_topt_cost_type;
2330 static int hf_lbmr_topt_cost_len;
2331 static int hf_lbmr_topt_cost_flags;
2332 static int hf_lbmr_topt_cost_flags_ignore;
2333 static int hf_lbmr_topt_cost_hop_count;
2334 static int hf_lbmr_topt_cost_cost;
2335 static int hf_lbmr_topt_otid;
2336 static int hf_lbmr_topt_otid_type;
2337 static int hf_lbmr_topt_otid_len;
2338 static int hf_lbmr_topt_otid_flags;
2339 static int hf_lbmr_topt_otid_flags_ignore;
2340 static int hf_lbmr_topt_otid_originating_transport;
2341 static int hf_lbmr_topt_ctxinst;
2342 static int hf_lbmr_topt_ctxinst_type;
2343 static int hf_lbmr_topt_ctxinst_len;
2344 static int hf_lbmr_topt_ctxinst_flags;
2345 static int hf_lbmr_topt_ctxinst_flags_ignore;
2346 static int hf_lbmr_topt_ctxinst_res;
2347 static int hf_lbmr_topt_ctxinst_ctxinst;
2348 static int hf_lbmr_topt_ctxinsts;
2349 static int hf_lbmr_topt_ctxinsts_type;
2350 static int hf_lbmr_topt_ctxinsts_len;
2351 static int hf_lbmr_topt_ctxinsts_flags;
2352 static int hf_lbmr_topt_ctxinsts_flags_ignore;
2353 static int hf_lbmr_topt_ctxinsts_idx;
2354 static int hf_lbmr_topt_ctxinsts_ctxinst;
2355 static int hf_lbmr_topt_ulb;
2356 static int hf_lbmr_topt_ulb_type;
2357 static int hf_lbmr_topt_ulb_len;
2358 static int hf_lbmr_topt_ulb_flags;
2359 static int hf_lbmr_topt_ulb_flags_ignore;
2360 static int hf_lbmr_topt_ulb_queue_id;
2361 static int hf_lbmr_topt_ulb_regid;
2362 static int hf_lbmr_topt_ulb_ulb_src_id;
2363 static int hf_lbmr_topt_ulb_src_ip_addr;
2364 static int hf_lbmr_topt_ulb_src_tcp_port;
2365 static int hf_lbmr_topt_ulb_reserved;
2366 static int hf_lbmr_topt_ctxinstq;
2367 static int hf_lbmr_topt_ctxinstq_type;
2368 static int hf_lbmr_topt_ctxinstq_len;
2369 static int hf_lbmr_topt_ctxinstq_flags;
2370 static int hf_lbmr_topt_ctxinstq_flags_ignore;
2371 static int hf_lbmr_topt_ctxinstq_idx;
2372 static int hf_lbmr_topt_ctxinstq_ctxinst;
2373 static int hf_lbmr_topt_domain_id;
2374 static int hf_lbmr_topt_domain_id_type;
2375 static int hf_lbmr_topt_domain_id_len;
2376 static int hf_lbmr_topt_domain_id_flags;
2377 static int hf_lbmr_topt_domain_id_flags_ignore;
2378 static int hf_lbmr_topt_domain_id_domain_id;
2379 static int hf_lbmr_topt_exfunc;
2380 static int hf_lbmr_topt_exfunc_type;
2381 static int hf_lbmr_topt_exfunc_len;
2382 static int hf_lbmr_topt_exfunc_flags;
2383 static int hf_lbmr_topt_exfunc_flags_ignore;
2384 static int hf_lbmr_topt_exfunc_src_tcp_port;
2385 static int hf_lbmr_topt_exfunc_reserved;
2386 static int hf_lbmr_topt_exfunc_src_ip_addr;
2387 static int hf_lbmr_topt_exfunc_functionality_flags;
2388 static int hf_lbmr_topt_exfunc_functionality_flags_lj;
2389 static int hf_lbmr_topt_exfunc_functionality_flags_ume;
2390 static int hf_lbmr_topt_exfunc_functionality_flags_umq;
2391 static int hf_lbmr_topt_exfunc_functionality_flags_ulb;
2392 static int hf_lbmr_topt_unknown;
2393 static int hf_lbmr_topt_unknown_type;
2394 static int hf_lbmr_topt_unknown_len;
2395 static int hf_lbmr_topt_unknown_flags;
2396 static int hf_lbmr_topt_unknown_data;
2397 static int hf_lbmr_qqr;
2398 static int hf_lbmr_qqr_name;
2399 static int hf_lbmr_qirs;
2400 static int hf_lbmr_qir;
2401 static int hf_lbmr_qir_queue_name;
2402 static int hf_lbmr_qir_topic_name;
2403 static int hf_lbmr_qir_queue_id;
2404 static int hf_lbmr_qir_queue_ver;
2405 static int hf_lbmr_qir_queue_prev_ver;
2406 static int hf_lbmr_qir_option_flag;
2407 static int hf_lbmr_qir_grp_blks;
2408 static int hf_lbmr_qir_queue_blks;
2409 static int hf_lbmr_qir_grps;
2410 static int hf_lbmr_qir_grp_blk;
2411 static int hf_lbmr_qir_grp_blk_grp_idx;
2412 static int hf_lbmr_qir_grp_blk_grp_sz;
2413 static int hf_lbmr_qir_queues;
2414 static int hf_lbmr_qir_queue_blk;
2415 static int hf_lbmr_qir_queue_blk_ip;
2416 static int hf_lbmr_qir_queue_blk_port;
2417 static int hf_lbmr_qir_queue_blk_idx;
2418 static int hf_lbmr_qir_queue_blk_grp_idx;
2419 static int hf_lbmr_qir_queue_blk_reserved;
2420 static int hf_lbmr_tmb;
2421 static int hf_lbmr_tmb_len;
2422 static int hf_lbmr_tmb_tmrs;
2423 static int hf_lbmr_tmb_tmr_list;
2424 static int hf_lbmr_tmr;
2425 static int hf_lbmr_tmr_len;
2426 static int hf_lbmr_tmr_type;
2427 static int hf_lbmr_tmr_flags;
2428 static int hf_lbmr_tmr_flags_response;
2429 static int hf_lbmr_tmr_flags_wildcard_pcre;
2430 static int hf_lbmr_tmr_flags_wildcard_regex;
2431 static int hf_lbmr_tmr_name;
2432 static int hf_lbmr_pser_dep_type;
2433 static int hf_lbmr_pser_len;
2434 static int hf_lbmr_pser_flags;
2435 static int hf_lbmr_pser_flags_option;
2436 static int hf_lbmr_pser_source_ip;
2437 static int hf_lbmr_pser_store_ip;
2438 static int hf_lbmr_pser_transport_idx;
2439 static int hf_lbmr_pser_topic_idx;
2440 static int hf_lbmr_pser_source_port;
2441 static int hf_lbmr_pser_store_port;
2442 static int hf_lbmr_pser_topic;
2443 static int hf_lbmr_pser_opts;
2444 static int hf_lbmr_pser_optlen;
2445 static int hf_lbmr_pser_optlen_type;
2446 static int hf_lbmr_pser_optlen_optlen;
2447 static int hf_lbmr_pser_opt_ctxinst;
2448 static int hf_lbmr_pser_opt_ctxinst_len;
2449 static int hf_lbmr_pser_opt_ctxinst_type;
2450 static int hf_lbmr_pser_opt_ctxinst_ctxinst;
2451 static int hf_lbmr_opts;
2452 static int hf_lbmr_opt_len;
2453 static int hf_lbmr_opt_len_type;
2454 static int hf_lbmr_opt_len_len;
2455 static int hf_lbmr_opt_len_total_len;
2456 static int hf_lbmr_opt_src_id;
2457 static int hf_lbmr_opt_src_id_type;
2458 static int hf_lbmr_opt_src_id_len;
2459 static int hf_lbmr_opt_src_id_flags;
2460 static int hf_lbmr_opt_src_id_flags_ignore;
2461 static int hf_lbmr_opt_src_id_src_id;
2462 static int hf_lbmr_opt_src_type;
2463 static int hf_lbmr_opt_src_type_type;
2464 static int hf_lbmr_opt_src_type_len;
2465 static int hf_lbmr_opt_src_type_flags;
2466 static int hf_lbmr_opt_src_type_flags_ignore;
2467 static int hf_lbmr_opt_src_type_src_type;
2468 static int hf_lbmr_opt_version;
2469 static int hf_lbmr_opt_version_type;
2470 static int hf_lbmr_opt_version_len;
2471 static int hf_lbmr_opt_version_flags;
2472 static int hf_lbmr_opt_version_flags_ignore;
2473 static int hf_lbmr_opt_version_flags_ume;
2474 static int hf_lbmr_opt_version_flags_umq;
2475 static int hf_lbmr_opt_version_version;
2476 static int hf_lbmr_opt_local_domain;
2477 static int hf_lbmr_opt_local_domain_type;
2478 static int hf_lbmr_opt_local_domain_len;
2479 static int hf_lbmr_opt_local_domain_flags;
2480 static int hf_lbmr_opt_local_domain_flags_ignore;
2481 static int hf_lbmr_opt_local_domain_flags_viral;
2482 static int hf_lbmr_opt_local_domain_local_domain_id;
2483 static int hf_lbmr_opt_unknown;
2484 static int hf_lbmr_opt_unknown_type;
2485 static int hf_lbmr_opt_unknown_len;
2486 static int hf_lbmr_opt_unknown_flags;
2487 static int hf_lbmr_opt_unknown_data;
2488 static int hf_lbmr_topic_res_request_flags;
2489 static int hf_lbmr_topic_res_request_flags_gw_remote_interest;
2490 static int hf_lbmr_topic_res_request_flags_context_query;
2491 static int hf_lbmr_topic_res_request_flags_context_advertisement;
2492 static int hf_lbmr_topic_res_request_flags_gateway_meta;
2493 static int hf_lbmr_topic_res_request_flags_advertisement;
2494 static int hf_lbmr_topic_res_request_flags_query;
2495 static int hf_lbmr_topic_res_request_flags_wildcard_query;
2496 static int hf_lbmr_ctxinfo_len;
2497 static int hf_lbmr_ctxinfo_hop_count;
2498 static int hf_lbmr_ctxinfo_flags;
2499 static int hf_lbmr_ctxinfo_flags_query;
2500 static int hf_lbmr_ctxinfo_flags_ip;
2501 static int hf_lbmr_ctxinfo_flags_instance;
2502 static int hf_lbmr_ctxinfo_flags_tnwg_src;
2503 static int hf_lbmr_ctxinfo_flags_tnwg_rcv;
2504 static int hf_lbmr_ctxinfo_flags_proxy;
2505 static int hf_lbmr_ctxinfo_flags_name;
2506 static int hf_lbmr_ctxinfo_port;
2507 static int hf_lbmr_ctxinfo_ip;
2508 static int hf_lbmr_ctxinfo_instance;
2509 static int hf_lbmr_ctxinfo_name;
2510 static int hf_lbmr_tnwg_len;
2511 static int hf_lbmr_tnwg_type;
2512 static int hf_lbmr_tnwg_reserved;
2513 static int hf_lbmr_tnwg_interest;
2514 static int hf_lbmr_tnwg_interest_len;
2515 static int hf_lbmr_tnwg_interest_count;
2516 static int hf_lbmr_tnwg_interest_rec;
2517 static int hf_lbmr_tnwg_interest_rec_len;
2518 static int hf_lbmr_tnwg_interest_rec_flags;
2519 static int hf_lbmr_tnwg_interest_rec_flags_pattern;
2520 static int hf_lbmr_tnwg_interest_rec_flags_cancel;
2521 static int hf_lbmr_tnwg_interest_rec_flags_refresh;
2522 static int hf_lbmr_tnwg_interest_rec_pattype;
2523 static int hf_lbmr_tnwg_interest_rec_domain_id;
2524 static int hf_lbmr_tnwg_interest_rec_symbol;
2525 static int hf_lbmr_tnwg_ctxinfo;
2526 static int hf_lbmr_tnwg_ctxinfo_len;
2527 static int hf_lbmr_tnwg_ctxinfo_hop_count;
2528 static int hf_lbmr_tnwg_ctxinfo_reserved;
2529 static int hf_lbmr_tnwg_ctxinfo_flags1;
2530 static int hf_lbmr_tnwg_ctxinfo_flags1_query;
2531 static int hf_lbmr_tnwg_ctxinfo_flags1_tnwg_src;
2532 static int hf_lbmr_tnwg_ctxinfo_flags1_tnwg_rcv;
2533 static int hf_lbmr_tnwg_ctxinfo_flags1_proxy;
2534 static int hf_lbmr_tnwg_ctxinfo_flags2;
2535 static int hf_lbmr_tnwg_trreq;
2536 static int hf_lbmr_tnwg_trreq_len;
2537 static int hf_lbmr_tnwg_opt;
2538 static int hf_lbmr_tnwg_opt_type;
2539 static int hf_lbmr_tnwg_opt_len;
2540 static int hf_lbmr_tnwg_opt_flags;
2541 static int hf_lbmr_tnwg_opt_flags_ignore;
2542 static int hf_lbmr_tnwg_opt_data;
2543 static int hf_lbmr_tnwg_opt_ctxinst;
2544 static int hf_lbmr_tnwg_opt_ctxinst_type;
2545 static int hf_lbmr_tnwg_opt_ctxinst_len;
2546 static int hf_lbmr_tnwg_opt_ctxinst_flags;
2547 static int hf_lbmr_tnwg_opt_ctxinst_flags_ignore;
2548 static int hf_lbmr_tnwg_opt_ctxinst_instance;
2549 static int hf_lbmr_tnwg_opt_address;
2550 static int hf_lbmr_tnwg_opt_address_type;
2551 static int hf_lbmr_tnwg_opt_address_len;
2552 static int hf_lbmr_tnwg_opt_address_flags;
2553 static int hf_lbmr_tnwg_opt_address_flags_ignore;
2554 static int hf_lbmr_tnwg_opt_address_port;
2555 static int hf_lbmr_tnwg_opt_address_res;
2556 static int hf_lbmr_tnwg_opt_address_ip;
2557 static int hf_lbmr_tnwg_opt_domain;
2558 static int hf_lbmr_tnwg_opt_domain_type;
2559 static int hf_lbmr_tnwg_opt_domain_len;
2560 static int hf_lbmr_tnwg_opt_domain_flags;
2561 static int hf_lbmr_tnwg_opt_domain_flags_ignore;
2562 static int hf_lbmr_tnwg_opt_domain_domain_id;
2563 static int hf_lbmr_tnwg_opt_name;
2564 static int hf_lbmr_tnwg_opt_name_type;
2565 static int hf_lbmr_tnwg_opt_name_len;
2566 static int hf_lbmr_tnwg_opt_name_flags;
2567 static int hf_lbmr_tnwg_opt_name_flags_ignore;
2568 static int hf_lbmr_tnwg_opt_name_name;
2569 static int hf_lbmr_remote_domain_route_hdr_num_domains;
2570 static int hf_lbmr_remote_domain_route_hdr_ip;
2571 static int hf_lbmr_remote_domain_route_hdr_port;
2572 static int hf_lbmr_remote_domain_route_hdr_route_index;
2573 static int hf_lbmr_remote_domain_route_hdr_length;
2574 static int hf_lbmr_remote_domain_route_hdr_domain;
2575 static int hf_lbmr_rctxinfo_len;
2576 static int hf_lbmr_rctxinfo_num_recs;
2577 static int hf_lbmr_rctxinfo_reserved;
2578 static int hf_lbmr_rctxinfo_rec;
2579 static int hf_lbmr_rctxinfo_rec_len;
2580 static int hf_lbmr_rctxinfo_rec_flags;
2581 static int hf_lbmr_rctxinfo_rec_flags_query;
2582 static int hf_lbmr_rctxinfo_rec_address;
2583 static int hf_lbmr_rctxinfo_rec_address_type;
2584 static int hf_lbmr_rctxinfo_rec_address_len;
2585 static int hf_lbmr_rctxinfo_rec_address_flags;
2586 static int hf_lbmr_rctxinfo_rec_address_domain_id;
2587 static int hf_lbmr_rctxinfo_rec_address_ip;
2588 static int hf_lbmr_rctxinfo_rec_address_port;
2589 static int hf_lbmr_rctxinfo_rec_address_res;
2590 static int hf_lbmr_rctxinfo_rec_instance;
2591 static int hf_lbmr_rctxinfo_rec_instance_type;
2592 static int hf_lbmr_rctxinfo_rec_instance_len;
2593 static int hf_lbmr_rctxinfo_rec_instance_flags;
2594 static int hf_lbmr_rctxinfo_rec_instance_instance;
2595 static int hf_lbmr_rctxinfo_rec_odomain;
2596 static int hf_lbmr_rctxinfo_rec_odomain_type;
2597 static int hf_lbmr_rctxinfo_rec_odomain_len;
2598 static int hf_lbmr_rctxinfo_rec_odomain_flags;
2599 static int hf_lbmr_rctxinfo_rec_odomain_domain_id;
2600 static int hf_lbmr_rctxinfo_rec_name;
2601 static int hf_lbmr_rctxinfo_rec_name_type;
2602 static int hf_lbmr_rctxinfo_rec_name_len;
2603 static int hf_lbmr_rctxinfo_rec_name_flags;
2604 static int hf_lbmr_rctxinfo_rec_name_name;
2605 static int hf_lbmr_rctxinfo_rec_unknown;
2606 static int hf_lbmr_rctxinfo_rec_unknown_type;
2607 static int hf_lbmr_rctxinfo_rec_unknown_len;
2608 static int hf_lbmr_rctxinfo_rec_unknown_flags;
2609 static int hf_lbmr_rctxinfo_rec_unknown_data;
2610 static int hf_qmgmt_flags;
2611 static int hf_qmgmt_flags_i_flag;
2612 static int hf_qmgmt_flags_n_flag;
2613 static int hf_qmgmt_flags_il_l_flag;
2614 static int hf_qmgmt_flags_il_k_flag;
2615 static int hf_qmgmt_pckt_type;
2616 static int hf_qmgmt_cfgsig;
2617 static int hf_qmgmt_queue_id;
2618 static int hf_qmgmt_queue_ver;
2619 static int hf_qmgmt_ip;
2620 static int hf_qmgmt_port;
2621 static int hf_qmgmt_inst_idx;
2622 static int hf_qmgmt_grp_idx;
2623 static int hf_qmgmt_pckt_type_dep16;
2624 static int hf_qmgmt_il_num_insts;
2625 static int hf_qmgmt_jrej_code;
2626 static int hf_qmgmt_ev_bias;
2627 static int hf_qmgmt_il;
2628 static int hf_qmgmt_il_highest_rcr_tsp;
2629 static int hf_qmgmt_il_inst;
2630 static int hf_qmgmt_il_inst_ip;
2631 static int hf_qmgmt_il_inst_port;
2632 static int hf_qmgmt_il_inst_inst_idx;
2633 static int hf_qmgmt_il_inst_grp_idx;
2634 static int hf_qmgmt_il_inst_flags;
2635 static int hf_qmgmt_il_inst_flags_m_flag;
2636 static int hf_qmgmt_il_inst_flags_q_flag;
2637 static int hf_qmgmt_il_inst_flags_p_flag;
2638 static int hf_qmgmt_ec;
2639 static int hf_qmgmt_ec_queue_new_ver;
2640 static int hf_qmgmt_ev;
2641 static int hf_qmgmt_ev_highest_rcr_tsp;
2642 static int hf_qmgmt_ev_age;
2643 static int hf_qmgmt_qro;
2644 static int hf_qmgmt_qro_highest_rcr_tsp;
2645 static int hf_qmgmt_qname;
2647 /* Expert info handles */
2648 static expert_field ei_lbmr_analysis_length_incorrect;
2649 static expert_field ei_lbmr_analysis_invalid_value;
2650 static expert_field ei_lbmr_analysis_zero_len_option;
2653 /* Tap handles */
2654 static int lbmr_topic_advertisement_tap_handle = -1;
2655 static int lbmr_topic_query_tap_handle = -1;
2656 static int lbmr_pattern_query_tap_handle = -1;
2657 static int lbmr_queue_advertisement_tap_handle = -1;
2658 static int lbmr_queue_query_tap_handle = -1;
2660 #define LBMR_TOPIC_ADVERTISEMENT_TAP_STRING "lbm_lbmr_topic_advertisement"
2661 #define LBMR_TOPIC_QUERY_TAP_STRING "lbm_lbmr_topic_query"
2662 #define LBMR_PATTERN_QUERY_TAP_STRING "lbm_lbmr_pattern_query"
2663 #define LBMR_QUEUE_ADVERTISEMENT_TAP_STRING "lbm_lbmr_queue_advertisement"
2664 #define LBMR_QUEUE_QUERY_TAP_STRING "lbm_lbmr_queue_query"
2666 /*----------------------------------------------------------------------------*/
2667 /* Statistics. */
2668 /*----------------------------------------------------------------------------*/
2669 /* Statistics structures */
2670 struct tqr_node_t_stct;
2671 struct tqr_node_t_stct
2673 char * topic;
2674 struct tqr_node_t_stct * next;
2676 typedef struct tqr_node_t_stct tqr_node_t;
2678 struct wctqr_node_t_stct;
2679 struct wctqr_node_t_stct
2681 uint8_t type;
2682 char * pattern;
2683 struct wctqr_node_t_stct * next;
2685 typedef struct wctqr_node_t_stct wctqr_node_t;
2687 struct tir_node_t_stct;
2688 struct tir_node_t_stct
2690 char * topic;
2691 char * source_string;
2692 uint32_t idx;
2693 struct tir_node_t_stct * next;
2695 typedef struct tir_node_t_stct tir_node_t;
2697 typedef struct
2699 int tqr_count;
2700 tqr_node_t * tqr;
2701 int tir_count;
2702 tir_node_t * tir;
2703 int wctqr_count;
2704 wctqr_node_t * wctqr;
2705 } lbmr_topic_contents_t;
2707 struct qqr_node_t_stct;
2708 struct qqr_node_t_stct
2710 char * queue;
2711 struct qqr_node_t_stct * next;
2713 typedef struct qqr_node_t_stct qqr_node_t;
2715 struct qir_node_t_stct;
2716 struct qir_node_t_stct
2718 char * queue;
2719 char * topic;
2720 uint16_t port;
2721 struct qir_node_t_stct * next;
2723 typedef struct qir_node_t_stct qir_node_t;
2725 typedef struct
2727 int qqr_count;
2728 qqr_node_t * qqr;
2729 int qir_count;
2730 qir_node_t * qir;
2731 } lbmr_queue_contents_t;
2733 typedef struct
2735 int type;
2736 union
2738 lbmr_topic_contents_t topic;
2739 lbmr_queue_contents_t queue;
2740 } contents;
2741 } lbmr_contents_t;
2743 #define LBMR_CONTENTS_TOPIC 0
2744 #define LBMR_CONTENTS_QUEUE 1
2746 /* Statistics titles */
2747 static const char * lbmr_stat_tree_name_topic_ads_topic = "29West/Topics/Advertisements by Topic";
2748 static const char * lbmr_stat_tree_name_topic_ads_source = "29West/Topics/Advertisements by Source";
2749 static const char * lbmr_stat_tree_name_topic_ads_transport = "29West/Topics/Advertisements by Transport";
2750 static const char * lbmr_stat_tree_name_topic_queries_topic = "29West/Topics/Queries by Topic";
2751 static const char * lbmr_stat_tree_name_topic_queries_receiver = "29West/Topics/Queries by Receiver";
2752 static const char * lbmr_stat_tree_name_topic_queries_pattern = "29West/Topics/Wildcard Queries by Pattern";
2753 static const char * lbmr_stat_tree_name_topic_queries_pattern_receiver = "29West/Topics/Wildcard Queries by Receiver";
2754 static const char * lbmr_stat_tree_name_queue_ads_queue = "29West/Queues/Advertisements by Queue";
2755 static const char * lbmr_stat_tree_name_queue_ads_source = "29West/Queues/Advertisements by Source";
2756 static const char * lbmr_stat_tree_name_queue_queries_queue = "29West/Queues/Queries by Queue";
2757 static const char * lbmr_stat_tree_name_queue_queries_receiver = "29West/Queues/Queries by Receiver";
2759 /* Statistics handles */
2760 static int lbmr_stats_tree_handle_topic_ads_topic = -1;
2761 static int lbmr_stats_tree_handle_topic_ads_source = -1;
2762 static int lbmr_stats_tree_handle_topic_ads_transport = -1;
2763 static int lbmr_stats_tree_handle_topic_queries_topic = -1;
2764 static int lbmr_stats_tree_handle_topic_queries_receiver = -1;
2765 static int lbmr_stats_tree_handle_topic_queries_pattern = -1;
2766 static int lbmr_stats_tree_handle_topic_queries_pattern_receiver = -1;
2767 static int lbmr_stats_tree_handle_queue_ads_queue = -1;
2768 static int lbmr_stats_tree_handle_queue_ads_source = -1;
2769 static int lbmr_stats_tree_handle_queue_queries_queue = -1;
2770 static int lbmr_stats_tree_handle_queue_queries_receiver = -1;
2772 /*----------------------------------------------------------------------------*/
2773 /* Statistics tree utility functions. */
2774 /*----------------------------------------------------------------------------*/
2776 static void add_contents_tqr(lbmr_contents_t * contents, const char * topic)
2778 tqr_node_t * node = NULL;
2780 node = wmem_new(wmem_packet_scope(), tqr_node_t);
2781 node->topic = wmem_strdup(wmem_packet_scope(), topic);
2782 node->next = contents->contents.topic.tqr;
2783 contents->contents.topic.tqr = node;
2784 contents->contents.topic.tqr_count++;
2787 static void add_contents_wctqr(lbmr_contents_t * contents, unsigned char type, const char * pattern)
2789 wctqr_node_t * node = NULL;
2791 node = wmem_new(wmem_packet_scope(), wctqr_node_t);
2792 node->type = type;
2793 node->pattern = wmem_strdup(wmem_packet_scope(), pattern);
2794 node->next = contents->contents.topic.wctqr;
2795 contents->contents.topic.wctqr = node;
2796 contents->contents.topic.wctqr_count++;
2799 static void add_contents_tir(lbmr_contents_t * contents, const char * topic, char * source, uint32_t topic_index)
2801 tir_node_t * node = NULL;
2803 node = wmem_new(wmem_packet_scope(), tir_node_t);
2804 node->topic = wmem_strdup(wmem_packet_scope(), topic);
2805 node->source_string = source;
2806 node->idx = topic_index;
2807 node->next = contents->contents.topic.tir;
2808 contents->contents.topic.tir = node;
2809 contents->contents.topic.tir_count++;
2812 static void add_contents_qqr(lbmr_contents_t * contents, const char * queue)
2814 qqr_node_t * node = NULL;
2816 node = wmem_new(wmem_packet_scope(), qqr_node_t);
2817 node->queue = wmem_strdup(wmem_packet_scope(), queue);
2818 node->next = contents->contents.queue.qqr;
2819 contents->contents.queue.qqr = node;
2820 contents->contents.queue.qqr_count++;
2823 static void add_contents_qir(lbmr_contents_t * contents, const char * queue, const char * topic, uint16_t port)
2825 qir_node_t * node = NULL;
2827 node = wmem_new(wmem_packet_scope(), qir_node_t);
2828 node->queue = wmem_strdup(wmem_packet_scope(), queue);
2829 node->topic = wmem_strdup(wmem_packet_scope(), topic);
2830 node->port = port;
2831 node->next = contents->contents.queue.qir;
2832 contents->contents.queue.qir = node;
2833 contents->contents.queue.qir_count++;
2836 /*----------------------------------------------------------------------------*/
2837 /* Topic advertisements by Topic: */
2838 /* Topic name */
2839 /* - Source address */
2840 /* - Source string (including topic index) */
2841 /*----------------------------------------------------------------------------*/
2843 static void lbmr_topic_ads_topic_stats_tree_init(stats_tree * tree)
2845 lbmr_stats_tree_handle_topic_ads_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, STAT_DT_INT, true);
2848 static tap_packet_status lbmr_topic_ads_topic_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2850 const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2851 int topic_node;
2852 int source_node;
2853 char * full_source_string;
2855 tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, false);
2856 topic_node = tick_stat_node(tree, info->topic, lbmr_stats_tree_handle_topic_ads_topic, true);
2857 source_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), topic_node, true);
2858 full_source_string = wmem_strdup_printf(wmem_packet_scope(), "%s[%" PRIu32 "]", info->source, info->topic_index);
2859 tick_stat_node(tree, full_source_string, source_node, true);
2860 return (TAP_PACKET_REDRAW);
2863 /*----------------------------------------------------------------------------*/
2864 /* Topic advertisements by Source: */
2865 /* Source address */
2866 /* - Topic name */
2867 /* - Source string (including topic index) */
2868 /*----------------------------------------------------------------------------*/
2870 static void lbmr_topic_ads_source_stats_tree_init(stats_tree * tree)
2872 lbmr_stats_tree_handle_topic_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, STAT_DT_INT, true);
2875 static tap_packet_status lbmr_topic_ads_source_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2877 const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2878 int source_node;
2879 int topic_node;
2880 char * full_source_string;
2882 tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, false);
2883 source_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), lbmr_stats_tree_handle_topic_ads_source, true);
2884 topic_node = tick_stat_node(tree, info->topic, source_node, true);
2885 full_source_string = wmem_strdup_printf(wmem_packet_scope(), "%s[%" PRIu32 "]", info->source, info->topic_index);
2886 tick_stat_node(tree, full_source_string, topic_node, true);
2887 return (TAP_PACKET_REDRAW);
2890 /*----------------------------------------------------------------------------*/
2891 /* Topic advertisements by Transport: */
2892 /* Source string */
2893 /* - Topic name (including topic index) */
2894 /*----------------------------------------------------------------------------*/
2896 static void lbmr_topic_ads_transport_stats_tree_init(stats_tree * tree)
2898 lbmr_stats_tree_handle_topic_ads_transport = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, STAT_DT_INT, true);
2901 static tap_packet_status lbmr_topic_ads_transport_stats_tree_packet(stats_tree * tree, packet_info * pinfo _U_, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2903 const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2904 int transport_node;
2905 char * full_source_string;
2907 tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, false);
2908 transport_node = tick_stat_node(tree, info->source, lbmr_stats_tree_handle_topic_ads_transport, true);
2909 full_source_string = wmem_strdup_printf(wmem_packet_scope(), "%s [%" PRIu32 "]", info->topic, info->topic_index);
2910 tick_stat_node(tree, full_source_string, transport_node, true);
2911 return (TAP_PACKET_REDRAW);
2914 /*----------------------------------------------------------------------------*/
2915 /* Topic queries by Topic: */
2916 /* Topic name */
2917 /* - Receiver address */
2918 /*----------------------------------------------------------------------------*/
2920 static void lbmr_topic_queries_topic_stats_tree_init(stats_tree * tree)
2922 lbmr_stats_tree_handle_topic_queries_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, STAT_DT_INT, true);
2925 static tap_packet_status lbmr_topic_queries_topic_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2927 const lbm_lbmr_topic_query_tap_info_t * info = (const lbm_lbmr_topic_query_tap_info_t *) data;
2928 int topic_node;
2930 tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, false);
2931 topic_node = tick_stat_node(tree, info->topic, lbmr_stats_tree_handle_topic_queries_topic, true);
2932 tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), topic_node, true);
2933 return (TAP_PACKET_REDRAW);
2936 /*----------------------------------------------------------------------------*/
2937 /* Topic queries by Receiver: */
2938 /* Receiver address */
2939 /* - Topic name */
2940 /*----------------------------------------------------------------------------*/
2942 static void lbmr_topic_queries_receiver_stats_tree_init(stats_tree * tree)
2944 lbmr_stats_tree_handle_topic_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, STAT_DT_INT, true);
2947 static tap_packet_status lbmr_topic_queries_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2949 const lbm_lbmr_topic_query_tap_info_t * info = (const lbm_lbmr_topic_query_tap_info_t *) data;
2950 int receiver_node;
2952 tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, false);
2953 receiver_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), lbmr_stats_tree_handle_topic_queries_receiver, true);
2954 tick_stat_node(tree, info->topic, receiver_node, true);
2955 return (TAP_PACKET_REDRAW);
2958 /*----------------------------------------------------------------------------*/
2959 /* Topic queries by Pattern: */
2960 /* Pattern */
2961 /* - Receiver address */
2962 /*----------------------------------------------------------------------------*/
2964 static void lbmr_topic_queries_pattern_stats_tree_init(stats_tree * tree)
2966 lbmr_stats_tree_handle_topic_queries_pattern = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, STAT_DT_INT, true);
2969 static tap_packet_status lbmr_topic_queries_pattern_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2971 const lbm_lbmr_pattern_query_tap_info_t * info = (const lbm_lbmr_pattern_query_tap_info_t *) data;
2972 int pattern_node;
2973 char * pattern_str;
2975 tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, false);
2976 pattern_str = wmem_strdup_printf(wmem_packet_scope(), "%s (%s)",
2977 info->pattern,
2978 val_to_str(info->type, lbm_wildcard_pattern_type_short, "UNKN[0x%02x]"));
2979 pattern_node = tick_stat_node(tree, pattern_str, lbmr_stats_tree_handle_topic_queries_pattern, true);
2980 tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), pattern_node, true);
2981 return (TAP_PACKET_REDRAW);
2984 /*----------------------------------------------------------------------------*/
2985 /* Topic queries by Pattern: */
2986 /* Receiver address */
2987 /* - Patternme */
2988 /*----------------------------------------------------------------------------*/
2990 static void lbmr_topic_queries_pattern_receiver_stats_tree_init(stats_tree * tree)
2992 lbmr_stats_tree_handle_topic_queries_pattern_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern_receiver, 0, STAT_DT_INT, true);
2995 static tap_packet_status lbmr_topic_queries_pattern_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
2997 const lbm_lbmr_pattern_query_tap_info_t * info = (const lbm_lbmr_pattern_query_tap_info_t *) data;
2998 int receiver_node;
2999 char * pattern_str;
3001 tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_pattern_receiver, 0, false);
3002 receiver_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), lbmr_stats_tree_handle_topic_queries_pattern_receiver, true);
3003 pattern_str = wmem_strdup_printf(wmem_packet_scope(), "%s (%s)",
3004 info->pattern,
3005 val_to_str(info->type, lbm_wildcard_pattern_type_short, "UNKN[0x%02x]"));
3006 tick_stat_node(tree, pattern_str, receiver_node, true);
3007 return (TAP_PACKET_REDRAW);
3010 /*----------------------------------------------------------------------------*/
3011 /* Queue advertisements by Queue: */
3012 /* Queue name */
3013 /* - Source address and port */
3014 /*----------------------------------------------------------------------------*/
3016 static void lbmr_queue_ads_queue_stats_tree_init(stats_tree * tree)
3018 lbmr_stats_tree_handle_queue_ads_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, STAT_DT_INT, true);
3021 static tap_packet_status lbmr_queue_ads_queue_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
3023 const lbm_lbmr_queue_advertisement_tap_info_t * info = (const lbm_lbmr_queue_advertisement_tap_info_t *) data;
3024 int queue_node;
3025 char * str;
3027 tick_stat_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, false);
3028 queue_node = tick_stat_node(tree, info->queue, lbmr_stats_tree_handle_queue_ads_queue, true);
3029 str = wmem_strdup_printf(wmem_packet_scope(), "%s:%" PRIu16, address_to_str(wmem_packet_scope(), &pinfo->net_src), info->port);
3030 tick_stat_node(tree, str, queue_node, true);
3031 return (TAP_PACKET_REDRAW);
3034 /*----------------------------------------------------------------------------*/
3035 /* Queue advertisements by Source: */
3036 /* Source address */
3037 /* - Queue name and port */
3038 /*----------------------------------------------------------------------------*/
3040 static void lbmr_queue_ads_source_stats_tree_init(stats_tree * tree)
3042 lbmr_stats_tree_handle_queue_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, STAT_DT_INT, true);
3045 static tap_packet_status lbmr_queue_ads_source_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
3047 const lbm_lbmr_queue_advertisement_tap_info_t * info = (const lbm_lbmr_queue_advertisement_tap_info_t *) data;
3048 int source_node;
3049 char * str;
3051 tick_stat_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, false);
3052 source_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), lbmr_stats_tree_handle_queue_ads_source, true);
3053 str = wmem_strdup_printf(wmem_packet_scope(), "%s:%" PRIu16, info->queue, info->port);
3054 tick_stat_node(tree, str, source_node, true);
3055 return (TAP_PACKET_REDRAW);
3058 /*----------------------------------------------------------------------------*/
3059 /* Queue queries by Queue: */
3060 /* Queue name */
3061 /* - Receiver address */
3062 /*----------------------------------------------------------------------------*/
3064 static void lbmr_queue_queries_queue_stats_tree_init(stats_tree * tree)
3066 lbmr_stats_tree_handle_queue_queries_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, STAT_DT_INT, true);
3069 static tap_packet_status lbmr_queue_queries_queue_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
3071 const lbm_lbmr_queue_query_tap_info_t * info = (const lbm_lbmr_queue_query_tap_info_t *) data;
3072 int queue_node = 0;
3074 tick_stat_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, false);
3075 queue_node = tick_stat_node(tree, info->queue, lbmr_stats_tree_handle_queue_queries_queue, true);
3076 tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), queue_node, true);
3077 return (TAP_PACKET_REDRAW);
3080 /*----------------------------------------------------------------------------*/
3081 /* Queue queries by Receiver: */
3082 /* Receiver address */
3083 /* - Queue name */
3084 /*----------------------------------------------------------------------------*/
3086 static void lbmr_queue_queries_receiver_stats_tree_init(stats_tree * tree)
3088 lbmr_stats_tree_handle_queue_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, STAT_DT_INT, true);
3091 static tap_packet_status lbmr_queue_queries_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data, tap_flags_t flags _U_)
3093 const lbm_lbmr_queue_query_tap_info_t * info = (const lbm_lbmr_queue_query_tap_info_t *) data;
3094 int receiver_node;
3096 tick_stat_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, false);
3097 receiver_node = tick_stat_node(tree, address_to_str(wmem_packet_scope(), &pinfo->net_src), lbmr_stats_tree_handle_queue_queries_receiver, true);
3098 tick_stat_node(tree, info->queue, receiver_node, true);
3099 return (TAP_PACKET_REDRAW);
3102 /*----------------------------------------------------------------------------*/
3103 /* Dissector functions. */
3104 /*----------------------------------------------------------------------------*/
3106 /*----------------------------------------------------------------------------*/
3107 /* LBMR TNWG option dissection functions. */
3108 /*----------------------------------------------------------------------------*/
3109 static int dissect_lbmr_tnwg_ctxinst_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3111 proto_tree * opt_tree = NULL;
3112 proto_item * opt_item = NULL;
3113 uint8_t opt_len = 0;
3114 static int * const flags[] =
3116 &hf_lbmr_tnwg_opt_ctxinst_flags_ignore,
3117 NULL
3120 opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_LEN);
3121 opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_ctxinst, tvb, offset, opt_len, ENC_NA);
3122 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_ctxinst_opt);
3123 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_ctxinst_type, tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_TYPE, L_LBMR_TNWG_OPT_CTXINST_T_TYPE, ENC_BIG_ENDIAN);
3124 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_ctxinst_len, tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_LEN, L_LBMR_TNWG_OPT_CTXINST_T_LEN, ENC_BIG_ENDIAN);
3125 proto_tree_add_bitmask(opt_tree, tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_FLAGS, hf_lbmr_tnwg_opt_ctxinst_flags, ett_lbmr_tnwg_ctxinst_opt_flags, flags, ENC_BIG_ENDIAN);
3126 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_ctxinst_instance, tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_INSTANCE, L_LBMR_TNWG_OPT_CTXINST_T_INSTANCE, ENC_NA);
3127 return ((int) opt_len);
3130 static int dissect_lbmr_tnwg_address_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3132 proto_tree * opt_tree = NULL;
3133 proto_item * opt_item = NULL;
3134 uint8_t opt_len = 0;
3135 static int * const flags[] =
3137 &hf_lbmr_tnwg_opt_address_flags_ignore,
3138 NULL
3141 opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_LEN);
3142 opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_address, tvb, offset, opt_len, ENC_NA);
3143 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_address_opt);
3144 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_address_type, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_TYPE, L_LBMR_TNWG_OPT_ADDRESS_T_TYPE, ENC_BIG_ENDIAN);
3145 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_address_len, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_LEN, L_LBMR_TNWG_OPT_ADDRESS_T_LEN, ENC_BIG_ENDIAN);
3146 proto_tree_add_bitmask(opt_tree, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_FLAGS, hf_lbmr_tnwg_opt_address_flags, ett_lbmr_tnwg_address_opt_flags, flags, ENC_BIG_ENDIAN);
3147 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_address_port, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_PORT, L_LBMR_TNWG_OPT_ADDRESS_T_PORT, ENC_BIG_ENDIAN);
3148 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_address_res, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_RES, L_LBMR_TNWG_OPT_ADDRESS_T_RES, ENC_BIG_ENDIAN);
3149 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_address_ip, tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_IP, L_LBMR_TNWG_OPT_ADDRESS_T_IP, ENC_BIG_ENDIAN);
3150 return ((int)opt_len);
3153 static int dissect_lbmr_tnwg_domain_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3155 proto_tree * opt_tree = NULL;
3156 proto_item * opt_item = NULL;
3157 uint8_t opt_len = 0;
3158 static int * const flags[] =
3160 &hf_lbmr_tnwg_opt_domain_flags_ignore,
3161 NULL
3164 opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_LEN);
3165 opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_domain, tvb, offset, opt_len, ENC_NA);
3166 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_domain_opt);
3167 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_domain_type, tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_TYPE, L_LBMR_TNWG_OPT_DOMAIN_T_TYPE, ENC_BIG_ENDIAN);
3168 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_domain_len, tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_LEN, L_LBMR_TNWG_OPT_DOMAIN_T_LEN, ENC_BIG_ENDIAN);
3169 proto_tree_add_bitmask(opt_tree, tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_FLAGS, hf_lbmr_tnwg_opt_domain_flags, ett_lbmr_tnwg_domain_opt_flags, flags, ENC_BIG_ENDIAN);
3170 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_domain_domain_id, tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_DOMAIN_ID, L_LBMR_TNWG_OPT_DOMAIN_T_DOMAIN_ID, ENC_BIG_ENDIAN);
3171 return ((int)opt_len);
3174 static int dissect_lbmr_tnwg_name_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3176 proto_tree * opt_tree = NULL;
3177 proto_item * opt_item = NULL;
3178 uint8_t opt_len = 0;
3179 static int * const flags[] =
3181 &hf_lbmr_tnwg_opt_name_flags_ignore,
3182 NULL
3184 uint32_t name_len = 0;
3186 opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_T_LEN);
3187 name_len = opt_len - L_LBMR_TNWG_OPT_T;
3188 opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_name, tvb, offset, opt_len, ENC_NA);
3189 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_name_opt);
3190 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_name_type, tvb, offset + O_LBMR_TNWG_OPT_T_TYPE, L_LBMR_TNWG_OPT_T_TYPE, ENC_BIG_ENDIAN);
3191 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_name_len, tvb, offset + O_LBMR_TNWG_OPT_T_LEN, L_LBMR_TNWG_OPT_T_LEN, ENC_BIG_ENDIAN);
3192 proto_tree_add_bitmask(opt_tree, tvb, offset + O_LBMR_TNWG_OPT_T_FLAGS, hf_lbmr_tnwg_opt_name_flags, ett_lbmr_tnwg_name_opt_flags, flags, ENC_BIG_ENDIAN);
3193 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_name_name, tvb, offset + L_LBMR_TNWG_OPT_T, name_len, ENC_ASCII);
3194 return ((int)opt_len);
3197 static int dissect_lbmr_tnwg_unknown_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3199 proto_tree * opt_tree = NULL;
3200 proto_item * opt_item = NULL;
3201 uint8_t opt_len = 0;
3202 static int * const flags[] =
3204 &hf_lbmr_tnwg_opt_flags_ignore,
3205 NULL
3207 uint32_t data_len = 0;
3209 opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_T_LEN);
3210 data_len = opt_len - L_LBMR_TNWG_OPT_T;
3211 opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt, tvb, offset, opt_len, ENC_NA);
3212 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_unknown_opt);
3213 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_type, tvb, offset + O_LBMR_TNWG_OPT_T_TYPE, L_LBMR_TNWG_OPT_T_TYPE, ENC_BIG_ENDIAN);
3214 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_len, tvb, offset + O_LBMR_TNWG_OPT_T_LEN, L_LBMR_TNWG_OPT_T_LEN, ENC_BIG_ENDIAN);
3215 proto_tree_add_bitmask(opt_tree, tvb, offset + O_LBMR_TNWG_OPT_T_FLAGS, hf_lbmr_tnwg_opt_flags, ett_lbmr_tnwg_unknown_opt_flags, flags, ENC_BIG_ENDIAN);
3216 proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_data, tvb, offset + L_LBMR_TNWG_OPT_T, data_len, ENC_NA);
3217 return ((int)opt_len);
3220 static int dissect_lbmr_tnwg_opts(tvbuff_t * tvb, int offset, int length, packet_info * pinfo, proto_tree * tree)
3222 int len_remaining = length;
3223 int curr_offset = offset;
3224 int dissected_len = 0;
3225 uint8_t type = 0;
3226 int len_used = 0;
3228 while (len_remaining >= L_LBMR_TNWG_OPT_T)
3230 type = tvb_get_uint8(tvb, curr_offset);
3231 switch (type)
3233 case LBMR_TNWG_OPT_CTXINST_TYPE:
3234 dissected_len += dissect_lbmr_tnwg_ctxinst_opt(tvb, curr_offset, pinfo, tree);
3235 break;
3236 case LBMR_TNWG_OPT_ADDRESS_TYPE:
3237 dissected_len += dissect_lbmr_tnwg_address_opt(tvb, curr_offset, pinfo, tree);
3238 break;
3239 case LBMR_TNWG_OPT_DOMAIN_TYPE:
3240 dissected_len += dissect_lbmr_tnwg_domain_opt(tvb, curr_offset, pinfo, tree);
3241 break;
3242 case LBMR_TNWG_OPT_NAME_TYPE:
3243 dissected_len += dissect_lbmr_tnwg_name_opt(tvb, curr_offset, pinfo, tree);
3244 break;
3245 default:
3246 dissected_len += dissect_lbmr_tnwg_unknown_opt(tvb, curr_offset, pinfo, tree);
3247 break;
3249 len_remaining -= dissected_len;
3250 len_used += dissected_len;
3251 curr_offset += dissected_len;
3253 return (len_used);
3256 /*----------------------------------------------------------------------------*/
3257 /* LBMR TNWG Interest dissection functions. */
3258 /*----------------------------------------------------------------------------*/
3259 static int dissect_lbmr_tnwg_interest_rec(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3261 proto_tree * rec_tree = NULL;
3262 proto_item * rec_item = NULL;
3263 uint16_t rec_len = 0;
3264 int string_len = 0;
3265 static int * const flags[] =
3267 &hf_lbmr_tnwg_interest_rec_flags_pattern,
3268 &hf_lbmr_tnwg_interest_rec_flags_cancel,
3269 &hf_lbmr_tnwg_interest_rec_flags_refresh,
3270 NULL
3273 rec_len = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_LEN);
3275 rec_item = proto_tree_add_item(tree, hf_lbmr_tnwg_interest_rec, tvb, offset, rec_len, ENC_NA);
3276 rec_tree = proto_item_add_subtree(rec_item, ett_lbmr_tnwg_interest_rec);
3277 proto_tree_add_item(rec_tree, hf_lbmr_tnwg_interest_rec_len, tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_LEN, L_LBMR_TNWG_INTEREST_REC_T_LEN, ENC_BIG_ENDIAN);
3278 if (rec_len < L_LBMR_TNWG_INTEREST_REC_T)
3280 /* XXX - report an error */
3281 return ((int)rec_len);
3283 proto_tree_add_bitmask(rec_tree, tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_FLAGS, hf_lbmr_tnwg_interest_rec_flags, ett_lbmr_tnwg_interest_rec_flags, flags, ENC_BIG_ENDIAN);
3284 proto_tree_add_item(rec_tree, hf_lbmr_tnwg_interest_rec_pattype, tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_PATTYPE, L_LBMR_TNWG_INTEREST_REC_T_PATTYPE, ENC_BIG_ENDIAN);
3285 proto_tree_add_item(rec_tree, hf_lbmr_tnwg_interest_rec_domain_id, tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID, L_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID, ENC_BIG_ENDIAN);
3286 string_len = rec_len - L_LBMR_TNWG_INTEREST_REC_T;
3287 proto_tree_add_item(rec_tree, hf_lbmr_tnwg_interest_rec_symbol, tvb, offset + L_LBMR_TNWG_INTEREST_REC_T, string_len, ENC_ASCII);
3288 return ((int)rec_len);
3291 static int dissect_lbmr_tnwg_interest(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3293 proto_tree * int_tree = NULL;
3294 proto_item * int_item = NULL;
3295 uint16_t rec_count = 0;
3296 int curr_offset = 0;
3297 int len = 0;
3298 int len_remaining = 0;
3299 int len_dissected = 0;
3301 len_remaining = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_T_LEN);
3302 rec_count = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_T_COUNT);
3303 int_item = proto_tree_add_item(tree, hf_lbmr_tnwg_interest, tvb, offset, len_remaining, ENC_NA);
3304 int_tree = proto_item_add_subtree(int_item, ett_lbmr_tnwg_interest);
3305 proto_tree_add_item(int_tree, hf_lbmr_tnwg_interest_len, tvb, offset + O_LBMR_TNWG_INTEREST_T_LEN, L_LBMR_TNWG_INTEREST_T_LEN, ENC_BIG_ENDIAN);
3306 proto_tree_add_item(int_tree, hf_lbmr_tnwg_interest_count, tvb, offset + O_LBMR_TNWG_INTEREST_T_COUNT, L_LBMR_TNWG_INTEREST_T_COUNT, ENC_BIG_ENDIAN);
3308 curr_offset = offset + L_LBMR_TNWG_INTEREST_T;
3309 len = L_LBMR_TNWG_INTEREST_T;
3310 while (rec_count > 0)
3312 len_dissected = dissect_lbmr_tnwg_interest_rec(tvb, curr_offset, pinfo, int_tree);
3313 curr_offset += len_dissected;
3314 len += len_dissected;
3315 rec_count--;
3317 return (len);
3320 /*----------------------------------------------------------------------------*/
3321 /* LBMR TNWG ContextInfo dissection functions. */
3322 /*----------------------------------------------------------------------------*/
3323 static int dissect_lbmr_tnwg_ctxinfo(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3325 proto_tree * ctxinfo_tree = NULL;
3326 proto_item * ctxinfo_item = NULL;
3327 static int * const flags1[] =
3329 &hf_lbmr_tnwg_ctxinfo_flags1_query,
3330 &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_src,
3331 &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_rcv,
3332 &hf_lbmr_tnwg_ctxinfo_flags1_proxy,
3333 NULL
3335 uint16_t reclen = 0;
3336 uint16_t len_remaining = 0;
3337 int len_used = 0;
3339 reclen = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_CTXINFO_T_LEN);
3340 len_remaining = reclen;
3341 ctxinfo_item = proto_tree_add_item(tree, hf_lbmr_tnwg_ctxinfo, tvb, offset, (int)reclen, ENC_NA);
3342 ctxinfo_tree = proto_item_add_subtree(ctxinfo_item, ett_lbmr_tnwg_ctxinfo);
3343 proto_tree_add_item(ctxinfo_tree, hf_lbmr_tnwg_ctxinfo_len, tvb, offset + O_LBMR_TNWG_CTXINFO_T_LEN, L_LBMR_TNWG_CTXINFO_T_LEN, ENC_BIG_ENDIAN);
3344 proto_tree_add_item(ctxinfo_tree, hf_lbmr_tnwg_ctxinfo_hop_count, tvb, offset + O_LBMR_TNWG_CTXINFO_T_HOP_COUNT, L_LBMR_TNWG_CTXINFO_T_HOP_COUNT, ENC_BIG_ENDIAN);
3345 proto_tree_add_item(ctxinfo_tree, hf_lbmr_tnwg_ctxinfo_reserved, tvb, offset + O_LBMR_TNWG_CTXINFO_T_RESERVED, L_LBMR_TNWG_CTXINFO_T_RESERVED, ENC_BIG_ENDIAN);
3346 proto_tree_add_bitmask(ctxinfo_tree, tvb, offset + O_LBMR_TNWG_CTXINFO_T_FLAGS1, hf_lbmr_tnwg_ctxinfo_flags1, ett_lbmr_tnwg_ctxinfo_flags1, flags1, ENC_BIG_ENDIAN);
3347 proto_tree_add_item(ctxinfo_tree, hf_lbmr_tnwg_ctxinfo_flags2, tvb, offset + O_LBMR_TNWG_CTXINFO_T_FLAGS2, L_LBMR_TNWG_CTXINFO_T_FLAGS2, ENC_BIG_ENDIAN);
3348 offset += L_LBMR_TNWG_CTXINFO_T;
3349 len_remaining -= L_LBMR_TNWG_CTXINFO_T;
3350 len_used = L_LBMR_TNWG_CTXINFO_T;
3351 if (len_remaining >= L_LBMR_TNWG_OPT_T)
3353 len_used += dissect_lbmr_tnwg_opts(tvb, offset, len_remaining, pinfo, ctxinfo_tree);
3355 return (len_used);
3358 /*----------------------------------------------------------------------------*/
3359 /* LBMR TNWG TopicRes Request dissection functions. */
3360 /*----------------------------------------------------------------------------*/
3361 static int dissect_lbmr_tnwg_trreq(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3363 proto_tree * trreq_tree = NULL;
3364 proto_item * trreq_item = NULL;
3365 uint16_t reclen = 0;
3366 uint16_t len_remaining = 0;
3367 int len_used = 0;
3369 reclen = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_TRREQ_T_LEN);
3370 len_remaining = reclen;
3372 trreq_item = proto_tree_add_item(tree, hf_lbmr_tnwg_trreq, tvb, offset, (int)reclen, ENC_NA);
3373 trreq_tree = proto_item_add_subtree(trreq_item, ett_lbmr_tnwg_trreq);
3374 proto_tree_add_item(trreq_tree, hf_lbmr_tnwg_trreq_len, tvb, offset + O_LBMR_TNWG_TRREQ_T_LEN, L_LBMR_TNWG_TRREQ_T_LEN, ENC_BIG_ENDIAN);
3376 offset += L_LBMR_TNWG_TRREQ_T;
3377 len_remaining -= L_LBMR_TNWG_TRREQ_T;
3378 len_used = L_LBMR_TNWG_TRREQ_T;
3379 if (len_remaining >= L_LBMR_TNWG_OPT_T)
3381 len_used += dissect_lbmr_tnwg_opts(tvb, offset, len_remaining, pinfo, trreq_tree);
3383 return (len_used);
3386 /*----------------------------------------------------------------------------*/
3387 /* LBMR TNWG dissection functions. */
3388 /*----------------------------------------------------------------------------*/
3389 static int dissect_lbmr_tnwg(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3391 uint16_t type = 0;
3392 int curr_offset = 0;
3393 int len_dissected = 0;
3394 proto_item * type_item = NULL;
3396 type = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_T_TYPE);
3397 proto_tree_add_item(tree, hf_lbmr_tnwg_len, tvb, offset + O_LBMR_TNWG_T_LEN, L_LBMR_TNWG_T_LEN, ENC_BIG_ENDIAN);
3398 type_item = proto_tree_add_item(tree, hf_lbmr_tnwg_type, tvb, offset + O_LBMR_TNWG_T_TYPE, L_LBMR_TNWG_T_TYPE, ENC_BIG_ENDIAN);
3399 proto_tree_add_item(tree, hf_lbmr_tnwg_reserved, tvb, offset + O_LBMR_TNWG_T_RESERVED, L_LBMR_TNWG_T_RESERVED, ENC_BIG_ENDIAN);
3400 len_dissected = L_LBMR_TNWG_T;
3401 curr_offset = offset + L_LBMR_TNWG_T;
3402 switch (type)
3404 case LBMR_TNWG_TYPE_INTEREST:
3405 len_dissected += dissect_lbmr_tnwg_interest(tvb, curr_offset, pinfo, tree);
3406 break;
3407 case LBMR_TNWG_TYPE_CTXINFO:
3408 len_dissected += dissect_lbmr_tnwg_ctxinfo(tvb, curr_offset, pinfo, tree);
3409 break;
3410 case LBMR_TNWG_TYPE_TRREQ:
3411 len_dissected += dissect_lbmr_tnwg_trreq(tvb, curr_offset, pinfo, tree);
3412 break;
3413 default:
3414 expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR TNWG type 0x%04x", type);
3415 break;
3417 return ((int)len_dissected);
3420 /*----------------------------------------------------------------------------*/
3421 /* LBMR Topic Management dissection functions. */
3422 /*----------------------------------------------------------------------------*/
3423 static int dissect_lbmr_tmr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3425 int namelen = 0;
3426 int name_offset = 0;
3427 char * name = NULL;
3428 proto_item * ti = NULL;
3429 proto_tree * tinfo_tree = NULL;
3430 static int * const flags[] =
3432 &hf_lbmr_tmr_flags_response,
3433 &hf_lbmr_tmr_flags_wildcard_pcre,
3434 &hf_lbmr_tmr_flags_wildcard_regex,
3435 NULL
3437 uint16_t tmr_len;
3438 uint8_t tmr_type;
3439 uint8_t tmr_flags;
3440 const char * info_string = "";
3442 tmr_len = tvb_get_ntohs(tvb, offset + O_LBMR_TMR_T_LEN);
3443 tmr_type = tvb_get_uint8(tvb, offset + O_LBMR_TMR_T_TYPE);
3444 tmr_flags = tvb_get_uint8(tvb, offset + O_LBMR_TMR_T_FLAGS);
3445 name_offset = offset + L_LBMR_TMR_T;
3447 name = tvb_get_stringz_enc(wmem_packet_scope(), tvb, name_offset, &namelen, ENC_ASCII);
3449 switch (tmr_type)
3451 case LBMR_TMR_LEAVE_TOPIC:
3452 default:
3453 break;
3454 case LBMR_TMR_TOPIC_USE:
3455 if (tmr_flags & LBMR_TMR_FLAG_RESPONSE)
3457 info_string = " Response";
3459 else
3461 info_string = " Query";
3463 break;
3465 ti = proto_tree_add_none_format(tree, hf_lbmr_tmr, tvb, offset, tmr_len, "%s: %s%s, Length %" PRIu16,
3466 name, val_to_str(tmr_type, lbmr_tmr_type, "Unknown (0x%02x)"), info_string, tmr_len);
3467 tinfo_tree = proto_item_add_subtree(ti, ett_lbmr_tmr);
3468 proto_tree_add_item(tinfo_tree, hf_lbmr_tmr_len, tvb, offset + O_LBMR_TMR_T_LEN, L_LBMR_TMR_T_LEN, ENC_BIG_ENDIAN);
3469 proto_tree_add_item(tinfo_tree, hf_lbmr_tmr_type, tvb, offset + O_LBMR_TMR_T_TYPE, L_LBMR_TMR_T_TYPE, ENC_BIG_ENDIAN);
3470 proto_tree_add_bitmask(tinfo_tree, tvb, offset + O_LBMR_TMR_T_FLAGS, hf_lbmr_tmr_flags, ett_lbmr_tmr_flags, flags, ENC_BIG_ENDIAN);
3471 proto_tree_add_item(tinfo_tree, hf_lbmr_tmr_name, tvb, name_offset, namelen, ENC_ASCII);
3472 return ((int) tmr_len);
3475 static int dissect_lbmr_tmb(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3477 int tmr_len = 0;
3478 proto_tree * tmb_tree = NULL;
3479 proto_item * ti = NULL;
3480 proto_tree * tmr_tree = NULL;
3481 proto_item * tmr_ti = NULL;
3482 int tmr_count = 0;
3483 uint16_t tmrs;
3484 int len_dissected;
3486 tmrs = tvb_get_ntohs(tvb, offset + O_LBMR_TMB_T_TMRS);
3487 ti = proto_tree_add_item(tree, hf_lbmr_tmb, tvb, offset, -1, ENC_NA);
3488 tmb_tree = proto_item_add_subtree(ti, ett_lbmr_tmb);
3489 proto_tree_add_item(tmb_tree, hf_lbmr_tmb_len, tvb, offset + O_LBMR_TMB_T_LEN, L_LBMR_TMB_T_LEN, ENC_BIG_ENDIAN);
3490 proto_tree_add_item(tmb_tree, hf_lbmr_tmb_tmrs, tvb, offset + O_LBMR_TMB_T_TMRS, L_LBMR_TMB_T_TMRS, ENC_BIG_ENDIAN);
3491 tmr_ti = proto_tree_add_item(tmb_tree, hf_lbmr_tmb_tmr_list, tvb, offset + L_LBMR_TMB_T, -1, ENC_NA);
3492 tmr_tree = proto_item_add_subtree(tmr_ti, ett_lbmr_tmrs);
3494 offset += L_LBMR_TMB_T;
3495 len_dissected = L_LBMR_TMB_T;
3496 while (tmr_count < tmrs)
3498 tmr_len = dissect_lbmr_tmr(tvb, offset, pinfo, tmr_tree);
3499 len_dissected += tmr_len;
3500 offset += tmr_len;
3501 tmr_count++;
3503 return (len_dissected);
3506 /*----------------------------------------------------------------------------*/
3507 /* LBMR Topic Query Record dissection functions. */
3508 /*----------------------------------------------------------------------------*/
3509 static int dissect_lbmr_tqr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, bool wildcard_tqr, lbmr_contents_t * contents)
3511 int namelen = 0;
3512 unsigned reclen = 0;
3513 char * name = NULL;
3514 uint8_t pattern_type;
3515 proto_item * tqr_item = NULL;
3516 proto_tree * tqr_tree = NULL;
3517 int name_offset = offset;
3519 if (wildcard_tqr)
3521 pattern_type = tvb_get_uint8(tvb, offset);
3522 name_offset++;
3523 reclen++;
3525 name = tvb_get_stringz_enc(wmem_packet_scope(), tvb, name_offset, &namelen, ENC_ASCII);
3526 reclen += namelen;
3528 if (wildcard_tqr)
3530 tqr_item = proto_tree_add_none_format(tree, hf_lbmr_tqr, tvb, offset, reclen, "Wildcard TQR: %s", name);
3532 else
3534 tqr_item = proto_tree_add_none_format(tree, hf_lbmr_tqr, tvb, offset, reclen, "TQR: %s", name);
3536 tqr_tree = proto_item_add_subtree(tqr_item, ett_lbmr_tqr);
3537 if (wildcard_tqr)
3539 proto_tree_add_item(tqr_tree, hf_lbmr_tqr_pattern_type, tvb, offset, 1, ENC_BIG_ENDIAN);
3540 proto_tree_add_item(tqr_tree, hf_lbmr_tqr_pattern, tvb, offset, namelen, ENC_ASCII);
3541 add_contents_wctqr(contents, pattern_type, name);
3543 else
3545 proto_tree_add_item(tqr_tree, hf_lbmr_tqr_name, tvb, offset, namelen, ENC_ASCII);
3546 add_contents_tqr(contents, name);
3548 return (reclen);
3551 static int dissect_lbmr_tqrs(tvbuff_t * tvb, int offset, uint8_t tqr_count, packet_info * pinfo, proto_tree * tree,
3552 bool wildcard_tqr, lbmr_contents_t * contents)
3554 int start_offset = 0;
3555 int tqr_len = 0;
3556 proto_tree * tqrs_tree = NULL;
3557 proto_item * ti = NULL;
3558 int len = 0;
3560 start_offset = offset;
3561 if (wildcard_tqr)
3563 ti = proto_tree_add_none_format(tree, hf_lbmr_tqrs, tvb, start_offset, -1, "Wildcard TQRs");
3565 else
3567 ti = proto_tree_add_none_format(tree, hf_lbmr_tqrs, tvb, start_offset, -1, "TQRs");
3569 tqrs_tree = proto_item_add_subtree(ti, ett_lbmr_tqrs);
3570 while (tqr_count-- > 0)
3572 tqr_len = dissect_lbmr_tqr(tvb, offset, pinfo, tqrs_tree, wildcard_tqr, contents);
3573 len += tqr_len;
3574 offset += tqr_len;
3576 proto_item_set_len(ti, len);
3577 return (len);
3580 /*----------------------------------------------------------------------------*/
3581 /* LBMR Topic Information Record dissection functions. */
3582 /*----------------------------------------------------------------------------*/
3583 static int dissect_lbmr_tir_options(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3585 uint8_t opt_type = 0;
3586 uint8_t opt_len = 0;
3587 int opt_total_len = 0;
3588 int opt_remaining_len = 0;
3589 int curr_offset = offset;
3590 proto_item * oi = NULL;
3591 proto_tree * otree = NULL;
3592 proto_item * optlen_item = NULL;
3593 proto_tree * optlen_tree = NULL;
3594 static int * const opt_ume_flags[] =
3596 &hf_lbmr_topt_ume_flags_ignore,
3597 &hf_lbmr_topt_ume_flags_latejoin,
3598 &hf_lbmr_topt_ume_flags_store,
3599 &hf_lbmr_topt_ume_flags_qccap,
3600 &hf_lbmr_topt_ume_flags_acktosrc,
3601 NULL
3603 static int * const opt_ume_store_flags[] =
3605 &hf_lbmr_topt_ume_store_flags_ignore,
3606 NULL
3608 static int * const opt_ume_store_group_flags[] =
3610 &hf_lbmr_topt_ume_store_group_flags_ignore,
3611 NULL
3613 static int * const opt_latejoin_flags[] =
3615 &hf_lbmr_topt_latejoin_flags_ignore,
3616 &hf_lbmr_topt_latejoin_flags_acktosrc,
3617 NULL
3619 static int * const opt_umq_rcridx_flags[] =
3621 &hf_lbmr_topt_umq_rcridx_flags_ignore,
3622 NULL
3624 static int * const opt_umq_qinfo_flags[] =
3626 &hf_lbmr_topt_umq_qinfo_flags_ignore,
3627 &hf_lbmr_topt_umq_qinfo_flags_queue,
3628 &hf_lbmr_topt_umq_qinfo_flags_rcvlisten,
3629 &hf_lbmr_topt_umq_qinfo_flags_control,
3630 &hf_lbmr_topt_umq_qinfo_flags_srcrcvlisten,
3631 &hf_lbmr_topt_umq_qinfo_flags_participants_only,
3632 NULL
3634 static int * const opt_cost_flags[] =
3636 &hf_lbmr_topt_cost_flags_ignore,
3637 NULL
3639 static int * const opt_otid_flags[] =
3641 &hf_lbmr_topt_otid_flags_ignore,
3642 NULL
3644 static int * const opt_ctxinst_flags[] =
3646 &hf_lbmr_topt_ctxinst_flags_ignore,
3647 NULL
3649 static int * const opt_ctxinsts_flags[] =
3651 &hf_lbmr_topt_ctxinsts_flags_ignore,
3652 NULL
3654 static int * const opt_ulb_flags[] =
3656 &hf_lbmr_topt_ulb_flags_ignore,
3657 NULL
3659 static int * const opt_ctxinstq_flags[] =
3661 &hf_lbmr_topt_ctxinstq_flags_ignore,
3662 NULL
3664 static int * const opt_domain_id_flags[] =
3666 &hf_lbmr_topt_domain_id_flags_ignore,
3667 NULL
3669 static int * const opt_exfunc_flags[] =
3671 &hf_lbmr_topt_exfunc_flags_ignore,
3672 NULL
3674 static int * const opt_exfunc_functionality_flags[] =
3676 &hf_lbmr_topt_exfunc_functionality_flags_ulb,
3677 &hf_lbmr_topt_exfunc_functionality_flags_umq,
3678 &hf_lbmr_topt_exfunc_functionality_flags_ume,
3679 &hf_lbmr_topt_exfunc_functionality_flags_lj,
3680 NULL
3682 int len = 0;
3684 opt_total_len = (int)tvb_get_ntohs(tvb, curr_offset + O_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN);
3685 opt_remaining_len = opt_total_len;
3687 oi = proto_tree_add_none_format(tree, hf_lbmr_topts, tvb, curr_offset, opt_total_len, "Options: %d bytes", opt_total_len);
3688 otree = proto_item_add_subtree(oi, ett_lbmr_topts);
3689 optlen_item = proto_tree_add_item(otree, hf_lbmr_topt_len, tvb, curr_offset, L_LBMR_TOPIC_OPT_LEN_T, ENC_NA);
3690 optlen_tree = proto_item_add_subtree(optlen_item, ett_lbmr_topt_len);
3691 proto_tree_add_item(optlen_tree, hf_lbmr_topt_len_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_LEN_T_TYPE, L_LBMR_TOPIC_OPT_LEN_T_TYPE, ENC_BIG_ENDIAN);
3692 proto_tree_add_item(optlen_tree, hf_lbmr_topt_len_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_LEN_T_LEN, L_LBMR_TOPIC_OPT_LEN_T_LEN, ENC_BIG_ENDIAN);
3693 proto_tree_add_item(optlen_tree, hf_lbmr_topt_len_total_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN, L_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN, ENC_BIG_ENDIAN);
3694 len = L_LBMR_TOPIC_OPT_LEN_T;
3695 curr_offset += L_LBMR_TOPIC_OPT_LEN_T;
3696 opt_remaining_len -= L_LBMR_TOPIC_OPT_LEN_T;
3697 while (opt_remaining_len > 0)
3699 proto_item * opt_item = NULL;
3700 proto_tree * opt_tree = NULL;
3701 proto_item * ei_item = NULL;
3702 int qname_len;
3704 opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE);
3705 opt_len = tvb_get_uint8(tvb, curr_offset + O_LBMR_TOPIC_OPT_T_LEN);
3706 if (opt_len == 0)
3708 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_unknown, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3709 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_unknown);
3710 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, L_LBMR_TOPIC_OPT_T_TYPE, ENC_BIG_ENDIAN);
3711 ei_item = proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_LEN, L_LBMR_TOPIC_OPT_T_LEN, ENC_BIG_ENDIAN);
3712 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_flags, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_FLAGS, L_LBMR_TOPIC_OPT_T_FLAGS, ENC_BIG_ENDIAN);
3713 if (((int) opt_len) > L_LBMR_TOPIC_OPT_T)
3715 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_data, tvb, curr_offset + L_LBMR_TOPIC_OPT_T, ((int) opt_len) - L_LBMR_TOPIC_OPT_T, ENC_NA);
3717 expert_add_info_format(pinfo, ei_item, &ei_lbmr_analysis_zero_len_option, "Zero-length LBMR option");
3718 return (len);
3720 switch (opt_type)
3722 case LBMR_TOPIC_OPT_UME_TYPE:
3723 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ume, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3724 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume);
3725 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_TYPE, L_LBMR_TOPIC_OPT_UME_T_TYPE, ENC_BIG_ENDIAN);
3726 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_LEN, L_LBMR_TOPIC_OPT_UME_T_LEN, ENC_BIG_ENDIAN);
3727 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_FLAGS, hf_lbmr_topt_ume_flags, ett_lbmr_topt_ume_flags, opt_ume_flags, ENC_BIG_ENDIAN);
3728 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT, L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT, ENC_BIG_ENDIAN);
3729 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_src_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT, L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT, ENC_BIG_ENDIAN);
3730 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_tcp_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR, L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR, ENC_BIG_ENDIAN);
3731 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_src_tcp_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR, L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR, ENC_BIG_ENDIAN);
3732 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_src_reg_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID, L_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID, ENC_BIG_ENDIAN);
3733 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_transport_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX, L_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX, ENC_BIG_ENDIAN);
3734 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_high_seqnum, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM, L_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM, ENC_BIG_ENDIAN);
3735 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_low_seqnum, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_T_LOW_SEQNUM, L_LBMR_TOPIC_OPT_UME_T_LOW_SEQNUM, ENC_BIG_ENDIAN);
3736 break;
3737 case LBMR_TOPIC_OPT_UME_STORE_TYPE:
3738 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ume_store, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3739 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume_store);
3740 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_TYPE, L_LBMR_TOPIC_OPT_UME_STORE_T_TYPE, ENC_BIG_ENDIAN);
3741 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_LEN, L_LBMR_TOPIC_OPT_UME_STORE_T_LEN, ENC_BIG_ENDIAN);
3742 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS, hf_lbmr_topt_ume_store_flags, ett_lbmr_topt_ume_store_flags, opt_ume_store_flags, ENC_BIG_ENDIAN);
3743 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_grp_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX, L_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX, ENC_BIG_ENDIAN);
3744 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_store_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT, L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT, ENC_BIG_ENDIAN);
3745 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_store_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX, L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX, ENC_BIG_ENDIAN);
3746 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_store_ip_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR, L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR, ENC_BIG_ENDIAN);
3747 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_src_reg_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_T_SRC_REG_ID, L_LBMR_TOPIC_OPT_UME_STORE_T_SRC_REG_ID, ENC_BIG_ENDIAN);
3748 break;
3749 case LBMR_TOPIC_OPT_UME_STORE_GROUP_TYPE:
3750 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ume_store_group, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3751 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume_store_group);
3752 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_group_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE, ENC_BIG_ENDIAN);
3753 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_group_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN, ENC_BIG_ENDIAN);
3754 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS, hf_lbmr_topt_ume_store_group_flags, ett_lbmr_topt_ume_store_group_flags, opt_ume_store_group_flags, ENC_BIG_ENDIAN);
3755 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_group_grp_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX, ENC_BIG_ENDIAN);
3756 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_group_grp_sz, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ, ENC_BIG_ENDIAN);
3757 proto_tree_add_item(opt_tree, hf_lbmr_topt_ume_store_group_reserved, tvb, curr_offset + O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_RESERVED, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_RESERVED, ENC_BIG_ENDIAN);
3758 break;
3759 case LBMR_TOPIC_OPT_LATEJOIN_TYPE:
3760 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_latejoin, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3761 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_latejoin);
3762 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE, L_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE, ENC_BIG_ENDIAN);
3763 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_LEN, L_LBMR_TOPIC_OPT_LATEJOIN_T_LEN, ENC_BIG_ENDIAN);
3764 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS, hf_lbmr_topt_latejoin_flags, ett_lbmr_topt_latejoin_flags, opt_latejoin_flags, ENC_BIG_ENDIAN);
3765 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_src_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT, L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT, ENC_BIG_ENDIAN);
3766 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_reserved, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED, L_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED, ENC_BIG_ENDIAN);
3767 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_src_ip_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR, L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR, ENC_BIG_ENDIAN);
3768 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_transport_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX, L_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX, ENC_BIG_ENDIAN);
3769 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_high_seqnum, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM, L_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM, ENC_BIG_ENDIAN);
3770 proto_tree_add_item(opt_tree, hf_lbmr_topt_latejoin_low_seqnum, tvb, curr_offset + O_LBMR_TOPIC_OPT_LATEJOIN_T_LOW_SEQNUM, L_LBMR_TOPIC_OPT_LATEJOIN_T_LOW_SEQNUM, ENC_BIG_ENDIAN);
3771 break;
3772 case LBMR_TOPIC_OPT_UMQ_RCRIDX_TYPE:
3773 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_umq_rcridx, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3774 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_umq_rcridx);
3775 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_rcridx_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE, L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE, ENC_BIG_ENDIAN);
3776 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_rcridx_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN, L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN, ENC_BIG_ENDIAN);
3777 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS, hf_lbmr_topt_umq_rcridx_flags, ett_lbmr_topt_umq_rcridx_flags, opt_umq_rcridx_flags, ENC_BIG_ENDIAN);
3778 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_rcridx_rcr_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_RCR_IDX, L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_RCR_IDX, ENC_BIG_ENDIAN);
3779 break;
3780 case LBMR_TOPIC_OPT_UMQ_QINFO_TYPE:
3781 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_umq_qinfo, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3782 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_umq_qinfo);
3783 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_qinfo_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, L_LBMR_TOPIC_OPT_T_TYPE, ENC_BIG_ENDIAN);
3784 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_qinfo_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_LEN, L_LBMR_TOPIC_OPT_T_LEN, ENC_BIG_ENDIAN);
3785 qname_len = opt_len - L_LBMR_TOPIC_OPT_T;
3786 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_FLAGS, hf_lbmr_topt_umq_qinfo_flags, ett_lbmr_topt_umq_qinfo_flags, opt_umq_qinfo_flags, ENC_BIG_ENDIAN);
3787 proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_qinfo_queue, tvb, curr_offset + L_LBMR_TOPIC_OPT_T, qname_len, ENC_ASCII);
3788 break;
3789 case LBMR_TOPIC_OPT_COST_TYPE:
3790 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_cost, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3791 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_cost);
3792 proto_tree_add_item(opt_tree, hf_lbmr_topt_cost_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_COST_T_TYPE, L_LBMR_TOPIC_OPT_COST_T_TYPE, ENC_BIG_ENDIAN);
3793 proto_tree_add_item(opt_tree, hf_lbmr_topt_cost_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_COST_T_LEN, L_LBMR_TOPIC_OPT_COST_T_LEN, ENC_BIG_ENDIAN);
3794 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_COST_T_FLAGS, hf_lbmr_topt_cost_flags, ett_lbmr_topt_cost_flags, opt_cost_flags, ENC_BIG_ENDIAN);
3795 proto_tree_add_item(opt_tree, hf_lbmr_topt_cost_hop_count, tvb, curr_offset + O_LBMR_TOPIC_OPT_COST_T_HOP_COUNT, L_LBMR_TOPIC_OPT_COST_T_HOP_COUNT, ENC_BIG_ENDIAN);
3796 proto_tree_add_item(opt_tree, hf_lbmr_topt_cost_cost, tvb, curr_offset + O_LBMR_TOPIC_OPT_COST_T_COST, L_LBMR_TOPIC_OPT_COST_T_COST, ENC_BIG_ENDIAN);
3797 break;
3798 case LBMR_TOPIC_OPT_OTID_TYPE:
3799 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_otid, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3800 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_otid);
3801 proto_tree_add_item(opt_tree, hf_lbmr_topt_otid_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_OTID_T_TYPE, L_LBMR_TOPIC_OPT_OTID_T_TYPE, ENC_BIG_ENDIAN);
3802 proto_tree_add_item(opt_tree, hf_lbmr_topt_otid_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_OTID_T_LEN, L_LBMR_TOPIC_OPT_OTID_T_LEN, ENC_BIG_ENDIAN);
3803 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_OTID_T_FLAGS, hf_lbmr_topt_otid_flags, ett_lbmr_topt_otid_flags, opt_otid_flags, ENC_BIG_ENDIAN);
3804 proto_tree_add_item(opt_tree, hf_lbmr_topt_otid_originating_transport, tvb, curr_offset + O_LBMR_TOPIC_OPT_OTID_T_ORIGINATING_TRANSPORT, L_LBMR_TOPIC_OPT_OTID_T_ORIGINATING_TRANSPORT, ENC_NA);
3805 break;
3806 case LBMR_TOPIC_OPT_CTXINST_TYPE:
3807 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinst, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3808 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinst);
3809 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinst_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINST_T_TYPE, L_LBMR_TOPIC_OPT_CTXINST_T_TYPE, ENC_BIG_ENDIAN);
3810 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinst_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINST_T_LEN, L_LBMR_TOPIC_OPT_CTXINST_T_LEN, ENC_BIG_ENDIAN);
3811 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINST_T_FLAGS, hf_lbmr_topt_ctxinst_flags, ett_lbmr_topt_ctxinst_flags, opt_ctxinst_flags, ENC_BIG_ENDIAN);
3812 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinst_res, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINST_T_RES, L_LBMR_TOPIC_OPT_CTXINST_T_RES, ENC_BIG_ENDIAN);
3813 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinst_ctxinst, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINST_T_CTXINST, L_LBMR_TOPIC_OPT_CTXINST_T_CTXINST, ENC_NA);
3814 break;
3815 case LBMR_TOPIC_OPT_CTXINSTS_TYPE:
3816 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinsts, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3817 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinsts);
3818 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinsts_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE, L_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE, ENC_BIG_ENDIAN);
3819 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinsts_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTS_T_LEN, L_LBMR_TOPIC_OPT_CTXINSTS_T_LEN, ENC_BIG_ENDIAN);
3820 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS, hf_lbmr_topt_ctxinsts_flags, ett_lbmr_topt_ctxinsts_flags, opt_ctxinsts_flags, ENC_BIG_ENDIAN);
3821 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinsts_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTS_T_IDX, L_LBMR_TOPIC_OPT_CTXINSTS_T_IDX, ENC_BIG_ENDIAN);
3822 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinsts_ctxinst, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTS_T_CTXINST, L_LBMR_TOPIC_OPT_CTXINSTS_T_CTXINST, ENC_NA);
3823 break;
3824 case LBMR_TOPIC_OPT_ULB_TYPE:
3825 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ulb, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3826 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ulb);
3827 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_TYPE, L_LBMR_TOPIC_OPT_ULB_T_TYPE, ENC_BIG_ENDIAN);
3828 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_LEN, L_LBMR_TOPIC_OPT_ULB_T_LEN, ENC_BIG_ENDIAN);
3829 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_FLAGS, hf_lbmr_topt_ulb_flags, ett_lbmr_topt_ulb_flags, opt_ulb_flags, ENC_BIG_ENDIAN);
3830 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_queue_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID, L_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID, ENC_BIG_ENDIAN);
3831 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_regid, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_REGID, L_LBMR_TOPIC_OPT_ULB_T_REGID, ENC_BIG_ENDIAN);
3832 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_ulb_src_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID, L_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID, ENC_BIG_ENDIAN);
3833 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_src_ip_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR, L_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR, ENC_BIG_ENDIAN);
3834 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_src_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT, L_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT, ENC_BIG_ENDIAN);
3835 proto_tree_add_item(opt_tree, hf_lbmr_topt_ulb_reserved, tvb, curr_offset + O_LBMR_TOPIC_OPT_ULB_T_RESERVED, L_LBMR_TOPIC_OPT_ULB_T_RESERVED, ENC_BIG_ENDIAN);
3836 break;
3837 case LBMR_TOPIC_OPT_CTXINSTQ_TYPE:
3838 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinstq, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3839 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinstq);
3840 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinstq_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE, L_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE, ENC_BIG_ENDIAN);
3841 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinstq_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN, L_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN, ENC_BIG_ENDIAN);
3842 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS, hf_lbmr_topt_ctxinstq_flags, ett_lbmr_topt_ctxinstq_flags, opt_ctxinstq_flags, ENC_BIG_ENDIAN);
3843 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinstq_idx, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX, L_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX, ENC_BIG_ENDIAN);
3844 proto_tree_add_item(opt_tree, hf_lbmr_topt_ctxinstq_ctxinst, tvb, curr_offset + O_LBMR_TOPIC_OPT_CTXINSTQ_T_CTXINST, L_LBMR_TOPIC_OPT_CTXINSTQ_T_CTXINST, ENC_NA);
3845 break;
3846 case LBMR_TOPIC_OPT_DOMAIN_ID_TYPE:
3847 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_domain_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3848 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_domain_id);
3849 proto_tree_add_item(opt_tree, hf_lbmr_topt_domain_id_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE, L_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE, ENC_BIG_ENDIAN);
3850 proto_tree_add_item(opt_tree, hf_lbmr_topt_domain_id_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN, L_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN, ENC_BIG_ENDIAN);
3851 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS, hf_lbmr_topt_domain_id_flags, ett_lbmr_topt_domain_id_flags, opt_domain_id_flags, ENC_BIG_ENDIAN);
3852 proto_tree_add_item(opt_tree, hf_lbmr_topt_domain_id_domain_id, tvb, curr_offset + O_LBMR_TOPIC_OPT_DOMAIN_ID_T_DOMAIN_ID, L_LBMR_TOPIC_OPT_DOMAIN_ID_T_DOMAIN_ID, ENC_BIG_ENDIAN);
3853 break;
3854 case LBMR_TOPIC_OPT_EXFUNC_TYPE:
3855 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_exfunc, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3856 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_exfunc);
3857 proto_tree_add_item(opt_tree, hf_lbmr_topt_exfunc_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_TYPE, L_LBMR_TOPIC_OPT_EXFUNC_T_TYPE, ENC_BIG_ENDIAN);
3858 proto_tree_add_item(opt_tree, hf_lbmr_topt_exfunc_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_LEN, L_LBMR_TOPIC_OPT_EXFUNC_T_LEN, ENC_BIG_ENDIAN);
3859 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS, hf_lbmr_topt_exfunc_flags, ett_lbmr_topt_exfunc_flags, opt_exfunc_flags, ENC_BIG_ENDIAN);
3860 proto_tree_add_item(opt_tree, hf_lbmr_topt_exfunc_src_tcp_port, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT, L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT, ENC_BIG_ENDIAN);
3861 proto_tree_add_item(opt_tree, hf_lbmr_topt_exfunc_reserved, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED, L_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED, ENC_BIG_ENDIAN);
3862 proto_tree_add_item(opt_tree, hf_lbmr_topt_exfunc_src_ip_addr, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR, L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR, ENC_BIG_ENDIAN);
3863 proto_tree_add_bitmask(opt_tree, tvb, curr_offset + O_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS, hf_lbmr_topt_exfunc_functionality_flags, ett_lbmr_topt_exfunc_functionality_flags, opt_exfunc_functionality_flags, ENC_BIG_ENDIAN);
3864 break;
3865 default:
3866 opt_item = proto_tree_add_item(otree, hf_lbmr_topt_unknown, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3867 opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_unknown);
3868 ei_item = proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_type, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, L_LBMR_TOPIC_OPT_T_TYPE, ENC_BIG_ENDIAN);
3869 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_len, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_LEN, L_LBMR_TOPIC_OPT_T_LEN, ENC_BIG_ENDIAN);
3870 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_flags, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_FLAGS, L_LBMR_TOPIC_OPT_T_FLAGS, ENC_BIG_ENDIAN);
3871 if (((int) opt_len) > L_LBMR_TOPIC_OPT_T)
3873 proto_tree_add_item(opt_tree, hf_lbmr_topt_unknown_data, tvb, curr_offset + L_LBMR_TOPIC_OPT_T, ((int) opt_len) - L_LBMR_TOPIC_OPT_T, ENC_NA);
3875 expert_add_info_format(pinfo, ei_item, &ei_lbmr_analysis_invalid_value, "Unknown option 0x%02x", opt_type);
3876 break;
3878 len += opt_len;
3879 curr_offset += opt_len;
3880 opt_remaining_len -= opt_len;
3882 return (opt_total_len);
3885 static int dissect_lbmr_tir_transport(tvbuff_t * tvb, int offset, lbm_uint8_t transport, lbm_uint8_t transport_len, const char * topic_name,
3886 uint32_t topic_index, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents, proto_item * transport_len_item)
3888 int len = 0;
3889 uint64_t channel;
3890 proto_item * channel_item = NULL;
3891 proto_item * ei_item = NULL;
3893 switch (transport)
3895 case LBMR_TRANSPORT_TCP:
3897 uint16_t port = 0;
3898 uint32_t session_id = 0;
3899 proto_item * tcp_item = NULL;
3900 proto_tree * tcp_tree = NULL;
3901 lbttcp_transport_t * lbttcp_transport = NULL;
3903 tcp_item = proto_tree_add_item(tree, hf_lbmr_tir_tcp, tvb, offset, (int) transport_len, ENC_NA);
3904 tcp_tree = proto_item_add_subtree(tcp_item, ett_lbmr_tir_tcp);
3905 if ((transport_len != L_LBMR_TIR_TCP_T) && (transport_len != L_LBMR_TIR_TCP_WITH_SID_T))
3907 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR TCP info");
3908 return 0;
3910 if (transport_len == L_LBMR_TIR_TCP_WITH_SID_T)
3912 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID);
3913 port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_PORT);
3914 proto_tree_add_item(tcp_tree, hf_lbmr_tir_tcp_ip, tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_IP, L_LBMR_TIR_TCP_WITH_SID_T_IP, ENC_BIG_ENDIAN);
3915 proto_tree_add_item(tcp_tree, hf_lbmr_tir_tcp_session_id, tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID, L_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID, ENC_BIG_ENDIAN);
3916 proto_tree_add_item(tcp_tree, hf_lbmr_tir_tcp_port, tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_PORT, L_LBMR_TIR_TCP_WITH_SID_T_PORT, ENC_BIG_ENDIAN);
3917 len += L_LBMR_TIR_TCP_WITH_SID_T;
3919 else
3921 port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_TCP_T_PORT);
3922 proto_tree_add_item(tcp_tree, hf_lbmr_tir_tcp_ip, tvb, offset + O_LBMR_TIR_TCP_T_IP, L_LBMR_TIR_TCP_T_IP, ENC_BIG_ENDIAN);
3923 proto_tree_add_item(tcp_tree, hf_lbmr_tir_tcp_port, tvb, offset + O_LBMR_TIR_TCP_T_PORT, L_LBMR_TIR_TCP_T_PORT, ENC_BIG_ENDIAN);
3924 session_id = 0;
3925 len += L_LBMR_TIR_TCP_T;
3927 lbttcp_transport = lbttcp_transport_add(&(pinfo->src), port, session_id, pinfo->num);
3928 channel = lbttcp_transport->channel;
3929 add_contents_tir(contents, topic_name, lbttcp_transport_source_string(&(pinfo->src), port, session_id), topic_index);
3931 break;
3932 case LBMR_TRANSPORT_LBTRM:
3934 uint16_t src_ucast_port = 0;
3935 uint16_t udp_dest_port = 0;
3936 uint32_t session_id = 0;
3937 proto_item * lbtrm_item = NULL;
3938 proto_tree * lbtrm_tree = NULL;
3939 lbtrm_transport_t * lbtrm_transport = NULL;
3940 address multicast_group;
3942 lbtrm_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtrm, tvb, offset, (int)transport_len, ENC_NA);
3943 lbtrm_tree = proto_item_add_subtree(lbtrm_item, ett_lbmr_tir_lbtrm);
3944 set_address_tvb(&multicast_group, AT_IPv4, L_LBMR_TIR_LBTRM_T_MCAST_ADDR, tvb, offset + O_LBMR_TIR_LBTRM_T_MCAST_ADDR);
3945 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRM_T_SESSION_ID);
3946 udp_dest_port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRM_T_UDP_DEST_PORT);
3947 src_ucast_port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT);
3948 proto_tree_add_item(lbtrm_tree, hf_lbmr_tir_lbtrm_src_addr, tvb, offset + O_LBMR_TIR_LBTRM_T_SRC_ADDR, L_LBMR_TIR_LBTRM_T_SRC_ADDR, ENC_BIG_ENDIAN);
3949 proto_tree_add_item(lbtrm_tree, hf_lbmr_tir_lbtrm_mcast_addr, tvb, offset + O_LBMR_TIR_LBTRM_T_MCAST_ADDR, L_LBMR_TIR_LBTRM_T_MCAST_ADDR, ENC_BIG_ENDIAN);
3950 proto_tree_add_item(lbtrm_tree, hf_lbmr_tir_lbtrm_session_id, tvb, offset + O_LBMR_TIR_LBTRM_T_SESSION_ID, L_LBMR_TIR_LBTRM_T_SESSION_ID, ENC_BIG_ENDIAN);
3951 proto_tree_add_item(lbtrm_tree, hf_lbmr_tir_lbtrm_udp_dest_port, tvb, offset + O_LBMR_TIR_LBTRM_T_UDP_DEST_PORT, L_LBMR_TIR_LBTRM_T_UDP_DEST_PORT, ENC_BIG_ENDIAN);
3952 proto_tree_add_item(lbtrm_tree, hf_lbmr_tir_lbtrm_src_ucast_port, tvb, offset + O_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT, L_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT, ENC_BIG_ENDIAN);
3953 lbtrm_transport = lbtrm_transport_add(&(pinfo->src), src_ucast_port, session_id, &multicast_group, udp_dest_port, pinfo->num);
3954 channel = lbtrm_transport->channel;
3955 add_contents_tir(contents, topic_name, lbtrm_transport_source_string(&(pinfo->src), src_ucast_port, session_id, &multicast_group, udp_dest_port), topic_index);
3956 len += L_LBMR_TIR_LBTRM_T;
3957 if (transport_len != L_LBMR_TIR_LBTRM_T)
3959 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRM info");
3962 break;
3963 case LBMR_TRANSPORT_LBTRU:
3965 uint32_t session_id;
3966 uint16_t port;
3967 proto_item * lbtru_item = NULL;
3968 proto_tree * lbtru_tree = NULL;
3969 lbtru_transport_t * lbtru_transport = NULL;
3971 lbtru_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtru, tvb, offset, (int)transport_len, ENC_NA);
3972 lbtru_tree = proto_item_add_subtree(lbtru_item, ett_lbmr_tir_lbtru);
3973 if ((transport_len != L_LBMR_TIR_LBTRU_T) && (transport_len != L_LBMR_TIR_LBTRU_WITH_SID_T))
3975 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRU info");
3976 return 0;
3978 if (transport_len == L_LBMR_TIR_LBTRU_WITH_SID_T)
3980 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID);
3981 port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_PORT);
3982 proto_tree_add_item(lbtru_tree, hf_lbmr_tir_lbtru_ip, tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_IP, L_LBMR_TIR_LBTRU_WITH_SID_T_IP, ENC_BIG_ENDIAN);
3983 proto_tree_add_item(lbtru_tree, hf_lbmr_tir_lbtru_session_id, tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID, L_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID, ENC_BIG_ENDIAN);
3984 proto_tree_add_item(lbtru_tree, hf_lbmr_tir_lbtru_port, tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_PORT, L_LBMR_TIR_LBTRU_WITH_SID_T_PORT, ENC_BIG_ENDIAN);
3985 len += L_LBMR_TIR_LBTRU_WITH_SID_T;
3987 else
3989 session_id = 0;
3990 port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRU_T_PORT);
3991 proto_tree_add_item(lbtru_tree, hf_lbmr_tir_lbtru_ip, tvb, offset + O_LBMR_TIR_LBTRU_T_IP, L_LBMR_TIR_LBTRU_T_IP, ENC_BIG_ENDIAN);
3992 proto_tree_add_item(lbtru_tree, hf_lbmr_tir_lbtru_port, tvb, offset + O_LBMR_TIR_LBTRU_T_PORT, L_LBMR_TIR_LBTRU_T_PORT, ENC_BIG_ENDIAN);
3993 len += L_LBMR_TIR_LBTRU_T;
3995 lbtru_transport = lbtru_transport_add(&(pinfo->src), port, session_id, pinfo->num);
3996 channel = lbtru_transport->channel;
3997 add_contents_tir(contents, topic_name, lbtru_transport_source_string(&(pinfo->src), port, session_id), topic_index);
3999 break;
4000 case LBMR_TRANSPORT_LBTIPC:
4002 uint32_t host_id;
4003 uint32_t session_id;
4004 uint16_t xport_id;
4005 proto_item * lbtipc_item = NULL;
4006 proto_tree * lbtipc_tree = NULL;
4007 lbtipc_transport_t * lbtipc_transport = NULL;
4009 lbtipc_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtipc, tvb, offset, (int)transport_len, ENC_NA);
4010 lbtipc_tree = proto_item_add_subtree(lbtipc_item, ett_lbmr_tir_lbtipc);
4011 if (transport_len != L_LBMR_TIR_LBTIPC_T)
4013 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTIPC info");
4014 return 0;
4016 host_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTIPC_T_HOST_ID);
4017 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTIPC_T_SESSION_ID);
4018 xport_id = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTIPC_T_XPORT_ID);
4019 proto_tree_add_item(lbtipc_tree, hf_lbmr_tir_lbtipc_host_id, tvb, offset + O_LBMR_TIR_LBTIPC_T_HOST_ID, L_LBMR_TIR_LBTIPC_T_HOST_ID, ENC_BIG_ENDIAN);
4020 proto_tree_add_item(lbtipc_tree, hf_lbmr_tir_lbtipc_session_id, tvb, offset + O_LBMR_TIR_LBTIPC_T_SESSION_ID, L_LBMR_TIR_LBTIPC_T_SESSION_ID, ENC_BIG_ENDIAN);
4021 proto_tree_add_item(lbtipc_tree, hf_lbmr_tir_lbtipc_xport_id, tvb, offset + O_LBMR_TIR_LBTIPC_T_XPORT_ID, L_LBMR_TIR_LBTIPC_T_XPORT_ID, ENC_BIG_ENDIAN);
4022 lbtipc_transport = lbtipc_transport_add(host_id, session_id, xport_id);
4023 channel = lbtipc_transport->channel;
4024 add_contents_tir(contents, topic_name, lbtipc_transport_source_string(host_id, session_id, xport_id), topic_index);
4025 len += L_LBMR_TIR_LBTIPC_T;
4027 break;
4028 case LBMR_TRANSPORT_LBTRDMA:
4030 uint32_t session_id;
4031 uint16_t port;
4032 proto_item * lbtrdma_item = NULL;
4033 proto_tree * lbtrdma_tree = NULL;
4034 lbtrdma_transport_t * lbtrdma_transport = NULL;
4035 address source_addr;
4037 lbtrdma_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtrdma, tvb, offset, (int)transport_len, ENC_NA);
4038 lbtrdma_tree = proto_item_add_subtree(lbtrdma_item, ett_lbmr_tir_lbtrdma);
4039 if (transport_len != L_LBMR_TIR_LBTRDMA_T)
4041 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRDMA info");
4042 return 0;
4044 set_address_tvb(&source_addr, AT_IPv4, L_LBMR_TIR_LBTRDMA_T_IP, tvb, offset + O_LBMR_TIR_LBTRDMA_T_IP);
4045 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRDMA_T_SESSION_ID);
4046 port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRDMA_T_PORT);
4047 proto_tree_add_item(lbtrdma_tree, hf_lbmr_tir_lbtrdma_ip, tvb, offset + O_LBMR_TIR_LBTRDMA_T_IP, L_LBMR_TIR_LBTRDMA_T_IP, ENC_BIG_ENDIAN);
4048 proto_tree_add_item(lbtrdma_tree, hf_lbmr_tir_lbtrdma_session_id, tvb, offset + O_LBMR_TIR_LBTRDMA_T_SESSION_ID, L_LBMR_TIR_LBTRDMA_T_SESSION_ID, ENC_BIG_ENDIAN);
4049 proto_tree_add_item(lbtrdma_tree, hf_lbmr_tir_lbtrdma_port, tvb, offset + O_LBMR_TIR_LBTRDMA_T_PORT, L_LBMR_TIR_LBTRDMA_T_PORT, ENC_BIG_ENDIAN);
4050 lbtrdma_transport = lbtrdma_transport_add(&source_addr, port, session_id);
4051 channel = lbtrdma_transport->channel;
4052 add_contents_tir(contents, topic_name, lbtrdma_transport_source_string(&source_addr, port, session_id), topic_index);
4053 len += L_LBMR_TIR_LBTRDMA_T;
4055 break;
4056 case LBMR_TRANSPORT_LBTSMX:
4058 uint32_t host_id;
4059 uint32_t session_id;
4060 uint16_t xport_id;
4061 proto_item * lbtsmx_item = NULL;
4062 proto_tree * lbtsmx_tree = NULL;
4063 lbtsmx_transport_t * lbtsmx_transport = NULL;
4065 lbtsmx_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtsmx, tvb, offset, (int)transport_len, ENC_NA);
4066 lbtsmx_tree = proto_item_add_subtree(lbtsmx_item, ett_lbmr_tir_lbtsmx);
4067 if (transport_len != L_LBMR_TIR_LBTSMX_T)
4069 expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTSMX info");
4071 host_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTSMX_T_HOST_ID);
4072 session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTSMX_T_SESSION_ID);
4073 xport_id = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTSMX_T_XPORT_ID);
4074 proto_tree_add_item(lbtsmx_tree, hf_lbmr_tir_lbtsmx_host_id, tvb, offset + O_LBMR_TIR_LBTSMX_T_HOST_ID, L_LBMR_TIR_LBTSMX_T_HOST_ID, ENC_BIG_ENDIAN);
4075 proto_tree_add_item(lbtsmx_tree, hf_lbmr_tir_lbtsmx_session_id, tvb, offset + O_LBMR_TIR_LBTSMX_T_SESSION_ID, L_LBMR_TIR_LBTSMX_T_SESSION_ID, ENC_BIG_ENDIAN);
4076 proto_tree_add_item(lbtsmx_tree, hf_lbmr_tir_lbtsmx_xport_id, tvb, offset + O_LBMR_TIR_LBTSMX_T_XPORT_ID, L_LBMR_TIR_LBTSMX_T_XPORT_ID, ENC_BIG_ENDIAN);
4077 lbtsmx_transport = lbtsmx_transport_add(host_id, session_id, xport_id);
4078 channel = lbtsmx_transport->channel;
4079 add_contents_tir(contents, topic_name, lbtsmx_transport_source_string(host_id, session_id, xport_id), topic_index);
4080 len += L_LBMR_TIR_LBTSMX_T;
4082 break;
4083 default:
4084 ei_item = proto_tree_add_item(tree, hf_lbmr_tir_unknown_transport, tvb, offset, transport_len, ENC_NA);
4085 expert_add_info_format(pinfo, ei_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR TIR transport 0x%02x", transport);
4086 len = transport_len;
4087 channel = LBM_CHANNEL_NO_CHANNEL;
4088 break;
4090 if (channel != LBM_CHANNEL_NO_CHANNEL)
4092 lbm_topic_add(channel, topic_index, topic_name);
4093 channel_item = proto_tree_add_uint64(tree, hf_lbmr_tir_channel, tvb, 0, 0, channel);
4094 proto_item_set_generated(channel_item);
4096 return (len);
4099 static int dissect_lbmr_tir_entry(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4101 int namelen = 0;
4102 int reclen = 0;
4103 int dissect_len = 0;
4104 int tinfo_offset = 0;
4105 char * name = NULL;
4106 proto_item * ti = NULL;
4107 proto_tree * tinfo_tree = NULL;
4108 uint8_t transport;
4109 uint8_t tlen;
4110 uint16_t ttl;
4111 uint32_t idx;
4112 int curr_offset;
4113 proto_item * transport_len_item = NULL;
4115 name = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &namelen, ENC_ASCII);
4116 reclen += namelen;
4117 curr_offset = offset + namelen;
4118 tinfo_offset = curr_offset;
4119 transport = tvb_get_uint8(tvb, curr_offset + O_LBMR_TIR_T_TRANSPORT);
4120 tlen = tvb_get_uint8(tvb, curr_offset + O_LBMR_TIR_T_TLEN);
4121 ttl = tvb_get_ntohs(tvb, curr_offset + O_LBMR_TIR_T_TTL);
4122 idx = tvb_get_ntohl(tvb, curr_offset + O_LBMR_TIR_T_INDEX);
4123 reclen += L_LBMR_TIR_T;
4124 curr_offset += L_LBMR_TIR_T;
4126 ti = proto_tree_add_none_format(tree, hf_lbmr_tir, tvb, offset, reclen, "%s: %s, Length %u, Index %" PRIu32 ", TTL %" PRIu16,
4127 name, val_to_str((transport & LBMR_TIR_TRANSPORT), lbmr_transport_type, "Unknown (0x%02x)"), tlen, idx, ttl);
4128 tinfo_tree = proto_item_add_subtree(ti, ett_lbmr_tir);
4129 proto_tree_add_item(tinfo_tree, hf_lbmr_tir_name, tvb, offset, namelen, ENC_ASCII);
4130 proto_tree_add_item(tinfo_tree, hf_lbmr_tir_transport_opts, tvb, tinfo_offset + O_LBMR_TIR_T_TRANSPORT, L_LBMR_TIR_T_TRANSPORT, ENC_BIG_ENDIAN);
4131 proto_tree_add_item(tinfo_tree, hf_lbmr_tir_transport_type, tvb, tinfo_offset + O_LBMR_TIR_T_TRANSPORT, L_LBMR_TIR_T_TRANSPORT, ENC_BIG_ENDIAN);
4132 transport_len_item = proto_tree_add_item(tinfo_tree, hf_lbmr_tir_tlen, tvb, tinfo_offset + O_LBMR_TIR_T_TLEN, L_LBMR_TIR_T_TLEN, ENC_BIG_ENDIAN);
4133 proto_tree_add_item(tinfo_tree, hf_lbmr_tir_ttl, tvb, tinfo_offset + O_LBMR_TIR_T_TTL, L_LBMR_TIR_T_TTL, ENC_BIG_ENDIAN);
4134 proto_tree_add_item(tinfo_tree, hf_lbmr_tir_index, tvb, tinfo_offset + O_LBMR_TIR_T_INDEX, L_LBMR_TIR_T_INDEX, ENC_BIG_ENDIAN);
4135 if ((transport & LBMR_TIR_OPTIONS) != 0)
4137 dissect_len = dissect_lbmr_tir_options(tvb, curr_offset, pinfo, tinfo_tree);
4138 reclen += dissect_len;
4139 curr_offset += dissect_len;
4141 reclen += dissect_lbmr_tir_transport(tvb, curr_offset, (lbm_uint8_t)(transport & LBMR_TIR_TRANSPORT), tlen, name, idx, pinfo, tinfo_tree, contents, transport_len_item);
4142 proto_item_set_len(ti, reclen);
4143 return (reclen);
4146 static int dissect_lbmr_tirs(tvbuff_t * tvb, int offset, uint16_t tir_count, packet_info * pinfo, proto_tree * tree,
4147 const char * name, lbmr_contents_t * contents)
4149 int start_offset;
4150 int tir_len;
4151 proto_tree * tirs_tree = NULL;
4152 proto_item * ti = NULL;
4153 int len = 0;
4155 start_offset = offset;
4156 ti = proto_tree_add_none_format(tree, hf_lbmr_tirs, tvb, start_offset, -1, "%s", name);
4157 tirs_tree = proto_item_add_subtree(ti, ett_lbmr_tirs);
4158 while (tir_count-- > 0)
4160 tir_len = dissect_lbmr_tir_entry(tvb, offset, pinfo, tirs_tree, contents);
4161 offset += tir_len;
4162 len += tir_len;
4164 proto_item_set_len(ti, len);
4165 return (len);
4168 /*----------------------------------------------------------------------------*/
4169 /* LBMR Queue Query Record dissection functions. */
4170 /*----------------------------------------------------------------------------*/
4171 static int dissect_lbmr_qqr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, lbmr_contents_t * contents)
4173 int namelen = 0;
4174 unsigned reclen = 0;
4175 char * name = NULL;
4177 name = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &namelen, ENC_ASCII);
4178 reclen += namelen;
4179 add_contents_qqr(contents, name);
4180 proto_tree_add_item(tree, hf_lbmr_qqr_name, tvb, offset, namelen, ENC_ASCII);
4181 return (reclen);
4184 static int dissect_lbmr_qqrs(tvbuff_t * tvb, int offset, uint8_t qqr_count, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4186 int start_offset;
4187 int qqr_len;
4188 proto_tree * qqrs_tree = NULL;
4189 proto_item * qqrs_ti = NULL;
4190 int total_len = 0;
4192 start_offset = offset;
4193 qqrs_ti = proto_tree_add_item(tree, hf_lbmr_qqr, tvb, start_offset, -1, ENC_NA);
4194 qqrs_tree = proto_item_add_subtree(qqrs_ti, ett_lbmr_qqrs);
4195 while (qqr_count-- > 0)
4197 qqr_len = dissect_lbmr_qqr(tvb, offset, pinfo, qqrs_tree, contents);
4198 total_len += qqr_len;
4199 offset += qqr_len;
4201 proto_item_set_len(qqrs_ti, total_len);
4202 return (total_len);
4205 /*----------------------------------------------------------------------------*/
4206 /* LBMR Queue Information Record dissection functions. */
4207 /*----------------------------------------------------------------------------*/
4208 static int dissect_lbmr_qir_queue_blk(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, const char * queue_name,
4209 const char * topic_name, lbmr_contents_t * contents)
4211 uint16_t port = 0;
4212 proto_item * ti = NULL;
4213 proto_tree * blk_tree = NULL;
4215 port = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_PORT);
4216 ti = proto_tree_add_item(tree, hf_lbmr_qir_queue_blk, tvb, offset, L_LBMR_QIR_QUEUE_BLK_T, ENC_NA);
4217 blk_tree = proto_item_add_subtree(ti, ett_lbmr_qir_queue_blk);
4218 proto_tree_add_item(blk_tree, hf_lbmr_qir_queue_blk_ip, tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_IP, L_LBMR_QIR_QUEUE_BLK_T_IP, ENC_BIG_ENDIAN);
4219 proto_tree_add_item(blk_tree, hf_lbmr_qir_queue_blk_port, tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_PORT, L_LBMR_QIR_QUEUE_BLK_T_PORT, ENC_BIG_ENDIAN);
4220 proto_tree_add_item(blk_tree, hf_lbmr_qir_queue_blk_idx, tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_IDX, L_LBMR_QIR_QUEUE_BLK_T_IDX, ENC_BIG_ENDIAN);
4221 proto_tree_add_item(blk_tree, hf_lbmr_qir_queue_blk_grp_idx, tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_GRP_IDX, L_LBMR_QIR_QUEUE_BLK_T_GRP_IDX, ENC_BIG_ENDIAN);
4222 proto_tree_add_item(blk_tree, hf_lbmr_qir_queue_blk_reserved, tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_RESERVED, L_LBMR_QIR_QUEUE_BLK_T_RESERVED, ENC_BIG_ENDIAN);
4223 add_contents_qir(contents, queue_name, topic_name, port);
4224 return ((int)L_LBMR_QIR_QUEUE_BLK_T);
4227 static int dissect_lbmr_qir_grp_blk(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, lbmr_contents_t * contents _U_)
4229 proto_item * ti = NULL;
4230 proto_tree * blk_tree = NULL;
4231 uint16_t idx = 0;
4232 uint16_t sz = 0;
4234 idx = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_IDX);
4235 sz = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_SZ);
4236 ti = proto_tree_add_none_format(tree, hf_lbmr_qir_grp_blk, tvb, offset, L_LBMR_QIR_GRP_BLK_T, "Group block, Index %" PRIu16 ", Size %" PRIu16, idx, sz);
4237 blk_tree = proto_item_add_subtree(ti, ett_lbmr_qir_grp_blk);
4238 proto_tree_add_item(blk_tree, hf_lbmr_qir_grp_blk_grp_idx, tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_IDX, L_LBMR_QIR_GRP_BLK_T_GRP_IDX, ENC_BIG_ENDIAN);
4239 proto_tree_add_item(blk_tree, hf_lbmr_qir_grp_blk_grp_sz, tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_SZ, L_LBMR_QIR_GRP_BLK_T_GRP_SZ, ENC_BIG_ENDIAN);
4240 return ((int)L_LBMR_QIR_GRP_BLK_T);
4243 static int dissect_lbmr_qir_entry(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4245 int qnamelen = 0;
4246 int qnameoffset = 0;
4247 char * qname = NULL;
4248 int tnamelen = 0;
4249 int tnameoffset = 0;
4250 char * tname = NULL;
4251 int reclen = 0;
4252 int curr_offset = 0;
4253 proto_item * qirti = NULL;
4254 proto_tree * qirtree = NULL;
4255 proto_item * grpti = NULL;
4256 proto_tree * grptree = NULL;
4257 int grplen = 0;
4258 proto_item * queueti = NULL;
4259 proto_item * queuetree = NULL;
4260 int queuelen = 0;
4261 uint32_t queue_id = 0;
4262 uint16_t grp_blks = 0;
4263 uint16_t queue_blks = 0;
4264 uint16_t have_options = 0;
4265 int optlen = 0;
4268 queue name (null-terminated)
4269 topic name (null-terminated)
4270 lbmr_qir_t
4271 if qir.grp_blks & LBMR_QIR_OPTIONS
4272 parse options (normal topic options - though there shouldn't be any) can use dissect_lbmr_tir_options
4273 endif
4274 group blocks (lbmr_qir_grp_blk_t)
4275 queue blocks (lbmr_qir_queue_blk_t)
4277 curr_offset = offset;
4278 qnameoffset = curr_offset;
4279 qname = tvb_get_stringz_enc(wmem_packet_scope(), tvb, qnameoffset, &qnamelen, ENC_ASCII);
4280 curr_offset += qnamelen;
4281 reclen += qnamelen;
4282 tnameoffset = curr_offset;
4283 tname = tvb_get_stringz_enc(wmem_packet_scope(), tvb, tnameoffset, &tnamelen, ENC_ASCII);
4284 curr_offset += tnamelen;
4285 reclen += tnamelen;
4286 queue_id = tvb_get_ntohl(tvb, curr_offset + O_LBMR_QIR_T_QUEUE_ID);
4287 have_options = tvb_get_ntohs(tvb, curr_offset + O_LBMR_QIR_T_GRP_BLKS);
4288 grp_blks = have_options & LBMR_QIR_GRP_BLOCKS_MASK;
4289 have_options &= LBMR_QIR_OPTIONS;
4290 queue_blks = tvb_get_ntohs(tvb, curr_offset + O_LBMR_QIR_T_QUEUE_BLKS);
4291 qirti = proto_tree_add_none_format(tree, hf_lbmr_qir, tvb, offset, reclen, "%s: %s, ID %" PRIu32, qname, tname, queue_id);
4292 qirtree = proto_item_add_subtree(qirti, ett_lbmr_qir);
4293 proto_tree_add_item(qirtree, hf_lbmr_qir_queue_name, tvb, qnameoffset, qnamelen, ENC_ASCII);
4294 proto_tree_add_item(qirtree, hf_lbmr_qir_topic_name, tvb, tnameoffset, tnamelen, ENC_ASCII);
4295 proto_tree_add_item(qirtree, hf_lbmr_qir_queue_id, tvb, curr_offset + O_LBMR_QIR_T_QUEUE_ID, L_LBMR_QIR_T_QUEUE_ID, ENC_BIG_ENDIAN);
4296 proto_tree_add_item(qirtree, hf_lbmr_qir_queue_ver, tvb, curr_offset + O_LBMR_QIR_T_QUEUE_VER, L_LBMR_QIR_T_QUEUE_VER, ENC_BIG_ENDIAN);
4297 proto_tree_add_item(qirtree, hf_lbmr_qir_queue_prev_ver, tvb, curr_offset + O_LBMR_QIR_T_QUEUE_PREV_VER, L_LBMR_QIR_T_QUEUE_PREV_VER, ENC_BIG_ENDIAN);
4298 proto_tree_add_item(qirtree, hf_lbmr_qir_option_flag, tvb, curr_offset + O_LBMR_QIR_T_GRP_BLKS, L_LBMR_QIR_T_GRP_BLKS, ENC_BIG_ENDIAN);
4299 proto_tree_add_item(qirtree, hf_lbmr_qir_grp_blks, tvb, curr_offset + O_LBMR_QIR_T_GRP_BLKS, L_LBMR_QIR_T_GRP_BLKS, ENC_BIG_ENDIAN);
4300 proto_tree_add_item(qirtree, hf_lbmr_qir_queue_blks, tvb, curr_offset + O_LBMR_QIR_T_QUEUE_BLKS, L_LBMR_QIR_T_QUEUE_BLKS, ENC_BIG_ENDIAN);
4301 curr_offset += L_LBMR_QIR_T;
4302 reclen += L_LBMR_QIR_T;
4303 if (have_options)
4305 optlen = dissect_lbmr_tir_options(tvb, curr_offset, pinfo, tree);
4306 curr_offset += optlen;
4307 reclen += optlen;
4309 if (grp_blks > 0)
4311 grpti = proto_tree_add_item(qirtree, hf_lbmr_qir_grps, tvb, curr_offset, 1, ENC_NA);
4312 grptree = proto_item_add_subtree(grpti, ett_lbmr_qir_grp);
4313 grplen = 0;
4314 while (grp_blks-- > 0)
4316 optlen = dissect_lbmr_qir_grp_blk(tvb, curr_offset, pinfo, grptree, contents);
4317 curr_offset += optlen;
4318 reclen += optlen;
4319 grplen += optlen;
4321 proto_item_set_len(grpti, grplen);
4323 if (queue_blks > 0)
4325 queueti = proto_tree_add_item(qirtree, hf_lbmr_qir_queues, tvb, curr_offset, 1, ENC_NA);
4326 queuetree = proto_item_add_subtree(queueti, ett_lbmr_qir_queue);
4327 queuelen = 0;
4328 while (queue_blks-- > 0)
4330 optlen = dissect_lbmr_qir_queue_blk(tvb, curr_offset, pinfo, queuetree, qname, tname, contents);
4331 curr_offset += optlen;
4332 reclen += optlen;
4333 queuelen += optlen;
4335 proto_item_set_len(queueti, queuelen);
4337 proto_item_set_len(qirti, reclen);
4338 return (reclen);
4341 static int dissect_lbmr_qirs(tvbuff_t * tvb, int offset, uint16_t qirs, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4343 int start_offset;
4344 int qir_len;
4345 proto_tree * qirs_tree = NULL;
4346 proto_item * qirs_ti = NULL;
4347 int len = 0;
4349 start_offset = offset;
4350 qirs_ti = proto_tree_add_item(tree, hf_lbmr_qirs, tvb, start_offset, -1, ENC_NA);
4351 qirs_tree = proto_item_add_subtree(qirs_ti, ett_lbmr_qirs);
4352 while (qirs-- > 0)
4354 qir_len = dissect_lbmr_qir_entry(tvb, offset, pinfo, qirs_tree, contents);
4355 len += qir_len;
4356 offset += qir_len;
4358 proto_item_set_len(qirs_ti, len);
4359 return (len);
4362 /*----------------------------------------------------------------------------*/
4363 /* LBMR Proxy Source Election Record dissection functions. */
4364 /*----------------------------------------------------------------------------*/
4365 static int dissect_lbmr_pser(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4367 int hdr_len = 0;
4368 int len = 0;
4369 int topic_len = 0;
4370 static int * const flags[] =
4372 &hf_lbmr_pser_flags_option,
4373 NULL
4375 int curr_offset = offset;
4376 uint16_t flags_val = 0;
4378 hdr_len = (int)tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_T_LEN);
4379 flags_val = tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_T_FLAGS);
4380 topic_len = hdr_len - L_LBMR_PSER_T;
4381 proto_tree_add_item(tree, hf_lbmr_pser_dep_type, tvb, offset + O_LBMR_PSER_T_DEP_TYPE, L_LBMR_PSER_T_DEP_TYPE, ENC_BIG_ENDIAN);
4382 proto_tree_add_item(tree, hf_lbmr_pser_len, tvb, offset + O_LBMR_PSER_T_LEN, L_LBMR_PSER_T_LEN, ENC_BIG_ENDIAN);
4383 proto_tree_add_bitmask(tree, tvb, offset + O_LBMR_PSER_T_FLAGS, hf_lbmr_pser_flags, ett_lbmr_pser_flags, flags, ENC_BIG_ENDIAN);
4384 proto_tree_add_item(tree, hf_lbmr_pser_source_ip, tvb, offset + O_LBMR_PSER_T_SOURCE_IP, L_LBMR_PSER_T_SOURCE_IP, ENC_BIG_ENDIAN);
4385 proto_tree_add_item(tree, hf_lbmr_pser_store_ip, tvb, offset + O_LBMR_PSER_T_STORE_IP, L_LBMR_PSER_T_STORE_IP, ENC_BIG_ENDIAN);
4386 proto_tree_add_item(tree, hf_lbmr_pser_transport_idx, tvb, offset + O_LBMR_PSER_T_TRANSPORT_IDX, L_LBMR_PSER_T_TRANSPORT_IDX, ENC_BIG_ENDIAN);
4387 proto_tree_add_item(tree, hf_lbmr_pser_topic_idx, tvb, offset + O_LBMR_PSER_T_TOPIC_IDX, L_LBMR_PSER_T_TOPIC_IDX, ENC_BIG_ENDIAN);
4388 proto_tree_add_item(tree, hf_lbmr_pser_source_port, tvb, offset + O_LBMR_PSER_T_SOURCE_PORT, L_LBMR_PSER_T_SOURCE_PORT, ENC_BIG_ENDIAN);
4389 proto_tree_add_item(tree, hf_lbmr_pser_store_port, tvb, offset + O_LBMR_PSER_T_STORE_PORT, L_LBMR_PSER_T_STORE_PORT, ENC_BIG_ENDIAN);
4390 proto_tree_add_item(tree, hf_lbmr_pser_topic, tvb, offset + O_LBMR_PSER_T_TOPIC, topic_len, ENC_ASCII);
4391 curr_offset += hdr_len;
4392 len = hdr_len;
4393 if ((flags_val & LBMR_PSER_OPT_FLAG) != 0)
4395 proto_tree * opts_tree = NULL;
4396 proto_item * opts_item = NULL;
4397 proto_tree * optlen_tree = NULL;
4398 proto_tree * optlen_item = NULL;
4399 uint16_t opt_len = 0;
4401 opt_len = tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_OPTLEN_T_OPTLEN);
4402 opts_item = proto_tree_add_item(tree, hf_lbmr_pser_opts, tvb, curr_offset, -1, ENC_NA);
4403 opts_tree = proto_item_add_subtree(opts_item, ett_lbmr_pser_opts);
4404 optlen_item = proto_tree_add_item(opts_tree, hf_lbmr_pser_optlen, tvb, curr_offset, L_LBMR_PSER_OPTLEN_T, ENC_NA);
4405 optlen_tree = proto_item_add_subtree(optlen_item, ett_lbmr_pser_opt_len);
4406 proto_tree_add_item(optlen_tree, hf_lbmr_pser_optlen_type, tvb, curr_offset + O_LBMR_PSER_OPTLEN_T_TYPE, L_LBMR_PSER_OPTLEN_T_TYPE, ENC_BIG_ENDIAN);
4407 proto_tree_add_item(optlen_tree, hf_lbmr_pser_optlen_optlen, tvb, curr_offset + O_LBMR_PSER_OPTLEN_T_OPTLEN, L_LBMR_PSER_OPTLEN_T_OPTLEN, ENC_BIG_ENDIAN);
4408 proto_item_set_len(opts_item, opt_len);
4409 len += L_LBMR_PSER_OPTLEN_T;
4410 curr_offset += L_LBMR_PSER_OPTLEN_T;
4411 opt_len -= L_LBMR_PSER_OPTLEN_T;
4412 while (opt_len > 0)
4414 proto_tree * ctxinst_tree = NULL;
4415 proto_item * ctxinst_item = NULL;
4416 uint8_t opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_PSER_OPT_HDR_T_TYPE);
4417 uint8_t option_len = tvb_get_uint8(tvb, curr_offset + O_LBMR_PSER_OPT_HDR_T_LEN);
4419 switch (opt_type)
4421 case LBMR_PSER_OPT_SRC_CTXINST_TYPE:
4422 case LBMR_PSER_OPT_STORE_CTXINST_TYPE:
4423 ctxinst_item = proto_tree_add_item(opts_tree, hf_lbmr_pser_opt_ctxinst, tvb, curr_offset, L_LBMR_PSER_OPT_CTXINST_T, ENC_NA);
4424 ctxinst_tree = proto_item_add_subtree(ctxinst_item, ett_lbmr_pser_opt_ctxinst);
4425 proto_tree_add_item(ctxinst_tree, hf_lbmr_pser_opt_ctxinst_len, tvb, curr_offset + O_LBMR_PSER_OPT_CTXINST_T_LEN, L_LBMR_PSER_OPT_CTXINST_T_LEN, ENC_BIG_ENDIAN);
4426 proto_tree_add_item(ctxinst_tree, hf_lbmr_pser_opt_ctxinst_type, tvb, curr_offset + O_LBMR_PSER_OPT_CTXINST_T_TYPE, L_LBMR_PSER_OPT_CTXINST_T_TYPE, ENC_BIG_ENDIAN);
4427 proto_tree_add_item(ctxinst_tree, hf_lbmr_pser_opt_ctxinst_ctxinst, tvb, curr_offset + O_LBMR_PSER_OPT_CTXINST_T_CTXINST, L_LBMR_PSER_OPT_CTXINST_T_CTXINST, ENC_NA);
4428 len += L_LBMR_PSER_OPT_CTXINST_T;
4429 curr_offset += L_LBMR_PSER_OPT_CTXINST_T;
4430 opt_len -= L_LBMR_PSER_OPT_CTXINST_T;
4431 break;
4432 default:
4433 len += option_len;
4434 curr_offset += option_len;
4435 opt_len -= option_len;
4436 expert_add_info_format(pinfo, NULL, &ei_lbmr_analysis_invalid_value, "Unknown LBMR PSER option 0x%02x", opt_type);
4437 if (option_len == 0) {
4438 return (len);
4440 break;
4444 return (len);
4447 /*----------------------------------------------------------------------------*/
4448 /* LBMR Queue Management dissection functions. */
4449 /*----------------------------------------------------------------------------*/
4450 int lbmr_dissect_umq_qmgmt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4452 uint8_t pckt_type = 0;
4453 int curr_offset = 0;
4454 uint16_t dep16;
4455 uint16_t idx;
4456 uint8_t flags_val = 0;
4457 int len_dissected = 0;
4458 static int * const flags[] =
4460 &hf_qmgmt_flags_i_flag,
4461 &hf_qmgmt_flags_n_flag,
4462 NULL
4464 static int * const il_flags[] =
4466 &hf_qmgmt_flags_i_flag,
4467 &hf_qmgmt_flags_n_flag,
4468 &hf_qmgmt_flags_il_l_flag,
4469 &hf_qmgmt_flags_il_k_flag,
4470 NULL
4473 flags_val = tvb_get_uint8(tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS);
4474 pckt_type = tvb_get_uint8(tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE);
4475 dep16 = tvb_get_ntohs(tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16);
4476 if (pckt_type == UMQ_QMGMT_HDR_PCKT_TYPE_IL)
4478 proto_tree_add_bitmask(tree, tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS, hf_qmgmt_flags, ett_qmgmt_flags, il_flags, ENC_BIG_ENDIAN);
4480 else
4482 proto_tree_add_bitmask(tree, tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS, hf_qmgmt_flags, ett_qmgmt_flags, flags, ENC_BIG_ENDIAN);
4484 proto_tree_add_item(tree, hf_qmgmt_pckt_type, tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE, L_UMQ_QMGMT_HDR_T_PCKT_TYPE, ENC_BIG_ENDIAN);
4485 proto_tree_add_item(tree, hf_qmgmt_cfgsig, tvb, offset + O_UMQ_QMGMT_HDR_T_CFGSIG, L_UMQ_QMGMT_HDR_T_CFGSIG, ENC_NA);
4486 proto_tree_add_item(tree, hf_qmgmt_queue_id, tvb, offset + O_UMQ_QMGMT_HDR_T_QUEUE_ID, L_UMQ_QMGMT_HDR_T_QUEUE_ID, ENC_BIG_ENDIAN);
4487 proto_tree_add_item(tree, hf_qmgmt_queue_ver, tvb, offset + O_UMQ_QMGMT_HDR_T_QUEUE_VER, L_UMQ_QMGMT_HDR_T_QUEUE_VER, ENC_BIG_ENDIAN);
4488 proto_tree_add_item(tree, hf_qmgmt_ip, tvb, offset + O_UMQ_QMGMT_HDR_T_IP, L_UMQ_QMGMT_HDR_T_IP, ENC_BIG_ENDIAN);
4489 proto_tree_add_item(tree, hf_qmgmt_port, tvb, offset + O_UMQ_QMGMT_HDR_T_PORT, L_UMQ_QMGMT_HDR_T_PORT, ENC_BIG_ENDIAN);
4490 proto_tree_add_item(tree, hf_qmgmt_inst_idx, tvb, offset + O_UMQ_QMGMT_HDR_T_INST_IDX, L_UMQ_QMGMT_HDR_T_INST_IDX, ENC_BIG_ENDIAN);
4491 proto_tree_add_item(tree, hf_qmgmt_grp_idx, tvb, offset + O_UMQ_QMGMT_HDR_T_GRP_IDX, L_UMQ_QMGMT_HDR_T_GRP_IDX, ENC_BIG_ENDIAN);
4492 switch (pckt_type)
4494 case UMQ_QMGMT_HDR_PCKT_TYPE_IL:
4495 proto_tree_add_item(tree, hf_qmgmt_il_num_insts, tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, ENC_BIG_ENDIAN);
4496 break;
4497 case UMQ_QMGMT_HDR_PCKT_TYPE_JREJ:
4498 proto_tree_add_item(tree, hf_qmgmt_jrej_code, tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, ENC_BIG_ENDIAN);
4499 break;
4500 case UMQ_QMGMT_HDR_PCKT_TYPE_EV:
4501 proto_tree_add_item(tree, hf_qmgmt_ev_bias, tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, ENC_BIG_ENDIAN);
4502 break;
4503 default:
4504 proto_tree_add_item(tree, hf_qmgmt_pckt_type_dep16, tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16, ENC_BIG_ENDIAN);
4505 break;
4507 len_dissected = L_UMQ_QMGMT_HDR_T;
4508 curr_offset = offset + L_UMQ_QMGMT_HDR_T;
4509 switch (pckt_type)
4511 case UMQ_QMGMT_HDR_PCKT_TYPE_IL:
4513 proto_item * il_subtree_item = NULL;
4514 proto_tree * il_subtree = NULL;
4515 static int * const il_inst_flags[] =
4517 &hf_qmgmt_il_inst_flags_m_flag,
4518 &hf_qmgmt_il_inst_flags_q_flag,
4519 &hf_qmgmt_il_inst_flags_p_flag,
4520 NULL
4523 il_subtree_item = proto_tree_add_item(tree, hf_qmgmt_il, tvb, curr_offset, L_UMQ_QMGMT_IL_HDR_T, ENC_NA);
4524 il_subtree = proto_item_add_subtree(il_subtree_item, ett_qmgmt_il);
4525 proto_tree_add_item(il_subtree, hf_qmgmt_il_highest_rcr_tsp, tvb, curr_offset + O_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP, L_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP, ENC_BIG_ENDIAN);
4526 len_dissected += L_UMQ_QMGMT_IL_HDR_T;
4527 curr_offset += L_UMQ_QMGMT_IL_HDR_T;
4528 for (idx = 0; idx < dep16; ++idx)
4530 proto_item * il_inst_subtree_item = NULL;
4531 proto_tree * il_inst_subtree = NULL;
4533 il_inst_subtree_item = proto_tree_add_item(tree, hf_qmgmt_il_inst, tvb, curr_offset, L_UMQ_QMGMT_IL_INST_HDR_T, ENC_NA);
4534 il_inst_subtree = proto_item_add_subtree(il_inst_subtree_item, ett_qmgmt_il_inst);
4535 proto_tree_add_item(il_inst_subtree, hf_qmgmt_il_inst_ip, tvb, curr_offset + O_UMQ_QMGMT_IL_INST_HDR_T_IP, L_UMQ_QMGMT_IL_INST_HDR_T_IP, ENC_BIG_ENDIAN);
4536 proto_tree_add_item(il_inst_subtree, hf_qmgmt_il_inst_port, tvb, curr_offset + O_UMQ_QMGMT_IL_INST_HDR_T_PORT, L_UMQ_QMGMT_IL_INST_HDR_T_PORT, ENC_BIG_ENDIAN);
4537 proto_tree_add_item(il_inst_subtree, hf_qmgmt_il_inst_inst_idx, tvb, curr_offset + O_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX, L_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX, ENC_BIG_ENDIAN);
4538 proto_tree_add_item(il_inst_subtree, hf_qmgmt_il_inst_grp_idx, tvb, curr_offset + O_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX, L_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX, ENC_BIG_ENDIAN);
4539 proto_tree_add_bitmask(il_inst_subtree, tvb, curr_offset + O_UMQ_QMGMT_IL_INST_HDR_T_FLAGS, hf_qmgmt_il_inst_flags, ett_qmgmt_il_inst_flags, il_inst_flags, ENC_BIG_ENDIAN);
4540 len_dissected += L_UMQ_QMGMT_IL_INST_HDR_T;
4541 curr_offset += L_UMQ_QMGMT_IL_INST_HDR_T;
4544 break;
4545 case UMQ_QMGMT_HDR_PCKT_TYPE_JR:
4546 /* Nothing to do */
4547 break;
4548 case UMQ_QMGMT_HDR_PCKT_TYPE_JREJ:
4549 /* Nothing to do */
4550 break;
4551 case UMQ_QMGMT_HDR_PCKT_TYPE_IKA:
4552 /* Nothing to do */
4553 break;
4554 case UMQ_QMGMT_HDR_PCKT_TYPE_EC:
4556 proto_item * ec_subtree_item = NULL;
4557 proto_tree * ec_subtree = NULL;
4559 ec_subtree_item = proto_tree_add_item(tree, hf_qmgmt_ec, tvb, curr_offset, L_UMQ_QMGMT_EC_HDR_T, ENC_NA);
4560 ec_subtree = proto_item_add_subtree(ec_subtree_item, ett_qmgmt_ec);
4561 proto_tree_add_item(ec_subtree, hf_qmgmt_ec_queue_new_ver, tvb, curr_offset + O_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER, L_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER, ENC_BIG_ENDIAN);
4562 len_dissected += L_UMQ_QMGMT_EC_HDR_T;
4563 curr_offset += L_UMQ_QMGMT_EC_HDR_T;
4565 break;
4566 case UMQ_QMGMT_HDR_PCKT_TYPE_EV:
4568 proto_item * ev_subtree_item = NULL;
4569 proto_tree * ev_subtree = NULL;
4571 ev_subtree_item = proto_tree_add_item(tree, hf_qmgmt_ev, tvb, curr_offset, L_UMQ_QMGMT_EV_HDR_T, ENC_NA);
4572 ev_subtree = proto_item_add_subtree(ev_subtree_item, ett_qmgmt_ev);
4573 proto_tree_add_item(ev_subtree, hf_qmgmt_ev_highest_rcr_tsp, tvb, curr_offset + O_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP, L_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP, ENC_BIG_ENDIAN);
4574 proto_tree_add_item(ev_subtree, hf_qmgmt_ev_age, tvb, curr_offset + O_UMQ_QMGMT_EV_HDR_T_AGE, L_UMQ_QMGMT_EV_HDR_T_AGE, ENC_BIG_ENDIAN);
4575 len_dissected += L_UMQ_QMGMT_EV_HDR_T;
4576 curr_offset += L_UMQ_QMGMT_EV_HDR_T;
4578 break;
4579 case UMQ_QMGMT_HDR_PCKT_TYPE_CNIL:
4580 /* Nothing to do */
4581 break;
4582 case UMQ_QMGMT_HDR_PCKT_TYPE_QRO:
4584 proto_item * qro_subtree_item = NULL;
4585 proto_tree * qro_subtree = NULL;
4587 qro_subtree_item = proto_tree_add_item(tree, hf_qmgmt_qro, tvb, curr_offset, L_UMQ_QMGMT_QRO_HDR_T, ENC_NA);
4588 qro_subtree = proto_item_add_subtree(qro_subtree_item, ett_qmgmt_qro);
4589 proto_tree_add_item(qro_subtree, hf_qmgmt_qro_highest_rcr_tsp, tvb, curr_offset + O_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP, L_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP, ENC_BIG_ENDIAN);
4590 len_dissected += L_UMQ_QMGMT_QRO_HDR_T;
4591 curr_offset += L_UMQ_QMGMT_QRO_HDR_T;
4593 break;
4594 default:
4595 expert_add_info_format(pinfo, NULL, &ei_lbmr_analysis_invalid_value, "Unknown LBMR QMGMT packet type 0x%02x", pckt_type);
4596 break;
4598 if ((flags_val & UMQ_QMGMT_HDR_N_FLAG) != 0)
4600 int qnamelen = tvb_reported_length_remaining(tvb, curr_offset);
4601 if (qnamelen > 1)
4603 proto_tree_add_item(tree, hf_qmgmt_qname, tvb, curr_offset, qnamelen, ENC_ASCII);
4605 len_dissected += qnamelen;
4607 return (len_dissected);
4610 /*----------------------------------------------------------------------------*/
4611 /* LBMR ContextInfo dissection functions. */
4612 /*----------------------------------------------------------------------------*/
4613 static int dissect_lbmr_ctxinfo(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4615 uint16_t flags16 = 0;
4616 uint8_t reclen = 0;
4617 static int * const flags[] =
4619 &hf_lbmr_ctxinfo_flags_query,
4620 &hf_lbmr_ctxinfo_flags_ip,
4621 &hf_lbmr_ctxinfo_flags_instance,
4622 &hf_lbmr_ctxinfo_flags_tnwg_src,
4623 &hf_lbmr_ctxinfo_flags_tnwg_rcv,
4624 &hf_lbmr_ctxinfo_flags_proxy,
4625 &hf_lbmr_ctxinfo_flags_name,
4626 NULL
4629 flags16 = tvb_get_ntohs(tvb, offset + O_LBMR_CTXINFO_T_FLAGS);
4630 reclen = tvb_get_uint8(tvb, offset + O_LBMR_CTXINFO_T_LEN);
4631 proto_tree_add_item(tree, hf_lbmr_ctxinfo_len, tvb, offset + O_LBMR_CTXINFO_T_LEN, L_LBMR_CTXINFO_T_LEN, ENC_BIG_ENDIAN);
4632 proto_tree_add_item(tree, hf_lbmr_ctxinfo_hop_count, tvb, offset + O_LBMR_CTXINFO_T_HOP_COUNT, L_LBMR_CTXINFO_T_HOP_COUNT, ENC_BIG_ENDIAN);
4633 proto_tree_add_bitmask(tree, tvb, offset + O_LBMR_CTXINFO_T_FLAGS, hf_lbmr_ctxinfo_flags, ett_lbmr_ctxinfo_flags, flags, ENC_BIG_ENDIAN);
4634 proto_tree_add_item(tree, hf_lbmr_ctxinfo_port, tvb, offset + O_LBMR_CTXINFO_T_PORT, L_LBMR_CTXINFO_T_FLAGS, ENC_BIG_ENDIAN);
4635 proto_tree_add_item(tree, hf_lbmr_ctxinfo_ip, tvb, offset + O_LBMR_CTXINFO_T_IP, L_LBMR_CTXINFO_T_IP, ENC_BIG_ENDIAN);
4636 proto_tree_add_item(tree, hf_lbmr_ctxinfo_instance, tvb, offset + O_LBMR_CTXINFO_T_INSTANCE, L_LBMR_CTXINFO_T_INSTANCE, ENC_NA);
4637 if ((flags16 & LBMR_CTXINFO_NAME_FLAG) != 0)
4639 proto_tree_add_item(tree, hf_lbmr_ctxinfo_name, tvb, offset + L_LBMR_CTXINFO_T, reclen - L_LBMR_CTXINFO_T, ENC_ASCII);
4641 return ((int)reclen);
4644 /*----------------------------------------------------------------------------*/
4645 /* LBMR Topic Res Request dissection functions. */
4646 /*----------------------------------------------------------------------------*/
4647 static int dissect_lbmr_topic_res_request(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4649 static int * const flags[] =
4651 &hf_lbmr_topic_res_request_flags_gw_remote_interest,
4652 &hf_lbmr_topic_res_request_flags_context_query,
4653 &hf_lbmr_topic_res_request_flags_context_advertisement,
4654 &hf_lbmr_topic_res_request_flags_gateway_meta,
4655 &hf_lbmr_topic_res_request_flags_advertisement,
4656 &hf_lbmr_topic_res_request_flags_query,
4657 &hf_lbmr_topic_res_request_flags_wildcard_query,
4658 NULL
4661 proto_tree_add_bitmask(tree, tvb, offset + O_LBMR_TOPIC_RES_REQUEST_T_FLAGS, hf_lbmr_topic_res_request_flags, ett_lbmr_topic_res_request_flags, flags, ENC_BIG_ENDIAN);
4662 return (L_LBMR_TOPIC_RES_REQUEST_T);
4665 /*----------------------------------------------------------------------------*/
4666 /* LBMR Remote Domain Route dissection functions. */
4667 /*----------------------------------------------------------------------------*/
4668 static int dissect_lbmr_remote_domain_route(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4670 uint16_t num_domains;
4671 int len_dissected = 0;
4672 int ofs = 0;
4673 uint16_t idx;
4675 num_domains = tvb_get_ntohs(tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS);
4676 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_num_domains, tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS, L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS, ENC_BIG_ENDIAN);
4677 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_ip, tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP, L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP, ENC_BIG_ENDIAN);
4678 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_port, tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT, L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT, ENC_BIG_ENDIAN);
4679 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_route_index, tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX, L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX, ENC_BIG_ENDIAN);
4680 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_length, tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH, L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH, ENC_BIG_ENDIAN);
4681 len_dissected = L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T;
4682 ofs = offset + L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T;
4683 for (idx = 0; idx < num_domains; ++idx)
4685 proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_domain, tvb, ofs, sizeof(lbm_uint32_t), ENC_BIG_ENDIAN);
4686 len_dissected += (int)sizeof(lbm_uint32_t);
4687 ofs += (int)sizeof(lbm_uint32_t);
4689 return (len_dissected);
4692 /*----------------------------------------------------------------------------*/
4693 /* LBMR Remote ContextInfo option dissection functions. */
4694 /*----------------------------------------------------------------------------*/
4695 static int dissect_lbmr_rctxinfo_rec_address_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4697 proto_tree * subtree = NULL;
4698 proto_item * subtree_item = NULL;
4700 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_address, tvb, offset, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T, ENC_NA);
4701 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_address);
4702 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_type, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE, ENC_BIG_ENDIAN);
4703 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_len, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN, ENC_BIG_ENDIAN);
4704 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_flags, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS, ENC_BIG_ENDIAN);
4705 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_domain_id, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID, ENC_BIG_ENDIAN);
4706 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_ip, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP, ENC_BIG_ENDIAN);
4707 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_port, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT, ENC_BIG_ENDIAN);
4708 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_address_res, tvb, offset + O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES, ENC_BIG_ENDIAN);
4709 return ((int)L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T);
4712 static int dissect_lbmr_rctxinfo_rec_instance_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4714 proto_tree * subtree = NULL;
4715 proto_item * subtree_item = NULL;
4716 uint8_t len = 0;
4718 len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN);
4719 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_instance, tvb, offset, (int)len, ENC_NA);
4720 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_instance);
4721 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_instance_type, tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE, L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE, ENC_BIG_ENDIAN);
4722 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_instance_len, tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN, L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN, ENC_BIG_ENDIAN);
4723 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_instance_flags, tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS, L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS, ENC_BIG_ENDIAN);
4724 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_instance_instance, tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE, L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE, ENC_NA);
4725 return ((int)L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T);
4728 static int dissect_lbmr_rctxinfo_rec_odomain_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4730 proto_tree * subtree = NULL;
4731 proto_item * subtree_item = NULL;
4732 uint8_t len = 0;
4734 len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN);
4735 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_odomain, tvb, offset, (int)len, ENC_NA);
4736 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_odomain);
4737 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_odomain_type, tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE, L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE, ENC_BIG_ENDIAN);
4738 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_odomain_len, tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN, L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN, ENC_BIG_ENDIAN);
4739 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_odomain_flags, tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS, L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS, ENC_BIG_ENDIAN);
4740 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_odomain_domain_id, tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID, L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID, ENC_BIG_ENDIAN);
4741 return ((int)L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T);
4744 static int dissect_lbmr_rctxinfo_rec_name_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4746 proto_tree * subtree = NULL;
4747 proto_item * subtree_item = NULL;
4748 uint8_t len = 0;
4749 int name_len = 0;
4751 len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN);
4752 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_name, tvb, offset, (int)len, ENC_NA);
4753 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_name);
4754 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_name_type, tvb, offset + O_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE, L_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE, ENC_BIG_ENDIAN);
4755 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_name_len, tvb, offset + O_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN, L_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN, ENC_BIG_ENDIAN);
4756 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_name_flags, tvb, offset + O_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS, L_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS, ENC_BIG_ENDIAN);
4757 name_len = ((int)len) - L_LBMR_RCTXINFO_REC_NAME_OPT_T;
4758 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_name_name, tvb, offset + L_LBMR_RCTXINFO_REC_NAME_OPT_T, name_len, ENC_ASCII);
4759 return ((int)len);
4762 static int dissect_lbmr_rctxinfo_rec_unknown_opt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4764 proto_tree * subtree = NULL;
4765 proto_item * subtree_item = NULL;
4766 uint8_t len = 0;
4767 int data_len = 0;
4768 uint8_t opt_type;
4770 opt_type = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_TYPE);
4771 len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_LEN);
4772 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_unknown, tvb, offset, (int)len, ENC_NA);
4773 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_unknown);
4774 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_unknown_type, tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_TYPE, L_LBMR_RCTXINFO_REC_OPT_T_TYPE, ENC_BIG_ENDIAN);
4775 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_unknown_len, tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_LEN, L_LBMR_RCTXINFO_REC_OPT_T_LEN, ENC_BIG_ENDIAN);
4776 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_unknown_flags, tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_FLAGS, L_LBMR_RCTXINFO_REC_OPT_T_FLAGS, ENC_BIG_ENDIAN);
4777 data_len = ((int) len) - L_LBMR_RCTXINFO_REC_OPT_T;
4778 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_unknown_data, tvb, offset + L_LBMR_RCTXINFO_REC_OPT_T, data_len, ENC_NA);
4779 expert_add_info_format(pinfo, subtree_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR RCTXINFO option 0x%02x", opt_type);
4780 return ((int) len);
4783 /*----------------------------------------------------------------------------*/
4784 /* LBMR Remote ContextInfo dissection functions. */
4785 /*----------------------------------------------------------------------------*/
4786 static int dissect_lbmr_rctxinfo_rec(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4788 proto_tree * subtree = NULL;
4789 proto_item * subtree_item = NULL;
4790 uint8_t opt_type = 0;
4791 static int * const flags[] =
4793 &hf_lbmr_rctxinfo_rec_flags_query,
4794 NULL
4796 uint16_t len = 0;
4797 int rec_len_remaining = 0;
4798 int ofs = 0;
4799 int opt_len_dissected = 0;
4800 int len_dissected = 0;
4802 len = tvb_get_ntohs(tvb, offset + O_LBMR_RCTXINFO_REC_T_LEN);
4803 subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec, tvb, offset, -1, ENC_NA);
4804 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec);
4805 proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_len, tvb, offset + O_LBMR_RCTXINFO_REC_T_LEN, L_LBMR_RCTXINFO_REC_T_LEN, ENC_BIG_ENDIAN);
4806 proto_tree_add_bitmask(subtree, tvb, offset + O_LBMR_RCTXINFO_REC_T_FLAGS, hf_lbmr_rctxinfo_rec_flags, ett_lbmr_rctxinfo_rec_flags, flags, ENC_BIG_ENDIAN);
4807 ofs = offset + L_LBMR_RCTXINFO_REC_T;
4808 rec_len_remaining = len - L_LBMR_RCTXINFO_REC_T;
4809 len_dissected = L_LBMR_RCTXINFO_REC_T;
4810 while (rec_len_remaining > 0)
4812 opt_type = tvb_get_uint8(tvb, ofs + O_LBMR_RCTXINFO_REC_OPT_T_TYPE);
4813 switch (opt_type)
4815 case LBMR_RCTXINFO_OPT_ADDRESS_TYPE:
4816 opt_len_dissected = dissect_lbmr_rctxinfo_rec_address_opt(tvb, ofs, pinfo, subtree);
4817 break;
4818 case LBMR_RCTXINFO_OPT_INSTANCE_TYPE:
4819 opt_len_dissected = dissect_lbmr_rctxinfo_rec_instance_opt(tvb, ofs, pinfo, subtree);
4820 break;
4821 case LBMR_RCTXINFO_OPT_ODOMAIN_TYPE:
4822 opt_len_dissected = dissect_lbmr_rctxinfo_rec_odomain_opt(tvb, ofs, pinfo, subtree);
4823 break;
4824 case LBMR_RCTXINFO_OPT_NAME_TYPE:
4825 opt_len_dissected = dissect_lbmr_rctxinfo_rec_name_opt(tvb, ofs, pinfo, subtree);
4826 break;
4827 default:
4828 opt_len_dissected = dissect_lbmr_rctxinfo_rec_unknown_opt(tvb, ofs, pinfo, subtree);
4829 break;
4831 len_dissected += opt_len_dissected;
4832 rec_len_remaining -= opt_len_dissected;
4833 ofs += opt_len_dissected;
4835 proto_item_set_len(subtree_item, len_dissected);
4836 return (len_dissected);
4839 static int dissect_lbmr_rctxinfo(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4841 uint16_t num_recs = 0;
4842 int ofs = 0;
4843 int len_dissected = 0;
4844 int rec_len_dissected = 0;
4846 num_recs = tvb_get_ntohs(tvb, offset + O_LBMR_RCTXINFO_T_NUM_RECS);
4847 proto_tree_add_item(tree, hf_lbmr_rctxinfo_len, tvb, offset + O_LBMR_RCTXINFO_T_LEN, L_LBMR_RCTXINFO_T_LEN, ENC_BIG_ENDIAN);
4848 proto_tree_add_item(tree, hf_lbmr_rctxinfo_num_recs, tvb, offset + O_LBMR_RCTXINFO_T_NUM_RECS, L_LBMR_RCTXINFO_T_NUM_RECS, ENC_BIG_ENDIAN);
4849 proto_tree_add_item(tree, hf_lbmr_rctxinfo_reserved, tvb, offset + O_LBMR_RCTXINFO_T_RESERVED, L_LBMR_RCTXINFO_T_RESERVED, ENC_BIG_ENDIAN);
4850 len_dissected = L_LBMR_RCTXINFO_T;
4851 ofs = offset + L_LBMR_RCTXINFO_T;
4852 while (num_recs > 0)
4854 rec_len_dissected = dissect_lbmr_rctxinfo_rec(tvb, ofs, pinfo, tree);
4855 ofs += rec_len_dissected;
4856 len_dissected += rec_len_dissected;
4857 num_recs--;
4859 return (len_dissected);
4862 static proto_item * format_ver_type(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4864 proto_item * type_item = NULL;
4866 proto_tree_add_item(tree, hf_lbmr_hdr_ver, tvb, offset + O_LBMR_HDR_T_VER_TYPE, L_LBMR_HDR_T_VER_TYPE, ENC_BIG_ENDIAN);
4867 proto_tree_add_item(tree, hf_lbmr_hdr_opt, tvb, offset + O_LBMR_HDR_T_VER_TYPE, L_LBMR_HDR_T_VER_TYPE, ENC_BIG_ENDIAN);
4868 type_item = proto_tree_add_item(tree, hf_lbmr_hdr_type, tvb, offset + O_LBMR_HDR_T_VER_TYPE, L_LBMR_HDR_T_VER_TYPE, ENC_BIG_ENDIAN);
4869 return (type_item);
4872 /*----------------------------------------------------------------------------*/
4873 /* LBMR Option dissection functions. */
4874 /*----------------------------------------------------------------------------*/
4875 static int dissect_lbmr_opt_len(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4877 proto_tree * subtree = NULL;
4878 proto_item * subtree_item = NULL;
4879 int len = 0;
4881 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_len, tvb, offset, L_LBMR_LBMR_OPT_SRC_ID_T, ENC_NA);
4882 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_len);
4883 proto_tree_add_item(subtree, hf_lbmr_opt_len_type, tvb, offset + O_LBMR_LBMR_OPT_LEN_T_TYPE, L_LBMR_LBMR_OPT_LEN_T_TYPE, ENC_BIG_ENDIAN);
4884 proto_tree_add_item(subtree, hf_lbmr_opt_len_len, tvb, offset + O_LBMR_LBMR_OPT_LEN_T_LEN, L_LBMR_LBMR_OPT_LEN_T_LEN, ENC_BIG_ENDIAN);
4885 proto_tree_add_item(subtree, hf_lbmr_opt_len_total_len, tvb, offset + O_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN, L_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN, ENC_BIG_ENDIAN);
4886 len = L_LBMR_LBMR_OPT_LEN_T;
4887 return (len);
4890 static int dissect_lbmr_opt_src_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4892 proto_tree * subtree = NULL;
4893 proto_item * subtree_item = NULL;
4894 static int * const flags[] =
4896 &hf_lbmr_opt_src_id_flags_ignore,
4897 NULL
4900 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_src_id, tvb, offset, L_LBMR_LBMR_OPT_SRC_ID_T, ENC_NA);
4901 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_src_id);
4902 proto_tree_add_item(subtree, hf_lbmr_opt_src_id_type, tvb, offset + O_LBMR_LBMR_OPT_SRC_ID_T_TYPE, L_LBMR_LBMR_OPT_SRC_ID_T_TYPE, ENC_BIG_ENDIAN);
4903 proto_tree_add_item(subtree, hf_lbmr_opt_src_id_len, tvb, offset + O_LBMR_LBMR_OPT_SRC_ID_T_LEN, L_LBMR_LBMR_OPT_SRC_ID_T_LEN, ENC_BIG_ENDIAN);
4904 proto_tree_add_bitmask(subtree, tvb, offset + O_LBMR_LBMR_OPT_SRC_ID_T_FLAGS, hf_lbmr_opt_src_id_flags, ett_lbmr_opt_src_id_flags, flags, ENC_BIG_ENDIAN);
4905 proto_tree_add_item(subtree, hf_lbmr_opt_src_id_src_id, tvb, offset + O_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID, L_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID, ENC_NA);
4906 return (L_LBMR_LBMR_OPT_SRC_ID_T);
4909 static int dissect_lbmr_opt_src_type(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4911 proto_tree * subtree = NULL;
4912 proto_item * subtree_item = NULL;
4913 static int * const flags[] =
4915 &hf_lbmr_opt_src_type_flags_ignore,
4916 NULL
4919 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_src_type, tvb, offset, L_LBMR_LBMR_OPT_SRC_TYPE_T, ENC_NA);
4920 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_src_type);
4921 proto_tree_add_item(subtree, hf_lbmr_opt_src_type_type, tvb, offset + O_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE, L_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE, ENC_BIG_ENDIAN);
4922 proto_tree_add_item(subtree, hf_lbmr_opt_src_type_len, tvb, offset + O_LBMR_LBMR_OPT_SRC_TYPE_T_LEN, L_LBMR_LBMR_OPT_SRC_TYPE_T_LEN, ENC_BIG_ENDIAN);
4923 proto_tree_add_bitmask(subtree, tvb, offset + O_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS, hf_lbmr_opt_src_type_flags, ett_lbmr_opt_src_type_flags, flags, ENC_BIG_ENDIAN);
4924 proto_tree_add_item(subtree, hf_lbmr_opt_src_type_src_type, tvb, offset + O_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE, L_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE, ENC_BIG_ENDIAN);
4925 return (L_LBMR_LBMR_OPT_SRC_TYPE_T);
4928 static int dissect_lbmr_opt_version(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4930 proto_tree * subtree = NULL;
4931 proto_item * subtree_item = NULL;
4932 static int * const flags[] =
4934 &hf_lbmr_opt_version_flags_ignore,
4935 &hf_lbmr_opt_version_flags_ume,
4936 &hf_lbmr_opt_version_flags_umq,
4937 NULL
4940 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_version, tvb, offset, L_LBMR_LBMR_OPT_VERSION_T, ENC_NA);
4941 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_version);
4942 proto_tree_add_item(subtree, hf_lbmr_opt_version_type, tvb, offset + O_LBMR_LBMR_OPT_VERSION_T_TYPE, L_LBMR_LBMR_OPT_VERSION_T_TYPE, ENC_BIG_ENDIAN);
4943 proto_tree_add_item(subtree, hf_lbmr_opt_version_len, tvb, offset + O_LBMR_LBMR_OPT_VERSION_T_LEN, L_LBMR_LBMR_OPT_VERSION_T_LEN, ENC_BIG_ENDIAN);
4944 proto_tree_add_bitmask(subtree, tvb, offset + O_LBMR_LBMR_OPT_VERSION_T_FLAGS, hf_lbmr_opt_version_flags, ett_lbmr_opt_version_flags, flags, ENC_BIG_ENDIAN);
4945 proto_tree_add_item(subtree, hf_lbmr_opt_version_version, tvb, offset + O_LBMR_LBMR_OPT_VERSION_T_VERSION, L_LBMR_LBMR_OPT_VERSION_T_VERSION, ENC_BIG_ENDIAN);
4946 return (L_LBMR_LBMR_OPT_VERSION_T);
4949 static int dissect_lbmr_opt_local_domain(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4951 proto_tree * subtree = NULL;
4952 proto_item * subtree_item = NULL;
4953 static int * const flags[] =
4955 &hf_lbmr_opt_local_domain_flags_ignore,
4956 &hf_lbmr_opt_local_domain_flags_viral,
4957 NULL
4960 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_local_domain, tvb, offset, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T, ENC_NA);
4961 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_local_domain);
4962 proto_tree_add_item(subtree, hf_lbmr_opt_local_domain_type, tvb, offset + O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE, ENC_BIG_ENDIAN);
4963 proto_tree_add_item(subtree, hf_lbmr_opt_local_domain_len, tvb, offset + O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN, ENC_BIG_ENDIAN);
4964 proto_tree_add_bitmask(subtree, tvb, offset + O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS, hf_lbmr_opt_local_domain_flags, ett_lbmr_opt_local_domain_flags, flags, ENC_BIG_ENDIAN);
4965 proto_tree_add_item(subtree, hf_lbmr_opt_local_domain_local_domain_id, tvb, offset + O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID, ENC_BIG_ENDIAN);
4966 return (L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T);
4969 static int dissect_lbmr_opt_unknown(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4971 proto_tree * subtree = NULL;
4972 proto_item * subtree_item = NULL;
4973 uint8_t len = 0;
4974 proto_item * type_item = NULL;
4975 uint8_t opt_type = 0;
4977 subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_unknown, tvb, offset, -1, ENC_NA);
4978 subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_unknown);
4979 opt_type = tvb_get_uint8(tvb, offset + O_LBMR_LBMR_OPT_HDR_T_TYPE);
4980 type_item = proto_tree_add_item(subtree, hf_lbmr_opt_unknown_type, tvb, offset + O_LBMR_LBMR_OPT_HDR_T_TYPE, L_LBMR_LBMR_OPT_HDR_T_TYPE, ENC_BIG_ENDIAN);
4981 len = tvb_get_uint8(tvb, offset + O_LBMR_LBMR_OPT_HDR_T_LEN);
4982 proto_tree_add_item(subtree, hf_lbmr_opt_unknown_len, tvb, offset + O_LBMR_LBMR_OPT_HDR_T_LEN, L_LBMR_LBMR_OPT_HDR_T_LEN, ENC_BIG_ENDIAN);
4983 proto_tree_add_item(subtree, hf_lbmr_opt_unknown_flags, tvb, offset + O_LBMR_LBMR_OPT_HDR_T_FLAGS, L_LBMR_LBMR_OPT_HDR_T_FLAGS, ENC_NA);
4984 proto_tree_add_item(subtree, hf_lbmr_opt_unknown_data, tvb, offset + L_LBMR_LBMR_OPT_HDR_T, (int) len - L_LBMR_LBMR_OPT_HDR_T, ENC_NA);
4985 proto_item_set_len(subtree_item, (int) len);
4986 expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR option type 0x%02x", opt_type);
4987 return ((int) len);
4990 static int dissect_lbmr_options(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4992 proto_tree * opt_tree = NULL;
4993 proto_item * ti = NULL;
4994 int curr_offset = offset;
4995 int len = 0;
4997 ti = proto_tree_add_item(tree, hf_lbmr_opts, tvb, curr_offset, -1, ENC_NA);
4998 opt_tree = proto_item_add_subtree(ti, ett_lbmr_opts);
4999 while (tvb_reported_length_remaining(tvb, curr_offset) > 0)
5001 int opt_len;
5002 uint8_t opt_type;
5004 opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_LBMR_OPT_HDR_T_TYPE);
5005 switch (opt_type)
5007 case LBMR_LBMR_OPT_LEN_TYPE:
5008 opt_len = dissect_lbmr_opt_len(tvb, curr_offset, pinfo, opt_tree);
5009 break;
5010 case LBMR_LBMR_OPT_SRC_ID_TYPE:
5011 opt_len = dissect_lbmr_opt_src_id(tvb, curr_offset, pinfo, opt_tree);
5012 break;
5013 case LBMR_LBMR_OPT_SRC_TYPE_TYPE:
5014 opt_len = dissect_lbmr_opt_src_type(tvb, curr_offset, pinfo, opt_tree);
5015 break;
5016 case LBMR_LBMR_OPT_VERSION_TYPE:
5017 opt_len = dissect_lbmr_opt_version(tvb, curr_offset, pinfo, opt_tree);
5018 break;
5019 case LBMR_LBMR_OPT_LOCAL_DOMAIN_TYPE:
5020 opt_len = dissect_lbmr_opt_local_domain(tvb, curr_offset, pinfo, opt_tree);
5021 break;
5022 default:
5023 opt_len = dissect_lbmr_opt_unknown(tvb, curr_offset, pinfo, opt_tree);
5024 break;
5026 len += opt_len;
5027 curr_offset += opt_len;
5029 return (len);
5032 static void lbmr_tap_queue_packet(packet_info * pinfo, const lbmr_contents_t * contents)
5034 const lbmr_topic_contents_t * topic;
5035 const lbmr_queue_contents_t * queue;
5037 switch (contents->type)
5039 case LBMR_CONTENTS_TOPIC:
5040 topic = &(contents->contents.topic);
5041 if (topic->tqr_count > 0)
5043 tqr_node_t * tqr = topic->tqr;
5044 while (tqr != NULL)
5046 lbm_lbmr_topic_query_tap_info_t * tqr_tap = wmem_new0(wmem_packet_scope(), lbm_lbmr_topic_query_tap_info_t);
5047 tqr_tap->size = (uint16_t) sizeof(lbm_lbmr_topic_query_tap_info_t);
5048 tqr_tap->topic_length = (uint8_t)strlen(tqr->topic);
5049 memcpy(tqr_tap->topic, tqr->topic, tqr_tap->topic_length);
5050 tap_queue_packet(lbmr_topic_query_tap_handle, pinfo, (void *) tqr_tap);
5051 tqr = tqr->next;
5054 if (topic->tir_count > 0)
5056 tir_node_t * tir = topic->tir;
5057 while (tir != NULL)
5059 lbm_lbmr_topic_advertisement_tap_info_t * tir_tap = wmem_new0(wmem_packet_scope(), lbm_lbmr_topic_advertisement_tap_info_t);
5060 tir_tap->size = (uint16_t) sizeof(lbm_lbmr_topic_advertisement_tap_info_t);
5061 tir_tap->topic_length = (uint8_t)strlen(tir->topic);
5062 tir_tap->source_length = (uint8_t)strlen(tir->source_string);
5063 tir_tap->topic_index = tir->idx;
5064 memcpy(tir_tap->topic, tir->topic, tir_tap->topic_length);
5065 memcpy(tir_tap->source, tir->source_string, tir_tap->source_length);
5066 tap_queue_packet(lbmr_topic_advertisement_tap_handle, pinfo, (void *) tir_tap);
5067 tir = tir->next;
5070 if (topic->wctqr_count > 0)
5072 wctqr_node_t * wctqr = topic->wctqr;
5073 while (wctqr != NULL)
5075 lbm_lbmr_pattern_query_tap_info_t * wctqr_tap = wmem_new0(wmem_packet_scope(), lbm_lbmr_pattern_query_tap_info_t);
5076 wctqr_tap->size = (uint16_t) sizeof(lbm_lbmr_pattern_query_tap_info_t);
5077 wctqr_tap->type = wctqr->type;
5078 wctqr_tap->pattern_length = (uint8_t)strlen(wctqr->pattern);
5079 memcpy(wctqr_tap->pattern, wctqr->pattern, wctqr_tap->pattern_length);
5080 tap_queue_packet(lbmr_pattern_query_tap_handle, pinfo, (void *) wctqr_tap);
5081 wctqr = wctqr->next;
5084 break;
5085 case LBMR_CONTENTS_QUEUE:
5086 queue = &(contents->contents.queue);
5087 if (queue->qqr_count > 0)
5089 qqr_node_t * qqr = queue->qqr;
5090 while (qqr != NULL)
5092 lbm_lbmr_queue_query_tap_info_t * qqr_tap = wmem_new0(wmem_packet_scope(), lbm_lbmr_queue_query_tap_info_t);
5093 qqr_tap->size = (uint16_t) sizeof(lbm_lbmr_queue_query_tap_info_t);
5094 qqr_tap->queue_length = (uint8_t)strlen(qqr->queue);
5095 memcpy(qqr_tap->queue, qqr->queue, qqr_tap->queue_length);
5096 tap_queue_packet(lbmr_queue_advertisement_tap_handle, pinfo, (void *) qqr_tap);
5097 qqr = qqr->next;
5100 if (queue->qir_count > 0)
5102 qir_node_t * qir = queue->qir;
5103 while (qir != NULL)
5105 lbm_lbmr_queue_advertisement_tap_info_t * qir_tap = wmem_new0(wmem_packet_scope(), lbm_lbmr_queue_advertisement_tap_info_t);
5106 qir_tap->size = (uint16_t) sizeof(lbm_lbmr_queue_advertisement_tap_info_t);
5107 qir_tap->port = qir->port;
5108 qir_tap->queue_length = (uint8_t)strlen(qir->queue);
5109 qir_tap->topic_length = (uint8_t)strlen(qir->topic);
5110 memcpy(qir_tap->queue, qir->queue, qir_tap->queue_length);
5111 memcpy(qir_tap->topic, qir->topic, qir_tap->topic_length);
5112 tap_queue_packet(lbmr_queue_query_tap_handle, pinfo, (void *) qir_tap);
5113 qir = qir->next;
5116 break;
5117 default:
5118 break;
5122 /*----------------------------------------------------------------------------*/
5123 /* dissect_lbmr - The dissector for LBM Topic Resolution protocol. */
5124 /*----------------------------------------------------------------------------*/
5125 static int dissect_lbmr(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void * user_data _U_)
5127 proto_tree * lbmr_tree = NULL;
5128 proto_item * ti = NULL;
5129 int offset = 0;
5130 uint8_t ver_type;
5131 uint8_t ver;
5132 uint8_t type;
5133 lbmr_contents_t * contents = NULL;
5134 char * tag_name = NULL;
5135 int total_len_dissected = 0;
5136 int len_dissected = 0;
5137 tvbuff_t * packet_tvb = NULL;
5138 proto_item * lbmr_hdr_item = NULL;
5139 proto_tree * lbmr_hdr_tree = NULL;
5141 col_set_str(pinfo->cinfo, COL_PROTOCOL, "LBMR");
5142 if (lbmr_use_tag)
5144 tag_name = lbmr_tag_find(pinfo);
5146 col_clear(pinfo->cinfo, COL_INFO);
5147 if (tag_name != NULL)
5149 col_add_fstr(pinfo->cinfo, COL_INFO, "[Tag: %s]", tag_name);
5151 col_set_fence(pinfo->cinfo, COL_INFO);
5153 ver_type = tvb_get_uint8(tvb, O_LBMR_HDR_T_VER_TYPE);
5154 ver = LBMR_HDR_VER(ver_type);
5155 type = LBMR_HDR_TYPE(ver_type);
5156 offset = 0;
5157 total_len_dissected = 0;
5158 packet_tvb = tvb;
5160 if ((ver_type & LBMR_HDR_TYPE_OPTS_MASK) != 0)
5162 uint8_t opt_type;
5163 uint8_t opt_len;
5165 opt_type = tvb_get_uint8(tvb, -L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_TYPE);
5166 opt_len = tvb_get_uint8(tvb, -L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_LEN);
5167 if ((opt_type == LBMR_LBMR_OPT_LEN_TYPE) && (((int)opt_len) == L_LBMR_LBMR_OPT_LEN_T))
5169 int opt_total_len = 0;
5170 int packet_len;
5172 packet_len = tvb_reported_length_remaining(tvb, 0);
5173 opt_total_len = tvb_get_ntohis(tvb, -L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN);
5174 if (packet_len > opt_total_len)
5176 int tvb_len = packet_len - opt_total_len;
5178 packet_tvb = tvb_new_subset_length(tvb, 0, tvb_len);
5183 if (type == LBMR_HDR_TYPE_EXT)
5185 uint8_t ext_type = 0;
5186 const char * ext_string;
5187 proto_item * ext_type_item = NULL;
5189 ext_type = tvb_get_uint8(tvb, O_LBMR_HDR_EXT_TYPE_T_EXT_TYPE);
5190 ext_string = val_to_str(ext_type, lbmr_ext_packet_type, "Unknown(0x%02x)");
5191 col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "ExtType %s", ext_string);
5192 if (tag_name != NULL)
5194 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_EXT_TYPE_T_VER_TYPE, -1, "LBM Topic Resolution Protocol (Tag: %s): Version %u, Type 0x%x (%s), ExtType %s",
5195 tag_name, ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), ext_string);
5197 else
5199 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_EXT_TYPE_T_VER_TYPE, -1, "LBM Topic Resolution Protocol: Version %u, Type 0x%x (%s), ExtType %s",
5200 ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), ext_string);
5202 lbmr_tree = proto_item_add_subtree(ti, ett_lbmr);
5203 if (tag_name != NULL)
5205 proto_item * item = NULL;
5207 item = proto_tree_add_string(lbmr_tree, hf_lbmr_tag, tvb, 0, 0, tag_name);
5208 proto_item_set_generated(item);
5210 lbmr_hdr_item = proto_tree_add_item(lbmr_tree, hf_lbmr_hdr, tvb, 0, -1, ENC_NA);
5211 lbmr_hdr_tree = proto_item_add_subtree(lbmr_hdr_item, ett_lbmr_hdr);
5212 (void) format_ver_type(tvb, 0, pinfo, lbmr_hdr_tree);
5213 ext_type_item = proto_tree_add_item(lbmr_hdr_tree, hf_lbmr_hdr_ext_type, tvb, O_LBMR_HDR_EXT_TYPE_T_EXT_TYPE, L_LBMR_HDR_EXT_TYPE_T_EXT_TYPE, ENC_BIG_ENDIAN);
5215 /* ver_type and ext_type have already been processed. But their dissected length is included in the individual type dissections below. */
5216 switch (ext_type)
5218 case LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT:
5219 len_dissected = dissect_lbmr_pser(packet_tvb, offset, pinfo, lbmr_tree);
5220 break;
5221 case LBMR_HDR_EXT_TYPE_UMQ_QUEUE_MGMT:
5222 offset += L_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE + L_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE;
5223 total_len_dissected += L_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE + L_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE;
5224 len_dissected = lbmr_dissect_umq_qmgmt(packet_tvb, offset - 2, pinfo, lbmr_tree);
5225 break;
5226 case LBMR_HDR_EXT_TYPE_CONTEXT_INFO:
5227 len_dissected = dissect_lbmr_ctxinfo(packet_tvb, offset, pinfo, lbmr_tree);
5228 break;
5229 case LBMR_HDR_EXT_TYPE_TOPIC_RES_REQUEST:
5230 len_dissected = dissect_lbmr_topic_res_request(packet_tvb, offset, pinfo, lbmr_tree);
5231 break;
5232 case LBMR_HDR_EXT_TYPE_TNWG_MSG:
5233 len_dissected = dissect_lbmr_tnwg(packet_tvb, offset, pinfo, lbmr_tree);
5234 break;
5235 case LBMR_HDR_EXT_TYPE_REMOTE_DOMAIN_ROUTE:
5236 len_dissected = dissect_lbmr_remote_domain_route(packet_tvb, offset, pinfo, lbmr_tree);
5237 break;
5238 case LBMR_HDR_EXT_TYPE_REMOTE_CONTEXT_INFO:
5239 len_dissected = dissect_lbmr_rctxinfo(packet_tvb, offset, pinfo, lbmr_tree);
5240 break;
5241 default:
5242 len_dissected = L_LBMR_HDR_EXT_TYPE_T_VER_TYPE + L_LBMR_HDR_EXT_TYPE_T_EXT_TYPE;
5243 expert_add_info_format(pinfo, ext_type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR extended type 0x%02x", ext_type);
5244 break;
5246 offset += len_dissected;
5247 total_len_dissected += len_dissected;
5249 else
5251 uint8_t tqrs = 0;
5252 uint16_t tirs = 0;
5253 bool rd_keepalive = false;
5254 bool topic_mgmt = false;
5255 bool client_rd_keepalive = false;
5256 bool zero_tirs_tqrs = false;
5257 proto_item * type_item = NULL;
5259 tqrs = tvb_get_uint8(tvb, O_LBMR_HDR_T_TQRS);
5260 tirs = tvb_get_ntohs(tvb, O_LBMR_HDR_T_TIRS);
5261 if ((tqrs == 0) && (tirs == 0))
5263 zero_tirs_tqrs = true;
5265 if ((type == LBMR_HDR_TYPE_NORMAL) && zero_tirs_tqrs)
5267 rd_keepalive = true;
5269 else if (zero_tirs_tqrs && ((type == LBMR_HDR_TYPE_UCAST_RCV_ALIVE) || (type == LBMR_HDR_TYPE_UCAST_SRC_ALIVE)))
5271 client_rd_keepalive = true;
5273 else if (type == LBMR_HDR_TYPE_TOPIC_MGMT)
5275 topic_mgmt = true;
5277 switch (type)
5279 case LBMR_HDR_TYPE_QUEUE_RES:
5280 col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "QQRs %u QIRs %" PRIu16, tqrs, tirs);
5281 break;
5282 default:
5283 if (rd_keepalive)
5285 col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Unicast Resolver Keepalive");
5287 else if (client_rd_keepalive)
5289 if (type == LBMR_HDR_TYPE_UCAST_RCV_ALIVE)
5291 col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Receiver Alive");
5293 else
5295 col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Source Alive");
5298 else if (topic_mgmt)
5300 col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Topic Management");
5302 else
5304 col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "TQRs %u TIRs %" PRIu16, tqrs, tirs);
5306 break;
5309 switch (type)
5311 case LBMR_HDR_TYPE_QUEUE_RES:
5312 if (tag_name != NULL)
5314 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol (Tag: %s): Version %u, Type 0x%x (%s) QQRs %u, QIRs %" PRIu16,
5315 tag_name, ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5317 else
5319 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol: Version %u, Type 0x%x (%s) QQRs %u, QIRs %" PRIu16,
5320 ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5322 break;
5323 default:
5324 if (tag_name != NULL)
5326 if (rd_keepalive)
5328 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol (Tag: %s): Version %u, Type 0x%x (%s) Unicast Resolver Keepalive",
5329 tag_name, ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"));
5331 else if (topic_mgmt)
5333 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol (Tag: %s): Version %u, Type 0x%x (%s) Topic Management",
5334 tag_name, ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"));
5336 else
5338 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol (Tag: %s): Version %u, Type 0x%x (%s) TQRs %u, TIRs %" PRIu16,
5339 tag_name, ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5342 else
5344 if (rd_keepalive)
5346 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol: Version %u, Type 0x%x (%s) Unicast Resolver Keepalive",
5347 ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"));
5349 else if (topic_mgmt)
5351 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol: Version %u, Type 0x%x (%s) Topic Management",
5352 ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"));
5354 else
5356 ti = proto_tree_add_protocol_format(tree, proto_lbmr, tvb, O_LBMR_HDR_T_VER_TYPE, -1, "LBM Topic Resolution Protocol: Version %u, Type 0x%x (%s) TQRs %u, TIRs %" PRIu16,
5357 ver, type, val_to_str(type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5360 break;
5362 lbmr_tree = proto_item_add_subtree(ti, ett_lbmr);
5363 if (tag_name != NULL)
5365 proto_item * item;
5366 item = proto_tree_add_string(lbmr_tree, hf_lbmr_tag, tvb, 0, 0, tag_name);
5367 proto_item_set_generated(item);
5369 lbmr_hdr_item = proto_tree_add_item(lbmr_tree, hf_lbmr_hdr, tvb, 0, -1, ENC_NA);
5370 lbmr_hdr_tree = proto_item_add_subtree(lbmr_hdr_item, ett_lbmr_hdr);
5371 type_item = format_ver_type(tvb, 0, pinfo, lbmr_hdr_tree);
5372 switch (type)
5374 case LBMR_HDR_TYPE_QUEUE_RES:
5375 proto_tree_add_item(lbmr_hdr_tree, hf_lbmr_hdr_qqrs, tvb, O_LBMR_HDR_T_TQRS, L_LBMR_HDR_T_TQRS, ENC_BIG_ENDIAN);
5376 proto_tree_add_item(lbmr_hdr_tree, hf_lbmr_hdr_qirs, tvb, O_LBMR_HDR_T_TIRS, L_LBMR_HDR_T_TIRS, ENC_BIG_ENDIAN);
5377 break;
5378 default:
5379 proto_tree_add_item(lbmr_hdr_tree, hf_lbmr_hdr_tqrs, tvb, O_LBMR_HDR_T_TQRS, L_LBMR_HDR_T_TQRS, ENC_BIG_ENDIAN);
5380 proto_tree_add_item(lbmr_hdr_tree, hf_lbmr_hdr_tirs, tvb, O_LBMR_HDR_T_TIRS, L_LBMR_HDR_T_TIRS, ENC_BIG_ENDIAN);
5381 break;
5384 offset = L_LBMR_HDR_T;
5385 total_len_dissected = L_LBMR_HDR_T;
5386 contents = wmem_new0(wmem_packet_scope(), lbmr_contents_t);
5387 switch (type)
5389 case LBMR_HDR_TYPE_QUEUE_RES:
5390 contents->type = LBMR_CONTENTS_QUEUE;
5391 if (tqrs > 0)
5393 len_dissected = dissect_lbmr_qqrs(packet_tvb, offset, tqrs, pinfo, lbmr_tree, contents);
5394 total_len_dissected += len_dissected;
5395 offset += len_dissected;
5397 if (tirs > 0)
5399 len_dissected = dissect_lbmr_qirs(packet_tvb, offset, tirs, pinfo, lbmr_tree, contents);
5400 total_len_dissected += len_dissected;
5401 offset += len_dissected;
5403 lbmr_tap_queue_packet(pinfo, contents);
5404 break;
5405 case LBMR_HDR_TYPE_NORMAL:
5406 case LBMR_HDR_TYPE_WC_TQRS:
5407 if (!rd_keepalive)
5409 contents->type = LBMR_CONTENTS_TOPIC;
5410 if (tqrs > 0)
5412 bool wc_tqrs = false;
5414 if (type == LBMR_HDR_TYPE_WC_TQRS)
5416 wc_tqrs = true;
5418 len_dissected = dissect_lbmr_tqrs(packet_tvb, offset, tqrs, pinfo, lbmr_tree, wc_tqrs, contents);
5419 total_len_dissected += len_dissected;
5420 offset += len_dissected;
5422 if (tirs > 0)
5424 len_dissected = dissect_lbmr_tirs(packet_tvb, offset, tirs, pinfo, lbmr_tree, "TIRs", contents);
5425 total_len_dissected += len_dissected;
5426 offset += len_dissected;
5428 lbmr_tap_queue_packet(pinfo, contents);
5430 break;
5431 case LBMR_HDR_TYPE_TOPIC_MGMT:
5432 len_dissected = dissect_lbmr_tmb(packet_tvb, offset, pinfo, lbmr_tree);
5433 total_len_dissected += len_dissected;
5434 offset += len_dissected;
5435 break;
5436 case LBMR_HDR_TYPE_UCAST_RCV_ALIVE:
5437 case LBMR_HDR_TYPE_UCAST_SRC_ALIVE:
5438 break;
5439 default:
5440 expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR type 0x%02x", type);
5441 break;
5444 if ((tvb_reported_length_remaining(tvb, offset) > 0) && ((ver_type & LBMR_HDR_TYPE_OPTS_MASK) != 0))
5446 /* Process LBMR packet options. */
5447 len_dissected = dissect_lbmr_options(tvb, offset, pinfo, lbmr_tree);
5448 total_len_dissected += len_dissected;
5450 return (total_len_dissected);
5453 static bool test_lbmr_packet(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void * user_data _U_)
5455 lbmr_tag_entry_t entry;
5456 bool valid_packet = false;
5458 /* Must be a UDP packet. */
5459 if (pinfo->ptype != PT_UDP)
5461 return false;
5463 /* Destination address must be IPV4 and 4 bytes in length. */
5464 if ((pinfo->dst.type != AT_IPv4) || (pinfo->dst.len != 4))
5466 return false;
5469 if (lbmr_use_tag)
5471 if (lbmr_tag_find(pinfo) != NULL)
5473 valid_packet = true;
5476 else
5478 entry.name = NULL;
5479 entry.mc_outgoing_udp_port = lbmr_mc_outgoing_udp_port;
5480 entry.mc_incoming_udp_port = lbmr_mc_incoming_udp_port;
5481 entry.mc_incoming_address = NULL;
5482 entry.mc_incoming_address_val_h = lbmr_mc_incoming_address_host;
5483 entry.mc_outgoing_address = NULL;
5484 entry.mc_outgoing_address_val_h = lbmr_mc_outgoing_address_host;
5485 entry.uc_port_high = lbmr_uc_port_high;
5486 entry.uc_port_low = lbmr_uc_port_low;
5487 entry.uc_dest_port = lbmr_uc_dest_port;
5488 entry.uc_address = NULL;
5489 entry.uc_address_val_h = lbmr_uc_address_host;
5490 valid_packet = lbmr_match_packet(pinfo, &entry);
5492 if (valid_packet)
5494 dissect_lbmr(tvb, pinfo, tree, NULL);
5495 return true;
5497 return false;
5500 /* Register all the bits needed with the filtering engine */
5501 void proto_register_lbmr(void)
5503 static hf_register_info hf[] =
5505 { &hf_lbmr_tag,
5506 { "Tag", "lbmr.tag", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5507 { &hf_lbmr_hdr,
5508 { "Header", "lbmr.hdr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5509 { &hf_lbmr_hdr_ver,
5510 { "Version", "lbmr.hdr.ver", FT_UINT8, BASE_DEC, NULL, LBMR_HDR_VER_VER_MASK, NULL, HFILL } },
5511 { &hf_lbmr_hdr_opt,
5512 { "Options", "lbmr.hdr.opts", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), LBMR_HDR_TYPE_OPTS_MASK, "Set if LBMR options are present", HFILL } },
5513 { &hf_lbmr_hdr_type,
5514 { "Type", "lbmr.hdr.type", FT_UINT8, BASE_HEX, VALS(lbmr_packet_type), LBMR_HDR_VER_TYPE_MASK, NULL, HFILL } },
5515 { &hf_lbmr_hdr_tqrs,
5516 { "Topic Query Records", "lbmr.hdr.tqrs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5517 { &hf_lbmr_hdr_tirs,
5518 { "Topic Information Records", "lbmr.hdr.tirs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5519 { &hf_lbmr_hdr_qqrs,
5520 { "Queue Query Records", "lbmr.hdr.qqrs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5521 { &hf_lbmr_hdr_qirs,
5522 { "Queue Information Records", "lbmr.hdr.qirs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5523 { &hf_lbmr_hdr_ext_type,
5524 { "Extended Type", "lbmr.hdr.ext_type", FT_UINT8, BASE_HEX, VALS(lbmr_ext_packet_type), 0x0, NULL, HFILL } },
5525 { &hf_lbmr_tqrs,
5526 { "TQRs", "lbmr.tqrs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5527 { &hf_lbmr_tqr,
5528 { "TQR", "lbmr.tqr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5529 { &hf_lbmr_tqr_pattern_type,
5530 { "Pattern Type", "lbmr.tqr.pattern_type", FT_UINT8, BASE_DEC, VALS(lbm_wildcard_pattern_type), 0x0, NULL, HFILL } },
5531 { &hf_lbmr_tqr_pattern,
5532 { "Pattern", "lbmr.tqr.pattern", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5533 { &hf_lbmr_tqr_name,
5534 { "Topic Name", "lbmr.tqr.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5535 { &hf_lbmr_tirs,
5536 { "TIRs", "lbmr.tirs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5537 { &hf_lbmr_tir,
5538 { "TIR", "lbmr.tir", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5539 { &hf_lbmr_tir_name,
5540 { "Topic Name", "lbmr.tir.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5541 { &hf_lbmr_tir_transport_opts,
5542 { "Transport Options Present", "lbmr.tir.transport_opts", FT_BOOLEAN, L_LBMR_TIR_T_TRANSPORT * 8, TFS(&tfs_set_notset), LBMR_TIR_OPTIONS, "Set if transport options are present", HFILL } },
5543 { &hf_lbmr_tir_transport_type,
5544 { "Transport Type", "lbmr.tir.transport_type", FT_UINT8, BASE_HEX, VALS(lbmr_transport_type), LBMR_TIR_TRANSPORT, NULL, HFILL } },
5545 { &hf_lbmr_tir_tlen,
5546 { "Transport Info Length", "lbmr.tir.tlen", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5547 { &hf_lbmr_tir_ttl,
5548 { "TTL", "lbmr.tir.ttl", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5549 { &hf_lbmr_tir_index,
5550 { "Index", "lbmr.tir.index", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5551 { &hf_lbmr_tir_tcp,
5552 { "TCP Transport", "lbmr.tir.tcp", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5553 { &hf_lbmr_tir_tcp_ip,
5554 { "Source IP", "lbmr.tir.tcp.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5555 { &hf_lbmr_tir_tcp_session_id,
5556 { "Session ID", "lbmr.tir.tcp.session_id", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5557 { &hf_lbmr_tir_tcp_port,
5558 { "Source Port", "lbmr.tir.tcp.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5559 { &hf_lbmr_tir_lbtrm,
5560 { "LBTRM Transport", "lbmr.tir.lbtrm", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5561 { &hf_lbmr_tir_lbtrm_src_addr,
5562 { "Source IP", "lbmr.tir.lbtrm.srcip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5563 { &hf_lbmr_tir_lbtrm_mcast_addr,
5564 { "Multicast IP", "lbmr.tir.lbtrm.mcastip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5565 { &hf_lbmr_tir_lbtrm_session_id,
5566 { "Session ID", "lbmr.tir.lbtrm.sessid", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5567 { &hf_lbmr_tir_lbtrm_udp_dest_port,
5568 { "Destination Port", "lbmr.tir.lbtrm.dport", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5569 { &hf_lbmr_tir_lbtrm_src_ucast_port,
5570 { "Source Port", "lbmr.tir.lbtrm.sport", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5571 { &hf_lbmr_tir_lbtru,
5572 { "LBTRU Transport", "lbmr.tir.lbtru", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5573 { &hf_lbmr_tir_lbtru_ip,
5574 { "Source IP", "lbmr.tir.lbtru.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5575 { &hf_lbmr_tir_lbtru_port,
5576 { "Source Port", "lbmr.tir.lbtru.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5577 { &hf_lbmr_tir_lbtru_session_id,
5578 { "Session ID", "lbmr.tir.lbtru.session_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5579 { &hf_lbmr_tir_lbtipc,
5580 { "LBTIPC Transport", "lbmr.tir.lbtipc", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5581 { &hf_lbmr_tir_lbtipc_host_id,
5582 { "Host ID", "lbmr.tir.lbtipc.host_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5583 { &hf_lbmr_tir_lbtipc_session_id,
5584 { "Session ID", "lbmr.tir.lbtipc.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5585 { &hf_lbmr_tir_lbtipc_xport_id,
5586 { "Transport ID", "lbmr.tir.lbtipc.xport_id", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5587 { &hf_lbmr_tir_lbtrdma,
5588 { "LBTRDMA Transport", "lbmr.tir.lbtrdma", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5589 { &hf_lbmr_tir_lbtrdma_ip,
5590 { "Source IP", "lbmr.tir.lbtrdma.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5591 { &hf_lbmr_tir_lbtrdma_session_id,
5592 { "Session ID", "lbmr.tir.lbtrdma.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5593 { &hf_lbmr_tir_lbtrdma_port,
5594 { "Port", "lbmr.tir.lbtrdma.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5595 { &hf_lbmr_tir_lbtsmx,
5596 { "LBTSMX Transport", "lbmr.tir.lbtsmx", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5597 { &hf_lbmr_tir_lbtsmx_host_id,
5598 { "Host ID", "lbmr.tir.lbtsmx.host_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5599 { &hf_lbmr_tir_lbtsmx_session_id,
5600 { "Session ID", "lbmr.tir.lbtsmx.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5601 { &hf_lbmr_tir_lbtsmx_xport_id,
5602 { "Transport ID", "lbmr.tir.lbtsmx.xport_id", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5603 { &hf_lbmr_tir_channel,
5604 { "Channel", "lbmr.tir.channel", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5605 { &hf_lbmr_tir_unknown_transport,
5606 { "Unknown Transport", "lbmr.tir.unknown_transport", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5607 { &hf_lbmr_topts,
5608 { "Options", "lbmr.topts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5609 { &hf_lbmr_topt_len,
5610 { "Length Option", "lbmr.topt.len", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5611 { &hf_lbmr_topt_len_type,
5612 { "Type", "lbmr.topt.len.type", FT_UINT8, BASE_DEC, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5613 { &hf_lbmr_topt_len_len,
5614 { "Length", "lbmr.topt.len.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5615 { &hf_lbmr_topt_len_total_len,
5616 { "Total Length", "lbmr.topt.len.total_len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5617 { &hf_lbmr_topt_ume,
5618 { "UME Option", "lbmr.topt.ume", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5619 { &hf_lbmr_topt_ume_type,
5620 { "Type", "lbmr.topt.ume.type", FT_UINT8, BASE_DEC, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5621 { &hf_lbmr_topt_ume_len,
5622 { "Length", "lbmr.topt.ume.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5623 { &hf_lbmr_topt_ume_flags,
5624 { "Flags", "lbmr.topt.ume.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5625 { &hf_lbmr_topt_ume_flags_ignore,
5626 { "Ignore", "lbmr.topt.ume.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_UME_FLAG_IGNORE, NULL, HFILL } },
5627 { &hf_lbmr_topt_ume_flags_latejoin,
5628 { "Late Join", "lbmr.topt.ume.flags.latejoin", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UME_FLAG_LATEJOIN, "If set, the source provides late join", HFILL } },
5629 { &hf_lbmr_topt_ume_flags_store,
5630 { "Store", "lbmr.topt.ume.flags.store", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UME_FLAG_STORE, "If set, one or more stores are specified", HFILL } },
5631 { &hf_lbmr_topt_ume_flags_qccap,
5632 { "Q/C Capable", "lbmr.topt.ume.flags.qccap", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UME_FLAG_QCCAP, "If set, the source supports quorun/consensus", HFILL } },
5633 { &hf_lbmr_topt_ume_flags_acktosrc,
5634 { "Send ACKs to Source", "lbmr.topt.ume.flags.acktosrc", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UME_FLAG_ACKTOSRC, "If set, receivers send ACKs to the source", HFILL } },
5635 { &hf_lbmr_topt_ume_store_tcp_port,
5636 { "Store TCP Port", "lbmr.topt.ume.store_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5637 { &hf_lbmr_topt_ume_src_tcp_port,
5638 { "Source TCP Port", "lbmr.topt.ume.src_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5639 { &hf_lbmr_topt_ume_store_tcp_addr,
5640 { "Store TCP Address", "lbmr.topt.ume.store_tcp_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5641 { &hf_lbmr_topt_ume_src_tcp_addr,
5642 { "Source TCP Address", "lbmr.topt.ume.src_tcp_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5643 { &hf_lbmr_topt_ume_src_reg_id,
5644 { "Source Registration ID", "lbmr.topt.ume.src_reg_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5645 { &hf_lbmr_topt_ume_transport_idx,
5646 { "Transport Index", "lbmr.topt.ume.transport_idx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5647 { &hf_lbmr_topt_ume_high_seqnum,
5648 { "High Sequence Number", "lbmr.topt.ume.high_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5649 { &hf_lbmr_topt_ume_low_seqnum,
5650 { "Low Sequence Number", "lbmr.topt.ume.low_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5651 { &hf_lbmr_topt_ume_store,
5652 { "UME Store Option", "lbmr.topt.ume_store", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5653 { &hf_lbmr_topt_ume_store_type,
5654 { "Type", "lbmr.topt.ume_store.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5655 { &hf_lbmr_topt_ume_store_len,
5656 { "Length", "lbmr.topt.ume_store.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5657 { &hf_lbmr_topt_ume_store_flags,
5658 { "Flags", "lbmr.topt.ume_store.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5659 { &hf_lbmr_topt_ume_store_flags_ignore,
5660 { "Ignore", "lbmr.topt.ume_store.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_UME_STORE_FLAG_IGNORE, NULL, HFILL } },
5661 { &hf_lbmr_topt_ume_store_grp_idx,
5662 { "Group Index", "lbmr.topt.ume_store.grp_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5663 { &hf_lbmr_topt_ume_store_store_tcp_port,
5664 { "Store TCP Port", "lbmr.topt.ume_store.store_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5665 { &hf_lbmr_topt_ume_store_store_idx,
5666 { "Store Index", "lbmr.topt.ume_store.store_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5667 { &hf_lbmr_topt_ume_store_store_ip_addr,
5668 { "Store IP Address", "lbmr.topt.ume_store.store_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5669 { &hf_lbmr_topt_ume_store_src_reg_id,
5670 { "Source Registration ID", "lbmr.topt.ume_store.src_reg_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5671 { &hf_lbmr_topt_ume_store_group,
5672 { "UME Store Group Option", "lbmr.topt.ume_store_group", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5673 { &hf_lbmr_topt_ume_store_group_type,
5674 { "Type", "lbmr.topt.ume_store_group.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5675 { &hf_lbmr_topt_ume_store_group_len,
5676 { "Length", "lbmr.topt.ume_store_group.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5677 { &hf_lbmr_topt_ume_store_group_flags,
5678 { "Flags", "lbmr.topt.ume_store_group.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5679 { &hf_lbmr_topt_ume_store_group_flags_ignore,
5680 { "Ignore", "lbmr.topt.ume_store_group.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_UME_STORE_GROUP_FLAG_IGNORE, NULL, HFILL } },
5681 { &hf_lbmr_topt_ume_store_group_grp_idx,
5682 { "Group Index", "lbmr.topt.ume_store_group.grp_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5683 { &hf_lbmr_topt_ume_store_group_grp_sz,
5684 { "Group Size", "lbmr.topt.ume_store_group.grp_sz", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5685 { &hf_lbmr_topt_ume_store_group_reserved,
5686 { "Reserved", "lbmr.topt.ume_store_group.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5687 { &hf_lbmr_topt_latejoin,
5688 { "Late Join Option", "lbmr.topt.latejoin", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5689 { &hf_lbmr_topt_latejoin_type,
5690 { "Type", "lbmr.topt.latejoin.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5691 { &hf_lbmr_topt_latejoin_len,
5692 { "Length", "lbmr.topt.latejoin.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5693 { &hf_lbmr_topt_latejoin_flags,
5694 { "Flags", "lbmr.topt.latejoin.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5695 { &hf_lbmr_topt_latejoin_flags_ignore,
5696 { "Ignore", "lbmr.topt.latejoin.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_LATEJOIN_FLAG_IGNORE, NULL, HFILL } },
5697 { &hf_lbmr_topt_latejoin_flags_acktosrc,
5698 { "Send ACKs to Source", "lbmr.topt.latejoin.flags.acktosrc", FT_BOOLEAN, L_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_LATEJOIN_FLAG_ACKTOSRC, "If set, ACKs are sent to source", HFILL } },
5699 { &hf_lbmr_topt_latejoin_src_tcp_port,
5700 { "Source TCP Port", "lbmr.topt.latejoin.src_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5701 { &hf_lbmr_topt_latejoin_reserved,
5702 { "Reserved", "lbmr.topt.latejoin.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5703 { &hf_lbmr_topt_latejoin_src_ip_addr,
5704 { "Source IP Address", "lbmr.topt.latejoin.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5705 { &hf_lbmr_topt_latejoin_transport_idx,
5706 { "Transport Index", "lbmr.topt.latejoin.transport_idx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5707 { &hf_lbmr_topt_latejoin_high_seqnum,
5708 { "High Sequence Number", "lbmr.topt.latejoin.high_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5709 { &hf_lbmr_topt_latejoin_low_seqnum,
5710 { "Low Sequence Number", "lbmr.topt.latejoin.low_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5711 { &hf_lbmr_topt_umq_rcridx,
5712 { "Receiver Control Record Index Option", "lbmr.topt.umq_rcridx", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5713 { &hf_lbmr_topt_umq_rcridx_type,
5714 { "Type", "lbmr.topt.umq_rcridx.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5715 { &hf_lbmr_topt_umq_rcridx_len,
5716 { "Length", "lbmr.topt.umq_rcridx.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5717 { &hf_lbmr_topt_umq_rcridx_flags,
5718 { "Flags", "lbmr.topt.umq_rcridx.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5719 { &hf_lbmr_topt_umq_rcridx_flags_ignore,
5720 { "Ignore", "lbmr.topt.umq_rcridx.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_UMQ_RCRIDX_FLAG_IGNORE, NULL, HFILL } },
5721 { &hf_lbmr_topt_umq_rcridx_rcr_idx,
5722 { "Receiver Control Record Index", "lbmr.topt.umq_rcridx.rcr_idx", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5723 { &hf_lbmr_topt_umq_qinfo,
5724 { "Queue Info Option", "lbmr.topt.umq_qinfo", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5725 { &hf_lbmr_topt_umq_qinfo_type,
5726 { "Type", "lbmr.topt.umq_qinfo.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5727 { &hf_lbmr_topt_umq_qinfo_len,
5728 { "Length", "lbmr.topt.umq_qinfo.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5729 { &hf_lbmr_topt_umq_qinfo_flags,
5730 { "Flags", "lbmr.topt.umq_qinfo.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5731 { &hf_lbmr_topt_umq_qinfo_flags_ignore,
5732 { "Ignore", "lbmr.topt.umq_qinfo.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_UMQ_FLAG_IGNORE, NULL, HFILL } },
5733 { &hf_lbmr_topt_umq_qinfo_flags_queue,
5734 { "Queue", "lbmr.topt.umq_qinfo.flags.queue", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UMQ_FLAG_QUEUE, NULL, HFILL } },
5735 { &hf_lbmr_topt_umq_qinfo_flags_rcvlisten,
5736 { "Receiver Listen", "lbmr.topt.umq_qinfo.flags.rcvlisten", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UMQ_FLAG_RCVLISTEN, NULL, HFILL } },
5737 { &hf_lbmr_topt_umq_qinfo_flags_control,
5738 { "Control", "lbmr.topt.umq_qinfo.flags.control", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UMQ_FLAG_CONTROL, NULL, HFILL } },
5739 { &hf_lbmr_topt_umq_qinfo_flags_srcrcvlisten,
5740 { "Source Receiver Listen", "lbmr.topt.umq_qinfo.flags.srcrcvlisten", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UMQ_FLAG_SRCRCVLISTEN, NULL, HFILL } },
5741 { &hf_lbmr_topt_umq_qinfo_flags_participants_only,
5742 { "Participants Only", "lbmr.topt.umq_qinfo.flags.participants_only", FT_BOOLEAN, L_LBMR_TOPIC_OPT_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TOPIC_OPT_UMQ_FLAG_PARTICIPANTS_ONLY, NULL, HFILL } },
5743 { &hf_lbmr_topt_umq_qinfo_queue,
5744 { "Queue", "lbmr.topt.ume_qinfo.queue", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5745 { &hf_lbmr_topt_cost,
5746 { "Cost Option", "lbmr.topt.cost", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5747 { &hf_lbmr_topt_cost_type,
5748 { "Type", "lbmr.topt.cost.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5749 { &hf_lbmr_topt_cost_len,
5750 { "Length", "lbmr.topt.cost.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5751 { &hf_lbmr_topt_cost_flags,
5752 { "Flags", "lbmr.topt.cost.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5753 { &hf_lbmr_topt_cost_flags_ignore,
5754 { "Ignore", "lbmr.topt.cost.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_COST_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_COST_FLAG_IGNORE, NULL, HFILL } },
5755 { &hf_lbmr_topt_cost_hop_count,
5756 { "Hop count", "lbmr.topt.cost.hop_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5757 { &hf_lbmr_topt_cost_cost,
5758 { "Cost", "lbmr.topt.cost.cost", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5759 { &hf_lbmr_topt_otid,
5760 { "Originating Transport ID Option", "lbmr.topt.otid", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5761 { &hf_lbmr_topt_otid_type,
5762 { "Type", "lbmr.topt.otid.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5763 { &hf_lbmr_topt_otid_len,
5764 { "Length", "lbmr.topt.otid.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5765 { &hf_lbmr_topt_otid_flags,
5766 { "Flags", "lbmr.topt.otid.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5767 { &hf_lbmr_topt_otid_flags_ignore,
5768 { "Ignore", "lbmr.topt.otid.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_OTID_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_OTID_FLAG_IGNORE, NULL, HFILL } },
5769 { &hf_lbmr_topt_otid_originating_transport,
5770 { "Originating Transport ID", "lbmr.topt.otid.originating_transport", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5771 { &hf_lbmr_topt_ctxinst,
5772 { "Context Instance Option", "lbmr.topt.ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5773 { &hf_lbmr_topt_ctxinst_type,
5774 { "Type", "lbmr.topt.ctxinst.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5775 { &hf_lbmr_topt_ctxinst_len,
5776 { "Length", "lbmr.topt.ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5777 { &hf_lbmr_topt_ctxinst_flags,
5778 { "Flags", "lbmr.topt.ctxinst.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5779 { &hf_lbmr_topt_ctxinst_flags_ignore,
5780 { "Ignore", "lbmr.topt.ctxinst.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_CTXINST_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_CTXINST_FLAG_IGNORE, NULL, HFILL } },
5781 { &hf_lbmr_topt_ctxinst_res,
5782 { "Reserved", "lbmr.topt.ctxinst.res", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5783 { &hf_lbmr_topt_ctxinst_ctxinst,
5784 { "Context Instance", "lbmr.topt.ctxinst.ctxinst", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5785 { &hf_lbmr_topt_ctxinsts,
5786 { "Store Context Instance Option", "lbmr.topt.ctxinsts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5787 { &hf_lbmr_topt_ctxinsts_type,
5788 { "Type", "lbmr.topt.ctxinsts.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5789 { &hf_lbmr_topt_ctxinsts_len,
5790 { "Length", "lbmr.topt.ctxinsts.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5791 { &hf_lbmr_topt_ctxinsts_flags,
5792 { "Flags", "lbmr.topt.ctxinsts.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5793 { &hf_lbmr_topt_ctxinsts_flags_ignore,
5794 { "Ignore", "lbmr.topt.ctxinsts.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_CTXINSTS_FLAG_IGNORE, NULL, HFILL } },
5795 { &hf_lbmr_topt_ctxinsts_idx,
5796 { "Index", "lbmr.topt.ctxinsts.idx", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5797 { &hf_lbmr_topt_ctxinsts_ctxinst,
5798 { "Store Context Instance", "lbmr.topt.ctxinsts.ctxinsts", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5799 { &hf_lbmr_topt_ulb,
5800 { "ULB Option", "lbmr.topt.ulb", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5801 { &hf_lbmr_topt_ulb_type,
5802 { "Type", "lbmr.topt.ulb.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5803 { &hf_lbmr_topt_ulb_len,
5804 { "Length", "lbmr.topt.ulb.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5805 { &hf_lbmr_topt_ulb_flags,
5806 { "Flags", "lbmr.topt.ulb.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5807 { &hf_lbmr_topt_ulb_flags_ignore,
5808 { "Ignore", "lbmr.topt.ulb.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_ULB_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_ULB_FLAG_IGNORE, NULL, HFILL } },
5809 { &hf_lbmr_topt_ulb_queue_id,
5810 { "Queue ID", "lbmr.topt.ulb.queue_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5811 { &hf_lbmr_topt_ulb_regid,
5812 { "Registration ID", "lbmr.topt.ulb.regid", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5813 { &hf_lbmr_topt_ulb_ulb_src_id,
5814 { "ULB Source ID", "lbmr.topt.ulb.ulb_src_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5815 { &hf_lbmr_topt_ulb_src_ip_addr,
5816 { "Source IP Address", "lbmr.topt.ulb.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5817 { &hf_lbmr_topt_ulb_src_tcp_port,
5818 { "Source TCP Port", "lbmr.topt.ulb.src_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5819 { &hf_lbmr_topt_ulb_reserved,
5820 { "Reserved", "lbmr.topt.ulb.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5821 { &hf_lbmr_topt_ctxinstq,
5822 { "Queue Context Instance Option", "lbmr.topt.ctxinstq", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5823 { &hf_lbmr_topt_ctxinstq_type,
5824 { "Type", "lbmr.topt.ctxinstq.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5825 { &hf_lbmr_topt_ctxinstq_len,
5826 { "Length", "lbmr.topt.ctxinstq.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5827 { &hf_lbmr_topt_ctxinstq_flags,
5828 { "Flags", "lbmr.topt.ctxinstq.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5829 { &hf_lbmr_topt_ctxinstq_flags_ignore,
5830 { "Ignore", "lbmr.topt.ctxinstq.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_CTXINSTQ_FLAG_IGNORE, NULL, HFILL } },
5831 { &hf_lbmr_topt_ctxinstq_idx,
5832 { "Index", "lbmr.topt.ctxinstq.idx", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5833 { &hf_lbmr_topt_ctxinstq_ctxinst,
5834 { "Store Context Instance", "lbmr.topt.ctxinstq.ctxinstq", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5835 { &hf_lbmr_topt_domain_id,
5836 { "Domain ID Option", "lbmr.topt.domain_id", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5837 { &hf_lbmr_topt_domain_id_type,
5838 { "Type", "lbmr.topt.domain_id.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5839 { &hf_lbmr_topt_domain_id_len,
5840 { "Length", "lbmr.topt.domain_id.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5841 { &hf_lbmr_topt_domain_id_flags,
5842 { "Flags", "lbmr.topt.domain_id.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5843 { &hf_lbmr_topt_domain_id_flags_ignore,
5844 { "Ignore", "lbmr.topt.domain_id.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_DOMAIN_ID_FLAG_IGNORE, NULL, HFILL } },
5845 { &hf_lbmr_topt_domain_id_domain_id,
5846 { "Domain ID", "lbmr.topt.domain_id.domain_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5847 { &hf_lbmr_topt_exfunc,
5848 { "Extended Functionality Option", "lbmr.topt.exfunc", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5849 { &hf_lbmr_topt_exfunc_type,
5850 { "Type", "lbmr.topt.exfunc.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5851 { &hf_lbmr_topt_exfunc_len,
5852 { "Length", "lbmr.topt.exfunc.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5853 { &hf_lbmr_topt_exfunc_flags,
5854 { "Flags", "lbmr.topt.exfunc.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5855 { &hf_lbmr_topt_exfunc_flags_ignore,
5856 { "Ignore", "lbmr.topt.exfunc.flags.ignore", FT_BOOLEAN, L_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TOPIC_OPT_EXFUNC_FLAG_IGNORE, NULL, HFILL } },
5857 { &hf_lbmr_topt_exfunc_src_tcp_port,
5858 { "Source TCP Port", "lbmr.topt.exfunc.src_tcp_port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5859 { &hf_lbmr_topt_exfunc_reserved,
5860 { "Reserved", "lbmr.topt.exfunc.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5861 { &hf_lbmr_topt_exfunc_src_ip_addr,
5862 { "Source IP Address", "lbmr.topt.exfunc.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5863 { &hf_lbmr_topt_exfunc_functionality_flags,
5864 { "Functionality Flags", "lbmr.topt.exfunc.functionality_flags", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5865 { &hf_lbmr_topt_exfunc_functionality_flags_ulb,
5866 { "ULB", "lbmr.topt.exfunc.functionality_flags.ulb", FT_BOOLEAN, L_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS * 8, TFS(&tfs_capable_not_capable), LBM_TOPIC_OPT_EXFUNC_FFLAG_ULB, "Set if ULB supported", HFILL } },
5867 { &hf_lbmr_topt_exfunc_functionality_flags_umq,
5868 { "UMQ", "lbmr.topt.exfunc.functionality_flags.umq", FT_BOOLEAN, L_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS * 8, TFS(&tfs_capable_not_capable), LBM_TOPIC_OPT_EXFUNC_FFLAG_UMQ, "Set if UMQ supported", HFILL } },
5869 { &hf_lbmr_topt_exfunc_functionality_flags_ume,
5870 { "UME", "lbmr.topt.exfunc.functionality_flags.ume", FT_BOOLEAN, L_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS * 8, TFS(&tfs_capable_not_capable), LBM_TOPIC_OPT_EXFUNC_FFLAG_UME, "Set if UME supported", HFILL } },
5871 { &hf_lbmr_topt_exfunc_functionality_flags_lj,
5872 { "Late Join", "lbmr.topt.exfunc.functionality_flags.lj", FT_BOOLEAN, L_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS * 8, TFS(&tfs_capable_not_capable), LBM_TOPIC_OPT_EXFUNC_FFLAG_LJ, "Set if late join supported", HFILL } },
5873 { &hf_lbmr_topt_unknown,
5874 { "Unknown Option", "lbmr.topt.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5875 { &hf_lbmr_topt_unknown_type,
5876 { "Type", "lbmr.topt.unknown.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5877 { &hf_lbmr_topt_unknown_len,
5878 { "Length", "lbmr.topt.unknown.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5879 { &hf_lbmr_topt_unknown_flags,
5880 { "Flags", "lbmr.topt.unknown.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5881 { &hf_lbmr_topt_unknown_data,
5882 { "Data", "lbmr.topt.unknown.data", FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } },
5883 { &hf_lbmr_tmb,
5884 { "Topic Management Block", "lbmr.tmb", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5885 { &hf_lbmr_tmb_len,
5886 { "Length", "lbmr.tmb.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5887 { &hf_lbmr_tmb_tmrs,
5888 { "Topic Management Record Count", "lbmr.tmb.tmrs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5889 { &hf_lbmr_tmb_tmr_list,
5890 { "Topic Management Records", "lbmr.tmb.tmr_list", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5891 { &hf_lbmr_tmr,
5892 { "Topic Management Record", "lbmr.tmb.tmr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5893 { &hf_lbmr_tmr_len,
5894 { "Length", "lbmr.tmb.tmr.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5895 { &hf_lbmr_tmr_type,
5896 { "TMR Type", "lbmr.tmb.tmr.type", FT_UINT8, BASE_DEC, VALS(lbmr_tmr_type), 0x0, NULL, HFILL } },
5897 { &hf_lbmr_tmr_flags,
5898 { "Flags", "lbmr.tmb.tmr.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5899 { &hf_lbmr_tmr_flags_response,
5900 { "Response", "lbmr.tmb.tmr.flags.response", FT_BOOLEAN, L_LBMR_TMR_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TMR_FLAG_RESPONSE, "Set if this is a response", HFILL } },
5901 { &hf_lbmr_tmr_flags_wildcard_pcre,
5902 { "PCRE pattern", "lbmr.tmb.tmr.flags.wildcard_pcre", FT_BOOLEAN, L_LBMR_TMR_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TMR_FLAG_WILDCARD_PCRE, "Set if topic is a PCRE pattern", HFILL } },
5903 { &hf_lbmr_tmr_flags_wildcard_regex,
5904 { "Regex pattern", "lbmr.tmb.tmr.flags.wildcard_regex", FT_BOOLEAN, L_LBMR_TMR_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TMR_FLAG_WILDCARD_REGEX, "Set if topic is a Regex pattern", HFILL } },
5905 { &hf_lbmr_tmr_name,
5906 { "Topic Name", "lbmr.tmb.tmr.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5907 { &hf_lbmr_pser_dep_type,
5908 { "Dependent Type", "lbmr.pser.dep_type", FT_UINT16, BASE_DEC_HEX, VALS(lbmr_pser_dependent_type), 0x0, NULL, HFILL } },
5909 { &hf_lbmr_pser_len,
5910 { "Length", "lbmr.pser.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5911 { &hf_lbmr_pser_flags,
5912 { "Flags", "lbmr.pser.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5913 { &hf_lbmr_pser_flags_option,
5914 { "Option", "lbmr.pser.flags.option", FT_BOOLEAN, L_LBMR_PSER_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_PSER_OPT_FLAG, NULL, HFILL } },
5915 { &hf_lbmr_pser_source_ip,
5916 { "Source IP", "lbmr.pser.source_ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5917 { &hf_lbmr_pser_store_ip,
5918 { "Store IP", "lbmr.pser.store_ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5919 { &hf_lbmr_pser_transport_idx,
5920 { "Transport Index", "lbmr.pser.transport_idx", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5921 { &hf_lbmr_pser_topic_idx,
5922 { "Topic Index", "lbmr.pser.topic_idx", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5923 { &hf_lbmr_pser_source_port,
5924 { "Source Port", "lbmr.pser.source_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5925 { &hf_lbmr_pser_store_port,
5926 { "Store Port", "lbmr.pser.store_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5927 { &hf_lbmr_pser_topic,
5928 { "Topic", "lbmr.pser.topic", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5929 { &hf_lbmr_pser_opts,
5930 { "Options", "lbmr.pser.opts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5931 { &hf_lbmr_pser_optlen,
5932 { "Option Length", "lbmr.pser.opt.optlen", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5933 { &hf_lbmr_pser_optlen_type,
5934 { "Type", "lbmr.pser.opt.optlen.type", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5935 { &hf_lbmr_pser_optlen_optlen,
5936 { "Options Length", "lbmr.pser.opt.optlen.optlen", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5937 { &hf_lbmr_pser_opt_ctxinst,
5938 { "Context Instance Option", "lbmr.pser.opt.ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5939 { &hf_lbmr_pser_opt_ctxinst_len,
5940 { "Length", "lbmr.pser.opt.ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5941 { &hf_lbmr_pser_opt_ctxinst_type,
5942 { "Type", "lbmr.pser.opt.ctxinst.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_pser_option_type), 0x0, NULL, HFILL } },
5943 { &hf_lbmr_pser_opt_ctxinst_ctxinst,
5944 { "Context Instance", "lbmr.pser.opt.ctxinst.ctxinst", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5945 { &hf_lbmr_qqr,
5946 { "QQRs", "lbmr.qqr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5947 { &hf_lbmr_qqr_name,
5948 { "Queue name", "lbmr.qqr.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5949 { &hf_lbmr_qirs,
5950 { "QIRs", "lbmr.qirs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5951 { &hf_lbmr_qir,
5952 { "QIR", "lbmr.qir", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5953 { &hf_lbmr_qir_queue_name,
5954 { "Queue name", "lbmr.qir.qname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5955 { &hf_lbmr_qir_topic_name,
5956 { "Topic name", "lbmr.qir.tname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5957 { &hf_lbmr_qir_queue_id,
5958 { "Queue ID", "lbmr.qir.queue_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5959 { &hf_lbmr_qir_queue_ver,
5960 { "Queue Version", "lbmr.qir.queue_ver", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5961 { &hf_lbmr_qir_queue_prev_ver,
5962 { "Queue Previous Version", "lbmr.qir.queue_prev_ver", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5963 { &hf_lbmr_qir_option_flag,
5964 { "QIR Options Present", "lbmr.qir.opts", FT_BOOLEAN, L_LBMR_QIR_T_GRP_BLKS * 8, TFS(&tfs_set_notset), LBMR_QIR_OPTIONS, NULL, HFILL } },
5965 { &hf_lbmr_qir_grp_blks,
5966 { "Group Block Count", "lbmr.qir.grp_blks", FT_UINT16, BASE_DEC_HEX, NULL, LBMR_QIR_GRP_BLOCKS_MASK, NULL, HFILL } },
5967 { &hf_lbmr_qir_queue_blks,
5968 { "Queue Blocks", "lbmr.qir.queue_blks", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5969 { &hf_lbmr_qir_grps,
5970 { "Groups", "lbmr.qir.grps", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5971 { &hf_lbmr_qir_grp_blk,
5972 { "Group Block", "lbmr.qir.grp", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5973 { &hf_lbmr_qir_grp_blk_grp_idx,
5974 { "Group Index", "lbmr.qir.grp.grp_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5975 { &hf_lbmr_qir_grp_blk_grp_sz,
5976 { "Group Size", "lbmr.qir.grp.grp_sz", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5977 { &hf_lbmr_qir_queues,
5978 { "Queues", "lbmr.qir.queues", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5979 { &hf_lbmr_qir_queue_blk,
5980 { "Queue Block", "lbmr.qir.queue", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5981 { &hf_lbmr_qir_queue_blk_ip,
5982 { "IP Address", "lbmr.qir.queue.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5983 { &hf_lbmr_qir_queue_blk_port,
5984 { "Port", "lbmr.qir.queue.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5985 { &hf_lbmr_qir_queue_blk_idx,
5986 { "Index", "lbmr.qir.queue.idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5987 { &hf_lbmr_qir_queue_blk_grp_idx,
5988 { "Group Index", "lbmr.qir.queue.grp_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5989 { &hf_lbmr_qir_queue_blk_reserved,
5990 { "Reserved", "lbmr.qir.queue.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5991 { &hf_lbmr_opts,
5992 { "Options", "lbmr.opt", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5993 { &hf_lbmr_opt_len,
5994 { "Length Option", "lbmr.opt.len", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5995 { &hf_lbmr_opt_len_type,
5996 { "Type", "lbmr.opt.len.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
5997 { &hf_lbmr_opt_len_len,
5998 { "Length", "lbmr.opt.len.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5999 { &hf_lbmr_opt_len_total_len,
6000 { "Total Length", "lbmr.opt.len.total_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6001 { &hf_lbmr_opt_src_id,
6002 { "Source ID Option", "lbmr.opt.src_id", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6003 { &hf_lbmr_opt_src_id_type,
6004 { "Type", "lbmr.opt.src_id.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6005 { &hf_lbmr_opt_src_id_len,
6006 { "Length", "lbmr.opt.src_id.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6007 { &hf_lbmr_opt_src_id_flags,
6008 { "Flags", "lbmr.opt.src_id.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6009 { &hf_lbmr_opt_src_id_flags_ignore,
6010 { "Ignore", "lbmr.opt.src_id.flags.ignore", FT_BOOLEAN, L_LBMR_LBMR_OPT_SRC_ID_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_LBMR_OPT_SRC_ID_FLAG_IGNORE, NULL, HFILL } },
6011 { &hf_lbmr_opt_src_id_src_id,
6012 { "Source ID", "lbmr.opt.src_id.src_id", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6013 { &hf_lbmr_opt_src_type,
6014 { "Source Type Option", "lbmr.opt.src_type", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6015 { &hf_lbmr_opt_src_type_type,
6016 { "Type", "lbmr.opt.src_type.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6017 { &hf_lbmr_opt_src_type_len,
6018 { "Length", "lbmr.opt.src_type.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6019 { &hf_lbmr_opt_src_type_flags,
6020 { "Flags", "lbmr.opt.src_type.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6021 { &hf_lbmr_opt_src_type_flags_ignore,
6022 { "Ignore", "lbmr.opt.src_type.flags.ignore", FT_BOOLEAN, L_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_LBMR_OPT_SRC_TYPE_FLAG_IGNORE, NULL, HFILL } },
6023 { &hf_lbmr_opt_src_type_src_type,
6024 { "Source Type", "lbmr.opt.src_type.src_type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_option_source_type), 0x0, NULL, HFILL } },
6025 { &hf_lbmr_opt_version,
6026 { "Version Option", "lbmr.opt.version", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6027 { &hf_lbmr_opt_version_type,
6028 { "Type", "lbmr.opt.version.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6029 { &hf_lbmr_opt_version_len,
6030 { "Length", "lbmr.opt.version.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6031 { &hf_lbmr_opt_version_flags,
6032 { "Flags", "lbmr.opt.version.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6033 { &hf_lbmr_opt_version_flags_ignore,
6034 { "Ignore", "lbmr.opt.version.flags.ignore", FT_BOOLEAN, L_LBMR_LBMR_OPT_VERSION_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_LBMR_OPT_VERSION_FLAG_IGNORE, NULL, HFILL } },
6035 { &hf_lbmr_opt_version_flags_ume,
6036 { "UME Capable", "lbmr.opt.version.flags.ume", FT_BOOLEAN, L_LBMR_LBMR_OPT_VERSION_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_LBMR_OPT_VERSION_FLAG_UME, "Set if UME capable", HFILL } },
6037 { &hf_lbmr_opt_version_flags_umq,
6038 { "UMQ Capable", "lbmr.opt.version.flags.umq", FT_BOOLEAN, L_LBMR_LBMR_OPT_VERSION_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_LBMR_OPT_VERSION_FLAG_UMQ, "Set if UMQ capable", HFILL } },
6039 { &hf_lbmr_opt_version_version,
6040 { "Version", "lbmr.opt.version.version", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6041 { &hf_lbmr_opt_local_domain,
6042 { "Local Domain Option", "lbmr.opt.local_domain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6043 { &hf_lbmr_opt_local_domain_type,
6044 { "Type", "lbmr.opt.local_domain.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6045 { &hf_lbmr_opt_local_domain_len,
6046 { "Length", "lbmr.opt.local_domain.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6047 { &hf_lbmr_opt_local_domain_flags,
6048 { "Flags", "lbmr.opt.local_domain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6049 { &hf_lbmr_opt_local_domain_flags_ignore,
6050 { "Ignore", "lbmr.opt.local_domain.flags.ignore", FT_BOOLEAN, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_LBMR_OPT_HDR_FLAG_IGNORE, NULL, HFILL } },
6051 { &hf_lbmr_opt_local_domain_flags_viral,
6052 { "Viral", "lbmr.opt.local_domain.flags.viral", FT_BOOLEAN, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_LBMR_OPT_HDR_FLAG_VIRAL, NULL, HFILL } },
6053 { &hf_lbmr_opt_local_domain_local_domain_id,
6054 { "Local Domain ID", "lbmr.opt.local_domain.local_domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6055 { &hf_lbmr_opt_unknown,
6056 { "Unknown ID Option", "lbmr.opt.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6057 { &hf_lbmr_opt_unknown_type,
6058 { "Type", "lbmr.opt.unknown.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6059 { &hf_lbmr_opt_unknown_len,
6060 { "Length", "lbmr.opt.unknown.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6061 { &hf_lbmr_opt_unknown_flags,
6062 { "Flags", "lbmr.opt.unknown.flags", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6063 { &hf_lbmr_opt_unknown_data,
6064 { "Data", "lbmr.opt.unknown.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6065 { &hf_lbmr_topic_res_request_flags,
6066 { "Flags", "lbmr.topic_res_request.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6067 { &hf_lbmr_topic_res_request_flags_gw_remote_interest,
6068 { "Gateway Remote Interest", "lbmr.topic_res_request.flags.gw_remote_interest", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_GW_REMOTE_INTEREST, "Set if gateway remote interest is requested", HFILL } },
6069 { &hf_lbmr_topic_res_request_flags_context_query,
6070 { "Context Queries", "lbmr.topic_res_request.flags.context_query", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_CONTEXT_QUERY, "Set if context queries are requested", HFILL } },
6071 { &hf_lbmr_topic_res_request_flags_context_advertisement,
6072 { "Context Advertisements", "lbmr.topic_res_request.flags.context_advertisement", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_CONTEXT_ADVERTISEMENT, "Set if context advertisements are requested", HFILL } },
6073 { &hf_lbmr_topic_res_request_flags_gateway_meta,
6074 { "Gateway Meta Flag", "lbmr.topic_res_request.flags.gateway_meta", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_RESERVED1, NULL, HFILL } },
6075 { &hf_lbmr_topic_res_request_flags_advertisement,
6076 { "Advertisements", "lbmr.topic_res_request.flags.advertisement", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_ADVERTISEMENT, "Set if advertisements are requested", HFILL } },
6077 { &hf_lbmr_topic_res_request_flags_query,
6078 { "Queries", "lbmr.topic_res_request.flags.query", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_QUERY, "Set if queries are requested", HFILL } },
6079 { &hf_lbmr_topic_res_request_flags_wildcard_query,
6080 { "Wildcard Queries", "lbmr.topic_res_request.flags.wildcard_query", FT_BOOLEAN, 8 * L_LBMR_TOPIC_RES_REQUEST_T_FLAGS, TFS(&tfs_set_notset), LBM_TOPIC_RES_REQUEST_WILDCARD_QUERY, "Set if wildcard queries are requested", HFILL } },
6081 { &hf_lbmr_ctxinfo_len,
6082 { "Length", "lbmr.ctxinfo.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6083 { &hf_lbmr_ctxinfo_hop_count,
6084 { "Hop Count", "lbmr.ctxinfo.hop_count", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6085 { &hf_lbmr_ctxinfo_flags,
6086 { "Flags", "lbmr.ctxinfo.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6087 { &hf_lbmr_ctxinfo_flags_query,
6088 { "Query", "lbmr.ctxinfo.flags.query", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_QUERY_FLAG, "Set if query, clear if response", HFILL } },
6089 { &hf_lbmr_ctxinfo_flags_ip,
6090 { "IP Address", "lbmr.ctxinfo.flags.ip", FT_BOOLEAN, 16, TFS(&tfs_present_not_present), LBMR_CTXINFO_IP_FLAG, "Set if IP address is included", HFILL } },
6091 { &hf_lbmr_ctxinfo_flags_instance,
6092 { "Instance", "lbmr.ctxinfo.flags.instance", FT_BOOLEAN, 16, TFS(&tfs_present_not_present), LBMR_CTXINFO_INSTANCE_FLAG, "Set if context instance is included", HFILL } },
6093 { &hf_lbmr_ctxinfo_flags_tnwg_src,
6094 { "Gateway Source", "lbmr.ctxinfo.flags.tnwg_src", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_TNWG_SRC_FLAG, "Set if a gateway source", HFILL } },
6095 { &hf_lbmr_ctxinfo_flags_tnwg_rcv,
6096 { "Gateway Receiver", "lbmr.ctxinfo.flags.tnwg_rcv", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_TNWG_RCV_FLAG, "Set if a gateway receiver", HFILL } },
6097 { &hf_lbmr_ctxinfo_flags_proxy,
6098 { "Proxy", "lbmr.ctxinfo.flags.proxy", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_PROXY_FLAG, "Set if a proxy for another context", HFILL } },
6099 { &hf_lbmr_ctxinfo_flags_name,
6100 { "Name", "lbmr.ctxinfo.flags.name", FT_BOOLEAN, 16, TFS(&tfs_present_not_present), LBMR_CTXINFO_NAME_FLAG, "Set if context name is included", HFILL } },
6101 { &hf_lbmr_ctxinfo_port,
6102 { "Port", "lbmr.ctxinfo.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6103 { &hf_lbmr_ctxinfo_ip,
6104 { "IP Address", "lbmr.ctxinfo.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6105 { &hf_lbmr_ctxinfo_instance,
6106 { "Instance", "lbmr.ctxinfo.instance", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6107 { &hf_lbmr_ctxinfo_name,
6108 { "Name", "lbmr.ctxinfo.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6109 { &hf_lbmr_tnwg_len,
6110 { "Length", "lbmr.tnwg.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6111 { &hf_lbmr_tnwg_type,
6112 { "Type", "lbmr.tnwg.type", FT_UINT16, BASE_DEC_HEX, VALS(lbmr_tnwg_function_type), 0x0, NULL, HFILL } },
6113 { &hf_lbmr_tnwg_reserved,
6114 { "Reserved", "lbmr.tnwg.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6115 { &hf_lbmr_tnwg_interest,
6116 { "Interest", "lbmr.tnwg.interest", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6117 { &hf_lbmr_tnwg_interest_len,
6118 { "Length", "lbmr.tnwg.interest.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6119 { &hf_lbmr_tnwg_interest_count,
6120 { "Record Count", "lbmr.tnwg.interest.count", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6121 { &hf_lbmr_tnwg_interest_rec,
6122 { "Interest Record", "lbmr.tnwg.interest_rec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6123 { &hf_lbmr_tnwg_interest_rec_len,
6124 { "Length", "lbmr.tnwg.interest_rec.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6125 { &hf_lbmr_tnwg_interest_rec_flags,
6126 { "Flags", "lbmr.tnwg.interest_rec.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6127 { &hf_lbmr_tnwg_interest_rec_flags_pattern,
6128 { "Pattern", "lbmr.tnwg.interest_rec.flags.pattern", FT_BOOLEAN, L_LBMR_TNWG_INTEREST_REC_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TNWG_INTEREST_REC_PATTERN_FLAG, "Set if interest is for a pattern", HFILL } },
6129 { &hf_lbmr_tnwg_interest_rec_flags_cancel,
6130 { "Cancel", "lbmr.tnwg.interest_rec.flags.cancel", FT_BOOLEAN, L_LBMR_TNWG_INTEREST_REC_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TNWG_INTEREST_REC_CANCEL_FLAG, "Set if interest is being cancelled", HFILL } },
6131 { &hf_lbmr_tnwg_interest_rec_flags_refresh,
6132 { "Refresh", "lbmr.tnwg.interest_rec.flags.refresh", FT_BOOLEAN, L_LBMR_TNWG_INTEREST_REC_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_TNWG_INTEREST_REC_REFRESH_FLAG, "Set if interest is being refreshed", HFILL } },
6133 { &hf_lbmr_tnwg_interest_rec_pattype,
6134 { "Pattern Type", "lbmr.tnwg.interest_rec.pattype", FT_UINT8, BASE_DEC_HEX, VALS(lbm_wildcard_pattern_type_short), 0x0, NULL, HFILL } },
6135 { &hf_lbmr_tnwg_interest_rec_domain_id,
6136 { "Domain ID", "lbmr.tnwg.interest_rec.domain_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6137 { &hf_lbmr_tnwg_interest_rec_symbol,
6138 { "Symbol", "lbmr.tnwg.interest_rec.symbol", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6139 { &hf_lbmr_tnwg_ctxinfo,
6140 { "Context Information", "lbmr.tnwg.ctxinfo", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6141 { &hf_lbmr_tnwg_ctxinfo_len,
6142 { "Length", "lbmr.tnwg.ctxinfo.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6143 { &hf_lbmr_tnwg_ctxinfo_hop_count,
6144 { "Hop Count", "lbmr.tnwg.ctxinfo.hop_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6145 { &hf_lbmr_tnwg_ctxinfo_reserved,
6146 { "Reserved", "lbmr.tnwg.ctxinfo.reserved", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6147 { &hf_lbmr_tnwg_ctxinfo_flags1,
6148 { "Flags1", "lbmr.tnwg.ctxinfo.flags1", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6149 { &hf_lbmr_tnwg_ctxinfo_flags1_query,
6150 { "Query", "lbmr.tnwg.ctxinfo.flags1.query", FT_BOOLEAN, L_LBMR_TNWG_CTXINFO_T_FLAGS1 * 8, TFS(&tfs_set_notset), LBMR_TNWG_CTXINFO_QUERY_FLAG, "Set if a query, clear if a response", HFILL } },
6151 { &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_src,
6152 { "TNWG Source", "lbmr.tnwg.ctxinfo.flags1.tnwg_src", FT_BOOLEAN, L_LBMR_TNWG_CTXINFO_T_FLAGS1 * 8, TFS(&tfs_set_notset), LBMR_TNWG_CTXINFO_TNWG_SRC_FLAG, "Set if a gateway source", HFILL } },
6153 { &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_rcv,
6154 { "TNWG Receiver", "lbmr.tnwg.ctxinfo.flags1.tnwg_rcv", FT_BOOLEAN, L_LBMR_TNWG_CTXINFO_T_FLAGS1 * 8, TFS(&tfs_set_notset), LBMR_TNWG_CTXINFO_TNWG_RCV_FLAG, "Set if a gateway receiver", HFILL } },
6155 { &hf_lbmr_tnwg_ctxinfo_flags1_proxy,
6156 { "Proxy", "lbmr.tnwg.ctxinfo.flags1.proxy", FT_BOOLEAN, L_LBMR_TNWG_CTXINFO_T_FLAGS1 * 8, TFS(&tfs_set_notset), LBMR_TNWG_CTXINFO_PROXY_FLAG, "Set if a proxy for another context", HFILL } },
6157 { &hf_lbmr_tnwg_ctxinfo_flags2,
6158 { "Flags2", "lbmr.tnwg.ctxinfo.flags2", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6159 { &hf_lbmr_tnwg_trreq,
6160 { "Topic Res Request", "lbmr.tnwg.trreq", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6161 { &hf_lbmr_tnwg_trreq_len,
6162 { "Length", "lbmr.tnwg.trreq.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6163 { &hf_lbmr_tnwg_opt,
6164 { "Unknown Option", "lbmr.tnwg.opt", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6165 { &hf_lbmr_tnwg_opt_type,
6166 { "Type", "lbmr.tnwg.opt.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6167 { &hf_lbmr_tnwg_opt_len,
6168 { "Length", "lbmr.tnwg.opt.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6169 { &hf_lbmr_tnwg_opt_flags,
6170 { "Flags", "lbmr.tnwg.opt.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6171 { &hf_lbmr_tnwg_opt_flags_ignore,
6172 { "Ignore", "lbmr.tnwg.opt.flags.ignore", FT_BOOLEAN, L_LBMR_TNWG_OPT_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TNWG_OPT_IGNORE_FLAG, NULL, HFILL } },
6173 { &hf_lbmr_tnwg_opt_data,
6174 { "Data", "lbmr.tnwg.opt.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6175 { &hf_lbmr_tnwg_opt_ctxinst,
6176 { "Context Instance Option", "lbmr.tnwg.opt_ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6177 { &hf_lbmr_tnwg_opt_ctxinst_type,
6178 { "Type", "lbmr.tnwg.opt_ctxinst.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6179 { &hf_lbmr_tnwg_opt_ctxinst_len,
6180 { "Length", "lbmr.tnwg.opt_ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6181 { &hf_lbmr_tnwg_opt_ctxinst_flags,
6182 { "Flags", "lbmr.tnwg.opt_ctxinst.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6183 { &hf_lbmr_tnwg_opt_ctxinst_flags_ignore,
6184 { "Ignore", "lbmr.tnwg.opt_ctxinst.flags.ignore", FT_BOOLEAN, L_LBMR_TNWG_OPT_CTXINST_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TNWG_OPT_IGNORE_FLAG, NULL, HFILL } },
6185 { &hf_lbmr_tnwg_opt_ctxinst_instance,
6186 { "Context Instance", "lbmr.tnwg.opt_ctxinst.instance", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6187 { &hf_lbmr_tnwg_opt_address,
6188 { "Address Option", "lbmr.tnwg.opt_address", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6189 { &hf_lbmr_tnwg_opt_address_type,
6190 { "Type", "lbmr.tnwg.opt_address.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6191 { &hf_lbmr_tnwg_opt_address_len,
6192 { "Length", "lbmr.tnwg.opt_address.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6193 { &hf_lbmr_tnwg_opt_address_flags,
6194 { "Flags", "lbmr.tnwg.opt_address.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6195 { &hf_lbmr_tnwg_opt_address_flags_ignore,
6196 { "Ignore", "lbmr.tnwg.opt_address.flags.ignore", FT_BOOLEAN, L_LBMR_TNWG_OPT_ADDRESS_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TNWG_OPT_IGNORE_FLAG, NULL, HFILL } },
6197 { &hf_lbmr_tnwg_opt_address_port,
6198 { "Port", "lbmr.tnwg.opt_address.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6199 { &hf_lbmr_tnwg_opt_address_res,
6200 { "Reserved", "lbmr.tnwg.opt_address.res", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6201 { &hf_lbmr_tnwg_opt_address_ip,
6202 { "IP Address", "lbmr.tnwg.opt_address.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6203 { &hf_lbmr_tnwg_opt_domain,
6204 { "Domain Option", "lbmr.tnwg.opt_domain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6205 { &hf_lbmr_tnwg_opt_domain_type,
6206 { "Type", "lbmr.tnwg.opt_domain.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6207 { &hf_lbmr_tnwg_opt_domain_len,
6208 { "Length", "lbmr.tnwg.opt_domain.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6209 { &hf_lbmr_tnwg_opt_domain_flags,
6210 { "Flags", "lbmr.tnwg.opt_domain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6211 { &hf_lbmr_tnwg_opt_domain_flags_ignore,
6212 { "Ignore", "lbmr.tnwg.opt_domain.flags.ignore", FT_BOOLEAN, L_LBMR_TNWG_OPT_DOMAIN_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TNWG_OPT_IGNORE_FLAG, NULL, HFILL } },
6213 { &hf_lbmr_tnwg_opt_domain_domain_id,
6214 { "Domain ID", "lbmr.tnwg.opt_domain.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6215 { &hf_lbmr_tnwg_opt_name,
6216 { "Name Option", "lbmr.tnwg.opt_name", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6217 { &hf_lbmr_tnwg_opt_name_type,
6218 { "Type", "lbmr.tnwg.opt_name.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6219 { &hf_lbmr_tnwg_opt_name_len,
6220 { "Length", "lbmr.tnwg.opt_name.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6221 { &hf_lbmr_tnwg_opt_name_flags,
6222 { "Flags", "lbmr.tnwg.opt_name.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6223 { &hf_lbmr_tnwg_opt_name_flags_ignore,
6224 { "Ignore", "lbmr.tnwg.opt_name.flags.ignore", FT_BOOLEAN, L_LBMR_TNWG_OPT_T_FLAGS * 8, TFS(&lbm_ignore_flag), LBMR_TNWG_OPT_IGNORE_FLAG, NULL, HFILL } },
6225 { &hf_lbmr_tnwg_opt_name_name,
6226 { "Name", "lbmr.tnwg.opt_name.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6227 { &hf_lbmr_remote_domain_route_hdr_num_domains,
6228 { "Number of Domains", "lbmr.remote_domain_route.num_domains", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6229 { &hf_lbmr_remote_domain_route_hdr_ip,
6230 { "IP Address", "lbmr.remote_domain_route.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6231 { &hf_lbmr_remote_domain_route_hdr_port,
6232 { "Port", "lbmr.remote_domain_route.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6233 { &hf_lbmr_remote_domain_route_hdr_route_index,
6234 { "Route Index", "lbmr.remote_domain_route.route_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6235 { &hf_lbmr_remote_domain_route_hdr_length,
6236 { "Length", "lbmr.remote_domain_route.length", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6237 { &hf_lbmr_remote_domain_route_hdr_domain,
6238 { "Domain", "lbmr.remote_domain_route.domain", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6239 { &hf_lbmr_rctxinfo_len,
6240 { "Length", "lbmr.rctxinfo.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6241 { &hf_lbmr_rctxinfo_num_recs,
6242 { "Number of Records", "lbmr.rctxinfo.num_recs", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6243 { &hf_lbmr_rctxinfo_reserved,
6244 { "Reserved", "lbmr.rctxinfo.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6245 { &hf_lbmr_rctxinfo_rec,
6246 { "Remote Context Information Record", "lbmr.rctxinfo.rec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6247 { &hf_lbmr_rctxinfo_rec_len,
6248 { "Length", "lbmr.rctxinfo.rec.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6249 { &hf_lbmr_rctxinfo_rec_flags,
6250 { "Flags", "lbmr.rctxinfo.rec.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6251 { &hf_lbmr_rctxinfo_rec_flags_query,
6252 { "Query", "lbmr.rctxinfo.rec.flags.query", FT_BOOLEAN, L_LBMR_RCTXINFO_REC_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_RCTXINFO_REC_FLAG_QUERY, "Set if a query, clear if a response", HFILL } },
6253 { &hf_lbmr_rctxinfo_rec_address,
6254 { "Address Option", "lbmr.rctxinfo.rec.address", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6255 { &hf_lbmr_rctxinfo_rec_address_type,
6256 { "Type", "lbmr.rctxinfo.rec.address.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6257 { &hf_lbmr_rctxinfo_rec_address_len,
6258 { "Length", "lbmr.rctxinfo.rec.address.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6259 { &hf_lbmr_rctxinfo_rec_address_flags,
6260 { "Flags", "lbmr.rctxinfo.rec.address.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6261 { &hf_lbmr_rctxinfo_rec_address_domain_id,
6262 { "Domain ID", "lbmr.rctxinfo.rec.address.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6263 { &hf_lbmr_rctxinfo_rec_address_ip,
6264 { "Address", "lbmr.rctxinfo.rec.address.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6265 { &hf_lbmr_rctxinfo_rec_address_port,
6266 { "Port", "lbmr.rctxinfo.rec.address.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6267 { &hf_lbmr_rctxinfo_rec_address_res,
6268 { "Reserved", "lbmr.rctxinfo.rec.address.res", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6269 { &hf_lbmr_rctxinfo_rec_instance,
6270 { "Instance Option", "lbmr.rctxinfo.rec.instance", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6271 { &hf_lbmr_rctxinfo_rec_instance_type,
6272 { "Type", "lbmr.rctxinfo.rec.instance.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6273 { &hf_lbmr_rctxinfo_rec_instance_len,
6274 { "Length", "lbmr.rctxinfo.rec.instance.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6275 { &hf_lbmr_rctxinfo_rec_instance_flags,
6276 { "Flags", "lbmr.rctxinfo.rec.instance.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6277 { &hf_lbmr_rctxinfo_rec_instance_instance,
6278 { "Instance", "lbmr.rctxinfo.rec.instance.instance", FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } },
6279 { &hf_lbmr_rctxinfo_rec_odomain,
6280 { "Originating Domain Option", "lbmr.rctxinfo.rec.odomain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6281 { &hf_lbmr_rctxinfo_rec_odomain_type,
6282 { "Type", "lbmr.rctxinfo.rec.odomain.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6283 { &hf_lbmr_rctxinfo_rec_odomain_len,
6284 { "Length", "lbmr.rctxinfo.rec.odomain.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6285 { &hf_lbmr_rctxinfo_rec_odomain_flags,
6286 { "Flags", "lbmr.rctxinfo.rec.odomain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6287 { &hf_lbmr_rctxinfo_rec_odomain_domain_id,
6288 { "Domain ID", "lbmr.rctxinfo.rec.odomain.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6289 { &hf_lbmr_rctxinfo_rec_name,
6290 { "Name Option", "lbmr.rctxinfo.rec.name", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6291 { &hf_lbmr_rctxinfo_rec_name_type,
6292 { "Type", "lbmr.rctxinfo.rec.name.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6293 { &hf_lbmr_rctxinfo_rec_name_len,
6294 { "Length", "lbmr.rctxinfo.rec.name.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6295 { &hf_lbmr_rctxinfo_rec_name_flags,
6296 { "Flags", "lbmr.rctxinfo.rec.name.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6297 { &hf_lbmr_rctxinfo_rec_name_name,
6298 { "Name", "lbmr.rctxinfo.rec.name.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6299 { &hf_lbmr_rctxinfo_rec_unknown,
6300 { "Unknown Option", "lbmr.rctxinfo.rec.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6301 { &hf_lbmr_rctxinfo_rec_unknown_type,
6302 { "Type", "lbmr.rctxinfo.rec.unknown.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6303 { &hf_lbmr_rctxinfo_rec_unknown_len,
6304 { "Length", "lbmr.rctxinfo.rec.unknown.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6305 { &hf_lbmr_rctxinfo_rec_unknown_flags,
6306 { "Flags", "lbmr.rctxinfo.rec.unknown.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6307 { &hf_lbmr_rctxinfo_rec_unknown_data,
6308 { "Data", "lbmr.rctxinfo.rec.unknown.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6309 { &hf_qmgmt_flags,
6310 { "Flags", "lbmr.qmgmt.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6311 { &hf_qmgmt_flags_i_flag,
6312 { "Ignore", "lbmr.qmgmt.flags.i_flag", FT_BOOLEAN, L_UMQ_QMGMT_HDR_T_FLAGS * 8, TFS(&lbm_ignore_flag), UMQ_QMGMT_HDR_I_FLAG, NULL, HFILL } },
6313 { &hf_qmgmt_flags_n_flag,
6314 { "Queue Name", "lbmr.qmgmt.flags.n_flag", FT_BOOLEAN, L_UMQ_QMGMT_HDR_T_FLAGS * 8, TFS(&tfs_present_not_present), UMQ_QMGMT_HDR_N_FLAG, "Set if queue name is present", HFILL } },
6315 { &hf_qmgmt_flags_il_l_flag,
6316 { "New Instance List", "lbmr.qmgmt.flags.il_l_flag", FT_BOOLEAN, L_UMQ_QMGMT_HDR_T_FLAGS * 8, TFS(&tfs_set_notset), UMQ_QMGMT_HDR_IL_L_FLAG, "Set if contains a new instance list", HFILL } },
6317 { &hf_qmgmt_flags_il_k_flag,
6318 { "Keepalive Requested", "lbmr.qmgmt.flags.il_k_flag", FT_BOOLEAN, L_UMQ_QMGMT_HDR_T_FLAGS * 8, TFS(&tfs_set_notset), UMQ_QMGMT_HDR_IL_K_FLAG, "Set if a keepalive requester", HFILL } },
6319 { &hf_qmgmt_pckt_type,
6320 { "Packet Type", "lbmr.qmgmt.pckt_type", FT_UINT8, BASE_HEX_DEC, VALS(umq_qmgmt_packet_type), 0x0, NULL, HFILL } },
6321 { &hf_qmgmt_cfgsig,
6322 { "Configuration Signature", "lbmr.qmgmt.cfg_sig", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6323 { &hf_qmgmt_queue_id,
6324 { "Queue ID", "lbmr.qmgmt.queue_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6325 { &hf_qmgmt_queue_ver,
6326 { "Queue Version", "lbmr.qmgmt.queue_ver", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6327 { &hf_qmgmt_ip,
6328 { "IP Address", "lbmr.qmgmt.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6329 { &hf_qmgmt_port,
6330 { "Port", "lbmr.qmgmt.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6331 { &hf_qmgmt_inst_idx,
6332 { "Instance Index", "lbmr.qmgmt.inst_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6333 { &hf_qmgmt_grp_idx,
6334 { "Group Index", "lbmr.qmgmt.grp_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6335 { &hf_qmgmt_pckt_type_dep16,
6336 { "Packet-Type Dependent Data", "lbmr.qmgmt.pckt_type_dep16", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6337 { &hf_qmgmt_il_num_insts,
6338 { "Number of IL Instances", "lbmr.qmgmt.il_num_insts", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6339 { &hf_qmgmt_jrej_code,
6340 { "Join Rejection Code", "lbmr.qmgmt.jrej_code", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6341 { &hf_qmgmt_ev_bias,
6342 { "EV Bias", "lbmr.qmgmt.ev_bias", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6343 { &hf_qmgmt_il,
6344 { "Instance List Header", "lbmr.qmgmt.il", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6345 { &hf_qmgmt_il_highest_rcr_tsp,
6346 { "Highest RCR TSP", "lbmr.qmgmt.il.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6347 { &hf_qmgmt_il_inst,
6348 { "Instance Header", "lbmr.qmgmt.il_inst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6349 { &hf_qmgmt_il_inst_ip,
6350 { "IP", "lbmr.qmgmt.il_inst.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6351 { &hf_qmgmt_il_inst_port,
6352 { "Port", "lbmr.qmgmt.il_inst.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6353 { &hf_qmgmt_il_inst_inst_idx,
6354 { "Instance Index", "lbmr.qmgmt.il_inst.inst_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6355 { &hf_qmgmt_il_inst_grp_idx,
6356 { "Group Index", "lbmr.qmgmt.il_inst.grp_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6357 { &hf_qmgmt_il_inst_flags,
6358 { "Flags", "lbmr.qmgmt.il_inst.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6359 { &hf_qmgmt_il_inst_flags_m_flag,
6360 { "Master", "lbmr.qmgmt.il_inst.flags.m_flag", FT_BOOLEAN, L_UMQ_QMGMT_IL_INST_HDR_T_FLAGS * 8, TFS(&tfs_set_notset), UMQ_QMGMT_HDR_IL_INST_M_FLAG, "Set if the master queue", HFILL } },
6361 { &hf_qmgmt_il_inst_flags_q_flag,
6362 { "Queue Election Master", "lbmr.qmgmt.il_inst.flags.q_flag", FT_BOOLEAN, L_UMQ_QMGMT_IL_INST_HDR_T_FLAGS * 8, TFS(&tfs_set_notset), UMQ_QMGMT_HDR_IL_INST_Q_FLAG, "Set if a queue election master", HFILL } },
6363 { &hf_qmgmt_il_inst_flags_p_flag,
6364 { "Post Election Master", "lbmr.qmgmt.il_inst.flags.p_flag", FT_BOOLEAN, L_UMQ_QMGMT_IL_INST_HDR_T_FLAGS * 8, TFS(&tfs_set_notset), UMQ_QMGMT_HDR_IL_INST_P_FLAG, "Set if a post election master", HFILL } },
6365 { &hf_qmgmt_ec,
6366 { "Election Call Header", "lbmr.qmgmt.ec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6367 { &hf_qmgmt_ec_queue_new_ver,
6368 { "Queue New Version", "lbmr.qmgmt.ec.queue_new_ver", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6369 { &hf_qmgmt_ev,
6370 { "Election Vote Header", "lbmr.qmgmt.ev", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6371 { &hf_qmgmt_ev_highest_rcr_tsp,
6372 { "Highest RCR TSP", "lbmr.qmgmt.ev.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6373 { &hf_qmgmt_ev_age,
6374 { "Age", "lbmr.qmgmt.ev.age", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6375 { &hf_qmgmt_qro,
6376 { "Queue Resume Operation Header", "lbmr.qmgmt.qro", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6377 { &hf_qmgmt_qro_highest_rcr_tsp,
6378 { "Highest RCR TSP", "lbmr.qmgmt.qro.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6379 { &hf_qmgmt_qname,
6380 { "Queue Name", "lbmr.qmgmt.qname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }
6382 static int * ett[] =
6384 &ett_lbmr,
6385 &ett_lbmr_hdr,
6386 &ett_lbmr_opts,
6387 &ett_lbmr_opt_src_id,
6388 &ett_lbmr_opt_src_id_flags,
6389 &ett_lbmr_opt_len,
6390 &ett_lbmr_opt_src_type,
6391 &ett_lbmr_opt_src_type_flags,
6392 &ett_lbmr_opt_version,
6393 &ett_lbmr_opt_version_flags,
6394 &ett_lbmr_opt_local_domain,
6395 &ett_lbmr_opt_local_domain_flags,
6396 &ett_lbmr_opt_unknown,
6397 &ett_lbmr_tqrs,
6398 &ett_lbmr_tqr,
6399 &ett_lbmr_tirs,
6400 &ett_lbmr_tir,
6401 &ett_lbmr_tir_tcp,
6402 &ett_lbmr_tir_lbtrm,
6403 &ett_lbmr_tir_lbtru,
6404 &ett_lbmr_tir_lbtipc,
6405 &ett_lbmr_tir_lbtrdma,
6406 &ett_lbmr_tir_lbtsmx,
6407 &ett_lbmr_topts,
6408 &ett_lbmr_topt_len,
6409 &ett_lbmr_topt_ume,
6410 &ett_lbmr_topt_ume_flags,
6411 &ett_lbmr_topt_ume_store,
6412 &ett_lbmr_topt_ume_store_flags,
6413 &ett_lbmr_topt_ume_store_group,
6414 &ett_lbmr_topt_ume_store_group_flags,
6415 &ett_lbmr_topt_latejoin,
6416 &ett_lbmr_topt_latejoin_flags,
6417 &ett_lbmr_topt_umq_rcridx,
6418 &ett_lbmr_topt_umq_rcridx_flags,
6419 &ett_lbmr_topt_umq_qinfo,
6420 &ett_lbmr_topt_umq_qinfo_flags,
6421 &ett_lbmr_topt_cost,
6422 &ett_lbmr_topt_cost_flags,
6423 &ett_lbmr_topt_otid,
6424 &ett_lbmr_topt_otid_flags,
6425 &ett_lbmr_topt_ctxinst,
6426 &ett_lbmr_topt_ctxinst_flags,
6427 &ett_lbmr_topt_ctxinsts,
6428 &ett_lbmr_topt_ctxinsts_flags,
6429 &ett_lbmr_topt_ulb,
6430 &ett_lbmr_topt_ulb_flags,
6431 &ett_lbmr_topt_ctxinstq,
6432 &ett_lbmr_topt_ctxinstq_flags,
6433 &ett_lbmr_topt_domain_id,
6434 &ett_lbmr_topt_domain_id_flags,
6435 &ett_lbmr_topt_exfunc,
6436 &ett_lbmr_topt_exfunc_flags,
6437 &ett_lbmr_topt_exfunc_functionality_flags,
6438 &ett_lbmr_topt_unknown,
6439 &ett_lbmr_tmb,
6440 &ett_lbmr_tmrs,
6441 &ett_lbmr_tmr,
6442 &ett_lbmr_tmr_flags,
6443 &ett_lbmr_pser_flags,
6444 &ett_lbmr_pser_opts,
6445 &ett_lbmr_pser_opt_len,
6446 &ett_lbmr_pser_opt_ctxinst,
6447 &ett_lbmr_qqrs,
6448 &ett_lbmr_qirs,
6449 &ett_lbmr_qir,
6450 &ett_lbmr_qir_options,
6451 &ett_lbmr_qir_grp_blk,
6452 &ett_lbmr_qir_queue_blk,
6453 &ett_lbmr_qir_grp,
6454 &ett_lbmr_qir_queue,
6455 &ett_lbmr_topic_res_request_flags,
6456 &ett_lbmr_ctxinfo_flags,
6457 &ett_lbmr_tnwg,
6458 &ett_lbmr_tnwg_interest,
6459 &ett_lbmr_tnwg_interest_rec,
6460 &ett_lbmr_tnwg_interest_rec_flags,
6461 &ett_lbmr_tnwg_ctxinfo,
6462 &ett_lbmr_tnwg_ctxinfo_flags1,
6463 &ett_lbmr_tnwg_trreq,
6464 &ett_lbmr_tnwg_ctxinst_opt,
6465 &ett_lbmr_tnwg_ctxinst_opt_flags,
6466 &ett_lbmr_tnwg_address_opt,
6467 &ett_lbmr_tnwg_address_opt_flags,
6468 &ett_lbmr_tnwg_domain_opt,
6469 &ett_lbmr_tnwg_domain_opt_flags,
6470 &ett_lbmr_tnwg_name_opt,
6471 &ett_lbmr_tnwg_name_opt_flags,
6472 &ett_lbmr_tnwg_unknown_opt,
6473 &ett_lbmr_tnwg_unknown_opt_flags,
6474 &ett_lbmr_remote_domain_route_hdr,
6475 &ett_lbmr_rctxinfo,
6476 &ett_lbmr_rctxinfo_rec,
6477 &ett_lbmr_rctxinfo_rec_flags,
6478 &ett_lbmr_rctxinfo_rec_address,
6479 &ett_lbmr_rctxinfo_rec_instance,
6480 &ett_lbmr_rctxinfo_rec_odomain,
6481 &ett_lbmr_rctxinfo_rec_name,
6482 &ett_lbmr_rctxinfo_rec_unknown,
6483 &ett_qmgmt_flags,
6484 &ett_qmgmt_il,
6485 &ett_qmgmt_il_inst,
6486 &ett_qmgmt_il_inst_flags,
6487 &ett_qmgmt_ec,
6488 &ett_qmgmt_ev,
6489 &ett_qmgmt_qro
6491 static ei_register_info ei[] =
6493 { &ei_lbmr_analysis_length_incorrect, { "lbmr.analysis.length_incorrect", PI_MALFORMED, PI_ERROR, "Header length incorrect", EXPFILL } },
6494 { &ei_lbmr_analysis_invalid_value, { "lbmr.analysis.invalid_value", PI_UNDECODED, PI_WARN, "Invalid value", EXPFILL } },
6495 { &ei_lbmr_analysis_zero_len_option, { "lbmr.analysis.zero_len_option", PI_MALFORMED, PI_ERROR, "Zero-length LBMR option", EXPFILL } },
6497 module_t * lbmr_module;
6498 uint32_t addr;
6499 uat_t * tag_uat;
6500 expert_module_t * expert_lbmr;
6502 proto_lbmr = proto_register_protocol("LBM Topic Resolution Protocol",
6503 "LBMR", "lbmr");
6505 proto_register_field_array(proto_lbmr, hf, array_length(hf));
6506 proto_register_subtree_array(ett, array_length(ett));
6507 expert_lbmr = expert_register_protocol(proto_lbmr);
6508 expert_register_field_array(expert_lbmr, ei, array_length(ei));
6510 lbmr_dissector_handle = register_dissector("lbmr", dissect_lbmr, proto_lbmr);
6512 lbmr_module = prefs_register_protocol_subtree("29West", proto_lbmr, proto_reg_handoff_lbmr);
6513 prefs_register_uint_preference(lbmr_module,
6514 "mc_incoming_port",
6515 "Incoming multicast UDP port (default " LBMR_DEFAULT_MC_INCOMING_UDP_PORT_STRING ")",
6516 "Set the UDP port for incoming multicast topic resolution (context resolver_multicast_incoming_port)",
6518 &global_lbmr_mc_incoming_udp_port);
6519 ws_inet_pton4(LBMR_DEFAULT_MC_INCOMING_ADDRESS, &addr);
6520 lbmr_mc_incoming_address_host = g_ntohl(addr);
6521 prefs_register_string_preference(lbmr_module,
6522 "mc_incoming_address",
6523 "Incoming multicast address (default " LBMR_DEFAULT_MC_INCOMING_ADDRESS ")",
6524 "Set the multicast address for incoming multicast topic resolution (context resolver_multicast_incoming_address)",
6525 &global_lbmr_mc_incoming_address);
6526 prefs_register_uint_preference(lbmr_module,
6527 "mc_outgoing_port",
6528 "Outgoing multicast UDP port (default " LBMR_DEFAULT_MC_OUTGOING_UDP_PORT_STRING ")",
6529 "Set the UDP port for outgoing multicast topic resolution (context resolver_multicast_outgoing_port)",
6531 &global_lbmr_mc_outgoing_udp_port);
6532 ws_inet_pton4(LBMR_DEFAULT_MC_OUTGOING_ADDRESS, &addr);
6533 lbmr_mc_outgoing_address_host = g_ntohl(addr);
6534 prefs_register_string_preference(lbmr_module,
6535 "mc_outgoing_address",
6536 "Outgoing multicast address (default " LBMR_DEFAULT_MC_OUTGOING_ADDRESS ")",
6537 "Set the multicast address for outgoing multicast topic resolution (context resolver_multicast_outgoing_address)",
6538 &global_lbmr_mc_outgoing_address);
6539 prefs_register_uint_preference(lbmr_module,
6540 "uc_port_low",
6541 "Unicast UDP port low (default " LBMR_DEFAULT_UC_PORT_LOW_STRING ")",
6542 "Set the low UDP port for unicast topic resolution (context resolver_unicast_port_low)",
6544 &global_lbmr_uc_port_low);
6545 prefs_register_uint_preference(lbmr_module,
6546 "uc_port_high",
6547 "Unicast UDP port high (default " LBMR_DEFAULT_UC_PORT_HIGH_STRING ")",
6548 "Set the high UDP port for unicast topic resolution (context resolver_unicast_port_high)",
6550 &global_lbmr_uc_port_high);
6551 prefs_register_uint_preference(lbmr_module,
6552 "uc_dest_port",
6553 "Unicast UDP destination port (default " LBMR_DEFAULT_UC_DEST_PORT_STRING ")",
6554 "Set the destination port for unicast topic resolution (context resolver_unicast_destination_port)",
6556 &global_lbmr_uc_dest_port);
6557 ws_inet_pton4(LBMR_DEFAULT_UC_ADDRESS, &addr);
6558 lbmr_uc_address_host = g_ntohl(addr);
6559 prefs_register_string_preference(lbmr_module,
6560 "uc_address",
6561 "Unicast resolver address (default " LBMR_DEFAULT_UC_ADDRESS ")",
6562 "Set the address of the unicast resolver daemon (context resolver_unicast_address)",
6563 &global_lbmr_uc_address);
6564 prefs_register_bool_preference(lbmr_module,
6565 "use_lbmr_domain",
6566 "Use LBMR tag table",
6567 "Use table of LBMR tags to decode the packet instead of above values",
6568 &global_lbmr_use_tag);
6569 tag_uat = uat_new("LBMR tag definitions",
6570 sizeof(lbmr_tag_entry_t),
6571 "lbmr_domains",
6572 true,
6573 (void * *)&lbmr_tag_entry,
6574 &lbmr_tag_count,
6575 UAT_AFFECTS_DISSECTION,
6576 NULL,
6577 lbmr_tag_copy_cb,
6578 lbmr_tag_update_cb,
6579 lbmr_tag_free_cb,
6580 NULL,
6581 NULL,
6582 lbmr_tag_array);
6583 prefs_register_uat_preference(lbmr_module,
6584 "tnw_lbmr_tags",
6585 "LBMR Tags",
6586 "A table to define LBMR tags",
6587 tag_uat);
6589 lbmr_topic_advertisement_tap_handle = register_tap(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING);
6590 lbmr_topic_query_tap_handle = register_tap(LBMR_TOPIC_QUERY_TAP_STRING);
6591 lbmr_pattern_query_tap_handle = register_tap(LBMR_PATTERN_QUERY_TAP_STRING);
6592 lbmr_queue_advertisement_tap_handle = register_tap(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING);
6593 lbmr_queue_query_tap_handle = register_tap(LBMR_QUEUE_QUERY_TAP_STRING);
6595 stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6596 "lbmr_topic_ads_topic",
6597 lbmr_stat_tree_name_topic_ads_topic,
6599 lbmr_topic_ads_topic_stats_tree_packet,
6600 lbmr_topic_ads_topic_stats_tree_init,
6601 NULL);
6602 stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6603 "lbmr_topic_ads_source",
6604 lbmr_stat_tree_name_topic_ads_source,
6606 lbmr_topic_ads_source_stats_tree_packet,
6607 lbmr_topic_ads_source_stats_tree_init,
6608 NULL);
6609 stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6610 "lbmr_topic_ads_transport",
6611 lbmr_stat_tree_name_topic_ads_transport,
6613 lbmr_topic_ads_transport_stats_tree_packet,
6614 lbmr_topic_ads_transport_stats_tree_init,
6615 NULL);
6616 stats_tree_register(LBMR_TOPIC_QUERY_TAP_STRING,
6617 "lbmr_topic_queries_topic",
6618 lbmr_stat_tree_name_topic_queries_topic,
6620 lbmr_topic_queries_topic_stats_tree_packet,
6621 lbmr_topic_queries_topic_stats_tree_init,
6622 NULL);
6623 stats_tree_register(LBMR_TOPIC_QUERY_TAP_STRING,
6624 "lbmr_topic_queries_receiver",
6625 lbmr_stat_tree_name_topic_queries_receiver,
6627 lbmr_topic_queries_receiver_stats_tree_packet,
6628 lbmr_topic_queries_receiver_stats_tree_init,
6629 NULL);
6630 stats_tree_register(LBMR_PATTERN_QUERY_TAP_STRING,
6631 "lbmr_topic_queries_pattern",
6632 lbmr_stat_tree_name_topic_queries_pattern,
6634 lbmr_topic_queries_pattern_stats_tree_packet,
6635 lbmr_topic_queries_pattern_stats_tree_init,
6636 NULL);
6637 stats_tree_register(LBMR_PATTERN_QUERY_TAP_STRING,
6638 "lbmr_topic_queries_pattern_receiver",
6639 lbmr_stat_tree_name_topic_queries_pattern_receiver,
6641 lbmr_topic_queries_pattern_receiver_stats_tree_packet,
6642 lbmr_topic_queries_pattern_receiver_stats_tree_init,
6643 NULL);
6644 stats_tree_register(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING,
6645 "lbmr_queue_ads_queue",
6646 lbmr_stat_tree_name_queue_ads_queue,
6648 lbmr_queue_ads_queue_stats_tree_packet,
6649 lbmr_queue_ads_queue_stats_tree_init,
6650 NULL);
6651 stats_tree_register(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING,
6652 "lbmr_queue_ads_source",
6653 lbmr_stat_tree_name_queue_ads_source,
6655 lbmr_queue_ads_source_stats_tree_packet,
6656 lbmr_queue_ads_source_stats_tree_init,
6657 NULL);
6658 stats_tree_register(LBMR_QUEUE_QUERY_TAP_STRING,
6659 "lbmr_queue_queries_queue",
6660 lbmr_stat_tree_name_queue_queries_queue,
6662 lbmr_queue_queries_queue_stats_tree_packet,
6663 lbmr_queue_queries_queue_stats_tree_init,
6664 NULL);
6665 stats_tree_register(LBMR_QUEUE_QUERY_TAP_STRING,
6666 "lbmr_queue_queries_receiver",
6667 lbmr_stat_tree_name_queue_queries_receiver,
6669 lbmr_queue_queries_receiver_stats_tree_packet,
6670 lbmr_queue_queries_receiver_stats_tree_init,
6671 NULL);
6673 lbm_topic_init();
6674 lbtsmx_transport_init();
6675 lbtipc_transport_init();
6676 lbtrdma_transport_init();
6679 /* The registration hand-off routine */
6680 void proto_reg_handoff_lbmr(void)
6682 static bool already_registered = false;
6683 uint32_t addr;
6685 if (!already_registered)
6687 dissector_add_for_decode_as_with_preference("udp.port", lbmr_dissector_handle);
6688 heur_dissector_add("udp", test_lbmr_packet, "LBM Topic Resolution over UDP", "lbmr_udp", proto_lbmr, HEURISTIC_ENABLE);
6691 lbmr_mc_incoming_udp_port = global_lbmr_mc_incoming_udp_port;
6692 lbmr_mc_outgoing_udp_port = global_lbmr_mc_outgoing_udp_port;
6693 ws_inet_pton4(global_lbmr_mc_incoming_address, &addr);
6694 lbmr_mc_incoming_address_host = g_ntohl(addr);
6696 ws_inet_pton4(global_lbmr_mc_outgoing_address, &addr);
6697 lbmr_mc_outgoing_address_host = g_ntohl(addr);
6699 /* Make sure the low port is <= the high port. If not, don't change them. */
6700 if (global_lbmr_uc_port_low <= global_lbmr_uc_port_high)
6702 lbmr_uc_port_high = global_lbmr_uc_port_high;
6703 lbmr_uc_port_low = global_lbmr_uc_port_low;
6705 lbmr_uc_dest_port = global_lbmr_uc_dest_port;
6706 ws_inet_pton4(global_lbmr_uc_address, &addr);
6707 lbmr_uc_address_host = g_ntohl(addr);
6708 lbmr_use_tag = global_lbmr_use_tag;
6710 already_registered = true;
6714 * Editor modelines - https://www.wireshark.org/tools/modelines.html
6716 * Local variables:
6717 * c-basic-offset: 4
6718 * tab-width: 8
6719 * indent-tabs-mode: nil
6720 * End:
6722 * vi: set shiftwidth=4 tabstop=8 expandtab:
6723 * :indentSize=4:tabSize=8:noTabs=true: