Coverage Report

Created: 2025-12-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-lbmr.c
Line
Count
Source
1
/* packet-lbmr.c
2
 * Routines for LBM Topic Resolution Packet dissection
3
 *
4
 * Copyright (c) 2005-2014 Informatica Corporation. All Rights Reserved.
5
 *
6
 * Wireshark - Network traffic analyzer
7
 * By Gerald Combs <gerald@wireshark.org>
8
 * Copyright 1998 Gerald Combs
9
 *
10
 * SPDX-License-Identifier: GPL-2.0-or-later
11
 */
12
13
#include "config.h"
14
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"
29
30
#define LBMR_MAX_NAMELEN 256
31
32
void proto_register_lbmr(void);
33
void proto_reg_handoff_lbmr(void);
34
35
/*----------------------------------------------------------------------------*/
36
/* LBT-IPC transport management.                                              */
37
/*----------------------------------------------------------------------------*/
38
39
typedef struct
40
{
41
    uint32_t host_id;
42
    uint32_t session_id;
43
    uint16_t xport_id;
44
    uint64_t channel;
45
} lbtipc_transport_t;
46
47
static wmem_tree_t * lbtipc_transport_table;
48
49
0
#define LBTIPC_KEY_ELEMENT_COUNT 3
50
0
#define LBTIPC_KEY_ELEMENT_HOST_ID 0
51
0
#define LBTIPC_KEY_ELEMENT_SESSION_ID 1
52
0
#define LBTIPC_KEY_ELEMENT_XPORT_ID 2
53
54
static void lbtipc_transport_init(void)
55
14
{
56
14
    lbtipc_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
57
14
}
58
59
static lbtipc_transport_t * lbtipc_transport_find(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
60
0
{
61
0
    lbtipc_transport_t * entry = NULL;
62
0
    uint32_t keyval[LBTIPC_KEY_ELEMENT_COUNT];
63
0
    wmem_tree_key_t tkey[2];
64
65
0
    keyval[LBTIPC_KEY_ELEMENT_HOST_ID] = host_id;
66
0
    keyval[LBTIPC_KEY_ELEMENT_SESSION_ID] = session_id;
67
0
    keyval[LBTIPC_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
68
0
    tkey[0].length = LBTIPC_KEY_ELEMENT_COUNT;
69
0
    tkey[0].key = keyval;
70
0
    tkey[1].length = 0;
71
0
    tkey[1].key = NULL;
72
0
    entry = (lbtipc_transport_t *) wmem_tree_lookup32_array(lbtipc_transport_table, tkey);
73
0
    return (entry);
74
0
}
75
76
static lbtipc_transport_t * lbtipc_transport_add(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
77
0
{
78
0
    lbtipc_transport_t * entry;
79
0
    uint32_t keyval[LBTIPC_KEY_ELEMENT_COUNT];
80
0
    wmem_tree_key_t tkey[2];
81
82
0
    entry = lbtipc_transport_find(host_id, session_id, xport_id);
83
0
    if (entry != NULL)
84
0
    {
85
0
        return (entry);
86
0
    }
87
0
    entry = wmem_new(wmem_file_scope(), lbtipc_transport_t);
88
0
    entry->host_id = host_id;
89
0
    entry->session_id = session_id;
90
0
    entry->xport_id = xport_id;
91
0
    entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTIPC);
92
0
    keyval[LBTIPC_KEY_ELEMENT_HOST_ID] = host_id;
93
0
    keyval[LBTIPC_KEY_ELEMENT_SESSION_ID] = session_id;
94
0
    keyval[LBTIPC_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
95
0
    tkey[0].length = LBTIPC_KEY_ELEMENT_COUNT;
96
0
    tkey[0].key = keyval;
97
0
    tkey[1].length = 0;
98
0
    tkey[1].key = NULL;
99
0
    wmem_tree_insert32_array(lbtipc_transport_table, tkey, (void *) entry);
100
0
    return (entry);
101
0
}
102
103
static char * lbtipc_transport_source_string(uint32_t host_id _U_, uint32_t session_id, uint16_t xport_id)
104
0
{
105
0
    return (wmem_strdup_printf(wmem_file_scope(), "LBT-IPC:%x:%" PRIu16, session_id, xport_id));
106
0
}
107
108
/*----------------------------------------------------------------------------*/
109
/* LBT-SMX transport management.                                              */
110
/*----------------------------------------------------------------------------*/
111
112
typedef struct
113
{
114
    uint32_t host_id;
115
    uint32_t session_id;
116
    uint16_t xport_id;
117
    uint64_t channel;
118
} lbtsmx_transport_t;
119
120
static wmem_tree_t * lbtsmx_transport_table;
121
122
0
#define LBTSMX_KEY_ELEMENT_COUNT 3
123
0
#define LBTSMX_KEY_ELEMENT_HOST_ID 0
124
0
#define LBTSMX_KEY_ELEMENT_SESSION_ID 1
125
0
#define LBTSMX_KEY_ELEMENT_XPORT_ID 2
126
127
static void lbtsmx_transport_init(void)
128
14
{
129
14
    lbtsmx_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
130
14
}
131
132
static lbtsmx_transport_t * lbtsmx_transport_find(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
133
0
{
134
0
    lbtsmx_transport_t * entry = NULL;
135
0
    uint32_t keyval[LBTSMX_KEY_ELEMENT_COUNT];
136
0
    wmem_tree_key_t tkey[2];
137
138
0
    keyval[LBTSMX_KEY_ELEMENT_HOST_ID] = host_id;
139
0
    keyval[LBTSMX_KEY_ELEMENT_SESSION_ID] = session_id;
140
0
    keyval[LBTSMX_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
141
0
    tkey[0].length = LBTSMX_KEY_ELEMENT_COUNT;
142
0
    tkey[0].key = keyval;
143
0
    tkey[1].length = 0;
144
0
    tkey[1].key = NULL;
145
0
    entry = (lbtsmx_transport_t *) wmem_tree_lookup32_array(lbtsmx_transport_table, tkey);
146
0
    return (entry);
147
0
}
148
149
static lbtsmx_transport_t * lbtsmx_transport_add(uint32_t host_id, uint32_t session_id, uint16_t xport_id)
150
0
{
151
0
    lbtsmx_transport_t * entry;
152
0
    uint32_t keyval[LBTSMX_KEY_ELEMENT_COUNT];
153
0
    wmem_tree_key_t tkey[2];
154
155
0
    entry = lbtsmx_transport_find(host_id, session_id, xport_id);
156
0
    if (entry != NULL)
157
0
    {
158
0
        return (entry);
159
0
    }
160
0
    entry = wmem_new(wmem_file_scope(), lbtsmx_transport_t);
161
0
    entry->host_id = host_id;
162
0
    entry->session_id = session_id;
163
0
    entry->xport_id = xport_id;
164
0
    entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTSMX);
165
0
    keyval[LBTSMX_KEY_ELEMENT_HOST_ID] = host_id;
166
0
    keyval[LBTSMX_KEY_ELEMENT_SESSION_ID] = session_id;
167
0
    keyval[LBTSMX_KEY_ELEMENT_XPORT_ID] = (uint32_t) xport_id;
168
0
    tkey[0].length = LBTSMX_KEY_ELEMENT_COUNT;
169
0
    tkey[0].key = keyval;
170
0
    tkey[1].length = 0;
171
0
    tkey[1].key = NULL;
172
0
    wmem_tree_insert32_array(lbtsmx_transport_table, tkey, (void *) entry);
173
0
    return (entry);
174
0
}
175
176
static char * lbtsmx_transport_source_string(uint32_t host_id _U_, uint32_t session_id, uint16_t xport_id)
177
0
{
178
0
    return (wmem_strdup_printf(wmem_file_scope(), "LBT-SMX:%x:%" PRIu16, session_id, xport_id));
179
0
}
180
181
/*----------------------------------------------------------------------------*/
182
/* LBT-RDMA transport management.                                             */
183
/*----------------------------------------------------------------------------*/
184
185
typedef struct
186
{
187
    address source_address;
188
    uint32_t session_id;
189
    uint16_t port;
190
    uint64_t channel;
191
} lbtrdma_transport_t;
192
193
static wmem_tree_t * lbtrdma_transport_table;
194
195
0
#define LBTRDMA_KEY_ELEMENT_COUNT          3
196
0
#define LBTRDMA_KEY_ELEMENT_SOURCE_ADDRESS 0
197
0
#define LBTRDMA_KEY_ELEMENT_SESSION_ID     1
198
0
#define LBTRDMA_KEY_ELEMENT_PORT           2
199
200
static void lbtrdma_transport_init(void)
201
14
{
202
14
    lbtrdma_transport_table = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope());
203
14
}
204
205
static void lbtrdma_transport_build_key(uint32_t * key_value, wmem_tree_key_t * key, const lbtrdma_transport_t * transport)
206
0
{
207
0
    uint32_t val;
208
209
0
    memcpy(&val, transport->source_address.data, sizeof(uint32_t));
210
0
    key_value[LBTRDMA_KEY_ELEMENT_SOURCE_ADDRESS] = val;
211
0
    key_value[LBTRDMA_KEY_ELEMENT_SESSION_ID] = transport->session_id;
212
0
    key_value[LBTRDMA_KEY_ELEMENT_PORT] = (uint32_t) transport->port;
213
0
    key[0].length = LBTRDMA_KEY_ELEMENT_COUNT;
214
0
    key[0].key = key_value;
215
0
    key[1].length = 0;
216
0
    key[1].key = NULL;
217
0
}
218
219
static lbtrdma_transport_t * lbtrdma_transport_find(const address * source_address, uint32_t session_id, uint16_t port)
220
0
{
221
0
    lbtrdma_transport_t key;
222
0
    lbtrdma_transport_t * entry = NULL;
223
0
    uint32_t keyval[LBTRDMA_KEY_ELEMENT_COUNT];
224
0
    wmem_tree_key_t tkey[2];
225
226
0
    memset((void *)&key, 0, sizeof(lbtrdma_transport_t));
227
0
    copy_address_shallow(&(key.source_address), source_address);
228
0
    key.session_id = session_id;
229
0
    key.port = port;
230
0
    lbtrdma_transport_build_key(keyval, tkey, &key);
231
0
    entry = (lbtrdma_transport_t *) wmem_tree_lookup32_array(lbtrdma_transport_table, tkey);
232
0
    return (entry);
233
0
}
234
235
static lbtrdma_transport_t * lbtrdma_transport_add(const address * source_address, uint32_t session_id, uint16_t port)
236
0
{
237
0
    lbtrdma_transport_t * entry;
238
0
    uint32_t keyval[LBTRDMA_KEY_ELEMENT_COUNT];
239
0
    wmem_tree_key_t tkey[2];
240
241
0
    entry = lbtrdma_transport_find(source_address, session_id, port);
242
0
    if (entry != NULL)
243
0
    {
244
0
        return (entry);
245
0
    }
246
0
    entry = wmem_new(wmem_file_scope(), lbtrdma_transport_t);
247
0
    copy_address_wmem(wmem_file_scope(), &(entry->source_address), source_address);
248
0
    entry->session_id = session_id;
249
0
    entry->port = port;
250
0
    entry->channel = lbm_channel_assign(LBM_CHANNEL_TRANSPORT_LBTRDMA);
251
0
    lbtrdma_transport_build_key(keyval, tkey, entry);
252
0
    wmem_tree_insert32_array(lbtrdma_transport_table, tkey, (void *) entry);
253
0
    return (entry);
254
0
}
255
256
static char * lbtrdma_transport_source_string(const address * source_address _U_, uint32_t session_id, uint16_t port)
257
0
{
258
0
    return (wmem_strdup_printf(wmem_file_scope(), "LBT-RDMA:%x:%" PRIu16, session_id, port));
259
0
}
260
261
/*----------------------------------------------------------------------------*/
262
/* Packet layouts.                                                            */
263
/*----------------------------------------------------------------------------*/
264
265
/* LBMR main header. */
266
typedef struct
267
{
268
    lbm_uint8_t ver_type;
269
    lbm_uint8_t tqrs;
270
    lbm_uint16_t tirs;
271
} lbmr_hdr_t;
272
0
#define O_LBMR_HDR_T_VER_TYPE OFFSETOF(lbmr_hdr_t, ver_type)
273
0
#define L_LBMR_HDR_T_VER_TYPE SIZEOF(lbmr_hdr_t, ver_type)
274
0
#define O_LBMR_HDR_T_TQRS OFFSETOF(lbmr_hdr_t, tqrs)
275
0
#define L_LBMR_HDR_T_TQRS SIZEOF(lbmr_hdr_t, tqrs)
276
0
#define O_LBMR_HDR_T_TIRS OFFSETOF(lbmr_hdr_t, tirs)
277
0
#define L_LBMR_HDR_T_TIRS SIZEOF(lbmr_hdr_t, tirs)
278
0
#define L_LBMR_HDR_T (int) sizeof(lbmr_hdr_t)
279
280
14
#define LBMR_HDR_VER_VER_MASK 0xf0
281
14
#define LBMR_HDR_VER_TYPE_MASK 0x07
282
0
#define LBMR_HDR_VER(x) (((x) & LBMR_HDR_VER_VER_MASK) >> 4)
283
0
#define LBMR_HDR_TYPE(x) ((x) & LBMR_HDR_VER_TYPE_MASK)
284
285
0
#define LBMR_HDR_TYPE_NORMAL 0x0
286
0
#define LBMR_HDR_TYPE_WC_TQRS 0x1
287
0
#define LBMR_HDR_TYPE_UCAST_RCV_ALIVE 0x2
288
0
#define LBMR_HDR_TYPE_UCAST_SRC_ALIVE 0x3
289
0
#define LBMR_HDR_TYPE_TOPIC_MGMT 0x4
290
0
#define LBMR_HDR_TYPE_QUEUE_RES 0x6
291
0
#define LBMR_HDR_TYPE_EXT 0x7
292
14
#define LBMR_HDR_TYPE_OPTS_MASK 0x8
293
294
/* LBMR extended header. */
295
typedef struct
296
{
297
    lbm_uint8_t ver_type;
298
    lbm_uint8_t ext_type;
299
    lbm_uint16_t dep;
300
} lbmr_hdr_ext_type_t;
301
0
#define O_LBMR_HDR_EXT_TYPE_T_VER_TYPE OFFSETOF(lbmr_hdr_ext_type_t, ver_type)
302
0
#define L_LBMR_HDR_EXT_TYPE_T_VER_TYPE SIZEOF(lbmr_hdr_ext_type_t, ver_type)
303
0
#define O_LBMR_HDR_EXT_TYPE_T_EXT_TYPE OFFSETOF(lbmr_hdr_ext_type_t, ext_type)
304
0
#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)
308
309
0
#define LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT 0x1
310
0
#define LBMR_HDR_EXT_TYPE_UMQ_QUEUE_MGMT 0x2
311
0
#define LBMR_HDR_EXT_TYPE_CONTEXT_INFO 0x3
312
0
#define LBMR_HDR_EXT_TYPE_TOPIC_RES_REQUEST 0x4
313
0
#define LBMR_HDR_EXT_TYPE_TNWG_MSG 0x5
314
0
#define LBMR_HDR_EXT_TYPE_REMOTE_DOMAIN_ROUTE 0x6
315
0
#define LBMR_HDR_EXT_TYPE_REMOTE_CONTEXT_INFO 0x7
316
317
/* LBMR topic information record */
318
typedef struct
319
{
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
0
#define O_LBMR_TIR_T_TRANSPORT OFFSETOF(lbmr_tir_t, transport)
326
14
#define L_LBMR_TIR_T_TRANSPORT SIZEOF(lbmr_tir_t, transport)
327
0
#define O_LBMR_TIR_T_TLEN OFFSETOF(lbmr_tir_t, tlen)
328
0
#define L_LBMR_TIR_T_TLEN SIZEOF(lbmr_tir_t, tlen)
329
0
#define O_LBMR_TIR_T_TTL OFFSETOF(lbmr_tir_t, ttl)
330
0
#define L_LBMR_TIR_T_TTL SIZEOF(lbmr_tir_t, ttl)
331
0
#define O_LBMR_TIR_T_INDEX OFFSETOF(lbmr_tir_t, idx)
332
0
#define L_LBMR_TIR_T_INDEX SIZEOF(lbmr_tir_t, idx)
333
0
#define L_LBMR_TIR_T (int) sizeof(lbmr_tir_t)
334
335
/* LBMR topic information record TCP option data */
336
typedef struct
337
{
338
    lbm_uint32_t ip;
339
    lbm_uint16_t port;
340
} lbmr_tir_tcp_t;
341
0
#define O_LBMR_TIR_TCP_T_IP OFFSETOF(lbmr_tir_tcp_t, ip)
342
0
#define L_LBMR_TIR_TCP_T_IP SIZEOF(lbmr_tir_tcp_t, ip)
343
0
#define O_LBMR_TIR_TCP_T_PORT OFFSETOF(lbmr_tir_tcp_t, port)
344
0
#define L_LBMR_TIR_TCP_T_PORT SIZEOF(lbmr_tir_tcp_t, port)
345
0
#define L_LBMR_TIR_TCP_T 6
346
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
0
#define O_LBMR_TIR_TCP_WITH_SID_T_IP OFFSETOF(lbmr_tir_tcp_with_sid_t, ip)
353
0
#define L_LBMR_TIR_TCP_WITH_SID_T_IP SIZEOF(lbmr_tir_tcp_with_sid_t, ip)
354
0
#define O_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID OFFSETOF(lbmr_tir_tcp_with_sid_t, session_id)
355
0
#define L_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID SIZEOF(lbmr_tir_tcp_with_sid_t, session_id)
356
0
#define O_LBMR_TIR_TCP_WITH_SID_T_PORT OFFSETOF(lbmr_tir_tcp_with_sid_t, port)
357
0
#define L_LBMR_TIR_TCP_WITH_SID_T_PORT SIZEOF(lbmr_tir_tcp_with_sid_t, port)
358
0
#define L_LBMR_TIR_TCP_WITH_SID_T 10
359
360
/* LBMR topic information record LBT-RM option data */
361
typedef struct
362
{
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
0
#define O_LBMR_TIR_LBTRM_T_SRC_ADDR OFFSETOF(lbmr_tir_lbtrm_t, src_addr)
370
0
#define L_LBMR_TIR_LBTRM_T_SRC_ADDR SIZEOF(lbmr_tir_lbtrm_t, src_addr)
371
0
#define O_LBMR_TIR_LBTRM_T_MCAST_ADDR OFFSETOF(lbmr_tir_lbtrm_t, mcast_addr)
372
0
#define L_LBMR_TIR_LBTRM_T_MCAST_ADDR SIZEOF(lbmr_tir_lbtrm_t, mcast_addr)
373
0
#define O_LBMR_TIR_LBTRM_T_SESSION_ID OFFSETOF(lbmr_tir_lbtrm_t, session_id)
374
0
#define L_LBMR_TIR_LBTRM_T_SESSION_ID SIZEOF(lbmr_tir_lbtrm_t, session_id)
375
0
#define O_LBMR_TIR_LBTRM_T_UDP_DEST_PORT OFFSETOF(lbmr_tir_lbtrm_t, udp_dest_port)
376
0
#define L_LBMR_TIR_LBTRM_T_UDP_DEST_PORT SIZEOF(lbmr_tir_lbtrm_t, udp_dest_port)
377
0
#define O_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT OFFSETOF(lbmr_tir_lbtrm_t, src_ucast_port)
378
0
#define L_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT SIZEOF(lbmr_tir_lbtrm_t, src_ucast_port)
379
0
#define L_LBMR_TIR_LBTRM_T (int) sizeof(lbmr_tir_lbtrm_t)
380
381
/* LBMR topic information record LBT-RU option data */
382
typedef struct
383
{
384
    lbm_uint32_t ip;
385
    lbm_uint16_t port;
386
} lbmr_tir_lbtru_t;
387
0
#define O_LBMR_TIR_LBTRU_T_IP OFFSETOF(lbmr_tir_lbtru_t, ip)
388
0
#define L_LBMR_TIR_LBTRU_T_IP SIZEOF(lbmr_tir_lbtru_t, ip)
389
0
#define O_LBMR_TIR_LBTRU_T_PORT OFFSETOF(lbmr_tir_lbtru_t, port)
390
0
#define L_LBMR_TIR_LBTRU_T_PORT SIZEOF(lbmr_tir_lbtru_t, port)
391
0
#define L_LBMR_TIR_LBTRU_T 6
392
393
typedef struct
394
{
395
    lbm_uint32_t ip;
396
    lbm_uint32_t session_id;
397
    lbm_uint16_t port;
398
} lbmr_tir_lbtru_with_sid_t;
399
0
#define O_LBMR_TIR_LBTRU_WITH_SID_T_IP OFFSETOF(lbmr_tir_lbtru_with_sid_t, ip)
400
0
#define L_LBMR_TIR_LBTRU_WITH_SID_T_IP SIZEOF(lbmr_tir_lbtru_with_sid_t, ip)
401
0
#define O_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID OFFSETOF(lbmr_tir_lbtru_with_sid_t, session_id)
402
0
#define L_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID SIZEOF(lbmr_tir_lbtru_with_sid_t, session_id)
403
0
#define O_LBMR_TIR_LBTRU_WITH_SID_T_PORT OFFSETOF(lbmr_tir_lbtru_with_sid_t, port)
404
0
#define L_LBMR_TIR_LBTRU_WITH_SID_T_PORT SIZEOF(lbmr_tir_lbtru_with_sid_t, port)
405
0
#define L_LBMR_TIR_LBTRU_WITH_SID_T 10
406
407
/* LBMR topic information record LBT-IPC option data */
408
typedef struct
409
{
410
    lbm_uint32_t host_id;
411
    lbm_uint32_t session_id;
412
    lbm_uint16_t xport_id;
413
} lbmr_tir_lbtipc_t;
414
0
#define O_LBMR_TIR_LBTIPC_T_HOST_ID OFFSETOF(lbmr_tir_lbtipc_t, host_id)
415
0
#define L_LBMR_TIR_LBTIPC_T_HOST_ID SIZEOF(lbmr_tir_lbtipc_t, host_id)
416
0
#define O_LBMR_TIR_LBTIPC_T_SESSION_ID OFFSETOF(lbmr_tir_lbtipc_t, session_id)
417
0
#define L_LBMR_TIR_LBTIPC_T_SESSION_ID SIZEOF(lbmr_tir_lbtipc_t, session_id)
418
0
#define O_LBMR_TIR_LBTIPC_T_XPORT_ID OFFSETOF(lbmr_tir_lbtipc_t, xport_id)
419
0
#define L_LBMR_TIR_LBTIPC_T_XPORT_ID SIZEOF(lbmr_tir_lbtipc_t, xport_id)
420
0
#define L_LBMR_TIR_LBTIPC_T 10
421
422
/* LBMR topic information record LBT-RDMA option data */
423
typedef struct
424
{
425
    lbm_uint32_t ip;
426
    lbm_uint32_t session_id;
427
    lbm_uint16_t port;
428
} lbmr_tir_lbtrdma_t;
429
0
#define O_LBMR_TIR_LBTRDMA_T_IP OFFSETOF(lbmr_tir_lbtrdma_t, ip)
430
0
#define L_LBMR_TIR_LBTRDMA_T_IP SIZEOF(lbmr_tir_lbtrdma_t, ip)
431
0
#define O_LBMR_TIR_LBTRDMA_T_SESSION_ID OFFSETOF(lbmr_tir_lbtrdma_t, session_id)
432
0
#define L_LBMR_TIR_LBTRDMA_T_SESSION_ID SIZEOF(lbmr_tir_lbtrdma_t, session_id)
433
0
#define O_LBMR_TIR_LBTRDMA_T_PORT OFFSETOF(lbmr_tir_lbtrdma_t, port)
434
0
#define L_LBMR_TIR_LBTRDMA_T_PORT SIZEOF(lbmr_tir_lbtrdma_t, port)
435
0
#define L_LBMR_TIR_LBTRDMA_T 10
436
437
/* LBMR topic information record LBT-SMX option data */
438
typedef struct
439
{
440
    lbm_uint32_t host_id;
441
    lbm_uint32_t session_id;
442
    lbm_uint16_t xport_id;
443
} lbmr_tir_lbtsmx_t;
444
0
#define O_LBMR_TIR_LBTSMX_T_HOST_ID OFFSETOF(lbmr_tir_lbtsmx_t, host_id)
445
0
#define L_LBMR_TIR_LBTSMX_T_HOST_ID SIZEOF(lbmr_tir_lbtsmx_t, host_id)
446
0
#define O_LBMR_TIR_LBTSMX_T_SESSION_ID OFFSETOF(lbmr_tir_lbtsmx_t, session_id)
447
0
#define L_LBMR_TIR_LBTSMX_T_SESSION_ID SIZEOF(lbmr_tir_lbtsmx_t, session_id)
448
0
#define O_LBMR_TIR_LBTSMX_T_XPORT_ID OFFSETOF(lbmr_tir_lbtsmx_t, xport_id)
449
0
#define L_LBMR_TIR_LBTSMX_T_XPORT_ID SIZEOF(lbmr_tir_lbtsmx_t, xport_id)
450
0
#define L_LBMR_TIR_LBTSMX_T 10
451
452
14
#define LBMR_TIR_TRANSPORT 0x7F
453
14
#define LBMR_TIR_OPTIONS 0x80
454
455
/* LBMR topic option */
456
typedef struct
457
{
458
    lbm_uint8_t type;
459
    lbm_uint8_t len;
460
    lbm_uint16_t flags;
461
} lbmr_topic_opt_t;
462
0
#define O_LBMR_TOPIC_OPT_T_TYPE OFFSETOF(lbmr_topic_opt_t, type)
463
0
#define L_LBMR_TOPIC_OPT_T_TYPE SIZEOF(lbmr_topic_opt_t, type)
464
0
#define O_LBMR_TOPIC_OPT_T_LEN OFFSETOF(lbmr_topic_opt_t, len)
465
0
#define L_LBMR_TOPIC_OPT_T_LEN SIZEOF(lbmr_topic_opt_t, len)
466
0
#define O_LBMR_TOPIC_OPT_T_FLAGS OFFSETOF(lbmr_topic_opt_t, flags)
467
84
#define L_LBMR_TOPIC_OPT_T_FLAGS SIZEOF(lbmr_topic_opt_t, flags)
468
0
#define L_LBMR_TOPIC_OPT_T (int) sizeof(lbmr_topic_opt_t)
469
470
#define LBMR_TOPIC_OPT_FLAG_IGNORE 0x8000
471
472
/* LBMR topic option length */
473
typedef struct
474
{
475
    lbm_uint8_t type;
476
    lbm_uint8_t len;
477
    lbm_uint16_t total_len;
478
} lbmr_topic_opt_len_t;
479
0
#define O_LBMR_TOPIC_OPT_LEN_T_TYPE OFFSETOF(lbmr_topic_opt_len_t, type)
480
0
#define L_LBMR_TOPIC_OPT_LEN_T_TYPE SIZEOF(lbmr_topic_opt_len_t, type)
481
0
#define O_LBMR_TOPIC_OPT_LEN_T_LEN OFFSETOF(lbmr_topic_opt_len_t, len)
482
0
#define L_LBMR_TOPIC_OPT_LEN_T_LEN SIZEOF(lbmr_topic_opt_len_t, len)
483
0
#define O_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN OFFSETOF(lbmr_topic_opt_len_t, total_len)
484
0
#define L_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN SIZEOF(lbmr_topic_opt_len_t, total_len)
485
0
#define L_LBMR_TOPIC_OPT_LEN_T (int) sizeof(lbmr_topic_opt_len_t)
486
487
#define LBMR_TOPIC_OPT_LEN_TYPE 0x00
488
#define LBMR_TOPIC_OPT_LEN_SZ 4
489
490
/* LBMR topic UME option */
491
typedef struct
492
{
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
0
#define O_LBMR_TOPIC_OPT_UME_T_TYPE OFFSETOF(lbmr_topic_opt_ume_t, type)
506
0
#define L_LBMR_TOPIC_OPT_UME_T_TYPE SIZEOF(lbmr_topic_opt_ume_t, type)
507
0
#define O_LBMR_TOPIC_OPT_UME_T_LEN OFFSETOF(lbmr_topic_opt_ume_t, len)
508
0
#define L_LBMR_TOPIC_OPT_UME_T_LEN SIZEOF(lbmr_topic_opt_ume_t, len)
509
0
#define O_LBMR_TOPIC_OPT_UME_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_t, flags)
510
70
#define L_LBMR_TOPIC_OPT_UME_T_FLAGS SIZEOF(lbmr_topic_opt_ume_t, flags)
511
0
#define O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_t, store_tcp_port)
512
0
#define L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_PORT SIZEOF(lbmr_topic_opt_ume_t, store_tcp_port)
513
0
#define O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_t, src_tcp_port)
514
0
#define L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_ume_t, src_tcp_port)
515
0
#define O_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR OFFSETOF(lbmr_topic_opt_ume_t, store_tcp_addr)
516
0
#define L_LBMR_TOPIC_OPT_UME_T_STORE_TCP_ADDR SIZEOF(lbmr_topic_opt_ume_t, store_tcp_addr)
517
0
#define O_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR OFFSETOF(lbmr_topic_opt_ume_t, src_tcp_addr)
518
0
#define L_LBMR_TOPIC_OPT_UME_T_SRC_TCP_ADDR SIZEOF(lbmr_topic_opt_ume_t, src_tcp_addr)
519
0
#define O_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID OFFSETOF(lbmr_topic_opt_ume_t, src_reg_id)
520
0
#define L_LBMR_TOPIC_OPT_UME_T_SRC_REG_ID SIZEOF(lbmr_topic_opt_ume_t, src_reg_id)
521
0
#define O_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX OFFSETOF(lbmr_topic_opt_ume_t, transport_idx)
522
0
#define L_LBMR_TOPIC_OPT_UME_T_TRANSPORT_IDX SIZEOF(lbmr_topic_opt_ume_t, transport_idx)
523
0
#define O_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM OFFSETOF(lbmr_topic_opt_ume_t, high_seqnum)
524
0
#define L_LBMR_TOPIC_OPT_UME_T_HIGH_SEQNUM SIZEOF(lbmr_topic_opt_ume_t, high_seqnum)
525
0
#define O_LBMR_TOPIC_OPT_UME_T_LOW_SEQNUM OFFSETOF(lbmr_topic_opt_ume_t, low_seqnum)
526
0
#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)
528
529
0
#define LBMR_TOPIC_OPT_UME_TYPE 0x01
530
14
#define LBMR_TOPIC_OPT_UME_FLAG_IGNORE 0x8000
531
14
#define LBMR_TOPIC_OPT_UME_FLAG_LATEJOIN 0x4000
532
14
#define LBMR_TOPIC_OPT_UME_FLAG_STORE 0x2000
533
14
#define LBMR_TOPIC_OPT_UME_FLAG_QCCAP 0x1000
534
14
#define LBMR_TOPIC_OPT_UME_FLAG_ACKTOSRC 0x800
535
#define LBMR_TOPIC_OPT_UME_SZ 32
536
537
/* LBMR topic UME store option */
538
typedef struct
539
{
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
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_TYPE OFFSETOF(lbmr_topic_opt_ume_store_t, type)
550
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_TYPE SIZEOF(lbmr_topic_opt_ume_store_t, type)
551
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_LEN OFFSETOF(lbmr_topic_opt_ume_store_t, len)
552
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_LEN SIZEOF(lbmr_topic_opt_ume_store_t, len)
553
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_store_t, flags)
554
14
#define L_LBMR_TOPIC_OPT_UME_STORE_T_FLAGS SIZEOF(lbmr_topic_opt_ume_store_t, flags)
555
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX OFFSETOF(lbmr_topic_opt_ume_store_t, grp_idx)
556
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_GRP_IDX SIZEOF(lbmr_topic_opt_ume_store_t, grp_idx)
557
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT OFFSETOF(lbmr_topic_opt_ume_store_t, store_tcp_port)
558
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_TCP_PORT SIZEOF(lbmr_topic_opt_ume_store_t, store_tcp_port)
559
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX OFFSETOF(lbmr_topic_opt_ume_store_t, store_idx)
560
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IDX SIZEOF(lbmr_topic_opt_ume_store_t, store_idx)
561
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR OFFSETOF(lbmr_topic_opt_ume_store_t, store_ip_addr)
562
0
#define L_LBMR_TOPIC_OPT_UME_STORE_T_STORE_IP_ADDR SIZEOF(lbmr_topic_opt_ume_store_t, store_ip_addr)
563
0
#define O_LBMR_TOPIC_OPT_UME_STORE_T_SRC_REG_ID OFFSETOF(lbmr_topic_opt_ume_store_t, src_reg_id)
564
0
#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)
566
567
0
#define LBMR_TOPIC_OPT_UME_STORE_TYPE 0x02
568
14
#define LBMR_TOPIC_OPT_UME_STORE_FLAG_IGNORE 0x80
569
#define LBMR_TOPIC_OPT_UME_STORE_SZ 16
570
571
/* LBMR topic UME store group option */
572
typedef struct
573
{
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
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE OFFSETOF(lbmr_topic_opt_ume_store_group_t, type)
582
0
#define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_TYPE SIZEOF(lbmr_topic_opt_ume_store_group_t, type)
583
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN OFFSETOF(lbmr_topic_opt_ume_store_group_t, len)
584
0
#define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_LEN SIZEOF(lbmr_topic_opt_ume_store_group_t, len)
585
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS OFFSETOF(lbmr_topic_opt_ume_store_group_t, flags)
586
14
#define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_FLAGS SIZEOF(lbmr_topic_opt_ume_store_group_t, flags)
587
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX OFFSETOF(lbmr_topic_opt_ume_store_group_t, grp_idx)
588
0
#define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_IDX SIZEOF(lbmr_topic_opt_ume_store_group_t, grp_idx)
589
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ OFFSETOF(lbmr_topic_opt_ume_store_group_t, grp_sz)
590
0
#define L_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_GRP_SZ SIZEOF(lbmr_topic_opt_ume_store_group_t, grp_sz)
591
0
#define O_LBMR_TOPIC_OPT_UME_STORE_GROUP_T_RESERVED OFFSETOF(lbmr_topic_opt_ume_store_group_t, reserved)
592
0
#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)
594
595
0
#define LBMR_TOPIC_OPT_UME_STORE_GROUP_TYPE 0x03
596
14
#define LBMR_TOPIC_OPT_UME_STORE_GROUP_FLAG_IGNORE 0x80
597
#define LBMR_TOPIC_OPT_UME_STORE_GROUP_SZ 8
598
599
/* LBMR topic latejoin option */
600
typedef struct
601
{
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
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE OFFSETOF(lbmr_topic_opt_latejoin_t, type)
613
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_TYPE SIZEOF(lbmr_topic_opt_latejoin_t, type)
614
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_LEN OFFSETOF(lbmr_topic_opt_latejoin_t, len)
615
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_LEN SIZEOF(lbmr_topic_opt_latejoin_t, len)
616
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS OFFSETOF(lbmr_topic_opt_latejoin_t, flags)
617
28
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_FLAGS SIZEOF(lbmr_topic_opt_latejoin_t, flags)
618
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_latejoin_t, src_tcp_port)
619
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_latejoin_t, src_tcp_port)
620
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED OFFSETOF(lbmr_topic_opt_latejoin_t, reserved)
621
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_RESERVED SIZEOF(lbmr_topic_opt_latejoin_t, reserved)
622
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_latejoin_t, src_ip_addr)
623
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_latejoin_t, src_ip_addr)
624
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX OFFSETOF(lbmr_topic_opt_latejoin_t, transport_idx)
625
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_TRANSPORT_IDX SIZEOF(lbmr_topic_opt_latejoin_t, transport_idx)
626
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM OFFSETOF(lbmr_topic_opt_latejoin_t, high_seqnum)
627
0
#define L_LBMR_TOPIC_OPT_LATEJOIN_T_HIGH_SEQNUM SIZEOF(lbmr_topic_opt_latejoin_t, high_seqnum)
628
0
#define O_LBMR_TOPIC_OPT_LATEJOIN_T_LOW_SEQNUM OFFSETOF(lbmr_topic_opt_latejoin_t, low_seqnum)
629
0
#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)
631
632
0
#define LBMR_TOPIC_OPT_LATEJOIN_TYPE 0x04
633
14
#define LBMR_TOPIC_OPT_LATEJOIN_FLAG_IGNORE 0x8000
634
14
#define LBMR_TOPIC_OPT_LATEJOIN_FLAG_ACKTOSRC 0x4000
635
#define LBMR_TOPIC_OPT_LATEJOIN_SZ 24
636
637
/* LBMR topic queue control option */
638
typedef struct
639
{
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
0
#define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE OFFSETOF(lbmr_topic_opt_umq_rcridx_t, type)
646
0
#define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_TYPE SIZEOF(lbmr_topic_opt_umq_rcridx_t, type)
647
0
#define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN OFFSETOF(lbmr_topic_opt_umq_rcridx_t, len)
648
0
#define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_LEN SIZEOF(lbmr_topic_opt_umq_rcridx_t, len)
649
0
#define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS OFFSETOF(lbmr_topic_opt_umq_rcridx_t, flags)
650
14
#define L_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_FLAGS SIZEOF(lbmr_topic_opt_umq_rcridx_t, flags)
651
0
#define O_LBMR_TOPIC_OPT_UMQ_RCRIDX_T_RCR_IDX OFFSETOF(lbmr_topic_opt_umq_rcridx_t, rcr_idx)
652
0
#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)
654
655
0
#define LBMR_TOPIC_OPT_UMQ_RCRIDX_TYPE 0x05
656
#define LBMR_TOPIC_OPT_UMQ_RCRIDX_SZ 8
657
14
#define LBMR_TOPIC_OPT_UMQ_RCRIDX_FLAG_IGNORE 0x8000
658
659
0
#define LBMR_TOPIC_OPT_UMQ_QINFO_TYPE 0x06
660
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_IGNORE 0x8000
661
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_QUEUE 0x4000
662
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_RCVLISTEN 0x2000
663
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_CONTROL 0x1000
664
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_SRCRCVLISTEN 0x0800
665
14
#define LBMR_TOPIC_OPT_UMQ_FLAG_PARTICIPANTS_ONLY 0x0400
666
#define LBMR_TOPIC_OPT_UMQ_MAX_QNAME_LEN 252
667
668
/* LBMR topic ULB option */
669
typedef struct
670
{
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
0
#define O_LBMR_TOPIC_OPT_ULB_T_TYPE OFFSETOF(lbmr_topic_opt_ulb_t, type)
682
0
#define L_LBMR_TOPIC_OPT_ULB_T_TYPE SIZEOF(lbmr_topic_opt_ulb_t, type)
683
0
#define O_LBMR_TOPIC_OPT_ULB_T_LEN OFFSETOF(lbmr_topic_opt_ulb_t, len)
684
0
#define L_LBMR_TOPIC_OPT_ULB_T_LEN SIZEOF(lbmr_topic_opt_ulb_t, len)
685
0
#define O_LBMR_TOPIC_OPT_ULB_T_FLAGS OFFSETOF(lbmr_topic_opt_ulb_t, flags)
686
14
#define L_LBMR_TOPIC_OPT_ULB_T_FLAGS SIZEOF(lbmr_topic_opt_ulb_t, flags)
687
0
#define O_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID OFFSETOF(lbmr_topic_opt_ulb_t, queue_id)
688
0
#define L_LBMR_TOPIC_OPT_ULB_T_QUEUE_ID SIZEOF(lbmr_topic_opt_ulb_t, queue_id)
689
0
#define O_LBMR_TOPIC_OPT_ULB_T_REGID OFFSETOF(lbmr_topic_opt_ulb_t, regid)
690
0
#define L_LBMR_TOPIC_OPT_ULB_T_REGID SIZEOF(lbmr_topic_opt_ulb_t, regid)
691
0
#define O_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID OFFSETOF(lbmr_topic_opt_ulb_t, ulb_src_id)
692
0
#define L_LBMR_TOPIC_OPT_ULB_T_ULB_SRC_ID SIZEOF(lbmr_topic_opt_ulb_t, ulb_src_id)
693
0
#define O_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_ulb_t, src_ip_addr)
694
0
#define L_LBMR_TOPIC_OPT_ULB_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_ulb_t, src_ip_addr)
695
0
#define O_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_ulb_t, src_tcp_port)
696
0
#define L_LBMR_TOPIC_OPT_ULB_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_ulb_t, src_tcp_port)
697
0
#define O_LBMR_TOPIC_OPT_ULB_T_RESERVED OFFSETOF(lbmr_topic_opt_ulb_t, reserved)
698
0
#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)
700
701
0
#define LBMR_TOPIC_OPT_ULB_TYPE 0x0B
702
14
#define LBMR_TOPIC_OPT_ULB_FLAG_IGNORE 0x8000
703
#define LBMR_TOPIC_OPT_ULB_SZ 28
704
705
/* LBMR topic cost option */
706
typedef struct
707
{
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
0
#define O_LBMR_TOPIC_OPT_COST_T_TYPE OFFSETOF(lbmr_topic_opt_cost_t, type)
715
0
#define L_LBMR_TOPIC_OPT_COST_T_TYPE SIZEOF(lbmr_topic_opt_cost_t, type)
716
0
#define O_LBMR_TOPIC_OPT_COST_T_LEN OFFSETOF(lbmr_topic_opt_cost_t, len)
717
0
#define L_LBMR_TOPIC_OPT_COST_T_LEN SIZEOF(lbmr_topic_opt_cost_t, len)
718
0
#define O_LBMR_TOPIC_OPT_COST_T_FLAGS OFFSETOF(lbmr_topic_opt_cost_t, flags)
719
14
#define L_LBMR_TOPIC_OPT_COST_T_FLAGS SIZEOF(lbmr_topic_opt_cost_t, flags)
720
0
#define O_LBMR_TOPIC_OPT_COST_T_HOP_COUNT OFFSETOF(lbmr_topic_opt_cost_t, hop_count)
721
0
#define L_LBMR_TOPIC_OPT_COST_T_HOP_COUNT SIZEOF(lbmr_topic_opt_cost_t, hop_count)
722
0
#define O_LBMR_TOPIC_OPT_COST_T_COST OFFSETOF(lbmr_topic_opt_cost_t, cost)
723
0
#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)
725
726
0
#define LBMR_TOPIC_OPT_COST_TYPE 0x07
727
14
#define LBMR_TOPIC_OPT_COST_FLAG_IGNORE 0x80
728
#define LBMR_TOPIC_OPT_COST_SZ 8
729
730
/* LBMR topic originating transport ID option */
731
typedef struct
732
{
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
0
#define O_LBMR_TOPIC_OPT_OTID_T_TYPE OFFSETOF(lbmr_topic_opt_otid_t, type)
739
0
#define L_LBMR_TOPIC_OPT_OTID_T_TYPE SIZEOF(lbmr_topic_opt_otid_t, type)
740
0
#define O_LBMR_TOPIC_OPT_OTID_T_LEN OFFSETOF(lbmr_topic_opt_otid_t, len)
741
0
#define L_LBMR_TOPIC_OPT_OTID_T_LEN SIZEOF(lbmr_topic_opt_otid_t, len)
742
0
#define O_LBMR_TOPIC_OPT_OTID_T_FLAGS OFFSETOF(lbmr_topic_opt_otid_t, flags)
743
14
#define L_LBMR_TOPIC_OPT_OTID_T_FLAGS SIZEOF(lbmr_topic_opt_otid_t, flags)
744
0
#define O_LBMR_TOPIC_OPT_OTID_T_ORIGINATING_TRANSPORT OFFSETOF(lbmr_topic_opt_otid_t, originating_transport)
745
0
#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)
747
748
0
#define LBMR_TOPIC_OPT_OTID_TYPE 0x08
749
14
#define LBMR_TOPIC_OPT_OTID_FLAG_IGNORE 0x8000
750
#define LBMR_TOPIC_OPT_OTID_SZ 36
751
752
/* LBMR topic context instance transport option */
753
typedef struct
754
{
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
0
#define O_LBMR_TOPIC_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinst_t, type)
762
0
#define L_LBMR_TOPIC_OPT_CTXINST_T_TYPE SIZEOF(lbmr_topic_opt_ctxinst_t, type)
763
0
#define O_LBMR_TOPIC_OPT_CTXINST_T_LEN OFFSETOF(lbmr_topic_opt_ctxinst_t, len)
764
0
#define L_LBMR_TOPIC_OPT_CTXINST_T_LEN SIZEOF(lbmr_topic_opt_ctxinst_t, len)
765
0
#define O_LBMR_TOPIC_OPT_CTXINST_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinst_t, flags)
766
14
#define L_LBMR_TOPIC_OPT_CTXINST_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinst_t, flags)
767
0
#define O_LBMR_TOPIC_OPT_CTXINST_T_RES OFFSETOF(lbmr_topic_opt_ctxinst_t, res)
768
0
#define L_LBMR_TOPIC_OPT_CTXINST_T_RES SIZEOF(lbmr_topic_opt_ctxinst_t, res)
769
0
#define O_LBMR_TOPIC_OPT_CTXINST_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinst_t, ctxinst)
770
0
#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)
772
773
0
#define LBMR_TOPIC_OPT_CTXINST_TYPE 0x09
774
14
#define LBMR_TOPIC_OPT_CTXINST_FLAG_IGNORE 0x80
775
#define LBMR_TOPIC_OPT_CTXINST_SZ 12
776
777
/* LBMR topic context instance store transport option */
778
typedef struct
779
{
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
0
#define O_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinsts_t, type)
787
0
#define L_LBMR_TOPIC_OPT_CTXINSTS_T_TYPE SIZEOF(lbmr_topic_opt_ctxinsts_t, type)
788
0
#define O_LBMR_TOPIC_OPT_CTXINSTS_T_LEN OFFSETOF(lbmr_topic_opt_ctxinsts_t, len)
789
0
#define L_LBMR_TOPIC_OPT_CTXINSTS_T_LEN SIZEOF(lbmr_topic_opt_ctxinsts_t, len)
790
0
#define O_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinsts_t, flags)
791
14
#define L_LBMR_TOPIC_OPT_CTXINSTS_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinsts_t, flags)
792
0
#define O_LBMR_TOPIC_OPT_CTXINSTS_T_IDX OFFSETOF(lbmr_topic_opt_ctxinsts_t, idx)
793
0
#define L_LBMR_TOPIC_OPT_CTXINSTS_T_IDX SIZEOF(lbmr_topic_opt_ctxinsts_t, idx)
794
0
#define O_LBMR_TOPIC_OPT_CTXINSTS_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinsts_t, ctxinst)
795
0
#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)
797
798
0
#define LBMR_TOPIC_OPT_CTXINSTS_TYPE 0x0A
799
14
#define LBMR_TOPIC_OPT_CTXINSTS_FLAG_IGNORE 0x80
800
#define LBMR_TOPIC_OPT_CTXINSTS_SZ 12
801
802
/* LBMR topic context instance queue transport option */
803
typedef struct
804
{
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
0
#define O_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE OFFSETOF(lbmr_topic_opt_ctxinstq_t, type)
812
0
#define L_LBMR_TOPIC_OPT_CTXINSTQ_T_TYPE SIZEOF(lbmr_topic_opt_ctxinstq_t, type)
813
0
#define O_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN OFFSETOF(lbmr_topic_opt_ctxinstq_t, len)
814
0
#define L_LBMR_TOPIC_OPT_CTXINSTQ_T_LEN SIZEOF(lbmr_topic_opt_ctxinstq_t, len)
815
0
#define O_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS OFFSETOF(lbmr_topic_opt_ctxinstq_t, flags)
816
14
#define L_LBMR_TOPIC_OPT_CTXINSTQ_T_FLAGS SIZEOF(lbmr_topic_opt_ctxinstq_t, flags)
817
0
#define O_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX OFFSETOF(lbmr_topic_opt_ctxinstq_t, idx)
818
0
#define L_LBMR_TOPIC_OPT_CTXINSTQ_T_IDX SIZEOF(lbmr_topic_opt_ctxinstq_t, idx)
819
0
#define O_LBMR_TOPIC_OPT_CTXINSTQ_T_CTXINST OFFSETOF(lbmr_topic_opt_ctxinstq_t, ctxinst)
820
0
#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)
822
823
0
#define LBMR_TOPIC_OPT_CTXINSTQ_TYPE 0x0C
824
14
#define LBMR_TOPIC_OPT_CTXINSTQ_FLAG_IGNORE 0x80
825
#define LBMR_TOPIC_OPT_CTXINSTQ_SZ 12
826
827
/* LBMR topic domain ID option */
828
typedef struct
829
{
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
0
#define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE OFFSETOF(lbmr_topic_opt_domain_id_t, type)
836
0
#define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_TYPE SIZEOF(lbmr_topic_opt_domain_id_t, type)
837
0
#define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN OFFSETOF(lbmr_topic_opt_domain_id_t, len)
838
0
#define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_LEN SIZEOF(lbmr_topic_opt_domain_id_t, len)
839
0
#define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS OFFSETOF(lbmr_topic_opt_domain_id_t, flags)
840
14
#define L_LBMR_TOPIC_OPT_DOMAIN_ID_T_FLAGS SIZEOF(lbmr_topic_opt_domain_id_t, flags)
841
0
#define O_LBMR_TOPIC_OPT_DOMAIN_ID_T_DOMAIN_ID OFFSETOF(lbmr_topic_opt_domain_id_t, domain_id)
842
0
#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)
844
845
0
#define LBMR_TOPIC_OPT_DOMAIN_ID_TYPE 0x0D
846
14
#define LBMR_TOPIC_OPT_DOMAIN_ID_FLAG_IGNORE 0x8000
847
#define LBMR_TOPIC_OPT_DOMAIN_ID_SZ 8
848
849
/* LBMR topic extended functionality option */
850
typedef struct
851
{
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
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_TYPE OFFSETOF(lbmr_topic_opt_exfunc_t, type)
861
0
#define L_LBMR_TOPIC_OPT_EXFUNC_T_TYPE SIZEOF(lbmr_topic_opt_exfunc_t, type)
862
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_LEN OFFSETOF(lbmr_topic_opt_exfunc_t, len)
863
0
#define L_LBMR_TOPIC_OPT_EXFUNC_T_LEN SIZEOF(lbmr_topic_opt_exfunc_t, len)
864
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS OFFSETOF(lbmr_topic_opt_exfunc_t, flags)
865
14
#define L_LBMR_TOPIC_OPT_EXFUNC_T_FLAGS SIZEOF(lbmr_topic_opt_exfunc_t, flags)
866
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT OFFSETOF(lbmr_topic_opt_exfunc_t, src_tcp_port)
867
0
#define L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_TCP_PORT SIZEOF(lbmr_topic_opt_exfunc_t, src_tcp_port)
868
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED OFFSETOF(lbmr_topic_opt_exfunc_t, reserved)
869
0
#define L_LBMR_TOPIC_OPT_EXFUNC_T_RESERVED SIZEOF(lbmr_topic_opt_exfunc_t, reserved)
870
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR OFFSETOF(lbmr_topic_opt_exfunc_t, src_ip_addr)
871
0
#define L_LBMR_TOPIC_OPT_EXFUNC_T_SRC_IP_ADDR SIZEOF(lbmr_topic_opt_exfunc_t, src_ip_addr)
872
0
#define O_LBMR_TOPIC_OPT_EXFUNC_T_FUNCTIONALITY_FLAGS OFFSETOF(lbmr_topic_opt_exfunc_t, functionality_flags)
873
56
#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)
875
876
0
#define LBMR_TOPIC_OPT_EXFUNC_TYPE 0x0E
877
14
#define LBMR_TOPIC_OPT_EXFUNC_FLAG_IGNORE 0x8000
878
#define LBMR_TOPIC_OPT_EXFUNC_SZ 16
879
880
/* Transports */
881
0
#define LBMR_TRANSPORT_TCP 0x00
882
0
#define LBMR_TRANSPORT_LBTRU 0x01
883
#define LBMR_TRANSPORT_TCP6 0x02
884
0
#define LBMR_TRANSPORT_LBTSMX 0x4
885
0
#define LBMR_TRANSPORT_LBTRM 0x10
886
0
#define LBMR_TRANSPORT_LBTIPC 0x40
887
0
#define LBMR_TRANSPORT_LBTRDMA 0x20
888
#define LBMR_TRANSPORT_PGM 0x11
889
890
#define LBMR_TRANSPORT_OPTION_MASK 0x80
891
892
/* LBMR context info */
893
typedef struct
894
{
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
0
#define O_LBMR_CTXINFO_T_LEN OFFSETOF(lbmr_ctxinfo_t, len)
909
0
#define L_LBMR_CTXINFO_T_LEN SIZEOF(lbmr_ctxinfo_t, len)
910
0
#define O_LBMR_CTXINFO_T_HOP_COUNT OFFSETOF(lbmr_ctxinfo_t, hop_count)
911
0
#define L_LBMR_CTXINFO_T_HOP_COUNT SIZEOF(lbmr_ctxinfo_t, hop_count)
912
0
#define O_LBMR_CTXINFO_T_FLAGS OFFSETOF(lbmr_ctxinfo_t, flags)
913
0
#define L_LBMR_CTXINFO_T_FLAGS SIZEOF(lbmr_ctxinfo_t, flags)
914
0
#define O_LBMR_CTXINFO_T_PORT OFFSETOF(lbmr_ctxinfo_t, port)
915
#define L_LBMR_CTXINFO_T_PORT SIZEOF(lbmr_ctxinfo_t, port)
916
0
#define O_LBMR_CTXINFO_T_IP OFFSETOF(lbmr_ctxinfo_t, ip)
917
0
#define L_LBMR_CTXINFO_T_IP SIZEOF(lbmr_ctxinfo_t, ip)
918
0
#define O_LBMR_CTXINFO_T_INSTANCE OFFSETOF(lbmr_ctxinfo_t, instance)
919
0
#define L_LBMR_CTXINFO_T_INSTANCE SIZEOF(lbmr_ctxinfo_t, instance)
920
0
#define L_LBMR_CTXINFO_T (int) sizeof(lbmr_ctxinfo_t)
921
922
14
#define LBMR_CTXINFO_QUERY_FLAG 0x8000
923
14
#define LBMR_CTXINFO_IP_FLAG 0x4000
924
14
#define LBMR_CTXINFO_INSTANCE_FLAG 0x2000
925
14
#define LBMR_CTXINFO_TNWG_SRC_FLAG 0x1000
926
14
#define LBMR_CTXINFO_TNWG_RCV_FLAG 0x0800
927
14
#define LBMR_CTXINFO_PROXY_FLAG 0x0400
928
14
#define LBMR_CTXINFO_NAME_FLAG 0x0001
929
930
/* LBMR topic resolution request */
931
typedef struct
932
{
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
0
#define O_LBMR_TOPIC_RES_REQUEST_T_FLAGS OFFSETOF(lbmr_topic_res_request_t, flags)
942
98
#define L_LBMR_TOPIC_RES_REQUEST_T_FLAGS SIZEOF(lbmr_topic_res_request_t, flags)
943
0
#define L_LBMR_TOPIC_RES_REQUEST_T (int) sizeof(lbmr_topic_res_request_t)
944
945
14
#define LBM_TOPIC_RES_REQUEST_GW_REMOTE_INTEREST 0x40
946
14
#define LBM_TOPIC_RES_REQUEST_CONTEXT_QUERY 0x20
947
14
#define LBM_TOPIC_RES_REQUEST_CONTEXT_ADVERTISEMENT 0x10
948
14
#define LBM_TOPIC_RES_REQUEST_RESERVED1 0x08
949
14
#define LBM_TOPIC_RES_REQUEST_ADVERTISEMENT 0x04
950
14
#define LBM_TOPIC_RES_REQUEST_QUERY 0x02
951
14
#define LBM_TOPIC_RES_REQUEST_WILDCARD_QUERY 0x01
952
953
/* LBMR topic management block */
954
typedef struct
955
{
956
    lbm_uint16_t len;
957
    lbm_uint16_t tmrs;
958
} lbmr_tmb_t;
959
0
#define O_LBMR_TMB_T_LEN OFFSETOF(lbmr_tmb_t, len)
960
0
#define L_LBMR_TMB_T_LEN SIZEOF(lbmr_tmb_t, len)
961
0
#define O_LBMR_TMB_T_TMRS OFFSETOF(lbmr_tmb_t, tmrs)
962
0
#define L_LBMR_TMB_T_TMRS SIZEOF(lbmr_tmb_t, tmrs)
963
0
#define L_LBMR_TMB_T (int) sizeof(lbmr_tmb_t)
964
965
/* LBMR topic management record */
966
typedef struct
967
{
968
    lbm_uint16_t len;
969
    lbm_uint8_t type;
970
    lbm_uint8_t flags;
971
} lbmr_tmr_t;
972
0
#define O_LBMR_TMR_T_LEN OFFSETOF(lbmr_tmr_t, len)
973
0
#define L_LBMR_TMR_T_LEN SIZEOF(lbmr_tmr_t, len)
974
0
#define O_LBMR_TMR_T_TYPE OFFSETOF(lbmr_tmr_t, type)
975
0
#define L_LBMR_TMR_T_TYPE SIZEOF(lbmr_tmr_t, type)
976
0
#define O_LBMR_TMR_T_FLAGS OFFSETOF(lbmr_tmr_t, flags)
977
42
#define L_LBMR_TMR_T_FLAGS SIZEOF(lbmr_tmr_t, flags)
978
0
#define L_LBMR_TMR_T (int) sizeof(lbmr_tmr_t)
979
980
0
#define LBMR_TMR_LEAVE_TOPIC 0x00
981
0
#define LBMR_TMR_TOPIC_USE 0x01
982
983
14
#define LBMR_TMR_FLAG_RESPONSE 0x80
984
14
#define LBMR_TMR_FLAG_WILDCARD_PCRE 0x40
985
14
#define LBMR_TMR_FLAG_WILDCARD_REGEX 0x20
986
#define LBMR_TMR_FLAG_WILDCARD_MASK (LBMR_TMR_FLAG_WILDCARD_PCRE | LBMR_TMR_FLAG_WILDCARD_REGEX)
987
988
/* LBMR queue information record */
989
typedef struct
990
{
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
0
#define O_LBMR_QIR_T_QUEUE_ID OFFSETOF(lbmr_qir_t, queue_id)
998
0
#define L_LBMR_QIR_T_QUEUE_ID SIZEOF(lbmr_qir_t, queue_id)
999
0
#define O_LBMR_QIR_T_QUEUE_VER OFFSETOF(lbmr_qir_t, queue_ver)
1000
0
#define L_LBMR_QIR_T_QUEUE_VER SIZEOF(lbmr_qir_t, queue_ver)
1001
0
#define O_LBMR_QIR_T_QUEUE_PREV_VER OFFSETOF(lbmr_qir_t, queue_prev_ver)
1002
0
#define L_LBMR_QIR_T_QUEUE_PREV_VER SIZEOF(lbmr_qir_t, queue_prev_ver)
1003
0
#define O_LBMR_QIR_T_GRP_BLKS OFFSETOF(lbmr_qir_t, grp_blks)
1004
14
#define L_LBMR_QIR_T_GRP_BLKS SIZEOF(lbmr_qir_t, grp_blks)
1005
0
#define O_LBMR_QIR_T_QUEUE_BLKS OFFSETOF(lbmr_qir_t, queue_blks)
1006
0
#define L_LBMR_QIR_T_QUEUE_BLKS SIZEOF(lbmr_qir_t, queue_blks)
1007
0
#define L_LBMR_QIR_T (int) sizeof(lbmr_qir_t)
1008
1009
14
#define LBMR_QIR_OPTIONS 0x8000
1010
14
#define LBMR_QIR_GRP_BLOCKS_MASK 0x7fff
1011
1012
/* LBMR queue group block record */
1013
typedef struct
1014
{
1015
    lbm_uint16_t grp_idx;
1016
    lbm_uint16_t grp_sz;
1017
} lbmr_qir_grp_blk_t;
1018
0
#define O_LBMR_QIR_GRP_BLK_T_GRP_IDX OFFSETOF(lbmr_qir_grp_blk_t, grp_idx)
1019
0
#define L_LBMR_QIR_GRP_BLK_T_GRP_IDX SIZEOF(lbmr_qir_grp_blk_t, grp_idx)
1020
0
#define O_LBMR_QIR_GRP_BLK_T_GRP_SZ OFFSETOF(lbmr_qir_grp_blk_t, grp_sz)
1021
0
#define L_LBMR_QIR_GRP_BLK_T_GRP_SZ SIZEOF(lbmr_qir_grp_blk_t, grp_sz)
1022
0
#define L_LBMR_QIR_GRP_BLK_T (int) sizeof(lbmr_qir_grp_blk_t)
1023
1024
/* LBMR queue block record */
1025
typedef struct
1026
{
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
0
#define O_LBMR_QIR_QUEUE_BLK_T_IP OFFSETOF(lbmr_qir_queue_blk_t, ip)
1034
0
#define L_LBMR_QIR_QUEUE_BLK_T_IP SIZEOF(lbmr_qir_queue_blk_t, ip)
1035
0
#define O_LBMR_QIR_QUEUE_BLK_T_PORT OFFSETOF(lbmr_qir_queue_blk_t, port)
1036
0
#define L_LBMR_QIR_QUEUE_BLK_T_PORT SIZEOF(lbmr_qir_queue_blk_t, port)
1037
0
#define O_LBMR_QIR_QUEUE_BLK_T_IDX OFFSETOF(lbmr_qir_queue_blk_t, idx)
1038
0
#define L_LBMR_QIR_QUEUE_BLK_T_IDX SIZEOF(lbmr_qir_queue_blk_t, idx)
1039
0
#define O_LBMR_QIR_QUEUE_BLK_T_GRP_IDX OFFSETOF(lbmr_qir_queue_blk_t, grp_idx)
1040
0
#define L_LBMR_QIR_QUEUE_BLK_T_GRP_IDX SIZEOF(lbmr_qir_queue_blk_t, grp_idx)
1041
0
#define O_LBMR_QIR_QUEUE_BLK_T_RESERVED OFFSETOF(lbmr_qir_queue_blk_t, reserved)
1042
0
#define L_LBMR_QIR_QUEUE_BLK_T_RESERVED SIZEOF(lbmr_qir_queue_blk_t, reserved)
1043
0
#define L_LBMR_QIR_QUEUE_BLK_T (int) sizeof(lbmr_qir_queue_blk_t)
1044
1045
#define LBMR_QIR_QUEUE_BLK_FLAG_MASTER 0x8000
1046
1047
/* LBMR packet option header */
1048
typedef struct
1049
{
1050
    lbm_uint8_t type;
1051
    lbm_uint8_t len;
1052
    lbm_uint16_t flags;
1053
} lbmr_lbmr_opt_hdr_t;
1054
0
#define O_LBMR_LBMR_OPT_HDR_T_TYPE OFFSETOF(lbmr_lbmr_opt_hdr_t, type)
1055
0
#define L_LBMR_LBMR_OPT_HDR_T_TYPE SIZEOF(lbmr_lbmr_opt_hdr_t, type)
1056
0
#define O_LBMR_LBMR_OPT_HDR_T_LEN OFFSETOF(lbmr_lbmr_opt_hdr_t, len)
1057
0
#define L_LBMR_LBMR_OPT_HDR_T_LEN SIZEOF(lbmr_lbmr_opt_hdr_t, len)
1058
0
#define O_LBMR_LBMR_OPT_HDR_T_FLAGS OFFSETOF(lbmr_lbmr_opt_hdr_t, flags)
1059
0
#define L_LBMR_LBMR_OPT_HDR_T_FLAGS SIZEOF(lbmr_lbmr_opt_hdr_t, flags)
1060
0
#define L_LBMR_LBMR_OPT_HDR_T (int) sizeof(lbmr_lbmr_opt_hdr_t)
1061
1062
14
#define LBMR_LBMR_OPT_HDR_FLAG_IGNORE 0x8000
1063
14
#define LBMR_LBMR_OPT_HDR_FLAG_VIRAL  0x0001
1064
1065
/* LBMR packet option length header */
1066
typedef struct
1067
{
1068
    lbm_uint8_t type;
1069
    lbm_uint8_t len;
1070
    lbm_uint16_t total_len;
1071
} lbmr_lbmr_opt_len_t;
1072
0
#define O_LBMR_LBMR_OPT_LEN_T_TYPE OFFSETOF(lbmr_lbmr_opt_len_t, type)
1073
0
#define L_LBMR_LBMR_OPT_LEN_T_TYPE SIZEOF(lbmr_lbmr_opt_len_t, type)
1074
0
#define O_LBMR_LBMR_OPT_LEN_T_LEN OFFSETOF(lbmr_lbmr_opt_len_t, len)
1075
0
#define L_LBMR_LBMR_OPT_LEN_T_LEN SIZEOF(lbmr_lbmr_opt_len_t, len)
1076
0
#define O_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN OFFSETOF(lbmr_lbmr_opt_len_t, total_len)
1077
0
#define L_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN SIZEOF(lbmr_lbmr_opt_len_t, total_len)
1078
0
#define L_LBMR_LBMR_OPT_LEN_T (int) sizeof(lbmr_lbmr_opt_len_t)
1079
1080
0
#define LBMR_LBMR_OPT_LEN_TYPE 0x80
1081
1082
/* LBMR packet option source ID header */
1083
typedef struct
1084
{
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
0
#define O_LBMR_LBMR_OPT_SRC_ID_T_TYPE OFFSETOF(lbmr_lbmr_opt_src_id_t, type)
1091
0
#define L_LBMR_LBMR_OPT_SRC_ID_T_TYPE SIZEOF(lbmr_lbmr_opt_src_id_t, type)
1092
0
#define O_LBMR_LBMR_OPT_SRC_ID_T_LEN OFFSETOF(lbmr_lbmr_opt_src_id_t, len)
1093
0
#define L_LBMR_LBMR_OPT_SRC_ID_T_LEN SIZEOF(lbmr_lbmr_opt_src_id_t, len)
1094
0
#define O_LBMR_LBMR_OPT_SRC_ID_T_FLAGS OFFSETOF(lbmr_lbmr_opt_src_id_t, flags)
1095
14
#define L_LBMR_LBMR_OPT_SRC_ID_T_FLAGS SIZEOF(lbmr_lbmr_opt_src_id_t, flags)
1096
0
#define O_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID OFFSETOF(lbmr_lbmr_opt_src_id_t, src_id)
1097
0
#define L_LBMR_LBMR_OPT_SRC_ID_T_SRC_ID SIZEOF(lbmr_lbmr_opt_src_id_t, src_id)
1098
0
#define L_LBMR_LBMR_OPT_SRC_ID_T (int) sizeof(lbmr_lbmr_opt_src_id_t)
1099
1100
0
#define LBMR_LBMR_OPT_SRC_ID_TYPE 0x81
1101
14
#define LBMR_LBMR_OPT_SRC_ID_FLAG_IGNORE 0x8000
1102
1103
/* LBMR packet option source type header */
1104
typedef struct
1105
{
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
0
#define O_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE OFFSETOF(lbmr_lbmr_opt_src_type_t, type)
1112
0
#define L_LBMR_LBMR_OPT_SRC_TYPE_T_TYPE SIZEOF(lbmr_lbmr_opt_src_type_t, type)
1113
0
#define O_LBMR_LBMR_OPT_SRC_TYPE_T_LEN OFFSETOF(lbmr_lbmr_opt_src_type_t, len)
1114
0
#define L_LBMR_LBMR_OPT_SRC_TYPE_T_LEN SIZEOF(lbmr_lbmr_opt_src_type_t, len)
1115
0
#define O_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS OFFSETOF(lbmr_lbmr_opt_src_type_t, flags)
1116
14
#define L_LBMR_LBMR_OPT_SRC_TYPE_T_FLAGS SIZEOF(lbmr_lbmr_opt_src_type_t, flags)
1117
0
#define O_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE OFFSETOF(lbmr_lbmr_opt_src_type_t, src_type)
1118
0
#define L_LBMR_LBMR_OPT_SRC_TYPE_T_SRC_TYPE SIZEOF(lbmr_lbmr_opt_src_type_t, src_type)
1119
0
#define L_LBMR_LBMR_OPT_SRC_TYPE_T (int) sizeof(lbmr_lbmr_opt_src_type_t)
1120
1121
0
#define LBMR_LBMR_OPT_SRC_TYPE_TYPE 0x82
1122
#define LBMR_LBMR_OPT_SRC_TYPE_SZ 4
1123
14
#define LBMR_LBMR_OPT_SRC_TYPE_FLAG_IGNORE 0x80
1124
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
1128
1129
/* LBMR packet option version header */
1130
typedef struct
1131
{
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
0
#define O_LBMR_LBMR_OPT_VERSION_T_TYPE OFFSETOF(lbmr_lbmr_opt_version_t, type)
1138
0
#define L_LBMR_LBMR_OPT_VERSION_T_TYPE SIZEOF(lbmr_lbmr_opt_version_t, type)
1139
0
#define O_LBMR_LBMR_OPT_VERSION_T_LEN OFFSETOF(lbmr_lbmr_opt_version_t, len)
1140
0
#define L_LBMR_LBMR_OPT_VERSION_T_LEN SIZEOF(lbmr_lbmr_opt_version_t, len)
1141
0
#define O_LBMR_LBMR_OPT_VERSION_T_FLAGS OFFSETOF(lbmr_lbmr_opt_version_t, flags)
1142
42
#define L_LBMR_LBMR_OPT_VERSION_T_FLAGS SIZEOF(lbmr_lbmr_opt_version_t, flags)
1143
0
#define O_LBMR_LBMR_OPT_VERSION_T_VERSION OFFSETOF(lbmr_lbmr_opt_version_t, version)
1144
0
#define L_LBMR_LBMR_OPT_VERSION_T_VERSION SIZEOF(lbmr_lbmr_opt_version_t, version)
1145
0
#define L_LBMR_LBMR_OPT_VERSION_T (int) sizeof(lbmr_lbmr_opt_version_t)
1146
1147
0
#define LBMR_LBMR_OPT_VERSION_TYPE 0x83
1148
#define LBMR_LBMR_OPT_VERSIION_SZ 8
1149
14
#define LBMR_LBMR_OPT_VERSION_FLAG_IGNORE 0x8000
1150
14
#define LBMR_LBMR_OPT_VERSION_FLAG_UME    0x0001
1151
14
#define LBMR_LBMR_OPT_VERSION_FLAG_UMQ    0x0002
1152
1153
/* LBMR packet option domain header */
1154
typedef struct
1155
{
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
0
#define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE OFFSETOF(lbmr_lbmr_opt_local_domain_t, type)
1162
0
#define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_TYPE SIZEOF(lbmr_lbmr_opt_local_domain_t, type)
1163
0
#define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN OFFSETOF(lbmr_lbmr_opt_local_domain_t, len)
1164
0
#define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LEN SIZEOF(lbmr_lbmr_opt_local_domain_t, len)
1165
0
#define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS OFFSETOF(lbmr_lbmr_opt_local_domain_t, flags)
1166
28
#define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_FLAGS SIZEOF(lbmr_lbmr_opt_local_domain_t, flags)
1167
0
#define O_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID OFFSETOF(lbmr_lbmr_opt_local_domain_t, local_domain_id)
1168
0
#define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T_LOCAL_DOMAIN_ID SIZEOF(lbmr_lbmr_opt_local_domain_t, local_domain_id)
1169
0
#define L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T (int) sizeof(lbmr_lbmr_opt_local_domain_t)
1170
1171
0
#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
1174
1175
/* LBMR (extended) proxy source election record */
1176
typedef struct
1177
{
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
0
#define O_LBMR_PSER_T_DEP_TYPE OFFSETOF(lbmr_pser_t, dep_type)
1195
0
#define L_LBMR_PSER_T_DEP_TYPE SIZEOF(lbmr_pser_t, dep_type)
1196
0
#define O_LBMR_PSER_T_LEN OFFSETOF(lbmr_pser_t, len)
1197
0
#define L_LBMR_PSER_T_LEN SIZEOF(lbmr_pser_t, len)
1198
0
#define O_LBMR_PSER_T_FLAGS OFFSETOF(lbmr_pser_t, flags)
1199
14
#define L_LBMR_PSER_T_FLAGS SIZEOF(lbmr_pser_t, flags)
1200
0
#define O_LBMR_PSER_T_SOURCE_IP OFFSETOF(lbmr_pser_t, source_ip)
1201
0
#define L_LBMR_PSER_T_SOURCE_IP SIZEOF(lbmr_pser_t, source_ip)
1202
0
#define O_LBMR_PSER_T_STORE_IP OFFSETOF(lbmr_pser_t, store_ip)
1203
0
#define L_LBMR_PSER_T_STORE_IP SIZEOF(lbmr_pser_t, store_ip)
1204
0
#define O_LBMR_PSER_T_TRANSPORT_IDX OFFSETOF(lbmr_pser_t, transport_idx)
1205
0
#define L_LBMR_PSER_T_TRANSPORT_IDX SIZEOF(lbmr_pser_t, transport_idx)
1206
0
#define O_LBMR_PSER_T_TOPIC_IDX OFFSETOF(lbmr_pser_t, topic_idx)
1207
0
#define L_LBMR_PSER_T_TOPIC_IDX SIZEOF(lbmr_pser_t, topic_idx)
1208
0
#define O_LBMR_PSER_T_SOURCE_PORT OFFSETOF(lbmr_pser_t, source_port)
1209
0
#define L_LBMR_PSER_T_SOURCE_PORT SIZEOF(lbmr_pser_t, source_port)
1210
0
#define O_LBMR_PSER_T_STORE_PORT OFFSETOF(lbmr_pser_t, store_port)
1211
0
#define L_LBMR_PSER_T_STORE_PORT SIZEOF(lbmr_pser_t, store_port)
1212
0
#define O_LBMR_PSER_T_TOPIC (O_LBMR_PSER_T_STORE_PORT + L_LBMR_PSER_T_STORE_PORT)
1213
0
#define L_LBMR_PSER_T (int) sizeof(lbmr_pser_t)
1214
1215
14
#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
1218
1219
typedef struct
1220
{
1221
    lbm_uint16_t type;
1222
    lbm_uint16_t optlen;
1223
} lbmr_pser_optlen_t;
1224
0
#define O_LBMR_PSER_OPTLEN_T_TYPE OFFSETOF(lbmr_pser_optlen_t, type)
1225
0
#define L_LBMR_PSER_OPTLEN_T_TYPE SIZEOF(lbmr_pser_optlen_t, type)
1226
0
#define O_LBMR_PSER_OPTLEN_T_OPTLEN OFFSETOF(lbmr_pser_optlen_t, optlen)
1227
0
#define L_LBMR_PSER_OPTLEN_T_OPTLEN SIZEOF(lbmr_pser_optlen_t, optlen)
1228
0
#define L_LBMR_PSER_OPTLEN_T (int) sizeof(lbmr_pser_optlen_t)
1229
1230
typedef struct
1231
{
1232
    lbm_uint8_t len;
1233
    lbm_uint8_t type;
1234
} lbmr_pser_opt_hdr_t;
1235
0
#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
0
#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)
1240
1241
0
#define LBMR_PSER_OPT_SRC_CTXINST_TYPE 0x00
1242
0
#define LBMR_PSER_OPT_STORE_CTXINST_TYPE 0x01
1243
1244
typedef struct
1245
{
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
0
#define O_LBMR_PSER_OPT_CTXINST_T_LEN OFFSETOF(lbmr_pser_opt_ctxinst_t, len)
1251
0
#define L_LBMR_PSER_OPT_CTXINST_T_LEN SIZEOF(lbmr_pser_opt_ctxinst_t, len)
1252
0
#define O_LBMR_PSER_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_pser_opt_ctxinst_t, type)
1253
0
#define L_LBMR_PSER_OPT_CTXINST_T_TYPE SIZEOF(lbmr_pser_opt_ctxinst_t, type)
1254
0
#define O_LBMR_PSER_OPT_CTXINST_T_CTXINST OFFSETOF(lbmr_pser_opt_ctxinst_t, ctxinst)
1255
0
#define L_LBMR_PSER_OPT_CTXINST_T_CTXINST SIZEOF(lbmr_pser_opt_ctxinst_t, ctxinst)
1256
0
#define L_LBMR_PSER_OPT_CTXINST_T (int) sizeof(lbmr_pser_opt_ctxinst_t)
1257
1258
/* LBMR (extended) gateway message */
1259
typedef struct
1260
{
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
0
#define O_LBMR_TNWG_T_LEN OFFSETOF(lbmr_tnwg_t, len)
1272
0
#define L_LBMR_TNWG_T_LEN SIZEOF(lbmr_tnwg_t, len)
1273
0
#define O_LBMR_TNWG_T_TYPE OFFSETOF(lbmr_tnwg_t, type)
1274
0
#define L_LBMR_TNWG_T_TYPE SIZEOF(lbmr_tnwg_t, type)
1275
0
#define O_LBMR_TNWG_T_RESERVED OFFSETOF(lbmr_tnwg_t, reserved)
1276
0
#define L_LBMR_TNWG_T_RESERVED SIZEOF(lbmr_tnwg_t, reserved)
1277
0
#define L_LBMR_TNWG_T (int) sizeof(lbmr_tnwg_t)
1278
1279
0
#define LBMR_TNWG_TYPE_INTEREST 0x0000
1280
0
#define LBMR_TNWG_TYPE_CTXINFO  0x0001
1281
0
#define LBMR_TNWG_TYPE_TRREQ    0x0002
1282
1283
/* LBMR (extended) gateway message - interest header */
1284
typedef struct
1285
{
1286
    lbm_uint16_t len;
1287
    lbm_uint16_t count;
1288
} lbmr_tnwg_interest_t;
1289
0
#define O_LBMR_TNWG_INTEREST_T_LEN OFFSETOF(lbmr_tnwg_interest_t, len)
1290
0
#define L_LBMR_TNWG_INTEREST_T_LEN SIZEOF(lbmr_tnwg_interest_t, len)
1291
0
#define O_LBMR_TNWG_INTEREST_T_COUNT OFFSETOF(lbmr_tnwg_interest_t, count)
1292
0
#define L_LBMR_TNWG_INTEREST_T_COUNT SIZEOF(lbmr_tnwg_interest_t, count)
1293
0
#define L_LBMR_TNWG_INTEREST_T (int) sizeof(lbmr_tnwg_interest_t)
1294
1295
/* LBMR (extended) gateway message - interest record */
1296
typedef struct
1297
{
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
0
#define O_LBMR_TNWG_INTEREST_REC_T_LEN OFFSETOF(lbmr_tnwg_interest_rec_t, len)
1304
0
#define L_LBMR_TNWG_INTEREST_REC_T_LEN SIZEOF(lbmr_tnwg_interest_rec_t, len)
1305
0
#define O_LBMR_TNWG_INTEREST_REC_T_FLAGS OFFSETOF(lbmr_tnwg_interest_rec_t, flags)
1306
42
#define L_LBMR_TNWG_INTEREST_REC_T_FLAGS SIZEOF(lbmr_tnwg_interest_rec_t, flags)
1307
0
#define O_LBMR_TNWG_INTEREST_REC_T_PATTYPE OFFSETOF(lbmr_tnwg_interest_rec_t, pattype)
1308
0
#define L_LBMR_TNWG_INTEREST_REC_T_PATTYPE SIZEOF(lbmr_tnwg_interest_rec_t, pattype)
1309
0
#define O_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID OFFSETOF(lbmr_tnwg_interest_rec_t, domain_id)
1310
0
#define L_LBMR_TNWG_INTEREST_REC_T_DOMAIN_ID SIZEOF(lbmr_tnwg_interest_rec_t, domain_id)
1311
0
#define L_LBMR_TNWG_INTEREST_REC_T (int) sizeof(lbmr_tnwg_interest_rec_t)
1312
1313
14
#define LBMR_TNWG_INTEREST_REC_PATTERN_FLAG 0x80
1314
14
#define LBMR_TNWG_INTEREST_REC_CANCEL_FLAG  0x40
1315
14
#define LBMR_TNWG_INTEREST_REC_REFRESH_FLAG 0x20
1316
1317
/* LBMR (extended) gateway message - ctxinfo header */
1318
typedef struct
1319
{
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
0
#define O_LBMR_TNWG_CTXINFO_T_LEN OFFSETOF(lbmr_tnwg_ctxinfo_t, len)
1327
0
#define L_LBMR_TNWG_CTXINFO_T_LEN SIZEOF(lbmr_tnwg_ctxinfo_t, len)
1328
0
#define O_LBMR_TNWG_CTXINFO_T_HOP_COUNT OFFSETOF(lbmr_tnwg_ctxinfo_t, hop_count)
1329
0
#define L_LBMR_TNWG_CTXINFO_T_HOP_COUNT SIZEOF(lbmr_tnwg_ctxinfo_t, hop_count)
1330
0
#define O_LBMR_TNWG_CTXINFO_T_RESERVED OFFSETOF(lbmr_tnwg_ctxinfo_t, reserved)
1331
0
#define L_LBMR_TNWG_CTXINFO_T_RESERVED SIZEOF(lbmr_tnwg_ctxinfo_t, reserved)
1332
0
#define O_LBMR_TNWG_CTXINFO_T_FLAGS1 OFFSETOF(lbmr_tnwg_ctxinfo_t, flags1)
1333
56
#define L_LBMR_TNWG_CTXINFO_T_FLAGS1 SIZEOF(lbmr_tnwg_ctxinfo_t, flags1)
1334
0
#define O_LBMR_TNWG_CTXINFO_T_FLAGS2 OFFSETOF(lbmr_tnwg_ctxinfo_t, flags2)
1335
0
#define L_LBMR_TNWG_CTXINFO_T_FLAGS2 SIZEOF(lbmr_tnwg_ctxinfo_t, flags2)
1336
0
#define L_LBMR_TNWG_CTXINFO_T (int) sizeof(lbmr_tnwg_ctxinfo_t)
1337
1338
14
#define LBMR_TNWG_CTXINFO_QUERY_FLAG 0x80000000
1339
14
#define LBMR_TNWG_CTXINFO_TNWG_SRC_FLAG 0x40000000
1340
14
#define LBMR_TNWG_CTXINFO_TNWG_RCV_FLAG 0x20000000
1341
14
#define LBMR_TNWG_CTXINFO_PROXY_FLAG 0x10000000
1342
1343
/* LBMR (extended) gateway message - topic res request header */
1344
typedef struct
1345
{
1346
    lbm_uint16_t len;
1347
} lbmr_tnwg_trreq_t;
1348
0
#define O_LBMR_TNWG_TRREQ_T_LEN OFFSETOF(lbmr_tnwg_trreq_t, len)
1349
0
#define L_LBMR_TNWG_TRREQ_T_LEN SIZEOF(lbmr_tnwg_trreq_t, len)
1350
0
#define L_LBMR_TNWG_TRREQ_T (int) sizeof(lbmr_tnwg_trreq_t)
1351
1352
/* LBMR (extended) gateway message - basic option */
1353
typedef struct
1354
{
1355
    lbm_uint8_t type;
1356
    lbm_uint8_t len;
1357
    lbm_uint16_t flags;
1358
} lbmr_tnwg_opt_t;
1359
0
#define O_LBMR_TNWG_OPT_T_TYPE OFFSETOF(lbmr_tnwg_opt_t, type)
1360
0
#define L_LBMR_TNWG_OPT_T_TYPE SIZEOF(lbmr_tnwg_opt_t, type)
1361
0
#define O_LBMR_TNWG_OPT_T_LEN OFFSETOF(lbmr_tnwg_opt_t, len)
1362
0
#define L_LBMR_TNWG_OPT_T_LEN SIZEOF(lbmr_tnwg_opt_t, len)
1363
0
#define O_LBMR_TNWG_OPT_T_FLAGS OFFSETOF(lbmr_tnwg_opt_t, flags)
1364
28
#define L_LBMR_TNWG_OPT_T_FLAGS SIZEOF(lbmr_tnwg_opt_t, flags)
1365
0
#define L_LBMR_TNWG_OPT_T (int) sizeof(lbmr_tnwg_opt_t)
1366
1367
70
#define LBMR_TNWG_OPT_IGNORE_FLAG 0x8000
1368
1369
/* LBMR (extended) gateway message - ctxinst option */
1370
typedef struct
1371
{
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
0
#define O_LBMR_TNWG_OPT_CTXINST_T_TYPE OFFSETOF(lbmr_tnwg_opt_ctxinst_t, type)
1378
0
#define L_LBMR_TNWG_OPT_CTXINST_T_TYPE SIZEOF(lbmr_tnwg_opt_ctxinst_t, type)
1379
0
#define O_LBMR_TNWG_OPT_CTXINST_T_LEN OFFSETOF(lbmr_tnwg_opt_ctxinst_t, len)
1380
0
#define L_LBMR_TNWG_OPT_CTXINST_T_LEN SIZEOF(lbmr_tnwg_opt_ctxinst_t, len)
1381
0
#define O_LBMR_TNWG_OPT_CTXINST_T_FLAGS OFFSETOF(lbmr_tnwg_opt_ctxinst_t, flags)
1382
14
#define L_LBMR_TNWG_OPT_CTXINST_T_FLAGS SIZEOF(lbmr_tnwg_opt_ctxinst_t, flags)
1383
0
#define O_LBMR_TNWG_OPT_CTXINST_T_INSTANCE OFFSETOF(lbmr_tnwg_opt_ctxinst_t, instance)
1384
0
#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)
1386
1387
0
#define LBMR_TNWG_OPT_CTXINST_TYPE 0x00
1388
1389
/* LBMR (extended) gateway message - address option */
1390
typedef struct
1391
{
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
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_TYPE OFFSETOF(lbmr_tnwg_opt_address_t, type)
1400
0
#define L_LBMR_TNWG_OPT_ADDRESS_T_TYPE SIZEOF(lbmr_tnwg_opt_address_t, type)
1401
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_LEN OFFSETOF(lbmr_tnwg_opt_address_t, len)
1402
0
#define L_LBMR_TNWG_OPT_ADDRESS_T_LEN SIZEOF(lbmr_tnwg_opt_address_t, len)
1403
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_FLAGS OFFSETOF(lbmr_tnwg_opt_address_t, flags)
1404
14
#define L_LBMR_TNWG_OPT_ADDRESS_T_FLAGS SIZEOF(lbmr_tnwg_opt_address_t, flags)
1405
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_PORT OFFSETOF(lbmr_tnwg_opt_address_t, port)
1406
0
#define L_LBMR_TNWG_OPT_ADDRESS_T_PORT SIZEOF(lbmr_tnwg_opt_address_t, port)
1407
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_RES OFFSETOF(lbmr_tnwg_opt_address_t, res)
1408
0
#define L_LBMR_TNWG_OPT_ADDRESS_T_RES SIZEOF(lbmr_tnwg_opt_address_t, res)
1409
0
#define O_LBMR_TNWG_OPT_ADDRESS_T_IP OFFSETOF(lbmr_tnwg_opt_address_t, ip)
1410
0
#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)
1412
1413
0
#define LBMR_TNWG_OPT_ADDRESS_TYPE 0x01
1414
1415
/* LBMR (extended) gateway message - domain option */
1416
typedef struct
1417
{
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
0
#define O_LBMR_TNWG_OPT_DOMAIN_T_TYPE OFFSETOF(lbmr_tnwg_opt_domain_t, type)
1424
0
#define L_LBMR_TNWG_OPT_DOMAIN_T_TYPE SIZEOF(lbmr_tnwg_opt_domain_t, type)
1425
0
#define O_LBMR_TNWG_OPT_DOMAIN_T_LEN OFFSETOF(lbmr_tnwg_opt_domain_t, len)
1426
0
#define L_LBMR_TNWG_OPT_DOMAIN_T_LEN SIZEOF(lbmr_tnwg_opt_domain_t, len)
1427
0
#define O_LBMR_TNWG_OPT_DOMAIN_T_FLAGS OFFSETOF(lbmr_tnwg_opt_domain_t, flags)
1428
14
#define L_LBMR_TNWG_OPT_DOMAIN_T_FLAGS SIZEOF(lbmr_tnwg_opt_domain_t, flags)
1429
0
#define O_LBMR_TNWG_OPT_DOMAIN_T_DOMAIN_ID OFFSETOF(lbmr_tnwg_opt_domain_t, domain_id)
1430
0
#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)
1432
1433
0
#define LBMR_TNWG_OPT_DOMAIN_TYPE 0x02
1434
1435
/* LBMR (extended) gateway message - name option (a base option) */
1436
0
#define LBMR_TNWG_OPT_NAME_TYPE 0x03
1437
1438
/* LBMR (extended) remote domain route message */
1439
typedef struct
1440
{
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
0
#define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS OFFSETOF(lbmr_remote_domain_route_hdr_t, num_domains)
1455
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS SIZEOF(lbmr_remote_domain_route_hdr_t, num_domains)
1456
0
#define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP OFFSETOF(lbmr_remote_domain_route_hdr_t, ip)
1457
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_IP SIZEOF(lbmr_remote_domain_route_hdr_t, ip)
1458
0
#define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT OFFSETOF(lbmr_remote_domain_route_hdr_t, port)
1459
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_PORT SIZEOF(lbmr_remote_domain_route_hdr_t, port)
1460
0
#define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX OFFSETOF(lbmr_remote_domain_route_hdr_t, route_index)
1461
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_ROUTE_INDEX SIZEOF(lbmr_remote_domain_route_hdr_t, route_index)
1462
0
#define O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH OFFSETOF(lbmr_remote_domain_route_hdr_t, length)
1463
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_LENGTH SIZEOF(lbmr_remote_domain_route_hdr_t, length)
1464
0
#define L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T (int) sizeof(lbmr_remote_domain_route_hdr_t)
1465
1466
/* LBMR (extended) remote context information message */
1467
typedef struct
1468
{
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
0
#define O_LBMR_RCTXINFO_T_LEN OFFSETOF(lbmr_rctxinfo_t, len)
1480
0
#define L_LBMR_RCTXINFO_T_LEN SIZEOF(lbmr_rctxinfo_t, len)
1481
0
#define O_LBMR_RCTXINFO_T_NUM_RECS OFFSETOF(lbmr_rctxinfo_t, num_recs)
1482
0
#define L_LBMR_RCTXINFO_T_NUM_RECS SIZEOF(lbmr_rctxinfo_t, num_recs)
1483
0
#define O_LBMR_RCTXINFO_T_RESERVED OFFSETOF(lbmr_rctxinfo_t, reserved)
1484
0
#define L_LBMR_RCTXINFO_T_RESERVED SIZEOF(lbmr_rctxinfo_t, reserved)
1485
0
#define L_LBMR_RCTXINFO_T (int) sizeof(lbmr_rctxinfo_t)
1486
1487
/* LBMR (extended) remote context information record */
1488
typedef struct
1489
{
1490
    lbm_uint16_t len;
1491
    lbm_uint16_t flags;
1492
} lbmr_rctxinfo_rec_t;
1493
0
#define O_LBMR_RCTXINFO_REC_T_LEN OFFSETOF(lbmr_rctxinfo_rec_t, len)
1494
0
#define L_LBMR_RCTXINFO_REC_T_LEN SIZEOF(lbmr_rctxinfo_rec_t, len)
1495
0
#define O_LBMR_RCTXINFO_REC_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_t, flags)
1496
14
#define L_LBMR_RCTXINFO_REC_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_t, flags)
1497
0
#define L_LBMR_RCTXINFO_REC_T (int) sizeof(lbmr_rctxinfo_rec_t)
1498
1499
14
#define LBMR_RCTXINFO_REC_FLAG_QUERY 0x8000
1500
1501
/* LBMR (extended) remote context information record option */
1502
typedef struct
1503
{
1504
    lbm_uint8_t type;
1505
    lbm_uint8_t len;
1506
    lbm_uint16_t flags;
1507
} lbmr_rctxinfo_rec_opt_t;
1508
0
#define O_LBMR_RCTXINFO_REC_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_opt_t, type)
1509
0
#define L_LBMR_RCTXINFO_REC_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_opt_t, type)
1510
0
#define O_LBMR_RCTXINFO_REC_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_opt_t, len)
1511
0
#define L_LBMR_RCTXINFO_REC_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_opt_t, len)
1512
0
#define O_LBMR_RCTXINFO_REC_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_opt_t, flags)
1513
0
#define L_LBMR_RCTXINFO_REC_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_opt_t, flags)
1514
0
#define L_LBMR_RCTXINFO_REC_OPT_T (int) sizeof(lbmr_rctxinfo_rec_opt_t)
1515
1516
/* LBMR (extended) remote context information record address option */
1517
typedef struct
1518
{
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
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, type)
1528
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_address_opt_t, type)
1529
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, len)
1530
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_address_opt_t, len)
1531
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, flags)
1532
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_address_opt_t, flags)
1533
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, domain_id)
1534
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_DOMAIN_ID SIZEOF(lbmr_rctxinfo_rec_address_opt_t, domain_id)
1535
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, ip)
1536
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_IP SIZEOF(lbmr_rctxinfo_rec_address_opt_t, ip)
1537
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, port)
1538
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_PORT SIZEOF(lbmr_rctxinfo_rec_address_opt_t, port)
1539
0
#define O_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES OFFSETOF(lbmr_rctxinfo_rec_address_opt_t, res)
1540
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T_RES SIZEOF(lbmr_rctxinfo_rec_address_opt_t, res)
1541
0
#define L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T (int) sizeof(lbmr_rctxinfo_rec_address_opt_t)
1542
1543
0
#define LBMR_RCTXINFO_OPT_ADDRESS_TYPE 0x01
1544
1545
/* LBMR (extended) remote context information record instance option */
1546
typedef struct
1547
{
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
0
#define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, type)
1554
0
#define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, type)
1555
0
#define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, len)
1556
0
#define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, len)
1557
0
#define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, flags)
1558
0
#define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, flags)
1559
0
#define O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE OFFSETOF(lbmr_rctxinfo_rec_instance_opt_t, instance)
1560
0
#define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_INSTANCE SIZEOF(lbmr_rctxinfo_rec_instance_opt_t, instance)
1561
0
#define L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T (int) sizeof(lbmr_rctxinfo_rec_instance_opt_t)
1562
1563
0
#define LBMR_RCTXINFO_OPT_INSTANCE_TYPE 0x02
1564
1565
/* LBMR (extended) remote context information record odomain option */
1566
typedef struct
1567
{
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
0
#define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, type)
1574
0
#define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, type)
1575
0
#define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, len)
1576
0
#define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, len)
1577
0
#define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, flags)
1578
0
#define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, flags)
1579
0
#define O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID OFFSETOF(lbmr_rctxinfo_rec_odomain_opt_t, domain_id)
1580
0
#define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_DOMAIN_ID SIZEOF(lbmr_rctxinfo_rec_odomain_opt_t, domain_id)
1581
0
#define L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T (int) sizeof(lbmr_rctxinfo_rec_odomain_opt_t)
1582
1583
0
#define LBMR_RCTXINFO_OPT_ODOMAIN_TYPE 0x03
1584
1585
/* LBMR (extended) remote context information record name option */
1586
typedef struct
1587
{
1588
    lbm_uint8_t type;
1589
    lbm_uint8_t len;
1590
    lbm_uint16_t flags;
1591
} lbmr_rctxinfo_rec_name_opt_t;
1592
0
#define O_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, type)
1593
0
#define L_LBMR_RCTXINFO_REC_NAME_OPT_T_TYPE SIZEOF(lbmr_rctxinfo_rec_name_opt_t, type)
1594
0
#define O_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, len)
1595
0
#define L_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN SIZEOF(lbmr_rctxinfo_rec_name_opt_t, len)
1596
0
#define O_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS OFFSETOF(lbmr_rctxinfo_rec_name_opt_t, flags)
1597
0
#define L_LBMR_RCTXINFO_REC_NAME_OPT_T_FLAGS SIZEOF(lbmr_rctxinfo_rec_name_opt_t, flags)
1598
0
#define L_LBMR_RCTXINFO_REC_NAME_OPT_T (int) sizeof(lbmr_rctxinfo_rec_name_opt_t)
1599
1600
0
#define LBMR_RCTXINFO_OPT_NAME_TYPE 0x04
1601
1602
/* Queue management headers (may appear in LBMR or LBMC packets) */
1603
typedef struct
1604
{
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
0
#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
0
#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)
1613
1614
typedef struct
1615
{
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
70
#define O_UMQ_QMGMT_HDR_T_FLAGS OFFSETOF(umq_qmgmt_hdr_t, flags)
1630
56
#define L_UMQ_QMGMT_HDR_T_FLAGS SIZEOF(umq_qmgmt_hdr_t, flags)
1631
70
#define O_UMQ_QMGMT_HDR_T_PCKT_TYPE OFFSETOF(umq_qmgmt_hdr_t, pckt_type)
1632
35
#define L_UMQ_QMGMT_HDR_T_PCKT_TYPE SIZEOF(umq_qmgmt_hdr_t, pckt_type)
1633
35
#define O_UMQ_QMGMT_HDR_T_CFGSIG OFFSETOF(umq_qmgmt_hdr_t, cfgsig)
1634
35
#define L_UMQ_QMGMT_HDR_T_CFGSIG SIZEOF(umq_qmgmt_hdr_t, cfgsig)
1635
35
#define O_UMQ_QMGMT_HDR_T_QUEUE_ID OFFSETOF(umq_qmgmt_hdr_t, queue_id)
1636
35
#define L_UMQ_QMGMT_HDR_T_QUEUE_ID SIZEOF(umq_qmgmt_hdr_t, queue_id)
1637
35
#define O_UMQ_QMGMT_HDR_T_QUEUE_VER OFFSETOF(umq_qmgmt_hdr_t, queue_ver)
1638
35
#define L_UMQ_QMGMT_HDR_T_QUEUE_VER SIZEOF(umq_qmgmt_hdr_t, queue_ver)
1639
35
#define O_UMQ_QMGMT_HDR_T_IP OFFSETOF(umq_qmgmt_hdr_t, ip)
1640
35
#define L_UMQ_QMGMT_HDR_T_IP SIZEOF(umq_qmgmt_hdr_t, ip)
1641
35
#define O_UMQ_QMGMT_HDR_T_PORT OFFSETOF(umq_qmgmt_hdr_t, port)
1642
35
#define L_UMQ_QMGMT_HDR_T_PORT SIZEOF(umq_qmgmt_hdr_t, port)
1643
35
#define O_UMQ_QMGMT_HDR_T_INST_IDX OFFSETOF(umq_qmgmt_hdr_t, inst_idx)
1644
35
#define L_UMQ_QMGMT_HDR_T_INST_IDX SIZEOF(umq_qmgmt_hdr_t, inst_idx)
1645
35
#define O_UMQ_QMGMT_HDR_T_GRP_IDX OFFSETOF(umq_qmgmt_hdr_t, grp_idx)
1646
35
#define L_UMQ_QMGMT_HDR_T_GRP_IDX SIZEOF(umq_qmgmt_hdr_t, grp_idx)
1647
69
#define O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16 OFFSETOF(umq_qmgmt_hdr_t, pckt_type_dep16)
1648
34
#define L_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16 SIZEOF(umq_qmgmt_hdr_t, pckt_type_dep16)
1649
68
#define L_UMQ_QMGMT_HDR_T (int) sizeof(umq_qmgmt_hdr_t)
1650
1651
14
#define UMQ_QMGMT_HDR_I_FLAG 0x80
1652
43
#define UMQ_QMGMT_HDR_N_FLAG 0x40
1653
14
#define UMQ_QMGMT_HDR_IL_L_FLAG 0x20
1654
14
#define UMQ_QMGMT_HDR_IL_K_FLAG 0x10
1655
1656
typedef struct
1657
{
1658
    lbm_uint32_t highest_rcr_tsp;
1659
} umq_qmgmt_il_hdr_t;
1660
5
#define O_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_il_hdr_t, highest_rcr_tsp)
1661
5
#define L_UMQ_QMGMT_IL_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_il_hdr_t, highest_rcr_tsp)
1662
15
#define L_UMQ_QMGMT_IL_HDR_T (int) sizeof(umq_qmgmt_il_hdr_t)
1663
1664
typedef struct
1665
{
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
25
#define O_UMQ_QMGMT_IL_INST_HDR_T_IP OFFSETOF(umq_qmgmt_il_inst_hdr_t, ip)
1673
25
#define L_UMQ_QMGMT_IL_INST_HDR_T_IP SIZEOF(umq_qmgmt_il_inst_hdr_t, ip)
1674
25
#define O_UMQ_QMGMT_IL_INST_HDR_T_PORT OFFSETOF(umq_qmgmt_il_inst_hdr_t, port)
1675
25
#define L_UMQ_QMGMT_IL_INST_HDR_T_PORT SIZEOF(umq_qmgmt_il_inst_hdr_t, port)
1676
25
#define O_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX OFFSETOF(umq_qmgmt_il_inst_hdr_t, inst_idx)
1677
25
#define L_UMQ_QMGMT_IL_INST_HDR_T_INST_IDX SIZEOF(umq_qmgmt_il_inst_hdr_t, inst_idx)
1678
25
#define O_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX OFFSETOF(umq_qmgmt_il_inst_hdr_t, grp_idx)
1679
25
#define L_UMQ_QMGMT_IL_INST_HDR_T_GRP_IDX SIZEOF(umq_qmgmt_il_inst_hdr_t, grp_idx)
1680
25
#define O_UMQ_QMGMT_IL_INST_HDR_T_FLAGS OFFSETOF(umq_qmgmt_il_inst_hdr_t, flags)
1681
42
#define L_UMQ_QMGMT_IL_INST_HDR_T_FLAGS SIZEOF(umq_qmgmt_il_inst_hdr_t, flags)
1682
75
#define L_UMQ_QMGMT_IL_INST_HDR_T (int) sizeof(umq_qmgmt_il_inst_hdr_t)
1683
1684
14
#define UMQ_QMGMT_HDR_IL_INST_M_FLAG 0x8000
1685
14
#define UMQ_QMGMT_HDR_IL_INST_Q_FLAG 0x4000
1686
14
#define UMQ_QMGMT_HDR_IL_INST_P_FLAG 0x2000
1687
1688
typedef struct
1689
{
1690
    lbm_uint32_t queue_new_ver;
1691
} umq_qmgmt_ec_hdr_t;
1692
1
#define O_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER OFFSETOF(umq_qmgmt_ec_hdr_t, queue_new_ver)
1693
1
#define L_UMQ_QMGMT_EC_HDR_T_QUEUE_NEW_VER SIZEOF(umq_qmgmt_ec_hdr_t, queue_new_ver)
1694
3
#define L_UMQ_QMGMT_EC_HDR_T (int) sizeof(umq_qmgmt_ec_hdr_t)
1695
1696
typedef struct
1697
{
1698
    lbm_uint32_t highest_rcr_tsp;
1699
    lbm_uint32_t age;
1700
} umq_qmgmt_ev_hdr_t;
1701
1
#define O_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_ev_hdr_t, highest_rcr_tsp)
1702
1
#define L_UMQ_QMGMT_EV_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_ev_hdr_t, highest_rcr_tsp)
1703
1
#define O_UMQ_QMGMT_EV_HDR_T_AGE OFFSETOF(umq_qmgmt_ev_hdr_t, age)
1704
1
#define L_UMQ_QMGMT_EV_HDR_T_AGE SIZEOF(umq_qmgmt_ev_hdr_t, age)
1705
3
#define L_UMQ_QMGMT_EV_HDR_T (int) sizeof(umq_qmgmt_ev_hdr_t)
1706
1707
typedef struct
1708
{
1709
    lbm_uint32_t highest_rcr_tsp;
1710
} umq_qmgmt_qro_hdr_t;
1711
1
#define O_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP OFFSETOF(umq_qmgmt_qro_hdr_t, highest_rcr_tsp)
1712
1
#define L_UMQ_QMGMT_QRO_HDR_T_HIGHEST_RCR_TSP SIZEOF(umq_qmgmt_qro_hdr_t, highest_rcr_tsp)
1713
3
#define L_UMQ_QMGMT_QRO_HDR_T (int) sizeof(umq_qmgmt_qro_hdr_t)
1714
1715
45
#define UMQ_QMGMT_HDR_PCKT_TYPE_IL 0x1
1716
0
#define UMQ_QMGMT_HDR_PCKT_TYPE_JR 0x2
1717
2
#define UMQ_QMGMT_HDR_PCKT_TYPE_JREJ 0x3
1718
0
#define UMQ_QMGMT_HDR_PCKT_TYPE_IKA 0x4
1719
1
#define UMQ_QMGMT_HDR_PCKT_TYPE_EC 0x5
1720
2
#define UMQ_QMGMT_HDR_PCKT_TYPE_EV 0x6
1721
1
#define UMQ_QMGMT_HDR_PCKT_TYPE_CNIL 0x7
1722
1
#define UMQ_QMGMT_HDR_PCKT_TYPE_QRO 0x8
1723
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
1728
1729
/*----------------------------------------------------------------------------*/
1730
/* Value translation tables.                                                  */
1731
/*----------------------------------------------------------------------------*/
1732
1733
static const value_string lbmr_packet_type[] =
1734
{
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 }
1743
};
1744
1745
static const value_string lbmr_ext_packet_type[] =
1746
{
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 }
1755
};
1756
1757
static const value_string lbmr_transport_type[] =
1758
{
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 }
1766
};
1767
1768
static const value_string lbmr_tmr_type[] =
1769
{
1770
    { LBMR_TMR_LEAVE_TOPIC, "Leave Topic" },
1771
    { LBMR_TMR_TOPIC_USE, "Topic Use" },
1772
    { 0x0, NULL }
1773
};
1774
1775
static const value_string lbmr_topic_option_type[] =
1776
{
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 }
1793
};
1794
1795
static const value_string lbmr_pser_dependent_type[] =
1796
{
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 }
1800
};
1801
1802
static const value_string lbmr_option_type[] =
1803
{
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 }
1810
};
1811
1812
static const value_string lbmr_pser_option_type[] =
1813
{
1814
    { LBMR_PSER_OPT_SRC_CTXINST_TYPE, "Source context instance" },
1815
    { LBMR_PSER_OPT_STORE_CTXINST_TYPE, "Store context instance" },
1816
    { 0x0, NULL }
1817
};
1818
1819
static const value_string lbmr_option_source_type[] =
1820
{
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 }
1825
};
1826
1827
static const value_string lbmr_tnwg_function_type[] =
1828
{
1829
    { LBMR_TNWG_TYPE_INTEREST, "Interest" },
1830
    { LBMR_TNWG_TYPE_CTXINFO, "Context information" },
1831
    { LBMR_TNWG_TYPE_TRREQ, "Topic res request" },
1832
    { 0x0, NULL }
1833
};
1834
1835
static const value_string lbmr_tnwg_option_type[] =
1836
{
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 }
1842
};
1843
1844
static const value_string umq_qmgmt_packet_type[] =
1845
{
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 }
1855
};
1856
1857
static const value_string lbmr_rctxinfo_option_type[] =
1858
{
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 }
1864
};
1865
1866
/*----------------------------------------------------------------------------*/
1867
/* Preferences.                                                               */
1868
/*----------------------------------------------------------------------------*/
1869
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
14
#define LBMR_DEFAULT_MC_INCOMING_ADDRESS "224.9.10.11"
1876
14
#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
14
#define LBMR_DEFAULT_UC_ADDRESS "0.0.0.0"
1884
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;
1895
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;
1906
1907
typedef struct
1908
{
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;
1922
1923
static lbmr_tag_entry_t * lbmr_tag_entry;
1924
static unsigned lbmr_tag_count;
1925
1926
UAT_CSTRING_CB_DEF(lbmr_tag, name, lbmr_tag_entry_t)
1927
0
UAT_DEC_CB_DEF(lbmr_tag, mc_outgoing_udp_port, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_outgoing_udp_port_set_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_outgoing_udp_port_tostr_cb
1928
0
UAT_DEC_CB_DEF(lbmr_tag, mc_incoming_udp_port, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_incoming_udp_port_set_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_incoming_udp_port_tostr_cb
1929
0
UAT_IPV4_MC_CB_DEF(lbmr_tag, mc_incoming_address, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_incoming_address_chk_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_incoming_address_set_cb
1930
0
UAT_IPV4_MC_CB_DEF(lbmr_tag, mc_outgoing_address, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_outgoing_address_chk_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_mc_outgoing_address_set_cb
1931
0
UAT_DEC_CB_DEF(lbmr_tag, uc_port_high, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_port_high_set_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_port_high_tostr_cb
1932
0
UAT_DEC_CB_DEF(lbmr_tag, uc_port_low, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_port_low_set_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_port_low_tostr_cb
1933
0
UAT_DEC_CB_DEF(lbmr_tag, uc_dest_port, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_dest_port_set_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_dest_port_tostr_cb
1934
0
UAT_IPV4_CB_DEF(lbmr_tag, uc_address, lbmr_tag_entry_t)
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_address_chk_cb
Unexecuted instantiation: packet-lbmr.c:lbmr_tag_uc_address_set_cb
1935
static uat_field_t lbmr_tag_array[] =
1936
{
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
1947
};
1948
1949
/*----------------------------------------------------------------------------*/
1950
/* UAT callback functions.                                                    */
1951
/*----------------------------------------------------------------------------*/
1952
static bool lbmr_tag_update_cb(void * record, char * * error_string)
1953
0
{
1954
0
    lbmr_tag_entry_t * tag = (lbmr_tag_entry_t *)record;
1955
1956
0
    if (tag->name == NULL)
1957
0
    {
1958
0
        *error_string = g_strdup("Tag name can't be empty");
1959
0
        return false;
1960
0
    }
1961
0
    else
1962
0
    {
1963
0
        g_strstrip(tag->name);
1964
0
        if (tag->name[0] == 0)
1965
0
        {
1966
0
            *error_string = g_strdup("Tag name can't be empty");
1967
0
            return false;
1968
0
        }
1969
0
    }
1970
0
    return true;
1971
0
}
1972
1973
static void * lbmr_tag_copy_cb(void * destination, const void * source, size_t length _U_)
1974
0
{
1975
0
    const lbmr_tag_entry_t * src = (const lbmr_tag_entry_t *)source;
1976
0
    lbmr_tag_entry_t * dest = (lbmr_tag_entry_t *)destination;
1977
1978
0
    dest->name = g_strdup(src->name);
1979
0
    dest->mc_outgoing_udp_port = src->mc_outgoing_udp_port;
1980
0
    dest->mc_incoming_udp_port = src->mc_incoming_udp_port;
1981
0
    dest->mc_incoming_address = g_strdup(src->mc_incoming_address);
1982
0
    dest->mc_incoming_address_val_h = src->mc_incoming_address_val_h;
1983
0
    dest->mc_outgoing_address = g_strdup(src->mc_outgoing_address);
1984
0
    dest->mc_outgoing_address_val_h = src->mc_outgoing_address_val_h;
1985
0
    dest->uc_port_high = src->uc_port_high;
1986
0
    dest->uc_port_low = src->uc_port_low;
1987
0
    dest->uc_dest_port = src->uc_dest_port;
1988
0
    dest->uc_address = g_strdup(src->uc_address);
1989
0
    dest->uc_address_val_h = src->uc_address_val_h;
1990
0
    return (dest);
1991
0
}
1992
1993
static void lbmr_tag_free_cb(void * record)
1994
0
{
1995
0
    lbmr_tag_entry_t * tag = (lbmr_tag_entry_t *)record;
1996
1997
0
    if (tag->name != NULL)
1998
0
    {
1999
0
        g_free(tag->name);
2000
0
        tag->name = NULL;
2001
0
    }
2002
0
    if (tag->mc_incoming_address != NULL)
2003
0
    {
2004
0
        g_free(tag->mc_incoming_address);
2005
0
        tag->mc_incoming_address = NULL;
2006
0
    }
2007
0
    if (tag->mc_outgoing_address != NULL)
2008
0
    {
2009
0
        g_free(tag->mc_outgoing_address);
2010
0
        tag->mc_outgoing_address = NULL;
2011
0
    }
2012
0
    if (tag->uc_address != NULL)
2013
0
    {
2014
0
        g_free(tag->uc_address);
2015
0
        tag->uc_address = NULL;
2016
0
    }
2017
0
}
2018
2019
static tap_packet_status lbmr_match_packet(packet_info * pinfo, const lbmr_tag_entry_t * entry)
2020
0
{
2021
0
    uint32_t dest_addr_h;
2022
0
    uint32_t src_addr_h;
2023
2024
0
    if ((pinfo->dst.type != AT_IPv4) || (pinfo->dst.len != 4) ||
2025
0
        (pinfo->src.type != AT_IPv4) || (pinfo->src.len != 4))
2026
0
        return (TAP_PACKET_DONT_REDRAW);
2027
0
    dest_addr_h = pntohu32(pinfo->dst.data);
2028
0
    src_addr_h = pntohu32(pinfo->src.data);
2029
2030
0
    if (in4_addr_is_multicast(dest_addr_h))
2031
0
    {
2032
        /* Check multicast topic resolution values. */
2033
0
        if ((dest_addr_h != entry->mc_incoming_address_val_h) && (dest_addr_h != entry->mc_outgoing_address_val_h))
2034
0
        {
2035
            /* No match. */
2036
0
            return (TAP_PACKET_DONT_REDRAW);
2037
0
        }
2038
        /* Check for the correct port. */
2039
0
        if ((dest_addr_h == entry->mc_incoming_address_val_h) && (pinfo->destport != entry->mc_incoming_udp_port))
2040
0
        {
2041
            /* Wrong incoming port. */
2042
0
            return (TAP_PACKET_DONT_REDRAW);
2043
0
        }
2044
0
        if ((dest_addr_h == entry->mc_outgoing_address_val_h) && (pinfo->destport != entry->mc_outgoing_udp_port))
2045
0
        {
2046
            /* Wrong outgoing port. */
2047
0
            return (TAP_PACKET_DONT_REDRAW);
2048
0
        }
2049
        /* Must be one of ours. */
2050
0
        return (TAP_PACKET_REDRAW);
2051
0
    }
2052
0
    else
2053
0
    {
2054
        /* Check unicast topic resolution values. */
2055
        /* Address should be either not specified, or match the src or dest address of the packet. */
2056
0
        if ((entry->uc_address_val_h == 0) || (entry->uc_address_val_h == dest_addr_h) || (entry->uc_address_val_h == src_addr_h))
2057
0
        {
2058
0
            if (((pinfo->destport == entry->uc_dest_port) || (pinfo->srcport == entry->uc_dest_port))
2059
0
                && (((pinfo->destport <= entry->uc_port_high) && (pinfo->destport >= entry->uc_port_low))
2060
0
                    || ((pinfo->srcport <= entry->uc_port_high) && (pinfo->srcport >= entry->uc_port_low))))
2061
0
            {
2062
                /* One of ours, so handle it. */
2063
0
                return (TAP_PACKET_REDRAW);
2064
0
            }
2065
0
        }
2066
0
    }
2067
0
    return (TAP_PACKET_DONT_REDRAW);
2068
0
}
2069
2070
static char * lbmr_tag_find(packet_info * pinfo)
2071
0
{
2072
0
    unsigned idx;
2073
0
    lbmr_tag_entry_t * tag = NULL;
2074
2075
0
    if (!lbmr_use_tag)
2076
0
    {
2077
0
        return (NULL);
2078
0
    }
2079
0
    for (idx = 0; idx < lbmr_tag_count; ++idx)
2080
0
    {
2081
0
        tag = &(lbmr_tag_entry[idx]);
2082
0
        if (lbmr_match_packet(pinfo, tag))
2083
0
        {
2084
0
            return tag->name;
2085
0
        }
2086
0
    }
2087
0
    return (NULL);
2088
0
}
2089
2090
/*----------------------------------------------------------------------------*/
2091
/* Handles of all types.                                                      */
2092
/*----------------------------------------------------------------------------*/
2093
/* Protocol handle */
2094
static int proto_lbmr;
2095
2096
/* Dissector handle */
2097
static dissector_handle_t lbmr_dissector_handle;
2098
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;
2206
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;
2646
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;
2651
2652
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;
2659
2660
56
#define LBMR_TOPIC_ADVERTISEMENT_TAP_STRING "lbm_lbmr_topic_advertisement"
2661
42
#define LBMR_TOPIC_QUERY_TAP_STRING "lbm_lbmr_topic_query"
2662
42
#define LBMR_PATTERN_QUERY_TAP_STRING "lbm_lbmr_pattern_query"
2663
42
#define LBMR_QUEUE_ADVERTISEMENT_TAP_STRING "lbm_lbmr_queue_advertisement"
2664
42
#define LBMR_QUEUE_QUERY_TAP_STRING "lbm_lbmr_queue_query"
2665
2666
/*----------------------------------------------------------------------------*/
2667
/* Statistics.                                                                */
2668
/*----------------------------------------------------------------------------*/
2669
/* Statistics structures */
2670
struct tqr_node_t_stct;
2671
struct tqr_node_t_stct
2672
{
2673
    char * topic;
2674
    struct tqr_node_t_stct * next;
2675
};
2676
typedef struct tqr_node_t_stct tqr_node_t;
2677
2678
struct wctqr_node_t_stct;
2679
struct wctqr_node_t_stct
2680
{
2681
    uint8_t type;
2682
    char * pattern;
2683
    struct wctqr_node_t_stct * next;
2684
};
2685
typedef struct wctqr_node_t_stct wctqr_node_t;
2686
2687
struct tir_node_t_stct;
2688
struct tir_node_t_stct
2689
{
2690
    char * topic;
2691
    char * source_string;
2692
    uint32_t idx;
2693
    struct tir_node_t_stct * next;
2694
};
2695
typedef struct tir_node_t_stct tir_node_t;
2696
2697
typedef struct
2698
{
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;
2706
2707
struct qqr_node_t_stct;
2708
struct qqr_node_t_stct
2709
{
2710
    char * queue;
2711
    struct qqr_node_t_stct * next;
2712
};
2713
typedef struct qqr_node_t_stct qqr_node_t;
2714
2715
struct qir_node_t_stct;
2716
struct qir_node_t_stct
2717
{
2718
    char * queue;
2719
    char * topic;
2720
    uint16_t port;
2721
    struct qir_node_t_stct * next;
2722
};
2723
typedef struct qir_node_t_stct qir_node_t;
2724
2725
typedef struct
2726
{
2727
    int qqr_count;
2728
    qqr_node_t * qqr;
2729
    int qir_count;
2730
    qir_node_t * qir;
2731
} lbmr_queue_contents_t;
2732
2733
typedef struct
2734
{
2735
    int type;
2736
    union
2737
    {
2738
        lbmr_topic_contents_t topic;
2739
        lbmr_queue_contents_t queue;
2740
    } contents;
2741
} lbmr_contents_t;
2742
2743
0
#define LBMR_CONTENTS_TOPIC 0
2744
0
#define LBMR_CONTENTS_QUEUE 1
2745
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";
2758
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;
2771
2772
/*----------------------------------------------------------------------------*/
2773
/* Statistics tree utility functions.                                         */
2774
/*----------------------------------------------------------------------------*/
2775
2776
static void add_contents_tqr(wmem_allocator_t* allocator, lbmr_contents_t * contents, const char * topic)
2777
0
{
2778
0
    tqr_node_t * node = NULL;
2779
2780
0
    node = wmem_new(allocator, tqr_node_t);
2781
0
    node->topic = wmem_strdup(allocator, topic);
2782
0
    node->next = contents->contents.topic.tqr;
2783
0
    contents->contents.topic.tqr = node;
2784
0
    contents->contents.topic.tqr_count++;
2785
0
}
2786
2787
static void add_contents_wctqr(wmem_allocator_t* allocator, lbmr_contents_t * contents, unsigned char type, const char * pattern)
2788
0
{
2789
0
    wctqr_node_t * node = NULL;
2790
2791
0
    node = wmem_new(allocator, wctqr_node_t);
2792
0
    node->type = type;
2793
0
    node->pattern = wmem_strdup(allocator, pattern);
2794
0
    node->next = contents->contents.topic.wctqr;
2795
0
    contents->contents.topic.wctqr = node;
2796
0
    contents->contents.topic.wctqr_count++;
2797
0
}
2798
2799
static void add_contents_tir(wmem_allocator_t* allocator, lbmr_contents_t * contents, const char * topic, char * source, uint32_t topic_index)
2800
0
{
2801
0
    tir_node_t * node = NULL;
2802
2803
0
    node = wmem_new(allocator, tir_node_t);
2804
0
    node->topic = wmem_strdup(allocator, topic);
2805
0
    node->source_string = source;
2806
0
    node->idx = topic_index;
2807
0
    node->next = contents->contents.topic.tir;
2808
0
    contents->contents.topic.tir = node;
2809
0
    contents->contents.topic.tir_count++;
2810
0
}
2811
2812
static void add_contents_qqr(wmem_allocator_t* allocator, lbmr_contents_t * contents, const char * queue)
2813
0
{
2814
0
    qqr_node_t * node = NULL;
2815
2816
0
    node = wmem_new(allocator, qqr_node_t);
2817
0
    node->queue = wmem_strdup(allocator, queue);
2818
0
    node->next = contents->contents.queue.qqr;
2819
0
    contents->contents.queue.qqr = node;
2820
0
    contents->contents.queue.qqr_count++;
2821
0
}
2822
2823
static void add_contents_qir(wmem_allocator_t* allocator, lbmr_contents_t * contents, const char * queue, const char * topic, uint16_t port)
2824
0
{
2825
0
    qir_node_t * node = NULL;
2826
2827
0
    node = wmem_new(allocator, qir_node_t);
2828
0
    node->queue = wmem_strdup(allocator, queue);
2829
0
    node->topic = wmem_strdup(allocator, topic);
2830
0
    node->port = port;
2831
0
    node->next = contents->contents.queue.qir;
2832
0
    contents->contents.queue.qir = node;
2833
0
    contents->contents.queue.qir_count++;
2834
0
}
2835
2836
/*----------------------------------------------------------------------------*/
2837
/*  Topic advertisements by Topic:                                            */
2838
/*  Topic name                                                                */
2839
/*    - Source address                                                        */
2840
/*      - Source string (including topic index)                               */
2841
/*----------------------------------------------------------------------------*/
2842
2843
static void lbmr_topic_ads_topic_stats_tree_init(stats_tree * tree)
2844
0
{
2845
0
    lbmr_stats_tree_handle_topic_ads_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, STAT_DT_INT, true);
2846
0
}
2847
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_)
2849
0
{
2850
0
    const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2851
0
    int topic_node;
2852
0
    int source_node;
2853
0
    char * full_source_string;
2854
2855
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, false);
2856
0
    topic_node = tick_stat_node(tree, info->topic, lbmr_stats_tree_handle_topic_ads_topic, true);
2857
0
    source_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), topic_node, true);
2858
0
    full_source_string = wmem_strdup_printf(pinfo->pool, "%s[%" PRIu32 "]", info->source, info->topic_index);
2859
0
    tick_stat_node(tree, full_source_string, source_node, true);
2860
0
    return (TAP_PACKET_REDRAW);
2861
0
}
2862
2863
/*----------------------------------------------------------------------------*/
2864
/*  Topic advertisements by Source:                                           */
2865
/*  Source address                                                            */
2866
/*    - Topic name                                                            */
2867
/*      - Source string (including topic index)                               */
2868
/*----------------------------------------------------------------------------*/
2869
2870
static void lbmr_topic_ads_source_stats_tree_init(stats_tree * tree)
2871
0
{
2872
0
    lbmr_stats_tree_handle_topic_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, STAT_DT_INT, true);
2873
0
}
2874
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_)
2876
0
{
2877
0
    const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2878
0
    int source_node;
2879
0
    int topic_node;
2880
0
    char * full_source_string;
2881
2882
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, false);
2883
0
    source_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), lbmr_stats_tree_handle_topic_ads_source, true);
2884
0
    topic_node = tick_stat_node(tree, info->topic, source_node, true);
2885
0
    full_source_string = wmem_strdup_printf(pinfo->pool, "%s[%" PRIu32 "]", info->source, info->topic_index);
2886
0
    tick_stat_node(tree, full_source_string, topic_node, true);
2887
0
    return (TAP_PACKET_REDRAW);
2888
0
}
2889
2890
/*----------------------------------------------------------------------------*/
2891
/*  Topic advertisements by Transport:                                        */
2892
/*  Source string                                                             */
2893
/*    - Topic name (including topic index)                                    */
2894
/*----------------------------------------------------------------------------*/
2895
2896
static void lbmr_topic_ads_transport_stats_tree_init(stats_tree * tree)
2897
0
{
2898
0
    lbmr_stats_tree_handle_topic_ads_transport = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, STAT_DT_INT, true);
2899
0
}
2900
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_)
2902
0
{
2903
0
    const lbm_lbmr_topic_advertisement_tap_info_t * info = (const lbm_lbmr_topic_advertisement_tap_info_t *) data;
2904
0
    int transport_node;
2905
0
    char * full_source_string;
2906
2907
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, false);
2908
0
    transport_node = tick_stat_node(tree, info->source, lbmr_stats_tree_handle_topic_ads_transport, true);
2909
0
    full_source_string = wmem_strdup_printf(pinfo->pool, "%s [%" PRIu32 "]", info->topic, info->topic_index);
2910
0
    tick_stat_node(tree, full_source_string, transport_node, true);
2911
0
    return (TAP_PACKET_REDRAW);
2912
0
}
2913
2914
/*----------------------------------------------------------------------------*/
2915
/*  Topic queries by Topic:                                                   */
2916
/*  Topic name                                                                */
2917
/*    - Receiver address                                                      */
2918
/*----------------------------------------------------------------------------*/
2919
2920
static void lbmr_topic_queries_topic_stats_tree_init(stats_tree * tree)
2921
0
{
2922
0
    lbmr_stats_tree_handle_topic_queries_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, STAT_DT_INT, true);
2923
0
}
2924
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_)
2926
0
{
2927
0
    const lbm_lbmr_topic_query_tap_info_t * info = (const lbm_lbmr_topic_query_tap_info_t *) data;
2928
0
    int topic_node;
2929
2930
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, false);
2931
0
    topic_node = tick_stat_node(tree, info->topic, lbmr_stats_tree_handle_topic_queries_topic, true);
2932
0
    tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), topic_node, true);
2933
0
    return (TAP_PACKET_REDRAW);
2934
0
}
2935
2936
/*----------------------------------------------------------------------------*/
2937
/*  Topic queries by Receiver:                                                */
2938
/*  Receiver address                                                          */
2939
/*    - Topic name                                                            */
2940
/*----------------------------------------------------------------------------*/
2941
2942
static void lbmr_topic_queries_receiver_stats_tree_init(stats_tree * tree)
2943
0
{
2944
0
    lbmr_stats_tree_handle_topic_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, STAT_DT_INT, true);
2945
0
}
2946
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_)
2948
0
{
2949
0
    const lbm_lbmr_topic_query_tap_info_t * info = (const lbm_lbmr_topic_query_tap_info_t *) data;
2950
0
    int receiver_node;
2951
2952
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, false);
2953
0
    receiver_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), lbmr_stats_tree_handle_topic_queries_receiver, true);
2954
0
    tick_stat_node(tree, info->topic, receiver_node, true);
2955
0
    return (TAP_PACKET_REDRAW);
2956
0
}
2957
2958
/*----------------------------------------------------------------------------*/
2959
/*  Topic queries by Pattern:                                                 */
2960
/*  Pattern                                                                   */
2961
/*    - Receiver address                                                      */
2962
/*----------------------------------------------------------------------------*/
2963
2964
static void lbmr_topic_queries_pattern_stats_tree_init(stats_tree * tree)
2965
0
{
2966
0
    lbmr_stats_tree_handle_topic_queries_pattern = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, STAT_DT_INT, true);
2967
0
}
2968
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_)
2970
0
{
2971
0
    const lbm_lbmr_pattern_query_tap_info_t * info = (const lbm_lbmr_pattern_query_tap_info_t *) data;
2972
0
    int pattern_node;
2973
0
    char * pattern_str;
2974
2975
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, false);
2976
0
    pattern_str = wmem_strdup_printf(pinfo->pool, "%s (%s)",
2977
0
        info->pattern,
2978
0
        val_to_str(pinfo->pool, info->type, lbm_wildcard_pattern_type_short, "UNKN[0x%02x]"));
2979
0
    pattern_node = tick_stat_node(tree, pattern_str, lbmr_stats_tree_handle_topic_queries_pattern, true);
2980
0
    tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), pattern_node, true);
2981
0
    return (TAP_PACKET_REDRAW);
2982
0
}
2983
2984
/*----------------------------------------------------------------------------*/
2985
/*  Topic queries by Pattern:                                                 */
2986
/*  Receiver address                                                          */
2987
/*    - Patternme                                                             */
2988
/*----------------------------------------------------------------------------*/
2989
2990
static void lbmr_topic_queries_pattern_receiver_stats_tree_init(stats_tree * tree)
2991
0
{
2992
0
    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);
2993
0
}
2994
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_)
2996
0
{
2997
0
    const lbm_lbmr_pattern_query_tap_info_t * info = (const lbm_lbmr_pattern_query_tap_info_t *) data;
2998
0
    int receiver_node;
2999
0
    char * pattern_str;
3000
3001
0
    tick_stat_node(tree, lbmr_stat_tree_name_topic_queries_pattern_receiver, 0, false);
3002
0
    receiver_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), lbmr_stats_tree_handle_topic_queries_pattern_receiver, true);
3003
0
    pattern_str = wmem_strdup_printf(pinfo->pool, "%s (%s)",
3004
0
        info->pattern,
3005
0
        val_to_str(pinfo->pool, info->type, lbm_wildcard_pattern_type_short, "UNKN[0x%02x]"));
3006
0
    tick_stat_node(tree, pattern_str, receiver_node, true);
3007
0
    return (TAP_PACKET_REDRAW);
3008
0
}
3009
3010
/*----------------------------------------------------------------------------*/
3011
/*  Queue advertisements by Queue:                                            */
3012
/*  Queue name                                                                */
3013
/*    - Source address and port                                               */
3014
/*----------------------------------------------------------------------------*/
3015
3016
static void lbmr_queue_ads_queue_stats_tree_init(stats_tree * tree)
3017
0
{
3018
0
    lbmr_stats_tree_handle_queue_ads_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, STAT_DT_INT, true);
3019
0
}
3020
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_)
3022
0
{
3023
0
    const lbm_lbmr_queue_advertisement_tap_info_t * info = (const lbm_lbmr_queue_advertisement_tap_info_t *) data;
3024
0
    int queue_node;
3025
0
    char * str;
3026
3027
0
    tick_stat_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, false);
3028
0
    queue_node = tick_stat_node(tree, info->queue, lbmr_stats_tree_handle_queue_ads_queue, true);
3029
0
    str = wmem_strdup_printf(pinfo->pool, "%s:%" PRIu16, address_to_str(pinfo->pool, &pinfo->net_src), info->port);
3030
0
    tick_stat_node(tree, str, queue_node, true);
3031
0
    return (TAP_PACKET_REDRAW);
3032
0
}
3033
3034
/*----------------------------------------------------------------------------*/
3035
/*  Queue advertisements by Source:                                           */
3036
/*  Source address                                                            */
3037
/*    - Queue name and port                                                   */
3038
/*----------------------------------------------------------------------------*/
3039
3040
static void lbmr_queue_ads_source_stats_tree_init(stats_tree * tree)
3041
0
{
3042
0
    lbmr_stats_tree_handle_queue_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, STAT_DT_INT, true);
3043
0
}
3044
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_)
3046
0
{
3047
0
    const lbm_lbmr_queue_advertisement_tap_info_t * info = (const lbm_lbmr_queue_advertisement_tap_info_t *) data;
3048
0
    int source_node;
3049
0
    char * str;
3050
3051
0
    tick_stat_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, false);
3052
0
    source_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), lbmr_stats_tree_handle_queue_ads_source, true);
3053
0
    str = wmem_strdup_printf(pinfo->pool, "%s:%" PRIu16, info->queue, info->port);
3054
0
    tick_stat_node(tree, str, source_node, true);
3055
0
    return (TAP_PACKET_REDRAW);
3056
0
}
3057
3058
/*----------------------------------------------------------------------------*/
3059
/*  Queue queries by Queue:                                                   */
3060
/*  Queue name                                                                */
3061
/*    - Receiver address                                                      */
3062
/*----------------------------------------------------------------------------*/
3063
3064
static void lbmr_queue_queries_queue_stats_tree_init(stats_tree * tree)
3065
0
{
3066
0
    lbmr_stats_tree_handle_queue_queries_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, STAT_DT_INT, true);
3067
0
}
3068
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_)
3070
0
{
3071
0
    const lbm_lbmr_queue_query_tap_info_t * info = (const lbm_lbmr_queue_query_tap_info_t *) data;
3072
0
    int queue_node = 0;
3073
3074
0
    tick_stat_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, false);
3075
0
    queue_node = tick_stat_node(tree, info->queue, lbmr_stats_tree_handle_queue_queries_queue, true);
3076
0
    tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), queue_node, true);
3077
0
    return (TAP_PACKET_REDRAW);
3078
0
}
3079
3080
/*----------------------------------------------------------------------------*/
3081
/*  Queue queries by Receiver:                                                */
3082
/*  Receiver address                                                          */
3083
/*    - Queue name                                                            */
3084
/*----------------------------------------------------------------------------*/
3085
3086
static void lbmr_queue_queries_receiver_stats_tree_init(stats_tree * tree)
3087
0
{
3088
0
    lbmr_stats_tree_handle_queue_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, STAT_DT_INT, true);
3089
0
}
3090
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_)
3092
0
{
3093
0
    const lbm_lbmr_queue_query_tap_info_t * info = (const lbm_lbmr_queue_query_tap_info_t *) data;
3094
0
    int receiver_node;
3095
3096
0
    tick_stat_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, false);
3097
0
    receiver_node = tick_stat_node(tree, address_to_str(pinfo->pool, &pinfo->net_src), lbmr_stats_tree_handle_queue_queries_receiver, true);
3098
0
    tick_stat_node(tree, info->queue, receiver_node, true);
3099
0
    return (TAP_PACKET_REDRAW);
3100
0
}
3101
3102
/*----------------------------------------------------------------------------*/
3103
/* Dissector functions.                                                       */
3104
/*----------------------------------------------------------------------------*/
3105
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)
3110
0
{
3111
0
    proto_tree * opt_tree = NULL;
3112
0
    proto_item * opt_item = NULL;
3113
0
    uint8_t opt_len = 0;
3114
0
    static int * const flags[] =
3115
0
    {
3116
0
        &hf_lbmr_tnwg_opt_ctxinst_flags_ignore,
3117
0
        NULL
3118
0
    };
3119
3120
0
    opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_CTXINST_T_LEN);
3121
0
    opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_ctxinst, tvb, offset, opt_len, ENC_NA);
3122
0
    opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_ctxinst_opt);
3123
0
    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
0
    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
0
    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
0
    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
0
    return ((int) opt_len);
3128
0
}
3129
3130
static int dissect_lbmr_tnwg_address_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3131
0
{
3132
0
    proto_tree * opt_tree = NULL;
3133
0
    proto_item * opt_item = NULL;
3134
0
    uint8_t opt_len = 0;
3135
0
    static int * const flags[] =
3136
0
    {
3137
0
        &hf_lbmr_tnwg_opt_address_flags_ignore,
3138
0
        NULL
3139
0
    };
3140
3141
0
    opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_ADDRESS_T_LEN);
3142
0
    opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_address, tvb, offset, opt_len, ENC_NA);
3143
0
    opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_address_opt);
3144
0
    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
0
    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
0
    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
0
    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
0
    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
0
    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
0
    return ((int)opt_len);
3151
0
}
3152
3153
static int dissect_lbmr_tnwg_domain_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3154
0
{
3155
0
    proto_tree * opt_tree = NULL;
3156
0
    proto_item * opt_item = NULL;
3157
0
    uint8_t opt_len = 0;
3158
0
    static int * const flags[] =
3159
0
    {
3160
0
        &hf_lbmr_tnwg_opt_domain_flags_ignore,
3161
0
        NULL
3162
0
    };
3163
3164
0
    opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_DOMAIN_T_LEN);
3165
0
    opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_domain, tvb, offset, opt_len, ENC_NA);
3166
0
    opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_domain_opt);
3167
0
    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
0
    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
0
    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
0
    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
0
    return ((int)opt_len);
3172
0
}
3173
3174
static int dissect_lbmr_tnwg_name_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3175
0
{
3176
0
    proto_tree * opt_tree = NULL;
3177
0
    proto_item * opt_item = NULL;
3178
0
    uint8_t opt_len = 0;
3179
0
    static int * const flags[] =
3180
0
    {
3181
0
        &hf_lbmr_tnwg_opt_name_flags_ignore,
3182
0
        NULL
3183
0
    };
3184
0
    uint32_t name_len = 0;
3185
3186
0
    opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_T_LEN);
3187
0
    name_len = opt_len - L_LBMR_TNWG_OPT_T;
3188
0
    opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt_name, tvb, offset, opt_len, ENC_NA);
3189
0
    opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_name_opt);
3190
0
    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
0
    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
0
    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
0
    proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_name_name, tvb, offset + L_LBMR_TNWG_OPT_T, name_len, ENC_ASCII);
3194
0
    return ((int)opt_len);
3195
0
}
3196
3197
static int dissect_lbmr_tnwg_unknown_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
3198
0
{
3199
0
    proto_tree * opt_tree = NULL;
3200
0
    proto_item * opt_item = NULL;
3201
0
    uint8_t opt_len = 0;
3202
0
    static int * const flags[] =
3203
0
    {
3204
0
        &hf_lbmr_tnwg_opt_flags_ignore,
3205
0
        NULL
3206
0
    };
3207
0
    uint32_t data_len = 0;
3208
3209
0
    opt_len = tvb_get_uint8(tvb, offset + O_LBMR_TNWG_OPT_T_LEN);
3210
0
    data_len = opt_len - L_LBMR_TNWG_OPT_T;
3211
0
    opt_item = proto_tree_add_item(tree, hf_lbmr_tnwg_opt, tvb, offset, opt_len, ENC_NA);
3212
0
    opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_tnwg_unknown_opt);
3213
0
    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
0
    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
0
    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
0
    proto_tree_add_item(opt_tree, hf_lbmr_tnwg_opt_data, tvb, offset + L_LBMR_TNWG_OPT_T, data_len, ENC_NA);
3217
0
    return ((int)opt_len);
3218
0
}
3219
3220
static int dissect_lbmr_tnwg_opts(tvbuff_t * tvb, int offset, int length, packet_info * pinfo, proto_tree * tree)
3221
0
{
3222
0
    int len_remaining = length;
3223
0
    int curr_offset = offset;
3224
0
    int dissected_len = 0;
3225
0
    uint8_t type = 0;
3226
0
    int len_used = 0;
3227
3228
0
    while (len_remaining >= L_LBMR_TNWG_OPT_T)
3229
0
    {
3230
0
        type = tvb_get_uint8(tvb, curr_offset);
3231
0
        switch (type)
3232
0
        {
3233
0
            case LBMR_TNWG_OPT_CTXINST_TYPE:
3234
0
                dissected_len += dissect_lbmr_tnwg_ctxinst_opt(tvb, curr_offset, pinfo, tree);
3235
0
                break;
3236
0
            case LBMR_TNWG_OPT_ADDRESS_TYPE:
3237
0
                dissected_len += dissect_lbmr_tnwg_address_opt(tvb, curr_offset, pinfo, tree);
3238
0
                break;
3239
0
            case LBMR_TNWG_OPT_DOMAIN_TYPE:
3240
0
                dissected_len += dissect_lbmr_tnwg_domain_opt(tvb, curr_offset, pinfo, tree);
3241
0
                break;
3242
0
            case LBMR_TNWG_OPT_NAME_TYPE:
3243
0
                dissected_len += dissect_lbmr_tnwg_name_opt(tvb, curr_offset, pinfo, tree);
3244
0
                break;
3245
0
            default:
3246
0
                dissected_len += dissect_lbmr_tnwg_unknown_opt(tvb, curr_offset, pinfo, tree);
3247
0
                break;
3248
0
        }
3249
0
        len_remaining -= dissected_len;
3250
0
        len_used += dissected_len;
3251
0
        curr_offset += dissected_len;
3252
0
    }
3253
0
    return (len_used);
3254
0
}
3255
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)
3260
0
{
3261
0
    proto_tree * rec_tree = NULL;
3262
0
    proto_item * rec_item = NULL;
3263
0
    uint16_t rec_len = 0;
3264
0
    int string_len = 0;
3265
0
    static int * const flags[] =
3266
0
    {
3267
0
        &hf_lbmr_tnwg_interest_rec_flags_pattern,
3268
0
        &hf_lbmr_tnwg_interest_rec_flags_cancel,
3269
0
        &hf_lbmr_tnwg_interest_rec_flags_refresh,
3270
0
        NULL
3271
0
    };
3272
3273
0
    rec_len = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_REC_T_LEN);
3274
3275
0
    rec_item = proto_tree_add_item(tree, hf_lbmr_tnwg_interest_rec, tvb, offset, rec_len, ENC_NA);
3276
0
    rec_tree = proto_item_add_subtree(rec_item, ett_lbmr_tnwg_interest_rec);
3277
0
    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
0
    if (rec_len < L_LBMR_TNWG_INTEREST_REC_T)
3279
0
    {
3280
        /* XXX - report an error */
3281
0
        return ((int)rec_len);
3282
0
    }
3283
0
    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
0
    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
0
    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
0
    string_len = rec_len - L_LBMR_TNWG_INTEREST_REC_T;
3287
0
    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
0
    return ((int)rec_len);
3289
0
}
3290
3291
static int dissect_lbmr_tnwg_interest(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3292
0
{
3293
0
    proto_tree * int_tree = NULL;
3294
0
    proto_item * int_item = NULL;
3295
0
    uint16_t rec_count = 0;
3296
0
    int curr_offset = 0;
3297
0
    int len = 0;
3298
0
    int len_remaining = 0;
3299
0
    int len_dissected = 0;
3300
3301
0
    len_remaining = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_T_LEN);
3302
0
    rec_count = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_INTEREST_T_COUNT);
3303
0
    int_item = proto_tree_add_item(tree, hf_lbmr_tnwg_interest, tvb, offset, len_remaining, ENC_NA);
3304
0
    int_tree = proto_item_add_subtree(int_item, ett_lbmr_tnwg_interest);
3305
0
    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
0
    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);
3307
3308
0
    curr_offset = offset + L_LBMR_TNWG_INTEREST_T;
3309
0
    len = L_LBMR_TNWG_INTEREST_T;
3310
0
    while (rec_count > 0)
3311
0
    {
3312
0
        len_dissected = dissect_lbmr_tnwg_interest_rec(tvb, curr_offset, pinfo, int_tree);
3313
0
        curr_offset += len_dissected;
3314
0
        len += len_dissected;
3315
0
        rec_count--;
3316
0
    }
3317
0
    return (len);
3318
0
}
3319
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)
3324
0
{
3325
0
    proto_tree * ctxinfo_tree = NULL;
3326
0
    proto_item * ctxinfo_item = NULL;
3327
0
    static int * const flags1[] =
3328
0
    {
3329
0
        &hf_lbmr_tnwg_ctxinfo_flags1_query,
3330
0
        &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_src,
3331
0
        &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_rcv,
3332
0
        &hf_lbmr_tnwg_ctxinfo_flags1_proxy,
3333
0
        NULL
3334
0
    };
3335
0
    uint16_t reclen = 0;
3336
0
    uint16_t len_remaining = 0;
3337
0
    int len_used = 0;
3338
3339
0
    reclen = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_CTXINFO_T_LEN);
3340
0
    len_remaining = reclen;
3341
0
    ctxinfo_item = proto_tree_add_item(tree, hf_lbmr_tnwg_ctxinfo, tvb, offset, (int)reclen, ENC_NA);
3342
0
    ctxinfo_tree = proto_item_add_subtree(ctxinfo_item, ett_lbmr_tnwg_ctxinfo);
3343
0
    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
0
    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
0
    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
0
    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
0
    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
0
    offset += L_LBMR_TNWG_CTXINFO_T;
3349
0
    len_remaining -= L_LBMR_TNWG_CTXINFO_T;
3350
0
    len_used = L_LBMR_TNWG_CTXINFO_T;
3351
0
    if (len_remaining >= L_LBMR_TNWG_OPT_T)
3352
0
    {
3353
0
        len_used += dissect_lbmr_tnwg_opts(tvb, offset, len_remaining, pinfo, ctxinfo_tree);
3354
0
    }
3355
0
    return (len_used);
3356
0
}
3357
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)
3362
0
{
3363
0
    proto_tree * trreq_tree = NULL;
3364
0
    proto_item * trreq_item = NULL;
3365
0
    uint16_t reclen = 0;
3366
0
    uint16_t len_remaining = 0;
3367
0
    int len_used = 0;
3368
3369
0
    reclen = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_TRREQ_T_LEN);
3370
0
    len_remaining = reclen;
3371
3372
0
    trreq_item = proto_tree_add_item(tree, hf_lbmr_tnwg_trreq, tvb, offset, (int)reclen, ENC_NA);
3373
0
    trreq_tree = proto_item_add_subtree(trreq_item, ett_lbmr_tnwg_trreq);
3374
0
    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);
3375
3376
0
    offset += L_LBMR_TNWG_TRREQ_T;
3377
0
    len_remaining -= L_LBMR_TNWG_TRREQ_T;
3378
0
    len_used = L_LBMR_TNWG_TRREQ_T;
3379
0
    if (len_remaining >= L_LBMR_TNWG_OPT_T)
3380
0
    {
3381
0
        len_used += dissect_lbmr_tnwg_opts(tvb, offset, len_remaining, pinfo, trreq_tree);
3382
0
    }
3383
0
    return (len_used);
3384
0
}
3385
3386
/*----------------------------------------------------------------------------*/
3387
/* LBMR TNWG dissection functions.                                            */
3388
/*----------------------------------------------------------------------------*/
3389
static int dissect_lbmr_tnwg(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3390
0
{
3391
0
    uint16_t type = 0;
3392
0
    int curr_offset = 0;
3393
0
    int len_dissected = 0;
3394
0
    proto_item * type_item = NULL;
3395
3396
0
    type = tvb_get_ntohs(tvb, offset + O_LBMR_TNWG_T_TYPE);
3397
0
    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
0
    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
0
    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
0
    len_dissected = L_LBMR_TNWG_T;
3401
0
    curr_offset = offset + L_LBMR_TNWG_T;
3402
0
    switch (type)
3403
0
    {
3404
0
        case LBMR_TNWG_TYPE_INTEREST:
3405
0
            len_dissected += dissect_lbmr_tnwg_interest(tvb, curr_offset, pinfo, tree);
3406
0
            break;
3407
0
        case LBMR_TNWG_TYPE_CTXINFO:
3408
0
            len_dissected += dissect_lbmr_tnwg_ctxinfo(tvb, curr_offset, pinfo, tree);
3409
0
            break;
3410
0
        case LBMR_TNWG_TYPE_TRREQ:
3411
0
            len_dissected += dissect_lbmr_tnwg_trreq(tvb, curr_offset, pinfo, tree);
3412
0
            break;
3413
0
        default:
3414
0
            expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR TNWG type 0x%04x", type);
3415
0
            break;
3416
0
    }
3417
0
    return ((int)len_dissected);
3418
0
}
3419
3420
/*----------------------------------------------------------------------------*/
3421
/* LBMR Topic Management dissection functions.                                */
3422
/*----------------------------------------------------------------------------*/
3423
static int dissect_lbmr_tmr(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3424
0
{
3425
0
    unsigned namelen = 0;
3426
0
    int name_offset = 0;
3427
0
    char * name = NULL;
3428
0
    proto_item * ti = NULL;
3429
0
    proto_tree * tinfo_tree = NULL;
3430
0
    static int * const flags[] =
3431
0
    {
3432
0
        &hf_lbmr_tmr_flags_response,
3433
0
        &hf_lbmr_tmr_flags_wildcard_pcre,
3434
0
        &hf_lbmr_tmr_flags_wildcard_regex,
3435
0
        NULL
3436
0
    };
3437
0
    uint16_t tmr_len;
3438
0
    uint8_t tmr_type;
3439
0
    uint8_t tmr_flags;
3440
0
    const char * info_string = "";
3441
3442
0
    tmr_len = tvb_get_ntohs(tvb, offset + O_LBMR_TMR_T_LEN);
3443
0
    tmr_type = tvb_get_uint8(tvb, offset + O_LBMR_TMR_T_TYPE);
3444
0
    tmr_flags = tvb_get_uint8(tvb, offset + O_LBMR_TMR_T_FLAGS);
3445
0
    name_offset = offset + L_LBMR_TMR_T;
3446
3447
0
    name = (char*)tvb_get_stringz_enc(pinfo->pool, tvb, name_offset, &namelen, ENC_ASCII);
3448
3449
0
    switch (tmr_type)
3450
0
    {
3451
0
        case LBMR_TMR_LEAVE_TOPIC:
3452
0
        default:
3453
0
            break;
3454
0
        case LBMR_TMR_TOPIC_USE:
3455
0
            if (tmr_flags & LBMR_TMR_FLAG_RESPONSE)
3456
0
            {
3457
0
                info_string = " Response";
3458
0
            }
3459
0
            else
3460
0
            {
3461
0
                info_string = " Query";
3462
0
            }
3463
0
            break;
3464
0
    }
3465
0
    ti = proto_tree_add_none_format(tree, hf_lbmr_tmr, tvb, offset, tmr_len, "%s: %s%s, Length %" PRIu16,
3466
0
        name, val_to_str(pinfo->pool, tmr_type, lbmr_tmr_type, "Unknown (0x%02x)"), info_string, tmr_len);
3467
0
    tinfo_tree = proto_item_add_subtree(ti, ett_lbmr_tmr);
3468
0
    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
0
    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
0
    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
0
    proto_tree_add_item(tinfo_tree, hf_lbmr_tmr_name, tvb, name_offset, namelen, ENC_ASCII);
3472
0
    return ((int) tmr_len);
3473
0
}
3474
3475
static int dissect_lbmr_tmb(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3476
0
{
3477
0
    int tmr_len = 0;
3478
0
    proto_tree * tmb_tree = NULL;
3479
0
    proto_item * ti = NULL;
3480
0
    proto_tree * tmr_tree = NULL;
3481
0
    proto_item * tmr_ti = NULL;
3482
0
    int tmr_count = 0;
3483
0
    uint16_t tmrs;
3484
0
    int len_dissected;
3485
3486
0
    tmrs = tvb_get_ntohs(tvb, offset + O_LBMR_TMB_T_TMRS);
3487
0
    ti = proto_tree_add_item(tree, hf_lbmr_tmb, tvb, offset, -1, ENC_NA);
3488
0
    tmb_tree = proto_item_add_subtree(ti, ett_lbmr_tmb);
3489
0
    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
0
    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
0
    tmr_ti = proto_tree_add_item(tmb_tree, hf_lbmr_tmb_tmr_list, tvb, offset + L_LBMR_TMB_T, -1, ENC_NA);
3492
0
    tmr_tree = proto_item_add_subtree(tmr_ti, ett_lbmr_tmrs);
3493
3494
0
    offset += L_LBMR_TMB_T;
3495
0
    len_dissected = L_LBMR_TMB_T;
3496
0
    while (tmr_count < tmrs)
3497
0
    {
3498
0
        tmr_len = dissect_lbmr_tmr(tvb, offset, pinfo, tmr_tree);
3499
0
        len_dissected += tmr_len;
3500
0
        offset += tmr_len;
3501
0
        tmr_count++;
3502
0
    }
3503
0
    return (len_dissected);
3504
0
}
3505
3506
/*----------------------------------------------------------------------------*/
3507
/* LBMR Topic Query Record dissection functions.                              */
3508
/*----------------------------------------------------------------------------*/
3509
static int dissect_lbmr_tqr(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, bool wildcard_tqr, lbmr_contents_t * contents)
3510
0
{
3511
0
    unsigned reclen;
3512
0
    const char * name = NULL;
3513
0
    uint32_t pattern_type;
3514
0
    proto_item * tqr_item = NULL;
3515
0
    proto_tree * tqr_tree = NULL;
3516
0
    int name_offset = offset;
3517
3518
0
    if (wildcard_tqr)
3519
0
    {
3520
0
        name_offset++;
3521
0
        reclen = tvb_strsize(tvb, name_offset) + 1;
3522
0
        tqr_item = proto_tree_add_none_format(tree, hf_lbmr_tqr, tvb, offset, reclen, "Wildcard TQR");
3523
0
    }
3524
0
    else
3525
0
    {
3526
0
        reclen = tvb_strsize(tvb, name_offset);
3527
0
        tqr_item = proto_tree_add_item(tree, hf_lbmr_tqr, tvb, offset, reclen, ENC_NA);
3528
0
    }
3529
0
    tqr_tree = proto_item_add_subtree(tqr_item, ett_lbmr_tqr);
3530
0
    if (wildcard_tqr)
3531
0
    {
3532
0
        proto_tree_add_item_ret_uint(tqr_tree, hf_lbmr_tqr_pattern_type, tvb, offset, 1, ENC_BIG_ENDIAN, &pattern_type);
3533
0
        offset++;
3534
0
        proto_tree_add_item_ret_string(tqr_tree, hf_lbmr_tqr_pattern, tvb, offset, -1, ENC_ASCII, pinfo->pool, (const uint8_t **)&name);
3535
0
        add_contents_wctqr(pinfo->pool, contents, (unsigned char)pattern_type, name);
3536
0
    }
3537
0
    else
3538
0
    {
3539
0
        proto_tree_add_item_ret_string(tqr_tree, hf_lbmr_tqr_name, tvb, offset, -1, ENC_ASCII, pinfo->pool, (const uint8_t **)&name);
3540
0
        add_contents_tqr(pinfo->pool, contents, name);
3541
0
    }
3542
0
    proto_item_append_text(tqr_item, ": %s", name);
3543
0
    return (reclen);
3544
0
}
3545
3546
static int dissect_lbmr_tqrs(tvbuff_t * tvb, int offset, uint8_t tqr_count, packet_info * pinfo, proto_tree * tree,
3547
    bool wildcard_tqr, lbmr_contents_t * contents)
3548
0
{
3549
0
    int start_offset = 0;
3550
0
    int tqr_len = 0;
3551
0
    proto_tree * tqrs_tree = NULL;
3552
0
    proto_item * ti = NULL;
3553
0
    int len = 0;
3554
3555
0
    start_offset = offset;
3556
0
    if (wildcard_tqr)
3557
0
    {
3558
0
        ti = proto_tree_add_none_format(tree, hf_lbmr_tqrs, tvb, start_offset, -1, "Wildcard TQRs");
3559
0
    }
3560
0
    else
3561
0
    {
3562
0
        ti = proto_tree_add_none_format(tree, hf_lbmr_tqrs, tvb, start_offset, -1, "TQRs");
3563
0
    }
3564
0
    tqrs_tree = proto_item_add_subtree(ti, ett_lbmr_tqrs);
3565
0
    while (tqr_count-- > 0)
3566
0
    {
3567
0
        tqr_len = dissect_lbmr_tqr(tvb, offset, pinfo, tqrs_tree, wildcard_tqr, contents);
3568
0
        len += tqr_len;
3569
0
        offset += tqr_len;
3570
0
    }
3571
0
    proto_item_set_len(ti, len);
3572
0
    return (len);
3573
0
}
3574
3575
/*----------------------------------------------------------------------------*/
3576
/* LBMR Topic Information Record dissection functions.                        */
3577
/*----------------------------------------------------------------------------*/
3578
static int dissect_lbmr_tir_options(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
3579
0
{
3580
0
    uint8_t opt_type = 0;
3581
0
    uint8_t opt_len = 0;
3582
0
    int opt_total_len = 0;
3583
0
    int opt_remaining_len = 0;
3584
0
    int curr_offset = offset;
3585
0
    proto_item * oi = NULL;
3586
0
    proto_tree * otree = NULL;
3587
0
    proto_item * optlen_item = NULL;
3588
0
    proto_tree * optlen_tree = NULL;
3589
0
    static int * const opt_ume_flags[] =
3590
0
    {
3591
0
        &hf_lbmr_topt_ume_flags_ignore,
3592
0
        &hf_lbmr_topt_ume_flags_latejoin,
3593
0
        &hf_lbmr_topt_ume_flags_store,
3594
0
        &hf_lbmr_topt_ume_flags_qccap,
3595
0
        &hf_lbmr_topt_ume_flags_acktosrc,
3596
0
        NULL
3597
0
    };
3598
0
    static int * const opt_ume_store_flags[] =
3599
0
    {
3600
0
        &hf_lbmr_topt_ume_store_flags_ignore,
3601
0
        NULL
3602
0
    };
3603
0
    static int * const opt_ume_store_group_flags[] =
3604
0
    {
3605
0
        &hf_lbmr_topt_ume_store_group_flags_ignore,
3606
0
        NULL
3607
0
    };
3608
0
    static int * const opt_latejoin_flags[] =
3609
0
    {
3610
0
        &hf_lbmr_topt_latejoin_flags_ignore,
3611
0
        &hf_lbmr_topt_latejoin_flags_acktosrc,
3612
0
        NULL
3613
0
    };
3614
0
    static int * const opt_umq_rcridx_flags[] =
3615
0
    {
3616
0
        &hf_lbmr_topt_umq_rcridx_flags_ignore,
3617
0
        NULL
3618
0
    };
3619
0
    static int * const opt_umq_qinfo_flags[] =
3620
0
    {
3621
0
        &hf_lbmr_topt_umq_qinfo_flags_ignore,
3622
0
        &hf_lbmr_topt_umq_qinfo_flags_queue,
3623
0
        &hf_lbmr_topt_umq_qinfo_flags_rcvlisten,
3624
0
        &hf_lbmr_topt_umq_qinfo_flags_control,
3625
0
        &hf_lbmr_topt_umq_qinfo_flags_srcrcvlisten,
3626
0
        &hf_lbmr_topt_umq_qinfo_flags_participants_only,
3627
0
        NULL
3628
0
    };
3629
0
    static int * const opt_cost_flags[] =
3630
0
    {
3631
0
        &hf_lbmr_topt_cost_flags_ignore,
3632
0
        NULL
3633
0
    };
3634
0
    static int * const opt_otid_flags[] =
3635
0
    {
3636
0
        &hf_lbmr_topt_otid_flags_ignore,
3637
0
        NULL
3638
0
    };
3639
0
    static int * const opt_ctxinst_flags[] =
3640
0
    {
3641
0
        &hf_lbmr_topt_ctxinst_flags_ignore,
3642
0
        NULL
3643
0
    };
3644
0
    static int * const opt_ctxinsts_flags[] =
3645
0
    {
3646
0
        &hf_lbmr_topt_ctxinsts_flags_ignore,
3647
0
        NULL
3648
0
    };
3649
0
    static int * const opt_ulb_flags[] =
3650
0
    {
3651
0
        &hf_lbmr_topt_ulb_flags_ignore,
3652
0
        NULL
3653
0
    };
3654
0
    static int * const opt_ctxinstq_flags[] =
3655
0
    {
3656
0
        &hf_lbmr_topt_ctxinstq_flags_ignore,
3657
0
        NULL
3658
0
    };
3659
0
    static int * const opt_domain_id_flags[] =
3660
0
    {
3661
0
        &hf_lbmr_topt_domain_id_flags_ignore,
3662
0
        NULL
3663
0
    };
3664
0
    static int * const opt_exfunc_flags[] =
3665
0
    {
3666
0
        &hf_lbmr_topt_exfunc_flags_ignore,
3667
0
        NULL
3668
0
    };
3669
0
    static int * const opt_exfunc_functionality_flags[] =
3670
0
    {
3671
0
        &hf_lbmr_topt_exfunc_functionality_flags_ulb,
3672
0
        &hf_lbmr_topt_exfunc_functionality_flags_umq,
3673
0
        &hf_lbmr_topt_exfunc_functionality_flags_ume,
3674
0
        &hf_lbmr_topt_exfunc_functionality_flags_lj,
3675
0
        NULL
3676
0
    };
3677
0
    int len = 0;
3678
3679
0
    opt_total_len = (int)tvb_get_ntohs(tvb, curr_offset + O_LBMR_TOPIC_OPT_LEN_T_TOTAL_LEN);
3680
0
    opt_remaining_len = opt_total_len;
3681
3682
0
    oi = proto_tree_add_none_format(tree, hf_lbmr_topts, tvb, curr_offset, opt_total_len, "Options: %d bytes", opt_total_len);
3683
0
    otree = proto_item_add_subtree(oi, ett_lbmr_topts);
3684
0
    optlen_item = proto_tree_add_item(otree, hf_lbmr_topt_len, tvb, curr_offset, L_LBMR_TOPIC_OPT_LEN_T, ENC_NA);
3685
0
    optlen_tree = proto_item_add_subtree(optlen_item, ett_lbmr_topt_len);
3686
0
    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);
3687
0
    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);
3688
0
    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);
3689
0
    len = L_LBMR_TOPIC_OPT_LEN_T;
3690
0
    curr_offset += L_LBMR_TOPIC_OPT_LEN_T;
3691
0
    opt_remaining_len -= L_LBMR_TOPIC_OPT_LEN_T;
3692
0
    while (opt_remaining_len > 0)
3693
0
    {
3694
0
        proto_item * opt_item = NULL;
3695
0
        proto_tree * opt_tree = NULL;
3696
0
        proto_item * ei_item = NULL;
3697
0
        int qname_len;
3698
3699
0
        opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE);
3700
0
        opt_len = tvb_get_uint8(tvb, curr_offset + O_LBMR_TOPIC_OPT_T_LEN);
3701
0
        if (opt_len == 0)
3702
0
        {
3703
0
            opt_item = proto_tree_add_item(otree, hf_lbmr_topt_unknown, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3704
0
            opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_unknown);
3705
0
            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);
3706
0
            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);
3707
0
            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);
3708
0
            if (((int) opt_len) > L_LBMR_TOPIC_OPT_T)
3709
0
            {
3710
0
                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);
3711
0
            }
3712
0
            expert_add_info(pinfo, ei_item, &ei_lbmr_analysis_zero_len_option);
3713
0
            return (len);
3714
0
        }
3715
0
        switch (opt_type)
3716
0
        {
3717
0
            case LBMR_TOPIC_OPT_UME_TYPE:
3718
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ume, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3719
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume);
3720
0
                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);
3721
0
                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);
3722
0
                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);
3723
0
                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);
3724
0
                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);
3725
0
                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);
3726
0
                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);
3727
0
                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);
3728
0
                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);
3729
0
                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);
3730
0
                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);
3731
0
                break;
3732
0
            case LBMR_TOPIC_OPT_UME_STORE_TYPE:
3733
0
                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);
3734
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume_store);
3735
0
                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);
3736
0
                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);
3737
0
                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);
3738
0
                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);
3739
0
                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);
3740
0
                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);
3741
0
                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);
3742
0
                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);
3743
0
                break;
3744
0
            case LBMR_TOPIC_OPT_UME_STORE_GROUP_TYPE:
3745
0
                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);
3746
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ume_store_group);
3747
0
                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);
3748
0
                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);
3749
0
                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);
3750
0
                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);
3751
0
                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);
3752
0
                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);
3753
0
                break;
3754
0
            case LBMR_TOPIC_OPT_LATEJOIN_TYPE:
3755
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_latejoin, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3756
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_latejoin);
3757
0
                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);
3758
0
                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);
3759
0
                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);
3760
0
                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);
3761
0
                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);
3762
0
                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);
3763
0
                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);
3764
0
                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);
3765
0
                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);
3766
0
                break;
3767
0
            case LBMR_TOPIC_OPT_UMQ_RCRIDX_TYPE:
3768
0
                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);
3769
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_umq_rcridx);
3770
0
                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);
3771
0
                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);
3772
0
                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);
3773
0
                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);
3774
0
                break;
3775
0
            case LBMR_TOPIC_OPT_UMQ_QINFO_TYPE:
3776
0
                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);
3777
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_umq_qinfo);
3778
0
                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);
3779
0
                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);
3780
0
                qname_len = opt_len - L_LBMR_TOPIC_OPT_T;
3781
0
                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);
3782
0
                proto_tree_add_item(opt_tree, hf_lbmr_topt_umq_qinfo_queue, tvb, curr_offset + L_LBMR_TOPIC_OPT_T, qname_len, ENC_ASCII);
3783
0
                break;
3784
0
            case LBMR_TOPIC_OPT_COST_TYPE:
3785
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_cost, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3786
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_cost);
3787
0
                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);
3788
0
                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);
3789
0
                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);
3790
0
                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);
3791
0
                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);
3792
0
                break;
3793
0
            case LBMR_TOPIC_OPT_OTID_TYPE:
3794
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_otid, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3795
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_otid);
3796
0
                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);
3797
0
                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);
3798
0
                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);
3799
0
                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);
3800
0
                break;
3801
0
            case LBMR_TOPIC_OPT_CTXINST_TYPE:
3802
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinst, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3803
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinst);
3804
0
                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);
3805
0
                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);
3806
0
                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);
3807
0
                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);
3808
0
                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);
3809
0
                break;
3810
0
            case LBMR_TOPIC_OPT_CTXINSTS_TYPE:
3811
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinsts, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3812
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinsts);
3813
0
                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);
3814
0
                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);
3815
0
                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);
3816
0
                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);
3817
0
                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);
3818
0
                break;
3819
0
            case LBMR_TOPIC_OPT_ULB_TYPE:
3820
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ulb, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3821
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ulb);
3822
0
                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);
3823
0
                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);
3824
0
                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);
3825
0
                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);
3826
0
                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);
3827
0
                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);
3828
0
                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);
3829
0
                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);
3830
0
                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);
3831
0
                break;
3832
0
            case LBMR_TOPIC_OPT_CTXINSTQ_TYPE:
3833
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_ctxinstq, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3834
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_ctxinstq);
3835
0
                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);
3836
0
                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);
3837
0
                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);
3838
0
                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);
3839
0
                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);
3840
0
                break;
3841
0
            case LBMR_TOPIC_OPT_DOMAIN_ID_TYPE:
3842
0
                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);
3843
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_domain_id);
3844
0
                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);
3845
0
                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);
3846
0
                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);
3847
0
                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);
3848
0
                break;
3849
0
            case LBMR_TOPIC_OPT_EXFUNC_TYPE:
3850
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_exfunc, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3851
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_exfunc);
3852
0
                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);
3853
0
                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);
3854
0
                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);
3855
0
                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);
3856
0
                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);
3857
0
                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);
3858
0
                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);
3859
0
                break;
3860
0
            default:
3861
0
                opt_item = proto_tree_add_item(otree, hf_lbmr_topt_unknown, tvb, curr_offset + O_LBMR_TOPIC_OPT_T_TYPE, opt_len, ENC_NA);
3862
0
                opt_tree = proto_item_add_subtree(opt_item, ett_lbmr_topt_unknown);
3863
0
                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);
3864
0
                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);
3865
0
                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);
3866
0
                if (((int) opt_len) > L_LBMR_TOPIC_OPT_T)
3867
0
                {
3868
0
                    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);
3869
0
                }
3870
0
                expert_add_info_format(pinfo, ei_item, &ei_lbmr_analysis_invalid_value, "Unknown option 0x%02x", opt_type);
3871
0
                break;
3872
0
        }
3873
0
        len += opt_len;
3874
0
        curr_offset += opt_len;
3875
0
        opt_remaining_len -= opt_len;
3876
0
    }
3877
0
    return (opt_total_len);
3878
0
}
3879
3880
static int dissect_lbmr_tir_transport(tvbuff_t * tvb, int offset, lbm_uint8_t transport, lbm_uint8_t transport_len, const char * topic_name,
3881
    uint32_t topic_index, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents, proto_item * transport_len_item)
3882
0
{
3883
0
    int len = 0;
3884
0
    uint64_t channel;
3885
0
    proto_item * channel_item = NULL;
3886
0
    proto_item * ei_item = NULL;
3887
3888
0
    switch (transport)
3889
0
    {
3890
0
        case LBMR_TRANSPORT_TCP:
3891
0
            {
3892
0
                uint16_t port = 0;
3893
0
                uint32_t session_id = 0;
3894
0
                proto_item * tcp_item = NULL;
3895
0
                proto_tree * tcp_tree = NULL;
3896
0
                lbttcp_transport_t * lbttcp_transport = NULL;
3897
3898
0
                tcp_item = proto_tree_add_item(tree, hf_lbmr_tir_tcp, tvb, offset, (int) transport_len, ENC_NA);
3899
0
                tcp_tree = proto_item_add_subtree(tcp_item, ett_lbmr_tir_tcp);
3900
0
                if ((transport_len != L_LBMR_TIR_TCP_T) && (transport_len != L_LBMR_TIR_TCP_WITH_SID_T))
3901
0
                {
3902
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR TCP info");
3903
0
                    return 0;
3904
0
                }
3905
0
                if (transport_len == L_LBMR_TIR_TCP_WITH_SID_T)
3906
0
                {
3907
0
                    session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_SESSION_ID);
3908
0
                    port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_TCP_WITH_SID_T_PORT);
3909
0
                    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);
3910
0
                    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);
3911
0
                    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);
3912
0
                    len += L_LBMR_TIR_TCP_WITH_SID_T;
3913
0
                }
3914
0
                else
3915
0
                {
3916
0
                    port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_TCP_T_PORT);
3917
0
                    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);
3918
0
                    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);
3919
0
                    session_id = 0;
3920
0
                    len += L_LBMR_TIR_TCP_T;
3921
0
                }
3922
0
                lbttcp_transport = lbttcp_transport_add(&(pinfo->src), port, session_id, pinfo->num);
3923
0
                channel = lbttcp_transport->channel;
3924
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbttcp_transport_source_string(pinfo->pool, &(pinfo->src), port, session_id), topic_index);
3925
0
            }
3926
0
            break;
3927
0
        case LBMR_TRANSPORT_LBTRM:
3928
0
            {
3929
0
                uint16_t src_ucast_port = 0;
3930
0
                uint16_t udp_dest_port = 0;
3931
0
                uint32_t session_id = 0;
3932
0
                proto_item * lbtrm_item = NULL;
3933
0
                proto_tree * lbtrm_tree = NULL;
3934
0
                lbtrm_transport_t * lbtrm_transport = NULL;
3935
0
                address multicast_group;
3936
3937
0
                lbtrm_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtrm, tvb, offset, (int)transport_len, ENC_NA);
3938
0
                lbtrm_tree = proto_item_add_subtree(lbtrm_item, ett_lbmr_tir_lbtrm);
3939
0
                set_address_tvb(&multicast_group, AT_IPv4, L_LBMR_TIR_LBTRM_T_MCAST_ADDR, tvb, offset + O_LBMR_TIR_LBTRM_T_MCAST_ADDR);
3940
0
                session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRM_T_SESSION_ID);
3941
0
                udp_dest_port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRM_T_UDP_DEST_PORT);
3942
0
                src_ucast_port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRM_T_SRC_UCAST_PORT);
3943
0
                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);
3944
0
                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);
3945
0
                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);
3946
0
                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);
3947
0
                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);
3948
0
                lbtrm_transport = lbtrm_transport_add(&(pinfo->src), src_ucast_port, session_id, &multicast_group, udp_dest_port, pinfo->num);
3949
0
                channel = lbtrm_transport->channel;
3950
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbtrm_transport_source_string(&(pinfo->src), src_ucast_port, session_id, &multicast_group, udp_dest_port), topic_index);
3951
0
                len += L_LBMR_TIR_LBTRM_T;
3952
0
                if (transport_len != L_LBMR_TIR_LBTRM_T)
3953
0
                {
3954
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRM info");
3955
0
                }
3956
0
            }
3957
0
            break;
3958
0
        case LBMR_TRANSPORT_LBTRU:
3959
0
            {
3960
0
                uint32_t session_id;
3961
0
                uint16_t port;
3962
0
                proto_item * lbtru_item = NULL;
3963
0
                proto_tree * lbtru_tree = NULL;
3964
0
                lbtru_transport_t * lbtru_transport = NULL;
3965
3966
0
                lbtru_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtru, tvb, offset, (int)transport_len, ENC_NA);
3967
0
                lbtru_tree = proto_item_add_subtree(lbtru_item, ett_lbmr_tir_lbtru);
3968
0
                if ((transport_len != L_LBMR_TIR_LBTRU_T) && (transport_len != L_LBMR_TIR_LBTRU_WITH_SID_T))
3969
0
                {
3970
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRU info");
3971
0
                    return 0;
3972
0
                }
3973
0
                if (transport_len == L_LBMR_TIR_LBTRU_WITH_SID_T)
3974
0
                {
3975
0
                    session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_SESSION_ID);
3976
0
                    port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRU_WITH_SID_T_PORT);
3977
0
                    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);
3978
0
                    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);
3979
0
                    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);
3980
0
                    len += L_LBMR_TIR_LBTRU_WITH_SID_T;
3981
0
                }
3982
0
                else
3983
0
                {
3984
0
                    session_id = 0;
3985
0
                    port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRU_T_PORT);
3986
0
                    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);
3987
0
                    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);
3988
0
                    len += L_LBMR_TIR_LBTRU_T;
3989
0
                }
3990
0
                lbtru_transport = lbtru_transport_add(&(pinfo->src), port, session_id, pinfo->num);
3991
0
                channel = lbtru_transport->channel;
3992
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbtru_transport_source_string(&(pinfo->src), port, session_id), topic_index);
3993
0
            }
3994
0
            break;
3995
0
        case LBMR_TRANSPORT_LBTIPC:
3996
0
            {
3997
0
                uint32_t host_id;
3998
0
                uint32_t session_id;
3999
0
                uint16_t xport_id;
4000
0
                proto_item * lbtipc_item = NULL;
4001
0
                proto_tree * lbtipc_tree = NULL;
4002
0
                lbtipc_transport_t * lbtipc_transport = NULL;
4003
4004
0
                lbtipc_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtipc, tvb, offset, (int)transport_len, ENC_NA);
4005
0
                lbtipc_tree = proto_item_add_subtree(lbtipc_item, ett_lbmr_tir_lbtipc);
4006
0
                if (transport_len != L_LBMR_TIR_LBTIPC_T)
4007
0
                {
4008
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTIPC info");
4009
0
                    return 0;
4010
0
                }
4011
0
                host_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTIPC_T_HOST_ID);
4012
0
                session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTIPC_T_SESSION_ID);
4013
0
                xport_id = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTIPC_T_XPORT_ID);
4014
0
                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);
4015
0
                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);
4016
0
                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);
4017
0
                lbtipc_transport = lbtipc_transport_add(host_id, session_id, xport_id);
4018
0
                channel = lbtipc_transport->channel;
4019
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbtipc_transport_source_string(host_id, session_id, xport_id), topic_index);
4020
0
                len += L_LBMR_TIR_LBTIPC_T;
4021
0
            }
4022
0
            break;
4023
0
        case LBMR_TRANSPORT_LBTRDMA:
4024
0
            {
4025
0
                uint32_t session_id;
4026
0
                uint16_t port;
4027
0
                proto_item * lbtrdma_item = NULL;
4028
0
                proto_tree * lbtrdma_tree = NULL;
4029
0
                lbtrdma_transport_t * lbtrdma_transport = NULL;
4030
0
                address source_addr;
4031
4032
0
                lbtrdma_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtrdma, tvb, offset, (int)transport_len, ENC_NA);
4033
0
                lbtrdma_tree = proto_item_add_subtree(lbtrdma_item, ett_lbmr_tir_lbtrdma);
4034
0
                if (transport_len != L_LBMR_TIR_LBTRDMA_T)
4035
0
                {
4036
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTRDMA info");
4037
0
                    return 0;
4038
0
                }
4039
0
                set_address_tvb(&source_addr, AT_IPv4, L_LBMR_TIR_LBTRDMA_T_IP, tvb, offset + O_LBMR_TIR_LBTRDMA_T_IP);
4040
0
                session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTRDMA_T_SESSION_ID);
4041
0
                port = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTRDMA_T_PORT);
4042
0
                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);
4043
0
                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);
4044
0
                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);
4045
0
                lbtrdma_transport = lbtrdma_transport_add(&source_addr, port, session_id);
4046
0
                channel = lbtrdma_transport->channel;
4047
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbtrdma_transport_source_string(&source_addr, port, session_id), topic_index);
4048
0
                len += L_LBMR_TIR_LBTRDMA_T;
4049
0
            }
4050
0
            break;
4051
0
        case LBMR_TRANSPORT_LBTSMX:
4052
0
            {
4053
0
                uint32_t host_id;
4054
0
                uint32_t session_id;
4055
0
                uint16_t xport_id;
4056
0
                proto_item * lbtsmx_item = NULL;
4057
0
                proto_tree * lbtsmx_tree = NULL;
4058
0
                lbtsmx_transport_t * lbtsmx_transport = NULL;
4059
4060
0
                lbtsmx_item = proto_tree_add_item(tree, hf_lbmr_tir_lbtsmx, tvb, offset, (int)transport_len, ENC_NA);
4061
0
                lbtsmx_tree = proto_item_add_subtree(lbtsmx_item, ett_lbmr_tir_lbtsmx);
4062
0
                if (transport_len != L_LBMR_TIR_LBTSMX_T)
4063
0
                {
4064
0
                    expert_add_info_format(pinfo, transport_len_item, &ei_lbmr_analysis_length_incorrect, "Wrong transport length for LBMR TIR LBTSMX info");
4065
0
                }
4066
0
                host_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTSMX_T_HOST_ID);
4067
0
                session_id = tvb_get_ntohl(tvb, offset + O_LBMR_TIR_LBTSMX_T_SESSION_ID);
4068
0
                xport_id = tvb_get_ntohs(tvb, offset + O_LBMR_TIR_LBTSMX_T_XPORT_ID);
4069
0
                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);
4070
0
                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);
4071
0
                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);
4072
0
                lbtsmx_transport = lbtsmx_transport_add(host_id, session_id, xport_id);
4073
0
                channel = lbtsmx_transport->channel;
4074
0
                add_contents_tir(pinfo->pool, contents, topic_name, lbtsmx_transport_source_string(host_id, session_id, xport_id), topic_index);
4075
0
                len += L_LBMR_TIR_LBTSMX_T;
4076
0
            }
4077
0
            break;
4078
0
        default:
4079
0
            ei_item = proto_tree_add_item(tree, hf_lbmr_tir_unknown_transport, tvb, offset, transport_len, ENC_NA);
4080
0
            expert_add_info_format(pinfo, ei_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR TIR transport 0x%02x", transport);
4081
0
            len = transport_len;
4082
0
            channel = LBM_CHANNEL_NO_CHANNEL;
4083
0
            break;
4084
0
    }
4085
0
    if (channel != LBM_CHANNEL_NO_CHANNEL)
4086
0
    {
4087
0
        lbm_topic_add(channel, topic_index, topic_name);
4088
0
        channel_item = proto_tree_add_uint64(tree, hf_lbmr_tir_channel, tvb, 0, 0, channel);
4089
0
        proto_item_set_generated(channel_item);
4090
0
    }
4091
0
    return (len);
4092
0
}
4093
4094
static int dissect_lbmr_tir_entry(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4095
0
{
4096
0
    unsigned namelen = 0;
4097
0
    int reclen = 0;
4098
0
    int dissect_len = 0;
4099
0
    int tinfo_offset = 0;
4100
0
    char * name = NULL;
4101
0
    proto_item * ti = NULL;
4102
0
    proto_tree * tinfo_tree = NULL;
4103
0
    uint8_t transport;
4104
0
    uint8_t tlen;
4105
0
    uint16_t ttl;
4106
0
    uint32_t idx;
4107
0
    int curr_offset;
4108
0
    proto_item * transport_len_item = NULL;
4109
4110
0
    name = (char*)tvb_get_stringz_enc(pinfo->pool, tvb, offset, &namelen, ENC_ASCII);
4111
0
    reclen += namelen;
4112
0
    curr_offset = offset + namelen;
4113
0
    tinfo_offset = curr_offset;
4114
0
    transport = tvb_get_uint8(tvb, curr_offset + O_LBMR_TIR_T_TRANSPORT);
4115
0
    tlen = tvb_get_uint8(tvb, curr_offset + O_LBMR_TIR_T_TLEN);
4116
0
    ttl = tvb_get_ntohs(tvb, curr_offset + O_LBMR_TIR_T_TTL);
4117
0
    idx = tvb_get_ntohl(tvb, curr_offset + O_LBMR_TIR_T_INDEX);
4118
0
    reclen += L_LBMR_TIR_T;
4119
0
    curr_offset += L_LBMR_TIR_T;
4120
4121
0
    ti = proto_tree_add_none_format(tree, hf_lbmr_tir, tvb, offset, reclen, "%s: %s, Length %u, Index %" PRIu32 ", TTL %" PRIu16,
4122
0
        name, val_to_str(pinfo->pool, (transport & LBMR_TIR_TRANSPORT), lbmr_transport_type, "Unknown (0x%02x)"), tlen, idx, ttl);
4123
0
    tinfo_tree = proto_item_add_subtree(ti, ett_lbmr_tir);
4124
0
    proto_tree_add_item(tinfo_tree, hf_lbmr_tir_name, tvb, offset, namelen, ENC_ASCII);
4125
0
    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);
4126
0
    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);
4127
0
    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);
4128
0
    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);
4129
0
    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);
4130
0
    if ((transport & LBMR_TIR_OPTIONS) != 0)
4131
0
    {
4132
0
        dissect_len = dissect_lbmr_tir_options(tvb, curr_offset, pinfo, tinfo_tree);
4133
0
        reclen += dissect_len;
4134
0
        curr_offset += dissect_len;
4135
0
    }
4136
0
    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);
4137
0
    proto_item_set_len(ti, reclen);
4138
0
    return (reclen);
4139
0
}
4140
4141
static int dissect_lbmr_tirs(tvbuff_t * tvb, int offset, uint16_t tir_count, packet_info * pinfo, proto_tree * tree,
4142
    const char * name, lbmr_contents_t * contents)
4143
0
{
4144
0
    int start_offset;
4145
0
    int tir_len;
4146
0
    proto_tree * tirs_tree = NULL;
4147
0
    proto_item * ti = NULL;
4148
0
    int len = 0;
4149
4150
0
    start_offset = offset;
4151
0
    ti = proto_tree_add_none_format(tree, hf_lbmr_tirs, tvb, start_offset, -1, "%s", name);
4152
0
    tirs_tree = proto_item_add_subtree(ti, ett_lbmr_tirs);
4153
0
    while (tir_count-- > 0)
4154
0
    {
4155
0
        tir_len = dissect_lbmr_tir_entry(tvb, offset, pinfo, tirs_tree, contents);
4156
0
        offset += tir_len;
4157
0
        len += tir_len;
4158
0
    }
4159
0
    proto_item_set_len(ti, len);
4160
0
    return (len);
4161
0
}
4162
4163
/*----------------------------------------------------------------------------*/
4164
/* LBMR Queue Query Record dissection functions.                              */
4165
/*----------------------------------------------------------------------------*/
4166
static int dissect_lbmr_qqr(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4167
0
{
4168
0
    unsigned namelen = 0;
4169
0
    unsigned reclen = 0;
4170
0
    char * name = NULL;
4171
4172
0
    name = (char*)tvb_get_stringz_enc(pinfo->pool, tvb, offset, &namelen, ENC_ASCII);
4173
0
    reclen += namelen;
4174
0
    add_contents_qqr(pinfo->pool, contents, name);
4175
0
    proto_tree_add_item(tree, hf_lbmr_qqr_name, tvb, offset, namelen, ENC_ASCII);
4176
0
    return (reclen);
4177
0
}
4178
4179
static int dissect_lbmr_qqrs(tvbuff_t * tvb, int offset, uint8_t qqr_count, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4180
0
{
4181
0
    int start_offset;
4182
0
    int qqr_len;
4183
0
    proto_tree * qqrs_tree = NULL;
4184
0
    proto_item * qqrs_ti = NULL;
4185
0
    int total_len = 0;
4186
4187
0
    start_offset = offset;
4188
0
    qqrs_ti = proto_tree_add_item(tree, hf_lbmr_qqr, tvb, start_offset, -1, ENC_NA);
4189
0
    qqrs_tree = proto_item_add_subtree(qqrs_ti, ett_lbmr_qqrs);
4190
0
    while (qqr_count-- > 0)
4191
0
    {
4192
0
        qqr_len = dissect_lbmr_qqr(tvb, offset, pinfo, qqrs_tree, contents);
4193
0
        total_len += qqr_len;
4194
0
        offset += qqr_len;
4195
0
    }
4196
0
    proto_item_set_len(qqrs_ti, total_len);
4197
0
    return (total_len);
4198
0
}
4199
4200
/*----------------------------------------------------------------------------*/
4201
/* LBMR Queue Information Record dissection functions.                        */
4202
/*----------------------------------------------------------------------------*/
4203
static int dissect_lbmr_qir_queue_blk(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, const char * queue_name,
4204
    const char * topic_name, lbmr_contents_t * contents)
4205
0
{
4206
0
    uint16_t port = 0;
4207
0
    proto_item * ti = NULL;
4208
0
    proto_tree * blk_tree = NULL;
4209
4210
0
    port = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_QUEUE_BLK_T_PORT);
4211
0
    ti = proto_tree_add_item(tree, hf_lbmr_qir_queue_blk, tvb, offset, L_LBMR_QIR_QUEUE_BLK_T, ENC_NA);
4212
0
    blk_tree = proto_item_add_subtree(ti, ett_lbmr_qir_queue_blk);
4213
0
    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);
4214
0
    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);
4215
0
    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);
4216
0
    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);
4217
0
    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);
4218
0
    add_contents_qir(pinfo->pool, contents, queue_name, topic_name, port);
4219
0
    return ((int)L_LBMR_QIR_QUEUE_BLK_T);
4220
0
}
4221
4222
static int dissect_lbmr_qir_grp_blk(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree, lbmr_contents_t * contents _U_)
4223
0
{
4224
0
    proto_item * ti = NULL;
4225
0
    proto_tree * blk_tree = NULL;
4226
0
    uint16_t idx = 0;
4227
0
    uint16_t sz = 0;
4228
4229
0
    idx = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_IDX);
4230
0
    sz = tvb_get_ntohs(tvb, offset + O_LBMR_QIR_GRP_BLK_T_GRP_SZ);
4231
0
    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);
4232
0
    blk_tree = proto_item_add_subtree(ti, ett_lbmr_qir_grp_blk);
4233
0
    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);
4234
0
    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);
4235
0
    return ((int)L_LBMR_QIR_GRP_BLK_T);
4236
0
}
4237
4238
static int dissect_lbmr_qir_entry(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4239
0
{
4240
0
    unsigned qnamelen = 0;
4241
0
    int qnameoffset = 0;
4242
0
    char * qname = NULL;
4243
0
    unsigned tnamelen = 0;
4244
0
    int tnameoffset = 0;
4245
0
    char * tname = NULL;
4246
0
    int reclen = 0;
4247
0
    int curr_offset = 0;
4248
0
    proto_item * qirti = NULL;
4249
0
    proto_tree * qirtree = NULL;
4250
0
    proto_item * grpti = NULL;
4251
0
    proto_tree * grptree = NULL;
4252
0
    int grplen = 0;
4253
0
    proto_item * queueti = NULL;
4254
0
    proto_item * queuetree = NULL;
4255
0
    int queuelen = 0;
4256
0
    uint32_t queue_id = 0;
4257
0
    uint16_t grp_blks = 0;
4258
0
    uint16_t queue_blks = 0;
4259
0
    uint16_t have_options = 0;
4260
0
    int optlen = 0;
4261
4262
    /*
4263
        queue name (null-terminated)
4264
        topic name (null-terminated)
4265
        lbmr_qir_t
4266
        if qir.grp_blks & LBMR_QIR_OPTIONS
4267
            parse options (normal topic options - though there shouldn't be any) can use dissect_lbmr_tir_options
4268
        endif
4269
        group blocks (lbmr_qir_grp_blk_t)
4270
        queue blocks (lbmr_qir_queue_blk_t)
4271
    */
4272
0
    curr_offset = offset;
4273
0
    qnameoffset = curr_offset;
4274
0
    qname = (char*)tvb_get_stringz_enc(pinfo->pool, tvb, qnameoffset, &qnamelen, ENC_ASCII);
4275
0
    curr_offset += qnamelen;
4276
0
    reclen += qnamelen;
4277
0
    tnameoffset = curr_offset;
4278
0
    tname = (char*)tvb_get_stringz_enc(pinfo->pool, tvb, tnameoffset, &tnamelen, ENC_ASCII);
4279
0
    curr_offset += tnamelen;
4280
0
    reclen += tnamelen;
4281
0
    queue_id = tvb_get_ntohl(tvb, curr_offset + O_LBMR_QIR_T_QUEUE_ID);
4282
0
    have_options = tvb_get_ntohs(tvb, curr_offset + O_LBMR_QIR_T_GRP_BLKS);
4283
0
    grp_blks = have_options & LBMR_QIR_GRP_BLOCKS_MASK;
4284
0
    have_options &= LBMR_QIR_OPTIONS;
4285
0
    queue_blks = tvb_get_ntohs(tvb, curr_offset + O_LBMR_QIR_T_QUEUE_BLKS);
4286
0
    qirti = proto_tree_add_none_format(tree, hf_lbmr_qir, tvb, offset, reclen, "%s: %s, ID %" PRIu32, qname, tname, queue_id);
4287
0
    qirtree = proto_item_add_subtree(qirti, ett_lbmr_qir);
4288
0
    proto_tree_add_item(qirtree, hf_lbmr_qir_queue_name, tvb, qnameoffset, qnamelen, ENC_ASCII);
4289
0
    proto_tree_add_item(qirtree, hf_lbmr_qir_topic_name, tvb, tnameoffset, tnamelen, ENC_ASCII);
4290
0
    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);
4291
0
    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);
4292
0
    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);
4293
0
    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);
4294
0
    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);
4295
0
    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);
4296
0
    curr_offset += L_LBMR_QIR_T;
4297
0
    reclen += L_LBMR_QIR_T;
4298
0
    if (have_options)
4299
0
    {
4300
0
        optlen = dissect_lbmr_tir_options(tvb, curr_offset, pinfo, tree);
4301
0
        curr_offset += optlen;
4302
0
        reclen += optlen;
4303
0
    }
4304
0
    if (grp_blks > 0)
4305
0
    {
4306
0
        grpti = proto_tree_add_item(qirtree, hf_lbmr_qir_grps, tvb, curr_offset, 1, ENC_NA);
4307
0
        grptree = proto_item_add_subtree(grpti, ett_lbmr_qir_grp);
4308
0
        grplen = 0;
4309
0
        while (grp_blks-- > 0)
4310
0
        {
4311
0
            optlen = dissect_lbmr_qir_grp_blk(tvb, curr_offset, pinfo, grptree, contents);
4312
0
            curr_offset += optlen;
4313
0
            reclen += optlen;
4314
0
            grplen += optlen;
4315
0
        }
4316
0
        proto_item_set_len(grpti, grplen);
4317
0
    }
4318
0
    if (queue_blks > 0)
4319
0
    {
4320
0
        queueti = proto_tree_add_item(qirtree, hf_lbmr_qir_queues, tvb, curr_offset, 1, ENC_NA);
4321
0
        queuetree = proto_item_add_subtree(queueti, ett_lbmr_qir_queue);
4322
0
        queuelen = 0;
4323
0
        while (queue_blks-- > 0)
4324
0
        {
4325
0
            optlen = dissect_lbmr_qir_queue_blk(tvb, curr_offset, pinfo, queuetree, qname, tname, contents);
4326
0
            curr_offset += optlen;
4327
0
            reclen += optlen;
4328
0
            queuelen += optlen;
4329
0
        }
4330
0
        proto_item_set_len(queueti, queuelen);
4331
0
    }
4332
0
    proto_item_set_len(qirti, reclen);
4333
0
    return (reclen);
4334
0
}
4335
4336
static int dissect_lbmr_qirs(tvbuff_t * tvb, int offset, uint16_t qirs, packet_info * pinfo, proto_tree * tree, lbmr_contents_t * contents)
4337
0
{
4338
0
    int start_offset;
4339
0
    int qir_len;
4340
0
    proto_tree * qirs_tree = NULL;
4341
0
    proto_item * qirs_ti = NULL;
4342
0
    int len = 0;
4343
4344
0
    start_offset = offset;
4345
0
    qirs_ti = proto_tree_add_item(tree, hf_lbmr_qirs, tvb, start_offset, -1, ENC_NA);
4346
0
    qirs_tree = proto_item_add_subtree(qirs_ti, ett_lbmr_qirs);
4347
0
    while (qirs-- > 0)
4348
0
    {
4349
0
        qir_len = dissect_lbmr_qir_entry(tvb, offset, pinfo, qirs_tree, contents);
4350
0
        len += qir_len;
4351
0
        offset += qir_len;
4352
0
    }
4353
0
    proto_item_set_len(qirs_ti, len);
4354
0
    return (len);
4355
0
}
4356
4357
/*----------------------------------------------------------------------------*/
4358
/* LBMR Proxy Source Election Record dissection functions.                    */
4359
/*----------------------------------------------------------------------------*/
4360
static int dissect_lbmr_pser(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4361
0
{
4362
0
    int hdr_len = 0;
4363
0
    int len = 0;
4364
0
    int topic_len = 0;
4365
0
    static int * const flags[] =
4366
0
    {
4367
0
        &hf_lbmr_pser_flags_option,
4368
0
        NULL
4369
0
    };
4370
0
    int curr_offset = offset;
4371
0
    uint16_t flags_val = 0;
4372
4373
0
    hdr_len = (int)tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_T_LEN);
4374
0
    flags_val = tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_T_FLAGS);
4375
0
    topic_len = hdr_len - L_LBMR_PSER_T;
4376
0
    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);
4377
0
    proto_tree_add_item(tree, hf_lbmr_pser_len, tvb, offset + O_LBMR_PSER_T_LEN, L_LBMR_PSER_T_LEN, ENC_BIG_ENDIAN);
4378
0
    proto_tree_add_bitmask(tree, tvb, offset + O_LBMR_PSER_T_FLAGS, hf_lbmr_pser_flags, ett_lbmr_pser_flags, flags, ENC_BIG_ENDIAN);
4379
0
    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);
4380
0
    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);
4381
0
    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);
4382
0
    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);
4383
0
    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);
4384
0
    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);
4385
0
    proto_tree_add_item(tree, hf_lbmr_pser_topic, tvb, offset + O_LBMR_PSER_T_TOPIC, topic_len, ENC_ASCII);
4386
0
    curr_offset += hdr_len;
4387
0
    len = hdr_len;
4388
0
    if ((flags_val & LBMR_PSER_OPT_FLAG) != 0)
4389
0
    {
4390
0
        proto_tree * opts_tree = NULL;
4391
0
        proto_item * opts_item = NULL;
4392
0
        proto_tree * optlen_tree = NULL;
4393
0
        proto_tree * optlen_item = NULL;
4394
0
        uint16_t opt_len = 0;
4395
4396
0
        opt_len = tvb_get_ntohs(tvb, curr_offset + O_LBMR_PSER_OPTLEN_T_OPTLEN);
4397
0
        opts_item = proto_tree_add_item(tree, hf_lbmr_pser_opts, tvb, curr_offset, -1, ENC_NA);
4398
0
        opts_tree = proto_item_add_subtree(opts_item, ett_lbmr_pser_opts);
4399
0
        optlen_item = proto_tree_add_item(opts_tree, hf_lbmr_pser_optlen, tvb, curr_offset, L_LBMR_PSER_OPTLEN_T, ENC_NA);
4400
0
        optlen_tree = proto_item_add_subtree(optlen_item, ett_lbmr_pser_opt_len);
4401
0
        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);
4402
0
        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);
4403
0
        proto_item_set_len(opts_item, opt_len);
4404
0
        len += L_LBMR_PSER_OPTLEN_T;
4405
0
        curr_offset += L_LBMR_PSER_OPTLEN_T;
4406
0
        opt_len -= L_LBMR_PSER_OPTLEN_T;
4407
0
        while (opt_len > 0)
4408
0
        {
4409
0
            proto_tree * ctxinst_tree = NULL;
4410
0
            proto_item * ctxinst_item = NULL;
4411
0
            uint8_t opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_PSER_OPT_HDR_T_TYPE);
4412
0
            uint8_t option_len = tvb_get_uint8(tvb, curr_offset + O_LBMR_PSER_OPT_HDR_T_LEN);
4413
4414
0
            switch (opt_type)
4415
0
            {
4416
0
                case LBMR_PSER_OPT_SRC_CTXINST_TYPE:
4417
0
                case LBMR_PSER_OPT_STORE_CTXINST_TYPE:
4418
0
                    ctxinst_item = proto_tree_add_item(opts_tree, hf_lbmr_pser_opt_ctxinst, tvb, curr_offset, L_LBMR_PSER_OPT_CTXINST_T, ENC_NA);
4419
0
                    ctxinst_tree = proto_item_add_subtree(ctxinst_item, ett_lbmr_pser_opt_ctxinst);
4420
0
                    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);
4421
0
                    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);
4422
0
                    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);
4423
0
                    len += L_LBMR_PSER_OPT_CTXINST_T;
4424
0
                    curr_offset += L_LBMR_PSER_OPT_CTXINST_T;
4425
0
                    opt_len -= L_LBMR_PSER_OPT_CTXINST_T;
4426
0
                    break;
4427
0
                default:
4428
0
                    len += option_len;
4429
0
                    curr_offset += option_len;
4430
0
                    opt_len -= option_len;
4431
0
                    expert_add_info_format(pinfo, NULL, &ei_lbmr_analysis_invalid_value, "Unknown LBMR PSER option 0x%02x", opt_type);
4432
0
                    if (option_len == 0) {
4433
0
                        return (len);
4434
0
                    }
4435
0
                    break;
4436
0
            }
4437
0
        }
4438
0
    }
4439
0
    return (len);
4440
0
}
4441
4442
/*----------------------------------------------------------------------------*/
4443
/* LBMR Queue Management dissection functions.                                */
4444
/*----------------------------------------------------------------------------*/
4445
int lbmr_dissect_umq_qmgmt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4446
35
{
4447
35
    uint8_t pckt_type = 0;
4448
35
    int curr_offset = 0;
4449
35
    uint16_t dep16;
4450
35
    uint16_t idx;
4451
35
    uint8_t flags_val = 0;
4452
35
    int len_dissected = 0;
4453
35
    static int * const flags[] =
4454
35
    {
4455
35
        &hf_qmgmt_flags_i_flag,
4456
35
        &hf_qmgmt_flags_n_flag,
4457
35
        NULL
4458
35
    };
4459
35
    static int * const il_flags[] =
4460
35
    {
4461
35
        &hf_qmgmt_flags_i_flag,
4462
35
        &hf_qmgmt_flags_n_flag,
4463
35
        &hf_qmgmt_flags_il_l_flag,
4464
35
        &hf_qmgmt_flags_il_k_flag,
4465
35
        NULL
4466
35
    };
4467
4468
35
    flags_val = tvb_get_uint8(tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS);
4469
35
    pckt_type = tvb_get_uint8(tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE);
4470
35
    dep16 = tvb_get_ntohs(tvb, offset + O_UMQ_QMGMT_HDR_T_PCKT_TYPE_DEP16);
4471
35
    if (pckt_type == UMQ_QMGMT_HDR_PCKT_TYPE_IL)
4472
5
    {
4473
5
        proto_tree_add_bitmask(tree, tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS, hf_qmgmt_flags, ett_qmgmt_flags, il_flags, ENC_BIG_ENDIAN);
4474
5
    }
4475
30
    else
4476
30
    {
4477
30
        proto_tree_add_bitmask(tree, tvb, offset + O_UMQ_QMGMT_HDR_T_FLAGS, hf_qmgmt_flags, ett_qmgmt_flags, flags, ENC_BIG_ENDIAN);
4478
30
    }
4479
35
    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);
4480
35
    proto_tree_add_item(tree, hf_qmgmt_cfgsig, tvb, offset + O_UMQ_QMGMT_HDR_T_CFGSIG, L_UMQ_QMGMT_HDR_T_CFGSIG, ENC_NA);
4481
35
    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);
4482
35
    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);
4483
35
    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);
4484
35
    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);
4485
35
    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);
4486
35
    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);
4487
35
    switch (pckt_type)
4488
35
    {
4489
5
        case UMQ_QMGMT_HDR_PCKT_TYPE_IL:
4490
5
            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);
4491
5
            break;
4492
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_JREJ:
4493
1
            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);
4494
1
            break;
4495
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_EV:
4496
1
            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);
4497
1
            break;
4498
27
        default:
4499
27
            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);
4500
27
            break;
4501
35
    }
4502
34
    len_dissected = L_UMQ_QMGMT_HDR_T;
4503
34
    curr_offset = offset + L_UMQ_QMGMT_HDR_T;
4504
34
    switch (pckt_type)
4505
34
    {
4506
5
        case UMQ_QMGMT_HDR_PCKT_TYPE_IL:
4507
5
            {
4508
5
                proto_item * il_subtree_item = NULL;
4509
5
                proto_tree * il_subtree = NULL;
4510
5
                static int * const il_inst_flags[] =
4511
5
                {
4512
5
                    &hf_qmgmt_il_inst_flags_m_flag,
4513
5
                    &hf_qmgmt_il_inst_flags_q_flag,
4514
5
                    &hf_qmgmt_il_inst_flags_p_flag,
4515
5
                    NULL
4516
5
                };
4517
4518
5
                il_subtree_item = proto_tree_add_item(tree, hf_qmgmt_il, tvb, curr_offset, L_UMQ_QMGMT_IL_HDR_T, ENC_NA);
4519
5
                il_subtree = proto_item_add_subtree(il_subtree_item, ett_qmgmt_il);
4520
5
                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);
4521
5
                len_dissected += L_UMQ_QMGMT_IL_HDR_T;
4522
5
                curr_offset += L_UMQ_QMGMT_IL_HDR_T;
4523
30
                for (idx = 0; idx < dep16; ++idx)
4524
25
                {
4525
25
                    proto_item * il_inst_subtree_item = NULL;
4526
25
                    proto_tree * il_inst_subtree = NULL;
4527
4528
25
                    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);
4529
25
                    il_inst_subtree = proto_item_add_subtree(il_inst_subtree_item, ett_qmgmt_il_inst);
4530
25
                    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);
4531
25
                    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);
4532
25
                    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);
4533
25
                    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);
4534
25
                    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);
4535
25
                    len_dissected += L_UMQ_QMGMT_IL_INST_HDR_T;
4536
25
                    curr_offset += L_UMQ_QMGMT_IL_INST_HDR_T;
4537
25
                }
4538
5
            }
4539
5
            break;
4540
0
        case UMQ_QMGMT_HDR_PCKT_TYPE_JR:
4541
            /* Nothing to do */
4542
0
            break;
4543
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_JREJ:
4544
            /* Nothing to do */
4545
1
            break;
4546
0
        case UMQ_QMGMT_HDR_PCKT_TYPE_IKA:
4547
            /* Nothing to do */
4548
0
            break;
4549
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_EC:
4550
1
            {
4551
1
                proto_item * ec_subtree_item = NULL;
4552
1
                proto_tree * ec_subtree = NULL;
4553
4554
1
                ec_subtree_item = proto_tree_add_item(tree, hf_qmgmt_ec, tvb, curr_offset, L_UMQ_QMGMT_EC_HDR_T, ENC_NA);
4555
1
                ec_subtree = proto_item_add_subtree(ec_subtree_item, ett_qmgmt_ec);
4556
1
                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);
4557
1
                len_dissected += L_UMQ_QMGMT_EC_HDR_T;
4558
1
                curr_offset += L_UMQ_QMGMT_EC_HDR_T;
4559
1
            }
4560
1
            break;
4561
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_EV:
4562
1
            {
4563
1
                proto_item * ev_subtree_item = NULL;
4564
1
                proto_tree * ev_subtree = NULL;
4565
4566
1
                ev_subtree_item = proto_tree_add_item(tree, hf_qmgmt_ev, tvb, curr_offset, L_UMQ_QMGMT_EV_HDR_T, ENC_NA);
4567
1
                ev_subtree = proto_item_add_subtree(ev_subtree_item, ett_qmgmt_ev);
4568
1
                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);
4569
1
                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);
4570
1
                len_dissected += L_UMQ_QMGMT_EV_HDR_T;
4571
1
                curr_offset += L_UMQ_QMGMT_EV_HDR_T;
4572
1
            }
4573
1
            break;
4574
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_CNIL:
4575
            /* Nothing to do */
4576
1
            break;
4577
1
        case UMQ_QMGMT_HDR_PCKT_TYPE_QRO:
4578
1
            {
4579
1
                proto_item * qro_subtree_item = NULL;
4580
1
                proto_tree * qro_subtree = NULL;
4581
4582
1
                qro_subtree_item = proto_tree_add_item(tree, hf_qmgmt_qro, tvb, curr_offset, L_UMQ_QMGMT_QRO_HDR_T, ENC_NA);
4583
1
                qro_subtree = proto_item_add_subtree(qro_subtree_item, ett_qmgmt_qro);
4584
1
                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);
4585
1
                len_dissected += L_UMQ_QMGMT_QRO_HDR_T;
4586
1
                curr_offset += L_UMQ_QMGMT_QRO_HDR_T;
4587
1
            }
4588
1
            break;
4589
24
        default:
4590
24
            expert_add_info_format(pinfo, NULL, &ei_lbmr_analysis_invalid_value, "Unknown LBMR QMGMT packet type 0x%02x", pckt_type);
4591
24
            break;
4592
34
    }
4593
29
    if ((flags_val & UMQ_QMGMT_HDR_N_FLAG) != 0)
4594
9
    {
4595
9
        int qnamelen = tvb_reported_length_remaining(tvb, curr_offset);
4596
9
        if (qnamelen > 1)
4597
9
        {
4598
9
            proto_tree_add_item(tree, hf_qmgmt_qname, tvb, curr_offset, qnamelen, ENC_ASCII);
4599
9
        }
4600
9
        len_dissected += qnamelen;
4601
9
    }
4602
29
    return (len_dissected);
4603
34
}
4604
4605
/*----------------------------------------------------------------------------*/
4606
/* LBMR ContextInfo dissection functions.                                     */
4607
/*----------------------------------------------------------------------------*/
4608
static int dissect_lbmr_ctxinfo(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4609
0
{
4610
0
    uint16_t flags16 = 0;
4611
0
    uint8_t reclen = 0;
4612
0
    static int * const flags[] =
4613
0
    {
4614
0
        &hf_lbmr_ctxinfo_flags_query,
4615
0
        &hf_lbmr_ctxinfo_flags_ip,
4616
0
        &hf_lbmr_ctxinfo_flags_instance,
4617
0
        &hf_lbmr_ctxinfo_flags_tnwg_src,
4618
0
        &hf_lbmr_ctxinfo_flags_tnwg_rcv,
4619
0
        &hf_lbmr_ctxinfo_flags_proxy,
4620
0
        &hf_lbmr_ctxinfo_flags_name,
4621
0
        NULL
4622
0
    };
4623
4624
0
    flags16 = tvb_get_ntohs(tvb, offset + O_LBMR_CTXINFO_T_FLAGS);
4625
0
    reclen = tvb_get_uint8(tvb, offset + O_LBMR_CTXINFO_T_LEN);
4626
0
    proto_tree_add_item(tree, hf_lbmr_ctxinfo_len, tvb, offset + O_LBMR_CTXINFO_T_LEN, L_LBMR_CTXINFO_T_LEN, ENC_BIG_ENDIAN);
4627
0
    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);
4628
0
    proto_tree_add_bitmask(tree, tvb, offset + O_LBMR_CTXINFO_T_FLAGS, hf_lbmr_ctxinfo_flags, ett_lbmr_ctxinfo_flags, flags, ENC_BIG_ENDIAN);
4629
0
    proto_tree_add_item(tree, hf_lbmr_ctxinfo_port, tvb, offset + O_LBMR_CTXINFO_T_PORT, L_LBMR_CTXINFO_T_FLAGS, ENC_BIG_ENDIAN);
4630
0
    proto_tree_add_item(tree, hf_lbmr_ctxinfo_ip, tvb, offset + O_LBMR_CTXINFO_T_IP, L_LBMR_CTXINFO_T_IP, ENC_BIG_ENDIAN);
4631
0
    proto_tree_add_item(tree, hf_lbmr_ctxinfo_instance, tvb, offset + O_LBMR_CTXINFO_T_INSTANCE, L_LBMR_CTXINFO_T_INSTANCE, ENC_NA);
4632
0
    if ((flags16 & LBMR_CTXINFO_NAME_FLAG) != 0)
4633
0
    {
4634
0
        proto_tree_add_item(tree, hf_lbmr_ctxinfo_name, tvb, offset + L_LBMR_CTXINFO_T, reclen - L_LBMR_CTXINFO_T, ENC_ASCII);
4635
0
    }
4636
0
    return ((int)reclen);
4637
0
}
4638
4639
/*----------------------------------------------------------------------------*/
4640
/* LBMR Topic Res Request dissection functions.                               */
4641
/*----------------------------------------------------------------------------*/
4642
static int dissect_lbmr_topic_res_request(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4643
0
{
4644
0
    static int * const flags[] =
4645
0
    {
4646
0
        &hf_lbmr_topic_res_request_flags_gw_remote_interest,
4647
0
        &hf_lbmr_topic_res_request_flags_context_query,
4648
0
        &hf_lbmr_topic_res_request_flags_context_advertisement,
4649
0
        &hf_lbmr_topic_res_request_flags_gateway_meta,
4650
0
        &hf_lbmr_topic_res_request_flags_advertisement,
4651
0
        &hf_lbmr_topic_res_request_flags_query,
4652
0
        &hf_lbmr_topic_res_request_flags_wildcard_query,
4653
0
        NULL
4654
0
    };
4655
4656
0
    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);
4657
0
    return (L_LBMR_TOPIC_RES_REQUEST_T);
4658
0
}
4659
4660
/*----------------------------------------------------------------------------*/
4661
/* LBMR Remote Domain Route dissection functions.                             */
4662
/*----------------------------------------------------------------------------*/
4663
static int dissect_lbmr_remote_domain_route(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4664
0
{
4665
0
    uint16_t num_domains;
4666
0
    int len_dissected = 0;
4667
0
    int ofs = 0;
4668
0
    uint16_t idx;
4669
4670
0
    num_domains = tvb_get_ntohs(tvb, offset + O_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T_NUM_DOMAINS);
4671
0
    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);
4672
0
    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);
4673
0
    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);
4674
0
    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);
4675
0
    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);
4676
0
    len_dissected = L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T;
4677
0
    ofs = offset + L_LBMR_REMOTE_DOMAIN_ROUTE_HDR_T;
4678
0
    for (idx = 0; idx < num_domains; ++idx)
4679
0
    {
4680
0
        proto_tree_add_item(tree, hf_lbmr_remote_domain_route_hdr_domain, tvb, ofs, sizeof(lbm_uint32_t), ENC_BIG_ENDIAN);
4681
0
        len_dissected += (int)sizeof(lbm_uint32_t);
4682
0
        ofs += (int)sizeof(lbm_uint32_t);
4683
0
    }
4684
0
    return (len_dissected);
4685
0
}
4686
4687
/*----------------------------------------------------------------------------*/
4688
/* LBMR Remote ContextInfo option dissection functions.                       */
4689
/*----------------------------------------------------------------------------*/
4690
static int dissect_lbmr_rctxinfo_rec_address_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4691
0
{
4692
0
    proto_tree * subtree = NULL;
4693
0
    proto_item * subtree_item = NULL;
4694
4695
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_address, tvb, offset, L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T, ENC_NA);
4696
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_address);
4697
0
    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);
4698
0
    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);
4699
0
    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);
4700
0
    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);
4701
0
    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);
4702
0
    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);
4703
0
    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);
4704
0
    return ((int)L_LBMR_RCTXINFO_REC_ADDRESS_OPT_T);
4705
0
}
4706
4707
static int dissect_lbmr_rctxinfo_rec_instance_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4708
0
{
4709
0
    proto_tree * subtree = NULL;
4710
0
    proto_item * subtree_item = NULL;
4711
0
    uint8_t len = 0;
4712
4713
0
    len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_INSTANCE_OPT_T_LEN);
4714
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_instance, tvb, offset, (int)len, ENC_NA);
4715
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_instance);
4716
0
    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);
4717
0
    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);
4718
0
    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);
4719
0
    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);
4720
0
    return ((int)L_LBMR_RCTXINFO_REC_INSTANCE_OPT_T);
4721
0
}
4722
4723
static int dissect_lbmr_rctxinfo_rec_odomain_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4724
0
{
4725
0
    proto_tree * subtree = NULL;
4726
0
    proto_item * subtree_item = NULL;
4727
0
    uint8_t len = 0;
4728
4729
0
    len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T_LEN);
4730
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_odomain, tvb, offset, (int)len, ENC_NA);
4731
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_odomain);
4732
0
    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);
4733
0
    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);
4734
0
    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);
4735
0
    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);
4736
0
    return ((int)L_LBMR_RCTXINFO_REC_ODOMAIN_OPT_T);
4737
0
}
4738
4739
static int dissect_lbmr_rctxinfo_rec_name_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4740
0
{
4741
0
    proto_tree * subtree = NULL;
4742
0
    proto_item * subtree_item = NULL;
4743
0
    uint8_t len = 0;
4744
0
    int name_len = 0;
4745
4746
0
    len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_NAME_OPT_T_LEN);
4747
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_name, tvb, offset, (int)len, ENC_NA);
4748
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_name);
4749
0
    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);
4750
0
    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);
4751
0
    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);
4752
0
    name_len = ((int)len) - L_LBMR_RCTXINFO_REC_NAME_OPT_T;
4753
0
    proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_name_name, tvb, offset + L_LBMR_RCTXINFO_REC_NAME_OPT_T, name_len, ENC_ASCII);
4754
0
    return ((int)len);
4755
0
}
4756
4757
static int dissect_lbmr_rctxinfo_rec_unknown_opt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4758
0
{
4759
0
    proto_tree * subtree = NULL;
4760
0
    proto_item * subtree_item = NULL;
4761
0
    uint8_t len = 0;
4762
0
    int data_len = 0;
4763
0
    uint8_t opt_type;
4764
4765
0
    opt_type = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_TYPE);
4766
0
    len = tvb_get_uint8(tvb, offset + O_LBMR_RCTXINFO_REC_OPT_T_LEN);
4767
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec_unknown, tvb, offset, (int)len, ENC_NA);
4768
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec_unknown);
4769
0
    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);
4770
0
    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);
4771
0
    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);
4772
0
    data_len = ((int) len) - L_LBMR_RCTXINFO_REC_OPT_T;
4773
0
    proto_tree_add_item(subtree, hf_lbmr_rctxinfo_rec_unknown_data, tvb, offset + L_LBMR_RCTXINFO_REC_OPT_T, data_len, ENC_NA);
4774
0
    expert_add_info_format(pinfo, subtree_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR RCTXINFO option 0x%02x", opt_type);
4775
0
    return ((int) len);
4776
0
}
4777
4778
/*----------------------------------------------------------------------------*/
4779
/* LBMR Remote ContextInfo dissection functions.                              */
4780
/*----------------------------------------------------------------------------*/
4781
static int dissect_lbmr_rctxinfo_rec(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4782
0
{
4783
0
    proto_tree * subtree = NULL;
4784
0
    proto_item * subtree_item = NULL;
4785
0
    uint8_t opt_type = 0;
4786
0
    static int * const flags[] =
4787
0
    {
4788
0
        &hf_lbmr_rctxinfo_rec_flags_query,
4789
0
        NULL
4790
0
    };
4791
0
    uint16_t len = 0;
4792
0
    int rec_len_remaining = 0;
4793
0
    int ofs = 0;
4794
0
    int opt_len_dissected = 0;
4795
0
    int len_dissected = 0;
4796
4797
0
    len = tvb_get_ntohs(tvb, offset + O_LBMR_RCTXINFO_REC_T_LEN);
4798
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_rctxinfo_rec, tvb, offset, -1, ENC_NA);
4799
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_rctxinfo_rec);
4800
0
    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);
4801
0
    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);
4802
0
    ofs = offset + L_LBMR_RCTXINFO_REC_T;
4803
0
    rec_len_remaining = len - L_LBMR_RCTXINFO_REC_T;
4804
0
    len_dissected = L_LBMR_RCTXINFO_REC_T;
4805
0
    while (rec_len_remaining > 0)
4806
0
    {
4807
0
        opt_type = tvb_get_uint8(tvb, ofs + O_LBMR_RCTXINFO_REC_OPT_T_TYPE);
4808
0
        switch (opt_type)
4809
0
        {
4810
0
            case LBMR_RCTXINFO_OPT_ADDRESS_TYPE:
4811
0
                opt_len_dissected = dissect_lbmr_rctxinfo_rec_address_opt(tvb, ofs, pinfo, subtree);
4812
0
                break;
4813
0
            case LBMR_RCTXINFO_OPT_INSTANCE_TYPE:
4814
0
                opt_len_dissected = dissect_lbmr_rctxinfo_rec_instance_opt(tvb, ofs, pinfo, subtree);
4815
0
                break;
4816
0
            case LBMR_RCTXINFO_OPT_ODOMAIN_TYPE:
4817
0
                opt_len_dissected = dissect_lbmr_rctxinfo_rec_odomain_opt(tvb, ofs, pinfo, subtree);
4818
0
                break;
4819
0
            case LBMR_RCTXINFO_OPT_NAME_TYPE:
4820
0
                opt_len_dissected = dissect_lbmr_rctxinfo_rec_name_opt(tvb, ofs, pinfo, subtree);
4821
0
                break;
4822
0
            default:
4823
0
                opt_len_dissected = dissect_lbmr_rctxinfo_rec_unknown_opt(tvb, ofs, pinfo, subtree);
4824
0
                break;
4825
0
        }
4826
0
        len_dissected += opt_len_dissected;
4827
0
        rec_len_remaining -= opt_len_dissected;
4828
0
        ofs += opt_len_dissected;
4829
0
    }
4830
0
    proto_item_set_len(subtree_item, len_dissected);
4831
0
    return (len_dissected);
4832
0
}
4833
4834
static int dissect_lbmr_rctxinfo(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4835
0
{
4836
0
    uint16_t num_recs = 0;
4837
0
    int ofs = 0;
4838
0
    int len_dissected = 0;
4839
0
    int rec_len_dissected = 0;
4840
4841
0
    num_recs = tvb_get_ntohs(tvb, offset + O_LBMR_RCTXINFO_T_NUM_RECS);
4842
0
    proto_tree_add_item(tree, hf_lbmr_rctxinfo_len, tvb, offset + O_LBMR_RCTXINFO_T_LEN, L_LBMR_RCTXINFO_T_LEN, ENC_BIG_ENDIAN);
4843
0
    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);
4844
0
    proto_tree_add_item(tree, hf_lbmr_rctxinfo_reserved, tvb, offset + O_LBMR_RCTXINFO_T_RESERVED, L_LBMR_RCTXINFO_T_RESERVED, ENC_BIG_ENDIAN);
4845
0
    len_dissected = L_LBMR_RCTXINFO_T;
4846
0
    ofs = offset + L_LBMR_RCTXINFO_T;
4847
0
    while (num_recs > 0)
4848
0
    {
4849
0
        rec_len_dissected = dissect_lbmr_rctxinfo_rec(tvb, ofs, pinfo, tree);
4850
0
        ofs += rec_len_dissected;
4851
0
        len_dissected += rec_len_dissected;
4852
0
        num_recs--;
4853
0
    }
4854
0
    return (len_dissected);
4855
0
}
4856
4857
static proto_item * format_ver_type(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4858
0
{
4859
0
    proto_item * type_item = NULL;
4860
4861
0
    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);
4862
0
    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);
4863
0
    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);
4864
0
    return (type_item);
4865
0
}
4866
4867
/*----------------------------------------------------------------------------*/
4868
/* LBMR Option dissection functions.                                          */
4869
/*----------------------------------------------------------------------------*/
4870
static int dissect_lbmr_opt_len(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4871
0
{
4872
0
    proto_tree * subtree = NULL;
4873
0
    proto_item * subtree_item = NULL;
4874
0
    int len = 0;
4875
4876
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_len, tvb, offset, L_LBMR_LBMR_OPT_SRC_ID_T, ENC_NA);
4877
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_len);
4878
0
    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);
4879
0
    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);
4880
0
    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);
4881
0
    len = L_LBMR_LBMR_OPT_LEN_T;
4882
0
    return (len);
4883
0
}
4884
4885
static int dissect_lbmr_opt_src_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4886
0
{
4887
0
    proto_tree * subtree = NULL;
4888
0
    proto_item * subtree_item = NULL;
4889
0
    static int * const flags[] =
4890
0
    {
4891
0
        &hf_lbmr_opt_src_id_flags_ignore,
4892
0
        NULL
4893
0
    };
4894
4895
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_src_id, tvb, offset, L_LBMR_LBMR_OPT_SRC_ID_T, ENC_NA);
4896
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_src_id);
4897
0
    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);
4898
0
    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);
4899
0
    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);
4900
0
    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);
4901
0
    return (L_LBMR_LBMR_OPT_SRC_ID_T);
4902
0
}
4903
4904
static int dissect_lbmr_opt_src_type(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4905
0
{
4906
0
    proto_tree * subtree = NULL;
4907
0
    proto_item * subtree_item = NULL;
4908
0
    static int * const flags[] =
4909
0
    {
4910
0
        &hf_lbmr_opt_src_type_flags_ignore,
4911
0
        NULL
4912
0
    };
4913
4914
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_src_type, tvb, offset, L_LBMR_LBMR_OPT_SRC_TYPE_T, ENC_NA);
4915
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_src_type);
4916
0
    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);
4917
0
    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);
4918
0
    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);
4919
0
    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);
4920
0
    return (L_LBMR_LBMR_OPT_SRC_TYPE_T);
4921
0
}
4922
4923
static int dissect_lbmr_opt_version(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4924
0
{
4925
0
    proto_tree * subtree = NULL;
4926
0
    proto_item * subtree_item = NULL;
4927
0
    static int * const flags[] =
4928
0
    {
4929
0
        &hf_lbmr_opt_version_flags_ignore,
4930
0
        &hf_lbmr_opt_version_flags_ume,
4931
0
        &hf_lbmr_opt_version_flags_umq,
4932
0
        NULL
4933
0
    };
4934
4935
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_version, tvb, offset, L_LBMR_LBMR_OPT_VERSION_T, ENC_NA);
4936
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_version);
4937
0
    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);
4938
0
    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);
4939
0
    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);
4940
0
    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);
4941
0
    return (L_LBMR_LBMR_OPT_VERSION_T);
4942
0
}
4943
4944
static int dissect_lbmr_opt_local_domain(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree)
4945
0
{
4946
0
    proto_tree * subtree = NULL;
4947
0
    proto_item * subtree_item = NULL;
4948
0
    static int * const flags[] =
4949
0
    {
4950
0
        &hf_lbmr_opt_local_domain_flags_ignore,
4951
0
        &hf_lbmr_opt_local_domain_flags_viral,
4952
0
        NULL
4953
0
    };
4954
4955
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_local_domain, tvb, offset, L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T, ENC_NA);
4956
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_local_domain);
4957
0
    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);
4958
0
    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);
4959
0
    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);
4960
0
    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);
4961
0
    return (L_LBMR_LBMR_OPT_LOCAL_DOMAIN_T);
4962
0
}
4963
4964
static int dissect_lbmr_opt_unknown(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4965
0
{
4966
0
    proto_tree * subtree = NULL;
4967
0
    proto_item * subtree_item = NULL;
4968
0
    uint8_t len = 0;
4969
0
    proto_item * type_item = NULL;
4970
0
    uint8_t opt_type = 0;
4971
4972
0
    subtree_item = proto_tree_add_item(tree, hf_lbmr_opt_unknown, tvb, offset, -1, ENC_NA);
4973
0
    subtree = proto_item_add_subtree(subtree_item, ett_lbmr_opt_unknown);
4974
0
    opt_type = tvb_get_uint8(tvb, offset + O_LBMR_LBMR_OPT_HDR_T_TYPE);
4975
0
    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);
4976
0
    len = tvb_get_uint8(tvb, offset + O_LBMR_LBMR_OPT_HDR_T_LEN);
4977
0
    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);
4978
0
    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);
4979
0
    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);
4980
0
    proto_item_set_len(subtree_item, (int) len);
4981
0
    expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR option type 0x%02x", opt_type);
4982
0
    return ((int) len);
4983
0
}
4984
4985
static int dissect_lbmr_options(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree)
4986
0
{
4987
0
    proto_tree * opt_tree = NULL;
4988
0
    proto_item * ti = NULL;
4989
0
    int curr_offset = offset;
4990
0
    int len = 0;
4991
4992
0
    ti = proto_tree_add_item(tree, hf_lbmr_opts, tvb, curr_offset, -1, ENC_NA);
4993
0
    opt_tree = proto_item_add_subtree(ti, ett_lbmr_opts);
4994
0
    while (tvb_reported_length_remaining(tvb, curr_offset) > 0)
4995
0
    {
4996
0
        int opt_len;
4997
0
        uint8_t opt_type;
4998
4999
0
        opt_type = tvb_get_uint8(tvb, curr_offset + O_LBMR_LBMR_OPT_HDR_T_TYPE);
5000
0
        switch (opt_type)
5001
0
        {
5002
0
            case LBMR_LBMR_OPT_LEN_TYPE:
5003
0
                opt_len = dissect_lbmr_opt_len(tvb, curr_offset, pinfo, opt_tree);
5004
0
                break;
5005
0
            case LBMR_LBMR_OPT_SRC_ID_TYPE:
5006
0
                opt_len = dissect_lbmr_opt_src_id(tvb, curr_offset, pinfo, opt_tree);
5007
0
                break;
5008
0
            case LBMR_LBMR_OPT_SRC_TYPE_TYPE:
5009
0
                opt_len = dissect_lbmr_opt_src_type(tvb, curr_offset, pinfo, opt_tree);
5010
0
                break;
5011
0
            case LBMR_LBMR_OPT_VERSION_TYPE:
5012
0
                opt_len = dissect_lbmr_opt_version(tvb, curr_offset, pinfo, opt_tree);
5013
0
                break;
5014
0
            case LBMR_LBMR_OPT_LOCAL_DOMAIN_TYPE:
5015
0
                opt_len = dissect_lbmr_opt_local_domain(tvb, curr_offset, pinfo, opt_tree);
5016
0
                break;
5017
0
            default:
5018
0
                opt_len = dissect_lbmr_opt_unknown(tvb, curr_offset, pinfo, opt_tree);
5019
0
                break;
5020
0
        }
5021
0
        len += opt_len;
5022
0
        curr_offset += opt_len;
5023
0
    }
5024
0
    return (len);
5025
0
}
5026
5027
static void lbmr_tap_queue_packet(packet_info * pinfo, const lbmr_contents_t * contents)
5028
0
{
5029
0
    const lbmr_topic_contents_t * topic;
5030
0
    const lbmr_queue_contents_t * queue;
5031
5032
0
    switch (contents->type)
5033
0
    {
5034
0
        case LBMR_CONTENTS_TOPIC:
5035
0
            topic = &(contents->contents.topic);
5036
0
            if (topic->tqr_count > 0)
5037
0
            {
5038
0
                tqr_node_t * tqr = topic->tqr;
5039
0
                while (tqr != NULL)
5040
0
                {
5041
0
                    lbm_lbmr_topic_query_tap_info_t * tqr_tap = wmem_new0(pinfo->pool, lbm_lbmr_topic_query_tap_info_t);
5042
0
                    tqr_tap->size = (uint16_t) sizeof(lbm_lbmr_topic_query_tap_info_t);
5043
0
                    tqr_tap->topic_length = (uint8_t)strlen(tqr->topic);
5044
0
                    memcpy(tqr_tap->topic, tqr->topic, tqr_tap->topic_length);
5045
0
                    tap_queue_packet(lbmr_topic_query_tap_handle, pinfo, (void *) tqr_tap);
5046
0
                    tqr = tqr->next;
5047
0
                }
5048
0
            }
5049
0
            if (topic->tir_count > 0)
5050
0
            {
5051
0
                tir_node_t * tir = topic->tir;
5052
0
                while (tir != NULL)
5053
0
                {
5054
0
                    lbm_lbmr_topic_advertisement_tap_info_t * tir_tap = wmem_new0(pinfo->pool, lbm_lbmr_topic_advertisement_tap_info_t);
5055
0
                    tir_tap->size = (uint16_t) sizeof(lbm_lbmr_topic_advertisement_tap_info_t);
5056
0
                    tir_tap->topic_length = (uint8_t)strlen(tir->topic);
5057
0
                    tir_tap->source_length = (uint8_t)strlen(tir->source_string);
5058
0
                    tir_tap->topic_index = tir->idx;
5059
0
                    memcpy(tir_tap->topic, tir->topic, tir_tap->topic_length);
5060
0
                    memcpy(tir_tap->source, tir->source_string, tir_tap->source_length);
5061
0
                    tap_queue_packet(lbmr_topic_advertisement_tap_handle, pinfo, (void *) tir_tap);
5062
0
                    tir = tir->next;
5063
0
                }
5064
0
            }
5065
0
            if (topic->wctqr_count > 0)
5066
0
            {
5067
0
                wctqr_node_t * wctqr = topic->wctqr;
5068
0
                while (wctqr != NULL)
5069
0
                {
5070
0
                    lbm_lbmr_pattern_query_tap_info_t * wctqr_tap = wmem_new0(pinfo->pool, lbm_lbmr_pattern_query_tap_info_t);
5071
0
                    wctqr_tap->size = (uint16_t) sizeof(lbm_lbmr_pattern_query_tap_info_t);
5072
0
                    wctqr_tap->type = wctqr->type;
5073
0
                    wctqr_tap->pattern_length = (uint8_t)strlen(wctqr->pattern);
5074
0
                    memcpy(wctqr_tap->pattern, wctqr->pattern, wctqr_tap->pattern_length);
5075
0
                    tap_queue_packet(lbmr_pattern_query_tap_handle, pinfo, (void *) wctqr_tap);
5076
0
                    wctqr = wctqr->next;
5077
0
                }
5078
0
            }
5079
0
            break;
5080
0
        case LBMR_CONTENTS_QUEUE:
5081
0
            queue = &(contents->contents.queue);
5082
0
            if (queue->qqr_count > 0)
5083
0
            {
5084
0
                qqr_node_t * qqr = queue->qqr;
5085
0
                while (qqr != NULL)
5086
0
                {
5087
0
                    lbm_lbmr_queue_query_tap_info_t * qqr_tap = wmem_new0(pinfo->pool, lbm_lbmr_queue_query_tap_info_t);
5088
0
                    qqr_tap->size = (uint16_t) sizeof(lbm_lbmr_queue_query_tap_info_t);
5089
0
                    qqr_tap->queue_length = (uint8_t)strlen(qqr->queue);
5090
0
                    memcpy(qqr_tap->queue, qqr->queue, qqr_tap->queue_length);
5091
0
                    tap_queue_packet(lbmr_queue_advertisement_tap_handle, pinfo, (void *) qqr_tap);
5092
0
                    qqr = qqr->next;
5093
0
                }
5094
0
            }
5095
0
            if (queue->qir_count > 0)
5096
0
            {
5097
0
                qir_node_t * qir = queue->qir;
5098
0
                while (qir != NULL)
5099
0
                {
5100
0
                    lbm_lbmr_queue_advertisement_tap_info_t * qir_tap = wmem_new0(pinfo->pool, lbm_lbmr_queue_advertisement_tap_info_t);
5101
0
                    qir_tap->size = (uint16_t) sizeof(lbm_lbmr_queue_advertisement_tap_info_t);
5102
0
                    qir_tap->port = qir->port;
5103
0
                    qir_tap->queue_length = (uint8_t)strlen(qir->queue);
5104
0
                    qir_tap->topic_length = (uint8_t)strlen(qir->topic);
5105
0
                    memcpy(qir_tap->queue, qir->queue, qir_tap->queue_length);
5106
0
                    memcpy(qir_tap->topic, qir->topic, qir_tap->topic_length);
5107
0
                    tap_queue_packet(lbmr_queue_query_tap_handle, pinfo, (void *) qir_tap);
5108
0
                    qir = qir->next;
5109
0
                }
5110
0
            }
5111
0
            break;
5112
0
        default:
5113
0
            break;
5114
0
    }
5115
0
}
5116
5117
/*----------------------------------------------------------------------------*/
5118
/* dissect_lbmr - The dissector for LBM Topic Resolution protocol.            */
5119
/*----------------------------------------------------------------------------*/
5120
static int dissect_lbmr(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void * user_data _U_)
5121
0
{
5122
0
    proto_tree * lbmr_tree = NULL;
5123
0
    proto_item * ti = NULL;
5124
0
    int offset = 0;
5125
0
    uint8_t ver_type;
5126
0
    uint8_t ver;
5127
0
    uint8_t type;
5128
0
    lbmr_contents_t * contents = NULL;
5129
0
    char * tag_name = NULL;
5130
0
    int total_len_dissected = 0;
5131
0
    int len_dissected = 0;
5132
0
    tvbuff_t * packet_tvb = NULL;
5133
0
    proto_item * lbmr_hdr_item = NULL;
5134
0
    proto_tree * lbmr_hdr_tree = NULL;
5135
5136
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "LBMR");
5137
0
    if (lbmr_use_tag)
5138
0
    {
5139
0
        tag_name = lbmr_tag_find(pinfo);
5140
0
    }
5141
0
    col_clear(pinfo->cinfo, COL_INFO);
5142
0
    if (tag_name != NULL)
5143
0
    {
5144
0
        col_add_fstr(pinfo->cinfo, COL_INFO, "[Tag: %s]", tag_name);
5145
0
    }
5146
0
    col_set_fence(pinfo->cinfo, COL_INFO);
5147
5148
0
    ver_type = tvb_get_uint8(tvb, O_LBMR_HDR_T_VER_TYPE);
5149
0
    ver = LBMR_HDR_VER(ver_type);
5150
0
    type = LBMR_HDR_TYPE(ver_type);
5151
0
    offset = 0;
5152
0
    total_len_dissected = 0;
5153
0
    packet_tvb = tvb;
5154
5155
0
    unsigned packet_len = tvb_reported_length(tvb);
5156
    /* The length option is at the end. Trim the options off if possible. */
5157
0
    if (((ver_type & LBMR_HDR_TYPE_OPTS_MASK) != 0) && packet_len > L_LBMR_LBMR_OPT_LEN_T && tvb_bytes_exist(tvb, 0, packet_len))
5158
0
    {
5159
0
        uint8_t opt_type;
5160
0
        uint8_t opt_len;
5161
5162
0
        opt_type = tvb_get_uint8(tvb, packet_len - L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_TYPE);
5163
0
        opt_len = tvb_get_uint8(tvb, packet_len - L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_LEN);
5164
0
        if ((opt_type == LBMR_LBMR_OPT_LEN_TYPE) && (((int)opt_len) == L_LBMR_LBMR_OPT_LEN_T))
5165
0
        {
5166
0
            unsigned opt_total_len = 0;
5167
5168
0
            opt_total_len = tvb_get_ntohs(tvb, packet_len - L_LBMR_LBMR_OPT_LEN_T + O_LBMR_LBMR_OPT_LEN_T_TOTAL_LEN);
5169
0
            if (packet_len > opt_total_len)
5170
0
            {
5171
0
                int tvb_len = packet_len - opt_total_len;
5172
5173
0
                packet_tvb = tvb_new_subset_length(tvb, 0, tvb_len);
5174
0
            }
5175
0
        }
5176
0
    }
5177
5178
0
    if (type == LBMR_HDR_TYPE_EXT)
5179
0
    {
5180
0
        uint8_t ext_type = 0;
5181
0
        const char * ext_string;
5182
0
        proto_item * ext_type_item = NULL;
5183
5184
0
        ext_type = tvb_get_uint8(tvb, O_LBMR_HDR_EXT_TYPE_T_EXT_TYPE);
5185
0
        ext_string = val_to_str(pinfo->pool, ext_type, lbmr_ext_packet_type, "Unknown(0x%02x)");
5186
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "ExtType %s", ext_string);
5187
0
        if (tag_name != NULL)
5188
0
        {
5189
0
            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",
5190
0
                tag_name, ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), ext_string);
5191
0
        }
5192
0
        else
5193
0
        {
5194
0
            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",
5195
0
                ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), ext_string);
5196
0
        }
5197
0
        lbmr_tree = proto_item_add_subtree(ti, ett_lbmr);
5198
0
        if (tag_name != NULL)
5199
0
        {
5200
0
            proto_item * item = NULL;
5201
5202
0
            item = proto_tree_add_string(lbmr_tree, hf_lbmr_tag, tvb, 0, 0, tag_name);
5203
0
            proto_item_set_generated(item);
5204
0
        }
5205
0
        lbmr_hdr_item = proto_tree_add_item(lbmr_tree, hf_lbmr_hdr, tvb, 0, -1, ENC_NA);
5206
0
        lbmr_hdr_tree = proto_item_add_subtree(lbmr_hdr_item, ett_lbmr_hdr);
5207
0
        (void) format_ver_type(tvb, 0, pinfo, lbmr_hdr_tree);
5208
0
        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);
5209
5210
        /* ver_type and ext_type have already been processed. But their dissected length is included in the individual type dissections below. */
5211
0
        switch (ext_type)
5212
0
        {
5213
0
            case LBMR_HDR_EXT_TYPE_UME_PROXY_SRC_ELECT:
5214
0
                len_dissected = dissect_lbmr_pser(packet_tvb, offset, pinfo, lbmr_tree);
5215
0
                break;
5216
0
            case LBMR_HDR_EXT_TYPE_UMQ_QUEUE_MGMT:
5217
0
                offset += L_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE + L_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE;
5218
0
                total_len_dissected += L_LBMR_UMQ_QMGMT_HDR_T_VER_TYPE + L_LBMR_UMQ_QMGMT_HDR_T_EXT_TYPE;
5219
0
                len_dissected = lbmr_dissect_umq_qmgmt(packet_tvb, offset - 2, pinfo, lbmr_tree);
5220
0
                break;
5221
0
            case LBMR_HDR_EXT_TYPE_CONTEXT_INFO:
5222
0
                len_dissected = dissect_lbmr_ctxinfo(packet_tvb, offset, pinfo, lbmr_tree);
5223
0
                break;
5224
0
            case LBMR_HDR_EXT_TYPE_TOPIC_RES_REQUEST:
5225
0
                len_dissected = dissect_lbmr_topic_res_request(packet_tvb, offset, pinfo, lbmr_tree);
5226
0
                break;
5227
0
            case LBMR_HDR_EXT_TYPE_TNWG_MSG:
5228
0
                len_dissected = dissect_lbmr_tnwg(packet_tvb, offset, pinfo, lbmr_tree);
5229
0
                break;
5230
0
            case LBMR_HDR_EXT_TYPE_REMOTE_DOMAIN_ROUTE:
5231
0
                len_dissected = dissect_lbmr_remote_domain_route(packet_tvb, offset, pinfo, lbmr_tree);
5232
0
                break;
5233
0
            case LBMR_HDR_EXT_TYPE_REMOTE_CONTEXT_INFO:
5234
0
                len_dissected = dissect_lbmr_rctxinfo(packet_tvb, offset, pinfo, lbmr_tree);
5235
0
                break;
5236
0
            default:
5237
0
                len_dissected = L_LBMR_HDR_EXT_TYPE_T_VER_TYPE + L_LBMR_HDR_EXT_TYPE_T_EXT_TYPE;
5238
0
                expert_add_info_format(pinfo, ext_type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR extended type 0x%02x", ext_type);
5239
0
                break;
5240
0
        }
5241
0
        offset += len_dissected;
5242
0
        total_len_dissected += len_dissected;
5243
0
    }
5244
0
    else
5245
0
    {
5246
0
        uint8_t tqrs = 0;
5247
0
        uint16_t tirs = 0;
5248
0
        bool rd_keepalive = false;
5249
0
        bool topic_mgmt = false;
5250
0
        bool client_rd_keepalive = false;
5251
0
        bool zero_tirs_tqrs = false;
5252
0
        proto_item * type_item = NULL;
5253
5254
0
        tqrs = tvb_get_uint8(tvb, O_LBMR_HDR_T_TQRS);
5255
0
        tirs = tvb_get_ntohs(tvb, O_LBMR_HDR_T_TIRS);
5256
0
        if ((tqrs == 0) && (tirs == 0))
5257
0
        {
5258
0
            zero_tirs_tqrs = true;
5259
0
        }
5260
0
        if ((type == LBMR_HDR_TYPE_NORMAL) && zero_tirs_tqrs)
5261
0
        {
5262
0
            rd_keepalive = true;
5263
0
        }
5264
0
        else if (zero_tirs_tqrs && ((type == LBMR_HDR_TYPE_UCAST_RCV_ALIVE) || (type == LBMR_HDR_TYPE_UCAST_SRC_ALIVE)))
5265
0
        {
5266
0
            client_rd_keepalive = true;
5267
0
        }
5268
0
        else if (type == LBMR_HDR_TYPE_TOPIC_MGMT)
5269
0
        {
5270
0
            topic_mgmt = true;
5271
0
        }
5272
0
        switch (type)
5273
0
        {
5274
0
            case LBMR_HDR_TYPE_QUEUE_RES:
5275
0
                col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "QQRs %u QIRs %" PRIu16, tqrs, tirs);
5276
0
                break;
5277
0
            default:
5278
0
                if (rd_keepalive)
5279
0
                {
5280
0
                    col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Unicast Resolver Keepalive");
5281
0
                }
5282
0
                else if (client_rd_keepalive)
5283
0
                {
5284
0
                    if (type == LBMR_HDR_TYPE_UCAST_RCV_ALIVE)
5285
0
                    {
5286
0
                        col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Receiver Alive");
5287
0
                    }
5288
0
                    else
5289
0
                    {
5290
0
                        col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Source Alive");
5291
0
                    }
5292
0
                }
5293
0
                else if (topic_mgmt)
5294
0
                {
5295
0
                    col_append_sep_str(pinfo->cinfo, COL_INFO, " ", "Topic Management");
5296
0
                }
5297
0
                else
5298
0
                {
5299
0
                    col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "TQRs %u TIRs %" PRIu16, tqrs, tirs);
5300
0
                }
5301
0
                break;
5302
0
        }
5303
5304
0
        switch (type)
5305
0
        {
5306
0
            case LBMR_HDR_TYPE_QUEUE_RES:
5307
0
                if (tag_name != NULL)
5308
0
                {
5309
0
                    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,
5310
0
                        tag_name, ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5311
0
                }
5312
0
                else
5313
0
                {
5314
0
                    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,
5315
0
                        ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5316
0
                }
5317
0
                break;
5318
0
            default:
5319
0
                if (tag_name != NULL)
5320
0
                {
5321
0
                    if (rd_keepalive)
5322
0
                    {
5323
0
                        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",
5324
0
                            tag_name, ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"));
5325
0
                    }
5326
0
                    else if (topic_mgmt)
5327
0
                    {
5328
0
                        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",
5329
0
                            tag_name, ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"));
5330
0
                    }
5331
0
                    else
5332
0
                    {
5333
0
                        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,
5334
0
                            tag_name, ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5335
0
                    }
5336
0
                }
5337
0
                else
5338
0
                {
5339
0
                    if (rd_keepalive)
5340
0
                    {
5341
0
                        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",
5342
0
                            ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"));
5343
0
                    }
5344
0
                    else if (topic_mgmt)
5345
0
                    {
5346
0
                        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",
5347
0
                            ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"));
5348
0
                    }
5349
0
                    else
5350
0
                    {
5351
0
                        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,
5352
0
                            ver, type, val_to_str(pinfo->pool, type, lbmr_packet_type, "Unknown(0x%02x)"), tqrs, tirs);
5353
0
                    }
5354
0
                }
5355
0
                break;
5356
0
        }
5357
0
        lbmr_tree = proto_item_add_subtree(ti, ett_lbmr);
5358
0
        if (tag_name != NULL)
5359
0
        {
5360
0
            proto_item * item;
5361
0
            item = proto_tree_add_string(lbmr_tree, hf_lbmr_tag, tvb, 0, 0, tag_name);
5362
0
            proto_item_set_generated(item);
5363
0
        }
5364
0
        lbmr_hdr_item = proto_tree_add_item(lbmr_tree, hf_lbmr_hdr, tvb, 0, -1, ENC_NA);
5365
0
        lbmr_hdr_tree = proto_item_add_subtree(lbmr_hdr_item, ett_lbmr_hdr);
5366
0
        type_item = format_ver_type(tvb, 0, pinfo, lbmr_hdr_tree);
5367
0
        switch (type)
5368
0
        {
5369
0
            case LBMR_HDR_TYPE_QUEUE_RES:
5370
0
                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);
5371
0
                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);
5372
0
                break;
5373
0
            default:
5374
0
                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);
5375
0
                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);
5376
0
                break;
5377
0
        }
5378
5379
0
        offset = L_LBMR_HDR_T;
5380
0
        total_len_dissected = L_LBMR_HDR_T;
5381
0
        contents = wmem_new0(pinfo->pool, lbmr_contents_t);
5382
0
        switch (type)
5383
0
        {
5384
0
            case LBMR_HDR_TYPE_QUEUE_RES:
5385
0
                contents->type = LBMR_CONTENTS_QUEUE;
5386
0
                if (tqrs > 0)
5387
0
                {
5388
0
                    len_dissected = dissect_lbmr_qqrs(packet_tvb, offset, tqrs, pinfo, lbmr_tree, contents);
5389
0
                    total_len_dissected += len_dissected;
5390
0
                    offset += len_dissected;
5391
0
                }
5392
0
                if (tirs > 0)
5393
0
                {
5394
0
                    len_dissected = dissect_lbmr_qirs(packet_tvb, offset, tirs, pinfo, lbmr_tree, contents);
5395
0
                    total_len_dissected += len_dissected;
5396
0
                    offset += len_dissected;
5397
0
                }
5398
0
                lbmr_tap_queue_packet(pinfo, contents);
5399
0
                break;
5400
0
            case LBMR_HDR_TYPE_NORMAL:
5401
0
            case LBMR_HDR_TYPE_WC_TQRS:
5402
0
                if (!rd_keepalive)
5403
0
                {
5404
0
                    contents->type = LBMR_CONTENTS_TOPIC;
5405
0
                    if (tqrs > 0)
5406
0
                    {
5407
0
                        bool wc_tqrs = false;
5408
5409
0
                        if (type == LBMR_HDR_TYPE_WC_TQRS)
5410
0
                        {
5411
0
                            wc_tqrs = true;
5412
0
                        }
5413
0
                        len_dissected = dissect_lbmr_tqrs(packet_tvb, offset, tqrs, pinfo, lbmr_tree, wc_tqrs, contents);
5414
0
                        total_len_dissected += len_dissected;
5415
0
                        offset += len_dissected;
5416
0
                    }
5417
0
                    if (tirs > 0)
5418
0
                    {
5419
0
                        len_dissected = dissect_lbmr_tirs(packet_tvb, offset, tirs, pinfo, lbmr_tree, "TIRs", contents);
5420
0
                        total_len_dissected += len_dissected;
5421
0
                        offset += len_dissected;
5422
0
                    }
5423
0
                    lbmr_tap_queue_packet(pinfo, contents);
5424
0
                }
5425
0
                break;
5426
0
            case LBMR_HDR_TYPE_TOPIC_MGMT:
5427
0
                len_dissected = dissect_lbmr_tmb(packet_tvb, offset, pinfo, lbmr_tree);
5428
0
                total_len_dissected += len_dissected;
5429
0
                offset += len_dissected;
5430
0
                break;
5431
0
            case LBMR_HDR_TYPE_UCAST_RCV_ALIVE:
5432
0
            case LBMR_HDR_TYPE_UCAST_SRC_ALIVE:
5433
0
                break;
5434
0
            default:
5435
0
                expert_add_info_format(pinfo, type_item, &ei_lbmr_analysis_invalid_value, "Unknown LBMR type 0x%02x", type);
5436
0
                break;
5437
0
        }
5438
0
    }
5439
0
    if ((tvb_reported_length_remaining(tvb, offset) > 0) && ((ver_type & LBMR_HDR_TYPE_OPTS_MASK) != 0))
5440
0
    {
5441
        /* Process LBMR packet options. */
5442
0
        len_dissected = dissect_lbmr_options(tvb, offset, pinfo, lbmr_tree);
5443
0
        total_len_dissected += len_dissected;
5444
0
    }
5445
0
    return (total_len_dissected);
5446
0
}
5447
5448
static bool test_lbmr_packet(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void * user_data _U_)
5449
1.34k
{
5450
1.34k
    lbmr_tag_entry_t entry;
5451
1.34k
    bool valid_packet = false;
5452
5453
    /* Must be a UDP packet. */
5454
1.34k
    if (pinfo->ptype != PT_UDP)
5455
1
    {
5456
1
        return false;
5457
1
    }
5458
    /* Destination address must be IPV4 and 4 bytes in length. */
5459
1.34k
    if ((pinfo->dst.type != AT_IPv4) || (pinfo->dst.len != 4))
5460
1.34k
    {
5461
1.34k
        return false;
5462
1.34k
    }
5463
5464
0
    if (lbmr_use_tag)
5465
0
    {
5466
0
        if (lbmr_tag_find(pinfo) != NULL)
5467
0
        {
5468
0
            valid_packet = true;
5469
0
        }
5470
0
    }
5471
0
    else
5472
0
    {
5473
0
        entry.name = NULL;
5474
0
        entry.mc_outgoing_udp_port = lbmr_mc_outgoing_udp_port;
5475
0
        entry.mc_incoming_udp_port = lbmr_mc_incoming_udp_port;
5476
0
        entry.mc_incoming_address = NULL;
5477
0
        entry.mc_incoming_address_val_h = lbmr_mc_incoming_address_host;
5478
0
        entry.mc_outgoing_address = NULL;
5479
0
        entry.mc_outgoing_address_val_h = lbmr_mc_outgoing_address_host;
5480
0
        entry.uc_port_high = lbmr_uc_port_high;
5481
0
        entry.uc_port_low = lbmr_uc_port_low;
5482
0
        entry.uc_dest_port = lbmr_uc_dest_port;
5483
0
        entry.uc_address = NULL;
5484
0
        entry.uc_address_val_h = lbmr_uc_address_host;
5485
0
        valid_packet = lbmr_match_packet(pinfo, &entry);
5486
0
    }
5487
0
    if (valid_packet)
5488
0
    {
5489
0
        dissect_lbmr(tvb, pinfo, tree, NULL);
5490
0
        return true;
5491
0
    }
5492
0
    return false;
5493
0
}
5494
5495
/* Register all the bits needed with the filtering engine */
5496
void proto_register_lbmr(void)
5497
14
{
5498
14
    static hf_register_info hf[] =
5499
14
    {
5500
14
        { &hf_lbmr_tag,
5501
14
            { "Tag", "lbmr.tag", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5502
14
        { &hf_lbmr_hdr,
5503
14
            { "Header", "lbmr.hdr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5504
14
        { &hf_lbmr_hdr_ver,
5505
14
            { "Version", "lbmr.hdr.ver", FT_UINT8, BASE_DEC, NULL, LBMR_HDR_VER_VER_MASK, NULL, HFILL } },
5506
14
        { &hf_lbmr_hdr_opt,
5507
14
            { "Options", "lbmr.hdr.opts", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), LBMR_HDR_TYPE_OPTS_MASK, "Set if LBMR options are present", HFILL } },
5508
14
        { &hf_lbmr_hdr_type,
5509
14
            { "Type", "lbmr.hdr.type", FT_UINT8, BASE_HEX, VALS(lbmr_packet_type), LBMR_HDR_VER_TYPE_MASK, NULL, HFILL } },
5510
14
        { &hf_lbmr_hdr_tqrs,
5511
14
            { "Topic Query Records", "lbmr.hdr.tqrs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5512
14
        { &hf_lbmr_hdr_tirs,
5513
14
            { "Topic Information Records", "lbmr.hdr.tirs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5514
14
        { &hf_lbmr_hdr_qqrs,
5515
14
            { "Queue Query Records", "lbmr.hdr.qqrs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5516
14
        { &hf_lbmr_hdr_qirs,
5517
14
            { "Queue Information Records", "lbmr.hdr.qirs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5518
14
        { &hf_lbmr_hdr_ext_type,
5519
14
            { "Extended Type", "lbmr.hdr.ext_type", FT_UINT8, BASE_HEX, VALS(lbmr_ext_packet_type), 0x0, NULL, HFILL } },
5520
14
        { &hf_lbmr_tqrs,
5521
14
            { "TQRs", "lbmr.tqrs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5522
14
        { &hf_lbmr_tqr,
5523
14
            { "TQR", "lbmr.tqr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5524
14
        { &hf_lbmr_tqr_pattern_type,
5525
14
            { "Pattern Type", "lbmr.tqr.pattern_type", FT_UINT8, BASE_DEC, VALS(lbm_wildcard_pattern_type), 0x0, NULL, HFILL } },
5526
14
        { &hf_lbmr_tqr_pattern,
5527
14
            { "Pattern", "lbmr.tqr.pattern", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5528
14
        { &hf_lbmr_tqr_name,
5529
14
            { "Topic Name", "lbmr.tqr.name", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5530
14
        { &hf_lbmr_tirs,
5531
14
            { "TIRs", "lbmr.tirs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5532
14
        { &hf_lbmr_tir,
5533
14
            { "TIR", "lbmr.tir", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5534
14
        { &hf_lbmr_tir_name,
5535
14
            { "Topic Name", "lbmr.tir.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5536
14
        { &hf_lbmr_tir_transport_opts,
5537
14
            { "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 } },
5538
14
        { &hf_lbmr_tir_transport_type,
5539
14
            { "Transport Type", "lbmr.tir.transport_type", FT_UINT8, BASE_HEX, VALS(lbmr_transport_type), LBMR_TIR_TRANSPORT, NULL, HFILL } },
5540
14
        { &hf_lbmr_tir_tlen,
5541
14
            { "Transport Info Length", "lbmr.tir.tlen", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5542
14
        { &hf_lbmr_tir_ttl,
5543
14
            { "TTL", "lbmr.tir.ttl", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5544
14
        { &hf_lbmr_tir_index,
5545
14
            { "Index", "lbmr.tir.index", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5546
14
        { &hf_lbmr_tir_tcp,
5547
14
            { "TCP Transport", "lbmr.tir.tcp", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5548
14
        { &hf_lbmr_tir_tcp_ip,
5549
14
            { "Source IP", "lbmr.tir.tcp.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5550
14
        { &hf_lbmr_tir_tcp_session_id,
5551
14
            { "Session ID", "lbmr.tir.tcp.session_id", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5552
14
        { &hf_lbmr_tir_tcp_port,
5553
14
            { "Source Port", "lbmr.tir.tcp.port", FT_UINT16, BASE_PT_TCP, NULL, 0x0, NULL, HFILL } },
5554
14
        { &hf_lbmr_tir_lbtrm,
5555
14
            { "LBTRM Transport", "lbmr.tir.lbtrm", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5556
14
        { &hf_lbmr_tir_lbtrm_src_addr,
5557
14
            { "Source IP", "lbmr.tir.lbtrm.srcip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5558
14
        { &hf_lbmr_tir_lbtrm_mcast_addr,
5559
14
            { "Multicast IP", "lbmr.tir.lbtrm.mcastip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5560
14
        { &hf_lbmr_tir_lbtrm_session_id,
5561
14
            { "Session ID", "lbmr.tir.lbtrm.sessid", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5562
14
        { &hf_lbmr_tir_lbtrm_udp_dest_port,
5563
14
            { "Destination Port", "lbmr.tir.lbtrm.dport", FT_UINT16, BASE_PT_UDP, NULL, 0x0, NULL, HFILL } },
5564
14
        { &hf_lbmr_tir_lbtrm_src_ucast_port,
5565
14
            { "Source Port", "lbmr.tir.lbtrm.sport", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5566
14
        { &hf_lbmr_tir_lbtru,
5567
14
            { "LBTRU Transport", "lbmr.tir.lbtru", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5568
14
        { &hf_lbmr_tir_lbtru_ip,
5569
14
            { "Source IP", "lbmr.tir.lbtru.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5570
14
        { &hf_lbmr_tir_lbtru_port,
5571
14
            { "Source Port", "lbmr.tir.lbtru.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5572
14
        { &hf_lbmr_tir_lbtru_session_id,
5573
14
            { "Session ID", "lbmr.tir.lbtru.session_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5574
14
        { &hf_lbmr_tir_lbtipc,
5575
14
            { "LBTIPC Transport", "lbmr.tir.lbtipc", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5576
14
        { &hf_lbmr_tir_lbtipc_host_id,
5577
14
            { "Host ID", "lbmr.tir.lbtipc.host_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5578
14
        { &hf_lbmr_tir_lbtipc_session_id,
5579
14
            { "Session ID", "lbmr.tir.lbtipc.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5580
14
        { &hf_lbmr_tir_lbtipc_xport_id,
5581
14
            { "Transport ID", "lbmr.tir.lbtipc.xport_id", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5582
14
        { &hf_lbmr_tir_lbtrdma,
5583
14
            { "LBTRDMA Transport", "lbmr.tir.lbtrdma", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5584
14
        { &hf_lbmr_tir_lbtrdma_ip,
5585
14
            { "Source IP", "lbmr.tir.lbtrdma.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5586
14
        { &hf_lbmr_tir_lbtrdma_session_id,
5587
14
            { "Session ID", "lbmr.tir.lbtrdma.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5588
14
        { &hf_lbmr_tir_lbtrdma_port,
5589
14
            { "Port", "lbmr.tir.lbtrdma.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5590
14
        { &hf_lbmr_tir_lbtsmx,
5591
14
            { "LBTSMX Transport", "lbmr.tir.lbtsmx", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5592
14
        { &hf_lbmr_tir_lbtsmx_host_id,
5593
14
            { "Host ID", "lbmr.tir.lbtsmx.host_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5594
14
        { &hf_lbmr_tir_lbtsmx_session_id,
5595
14
            { "Session ID", "lbmr.tir.lbtsmx.session_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5596
14
        { &hf_lbmr_tir_lbtsmx_xport_id,
5597
14
            { "Transport ID", "lbmr.tir.lbtsmx.xport_id", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5598
14
        { &hf_lbmr_tir_channel,
5599
14
            { "Channel", "lbmr.tir.channel", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5600
14
        { &hf_lbmr_tir_unknown_transport,
5601
14
            { "Unknown Transport", "lbmr.tir.unknown_transport", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5602
14
        { &hf_lbmr_topts,
5603
14
            { "Options", "lbmr.topts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5604
14
        { &hf_lbmr_topt_len,
5605
14
            { "Length Option", "lbmr.topt.len", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5606
14
        { &hf_lbmr_topt_len_type,
5607
14
            { "Type", "lbmr.topt.len.type", FT_UINT8, BASE_DEC, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5608
14
        { &hf_lbmr_topt_len_len,
5609
14
            { "Length", "lbmr.topt.len.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5610
14
        { &hf_lbmr_topt_len_total_len,
5611
14
            { "Total Length", "lbmr.topt.len.total_len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5612
14
        { &hf_lbmr_topt_ume,
5613
14
            { "UME Option", "lbmr.topt.ume", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5614
14
        { &hf_lbmr_topt_ume_type,
5615
14
            { "Type", "lbmr.topt.ume.type", FT_UINT8, BASE_DEC, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5616
14
        { &hf_lbmr_topt_ume_len,
5617
14
            { "Length", "lbmr.topt.ume.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5618
14
        { &hf_lbmr_topt_ume_flags,
5619
14
            { "Flags", "lbmr.topt.ume.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5620
14
        { &hf_lbmr_topt_ume_flags_ignore,
5621
14
            { "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 } },
5622
14
        { &hf_lbmr_topt_ume_flags_latejoin,
5623
14
            { "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 } },
5624
14
        { &hf_lbmr_topt_ume_flags_store,
5625
14
            { "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 } },
5626
14
        { &hf_lbmr_topt_ume_flags_qccap,
5627
14
            { "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 } },
5628
14
        { &hf_lbmr_topt_ume_flags_acktosrc,
5629
14
            { "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 } },
5630
14
        { &hf_lbmr_topt_ume_store_tcp_port,
5631
14
            { "Store TCP Port", "lbmr.topt.ume.store_tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5632
14
        { &hf_lbmr_topt_ume_src_tcp_port,
5633
14
            { "Source TCP Port", "lbmr.topt.ume.src_tcp_port", FT_UINT16, BASE_PT_TCP, NULL, 0x0, NULL, HFILL } },
5634
14
        { &hf_lbmr_topt_ume_store_tcp_addr,
5635
14
            { "Store TCP Address", "lbmr.topt.ume.store_tcp_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5636
14
        { &hf_lbmr_topt_ume_src_tcp_addr,
5637
14
            { "Source TCP Address", "lbmr.topt.ume.src_tcp_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5638
14
        { &hf_lbmr_topt_ume_src_reg_id,
5639
14
            { "Source Registration ID", "lbmr.topt.ume.src_reg_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5640
14
        { &hf_lbmr_topt_ume_transport_idx,
5641
14
            { "Transport Index", "lbmr.topt.ume.transport_idx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5642
14
        { &hf_lbmr_topt_ume_high_seqnum,
5643
14
            { "High Sequence Number", "lbmr.topt.ume.high_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5644
14
        { &hf_lbmr_topt_ume_low_seqnum,
5645
14
            { "Low Sequence Number", "lbmr.topt.ume.low_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5646
14
        { &hf_lbmr_topt_ume_store,
5647
14
            { "UME Store Option", "lbmr.topt.ume_store", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5648
14
        { &hf_lbmr_topt_ume_store_type,
5649
14
            { "Type", "lbmr.topt.ume_store.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5650
14
        { &hf_lbmr_topt_ume_store_len,
5651
14
            { "Length", "lbmr.topt.ume_store.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5652
14
        { &hf_lbmr_topt_ume_store_flags,
5653
14
            { "Flags", "lbmr.topt.ume_store.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5654
14
        { &hf_lbmr_topt_ume_store_flags_ignore,
5655
14
            { "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 } },
5656
14
        { &hf_lbmr_topt_ume_store_grp_idx,
5657
14
            { "Group Index", "lbmr.topt.ume_store.grp_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5658
14
        { &hf_lbmr_topt_ume_store_store_tcp_port,
5659
14
            { "Store TCP Port", "lbmr.topt.ume_store.store_tcp_port", FT_UINT16, BASE_PT_TCP, NULL, 0x0, NULL, HFILL } },
5660
14
        { &hf_lbmr_topt_ume_store_store_idx,
5661
14
            { "Store Index", "lbmr.topt.ume_store.store_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5662
14
        { &hf_lbmr_topt_ume_store_store_ip_addr,
5663
14
            { "Store IP Address", "lbmr.topt.ume_store.store_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5664
14
        { &hf_lbmr_topt_ume_store_src_reg_id,
5665
14
            { "Source Registration ID", "lbmr.topt.ume_store.src_reg_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5666
14
        { &hf_lbmr_topt_ume_store_group,
5667
14
            { "UME Store Group Option", "lbmr.topt.ume_store_group", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5668
14
        { &hf_lbmr_topt_ume_store_group_type,
5669
14
            { "Type", "lbmr.topt.ume_store_group.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5670
14
        { &hf_lbmr_topt_ume_store_group_len,
5671
14
            { "Length", "lbmr.topt.ume_store_group.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5672
14
        { &hf_lbmr_topt_ume_store_group_flags,
5673
14
            { "Flags", "lbmr.topt.ume_store_group.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5674
14
        { &hf_lbmr_topt_ume_store_group_flags_ignore,
5675
14
            { "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 } },
5676
14
        { &hf_lbmr_topt_ume_store_group_grp_idx,
5677
14
            { "Group Index", "lbmr.topt.ume_store_group.grp_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5678
14
        { &hf_lbmr_topt_ume_store_group_grp_sz,
5679
14
            { "Group Size", "lbmr.topt.ume_store_group.grp_sz", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5680
14
        { &hf_lbmr_topt_ume_store_group_reserved,
5681
14
            { "Reserved", "lbmr.topt.ume_store_group.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5682
14
        { &hf_lbmr_topt_latejoin,
5683
14
            { "Late Join Option", "lbmr.topt.latejoin", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5684
14
        { &hf_lbmr_topt_latejoin_type,
5685
14
            { "Type", "lbmr.topt.latejoin.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5686
14
        { &hf_lbmr_topt_latejoin_len,
5687
14
            { "Length", "lbmr.topt.latejoin.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5688
14
        { &hf_lbmr_topt_latejoin_flags,
5689
14
            { "Flags", "lbmr.topt.latejoin.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5690
14
        { &hf_lbmr_topt_latejoin_flags_ignore,
5691
14
            { "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 } },
5692
14
        { &hf_lbmr_topt_latejoin_flags_acktosrc,
5693
14
            { "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 } },
5694
14
        { &hf_lbmr_topt_latejoin_src_tcp_port,
5695
14
            { "Source TCP Port", "lbmr.topt.latejoin.src_tcp_port", FT_UINT16, BASE_PT_TCP, NULL, 0x0, NULL, HFILL } },
5696
14
        { &hf_lbmr_topt_latejoin_reserved,
5697
14
            { "Reserved", "lbmr.topt.latejoin.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5698
14
        { &hf_lbmr_topt_latejoin_src_ip_addr,
5699
14
            { "Source IP Address", "lbmr.topt.latejoin.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5700
14
        { &hf_lbmr_topt_latejoin_transport_idx,
5701
14
            { "Transport Index", "lbmr.topt.latejoin.transport_idx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5702
14
        { &hf_lbmr_topt_latejoin_high_seqnum,
5703
14
            { "High Sequence Number", "lbmr.topt.latejoin.high_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5704
14
        { &hf_lbmr_topt_latejoin_low_seqnum,
5705
14
            { "Low Sequence Number", "lbmr.topt.latejoin.low_seqnum", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5706
14
        { &hf_lbmr_topt_umq_rcridx,
5707
14
            { "Receiver Control Record Index Option", "lbmr.topt.umq_rcridx", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5708
14
        { &hf_lbmr_topt_umq_rcridx_type,
5709
14
            { "Type", "lbmr.topt.umq_rcridx.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5710
14
        { &hf_lbmr_topt_umq_rcridx_len,
5711
14
            { "Length", "lbmr.topt.umq_rcridx.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5712
14
        { &hf_lbmr_topt_umq_rcridx_flags,
5713
14
            { "Flags", "lbmr.topt.umq_rcridx.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5714
14
        { &hf_lbmr_topt_umq_rcridx_flags_ignore,
5715
14
            { "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 } },
5716
14
        { &hf_lbmr_topt_umq_rcridx_rcr_idx,
5717
14
            { "Receiver Control Record Index", "lbmr.topt.umq_rcridx.rcr_idx", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5718
14
        { &hf_lbmr_topt_umq_qinfo,
5719
14
            { "Queue Info Option", "lbmr.topt.umq_qinfo", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5720
14
        { &hf_lbmr_topt_umq_qinfo_type,
5721
14
            { "Type", "lbmr.topt.umq_qinfo.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5722
14
        { &hf_lbmr_topt_umq_qinfo_len,
5723
14
            { "Length", "lbmr.topt.umq_qinfo.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5724
14
        { &hf_lbmr_topt_umq_qinfo_flags,
5725
14
            { "Flags", "lbmr.topt.umq_qinfo.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5726
14
        { &hf_lbmr_topt_umq_qinfo_flags_ignore,
5727
14
            { "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 } },
5728
14
        { &hf_lbmr_topt_umq_qinfo_flags_queue,
5729
14
            { "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 } },
5730
14
        { &hf_lbmr_topt_umq_qinfo_flags_rcvlisten,
5731
14
            { "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 } },
5732
14
        { &hf_lbmr_topt_umq_qinfo_flags_control,
5733
14
            { "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 } },
5734
14
        { &hf_lbmr_topt_umq_qinfo_flags_srcrcvlisten,
5735
14
            { "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 } },
5736
14
        { &hf_lbmr_topt_umq_qinfo_flags_participants_only,
5737
14
            { "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 } },
5738
14
        { &hf_lbmr_topt_umq_qinfo_queue,
5739
14
            { "Queue", "lbmr.topt.ume_qinfo.queue", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5740
14
        { &hf_lbmr_topt_cost,
5741
14
            { "Cost Option", "lbmr.topt.cost", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5742
14
        { &hf_lbmr_topt_cost_type,
5743
14
            { "Type", "lbmr.topt.cost.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5744
14
        { &hf_lbmr_topt_cost_len,
5745
14
            { "Length", "lbmr.topt.cost.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5746
14
        { &hf_lbmr_topt_cost_flags,
5747
14
            { "Flags", "lbmr.topt.cost.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5748
14
        { &hf_lbmr_topt_cost_flags_ignore,
5749
14
            { "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 } },
5750
14
        { &hf_lbmr_topt_cost_hop_count,
5751
14
            { "Hop count", "lbmr.topt.cost.hop_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5752
14
        { &hf_lbmr_topt_cost_cost,
5753
14
            { "Cost", "lbmr.topt.cost.cost", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5754
14
        { &hf_lbmr_topt_otid,
5755
14
            { "Originating Transport ID Option", "lbmr.topt.otid", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5756
14
        { &hf_lbmr_topt_otid_type,
5757
14
            { "Type", "lbmr.topt.otid.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5758
14
        { &hf_lbmr_topt_otid_len,
5759
14
            { "Length", "lbmr.topt.otid.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5760
14
        { &hf_lbmr_topt_otid_flags,
5761
14
            { "Flags", "lbmr.topt.otid.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5762
14
        { &hf_lbmr_topt_otid_flags_ignore,
5763
14
            { "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 } },
5764
14
        { &hf_lbmr_topt_otid_originating_transport,
5765
14
            { "Originating Transport ID", "lbmr.topt.otid.originating_transport", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5766
14
        { &hf_lbmr_topt_ctxinst,
5767
14
            { "Context Instance Option", "lbmr.topt.ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5768
14
        { &hf_lbmr_topt_ctxinst_type,
5769
14
            { "Type", "lbmr.topt.ctxinst.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5770
14
        { &hf_lbmr_topt_ctxinst_len,
5771
14
            { "Length", "lbmr.topt.ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5772
14
        { &hf_lbmr_topt_ctxinst_flags,
5773
14
            { "Flags", "lbmr.topt.ctxinst.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5774
14
        { &hf_lbmr_topt_ctxinst_flags_ignore,
5775
14
            { "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 } },
5776
14
        { &hf_lbmr_topt_ctxinst_res,
5777
14
            { "Reserved", "lbmr.topt.ctxinst.res", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5778
14
        { &hf_lbmr_topt_ctxinst_ctxinst,
5779
14
            { "Context Instance", "lbmr.topt.ctxinst.ctxinst", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5780
14
        { &hf_lbmr_topt_ctxinsts,
5781
14
            { "Store Context Instance Option", "lbmr.topt.ctxinsts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5782
14
        { &hf_lbmr_topt_ctxinsts_type,
5783
14
            { "Type", "lbmr.topt.ctxinsts.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5784
14
        { &hf_lbmr_topt_ctxinsts_len,
5785
14
            { "Length", "lbmr.topt.ctxinsts.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5786
14
        { &hf_lbmr_topt_ctxinsts_flags,
5787
14
            { "Flags", "lbmr.topt.ctxinsts.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5788
14
        { &hf_lbmr_topt_ctxinsts_flags_ignore,
5789
14
            { "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 } },
5790
14
        { &hf_lbmr_topt_ctxinsts_idx,
5791
14
            { "Index", "lbmr.topt.ctxinsts.idx", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5792
14
        { &hf_lbmr_topt_ctxinsts_ctxinst,
5793
14
            { "Store Context Instance", "lbmr.topt.ctxinsts.ctxinsts", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5794
14
        { &hf_lbmr_topt_ulb,
5795
14
            { "ULB Option", "lbmr.topt.ulb", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5796
14
        { &hf_lbmr_topt_ulb_type,
5797
14
            { "Type", "lbmr.topt.ulb.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5798
14
        { &hf_lbmr_topt_ulb_len,
5799
14
            { "Length", "lbmr.topt.ulb.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5800
14
        { &hf_lbmr_topt_ulb_flags,
5801
14
            { "Flags", "lbmr.topt.ulb.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5802
14
        { &hf_lbmr_topt_ulb_flags_ignore,
5803
14
            { "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 } },
5804
14
        { &hf_lbmr_topt_ulb_queue_id,
5805
14
            { "Queue ID", "lbmr.topt.ulb.queue_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5806
14
        { &hf_lbmr_topt_ulb_regid,
5807
14
            { "Registration ID", "lbmr.topt.ulb.regid", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5808
14
        { &hf_lbmr_topt_ulb_ulb_src_id,
5809
14
            { "ULB Source ID", "lbmr.topt.ulb.ulb_src_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
5810
14
        { &hf_lbmr_topt_ulb_src_ip_addr,
5811
14
            { "Source IP Address", "lbmr.topt.ulb.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5812
14
        { &hf_lbmr_topt_ulb_src_tcp_port,
5813
14
            { "Source TCP Port", "lbmr.topt.ulb.src_tcp_port", FT_UINT16, BASE_PT_TCP, NULL, 0x0, NULL, HFILL } },
5814
14
        { &hf_lbmr_topt_ulb_reserved,
5815
14
            { "Reserved", "lbmr.topt.ulb.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5816
14
        { &hf_lbmr_topt_ctxinstq,
5817
14
            { "Queue Context Instance Option", "lbmr.topt.ctxinstq", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5818
14
        { &hf_lbmr_topt_ctxinstq_type,
5819
14
            { "Type", "lbmr.topt.ctxinstq.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5820
14
        { &hf_lbmr_topt_ctxinstq_len,
5821
14
            { "Length", "lbmr.topt.ctxinstq.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5822
14
        { &hf_lbmr_topt_ctxinstq_flags,
5823
14
            { "Flags", "lbmr.topt.ctxinstq.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5824
14
        { &hf_lbmr_topt_ctxinstq_flags_ignore,
5825
14
            { "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 } },
5826
14
        { &hf_lbmr_topt_ctxinstq_idx,
5827
14
            { "Index", "lbmr.topt.ctxinstq.idx", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5828
14
        { &hf_lbmr_topt_ctxinstq_ctxinst,
5829
14
            { "Store Context Instance", "lbmr.topt.ctxinstq.ctxinstq", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5830
14
        { &hf_lbmr_topt_domain_id,
5831
14
            { "Domain ID Option", "lbmr.topt.domain_id", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5832
14
        { &hf_lbmr_topt_domain_id_type,
5833
14
            { "Type", "lbmr.topt.domain_id.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5834
14
        { &hf_lbmr_topt_domain_id_len,
5835
14
            { "Length", "lbmr.topt.domain_id.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5836
14
        { &hf_lbmr_topt_domain_id_flags,
5837
14
            { "Flags", "lbmr.topt.domain_id.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5838
14
        { &hf_lbmr_topt_domain_id_flags_ignore,
5839
14
            { "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 } },
5840
14
        { &hf_lbmr_topt_domain_id_domain_id,
5841
14
            { "Domain ID", "lbmr.topt.domain_id.domain_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5842
14
        { &hf_lbmr_topt_exfunc,
5843
14
            { "Extended Functionality Option", "lbmr.topt.exfunc", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5844
14
        { &hf_lbmr_topt_exfunc_type,
5845
14
            { "Type", "lbmr.topt.exfunc.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5846
14
        { &hf_lbmr_topt_exfunc_len,
5847
14
            { "Length", "lbmr.topt.exfunc.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5848
14
        { &hf_lbmr_topt_exfunc_flags,
5849
14
            { "Flags", "lbmr.topt.exfunc.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5850
14
        { &hf_lbmr_topt_exfunc_flags_ignore,
5851
14
            { "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 } },
5852
14
        { &hf_lbmr_topt_exfunc_src_tcp_port,
5853
14
            { "Source TCP Port", "lbmr.topt.exfunc.src_tcp_port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5854
14
        { &hf_lbmr_topt_exfunc_reserved,
5855
14
            { "Reserved", "lbmr.topt.exfunc.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5856
14
        { &hf_lbmr_topt_exfunc_src_ip_addr,
5857
14
            { "Source IP Address", "lbmr.topt.exfunc.src_ip_addr", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5858
14
        { &hf_lbmr_topt_exfunc_functionality_flags,
5859
14
            { "Functionality Flags", "lbmr.topt.exfunc.functionality_flags", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5860
14
        { &hf_lbmr_topt_exfunc_functionality_flags_ulb,
5861
14
            { "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 } },
5862
14
        { &hf_lbmr_topt_exfunc_functionality_flags_umq,
5863
14
            { "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 } },
5864
14
        { &hf_lbmr_topt_exfunc_functionality_flags_ume,
5865
14
            { "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 } },
5866
14
        { &hf_lbmr_topt_exfunc_functionality_flags_lj,
5867
14
            { "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 } },
5868
14
        { &hf_lbmr_topt_unknown,
5869
14
            { "Unknown Option", "lbmr.topt.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5870
14
        { &hf_lbmr_topt_unknown_type,
5871
14
            { "Type", "lbmr.topt.unknown.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_topic_option_type), 0x0, NULL, HFILL } },
5872
14
        { &hf_lbmr_topt_unknown_len,
5873
14
            { "Length", "lbmr.topt.unknown.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5874
14
        { &hf_lbmr_topt_unknown_flags,
5875
14
            { "Flags", "lbmr.topt.unknown.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5876
14
        { &hf_lbmr_topt_unknown_data,
5877
14
            { "Data", "lbmr.topt.unknown.data", FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } },
5878
14
        { &hf_lbmr_tmb,
5879
14
            { "Topic Management Block", "lbmr.tmb", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5880
14
        { &hf_lbmr_tmb_len,
5881
14
            { "Length", "lbmr.tmb.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5882
14
        { &hf_lbmr_tmb_tmrs,
5883
14
            { "Topic Management Record Count", "lbmr.tmb.tmrs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5884
14
        { &hf_lbmr_tmb_tmr_list,
5885
14
            { "Topic Management Records", "lbmr.tmb.tmr_list", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5886
14
        { &hf_lbmr_tmr,
5887
14
            { "Topic Management Record", "lbmr.tmb.tmr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5888
14
        { &hf_lbmr_tmr_len,
5889
14
            { "Length", "lbmr.tmb.tmr.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5890
14
        { &hf_lbmr_tmr_type,
5891
14
            { "TMR Type", "lbmr.tmb.tmr.type", FT_UINT8, BASE_DEC, VALS(lbmr_tmr_type), 0x0, NULL, HFILL } },
5892
14
        { &hf_lbmr_tmr_flags,
5893
14
            { "Flags", "lbmr.tmb.tmr.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5894
14
        { &hf_lbmr_tmr_flags_response,
5895
14
            { "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 } },
5896
14
        { &hf_lbmr_tmr_flags_wildcard_pcre,
5897
14
            { "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 } },
5898
14
        { &hf_lbmr_tmr_flags_wildcard_regex,
5899
14
            { "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 } },
5900
14
        { &hf_lbmr_tmr_name,
5901
14
            { "Topic Name", "lbmr.tmb.tmr.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5902
14
        { &hf_lbmr_pser_dep_type,
5903
14
            { "Dependent Type", "lbmr.pser.dep_type", FT_UINT16, BASE_DEC_HEX, VALS(lbmr_pser_dependent_type), 0x0, NULL, HFILL } },
5904
14
        { &hf_lbmr_pser_len,
5905
14
            { "Length", "lbmr.pser.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5906
14
        { &hf_lbmr_pser_flags,
5907
14
            { "Flags", "lbmr.pser.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5908
14
        { &hf_lbmr_pser_flags_option,
5909
14
            { "Option", "lbmr.pser.flags.option", FT_BOOLEAN, L_LBMR_PSER_T_FLAGS * 8, TFS(&tfs_set_notset), LBMR_PSER_OPT_FLAG, NULL, HFILL } },
5910
14
        { &hf_lbmr_pser_source_ip,
5911
14
            { "Source IP", "lbmr.pser.source_ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5912
14
        { &hf_lbmr_pser_store_ip,
5913
14
            { "Store IP", "lbmr.pser.store_ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5914
14
        { &hf_lbmr_pser_transport_idx,
5915
14
            { "Transport Index", "lbmr.pser.transport_idx", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5916
14
        { &hf_lbmr_pser_topic_idx,
5917
14
            { "Topic Index", "lbmr.pser.topic_idx", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5918
14
        { &hf_lbmr_pser_source_port,
5919
14
            { "Source Port", "lbmr.pser.source_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5920
14
        { &hf_lbmr_pser_store_port,
5921
14
            { "Store Port", "lbmr.pser.store_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5922
14
        { &hf_lbmr_pser_topic,
5923
14
            { "Topic", "lbmr.pser.topic", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5924
14
        { &hf_lbmr_pser_opts,
5925
14
            { "Options", "lbmr.pser.opts", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5926
14
        { &hf_lbmr_pser_optlen,
5927
14
            { "Option Length", "lbmr.pser.opt.optlen", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5928
14
        { &hf_lbmr_pser_optlen_type,
5929
14
            { "Type", "lbmr.pser.opt.optlen.type", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5930
14
        { &hf_lbmr_pser_optlen_optlen,
5931
14
            { "Options Length", "lbmr.pser.opt.optlen.optlen", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5932
14
        { &hf_lbmr_pser_opt_ctxinst,
5933
14
            { "Context Instance Option", "lbmr.pser.opt.ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5934
14
        { &hf_lbmr_pser_opt_ctxinst_len,
5935
14
            { "Length", "lbmr.pser.opt.ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5936
14
        { &hf_lbmr_pser_opt_ctxinst_type,
5937
14
            { "Type", "lbmr.pser.opt.ctxinst.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_pser_option_type), 0x0, NULL, HFILL } },
5938
14
        { &hf_lbmr_pser_opt_ctxinst_ctxinst,
5939
14
            { "Context Instance", "lbmr.pser.opt.ctxinst.ctxinst", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5940
14
        { &hf_lbmr_qqr,
5941
14
            { "QQRs", "lbmr.qqr", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5942
14
        { &hf_lbmr_qqr_name,
5943
14
            { "Queue name", "lbmr.qqr.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5944
14
        { &hf_lbmr_qirs,
5945
14
            { "QIRs", "lbmr.qirs", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5946
14
        { &hf_lbmr_qir,
5947
14
            { "QIR", "lbmr.qir", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5948
14
        { &hf_lbmr_qir_queue_name,
5949
14
            { "Queue name", "lbmr.qir.qname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5950
14
        { &hf_lbmr_qir_topic_name,
5951
14
            { "Topic name", "lbmr.qir.tname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5952
14
        { &hf_lbmr_qir_queue_id,
5953
14
            { "Queue ID", "lbmr.qir.queue_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5954
14
        { &hf_lbmr_qir_queue_ver,
5955
14
            { "Queue Version", "lbmr.qir.queue_ver", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5956
14
        { &hf_lbmr_qir_queue_prev_ver,
5957
14
            { "Queue Previous Version", "lbmr.qir.queue_prev_ver", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
5958
14
        { &hf_lbmr_qir_option_flag,
5959
14
            { "QIR Options Present", "lbmr.qir.opts", FT_BOOLEAN, L_LBMR_QIR_T_GRP_BLKS * 8, TFS(&tfs_set_notset), LBMR_QIR_OPTIONS, NULL, HFILL } },
5960
14
        { &hf_lbmr_qir_grp_blks,
5961
14
            { "Group Block Count", "lbmr.qir.grp_blks", FT_UINT16, BASE_DEC_HEX, NULL, LBMR_QIR_GRP_BLOCKS_MASK, NULL, HFILL } },
5962
14
        { &hf_lbmr_qir_queue_blks,
5963
14
            { "Queue Blocks", "lbmr.qir.queue_blks", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5964
14
        { &hf_lbmr_qir_grps,
5965
14
            { "Groups", "lbmr.qir.grps", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5966
14
        { &hf_lbmr_qir_grp_blk,
5967
14
            { "Group Block", "lbmr.qir.grp", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5968
14
        { &hf_lbmr_qir_grp_blk_grp_idx,
5969
14
            { "Group Index", "lbmr.qir.grp.grp_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5970
14
        { &hf_lbmr_qir_grp_blk_grp_sz,
5971
14
            { "Group Size", "lbmr.qir.grp.grp_sz", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5972
14
        { &hf_lbmr_qir_queues,
5973
14
            { "Queues", "lbmr.qir.queues", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5974
14
        { &hf_lbmr_qir_queue_blk,
5975
14
            { "Queue Block", "lbmr.qir.queue", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5976
14
        { &hf_lbmr_qir_queue_blk_ip,
5977
14
            { "IP Address", "lbmr.qir.queue.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5978
14
        { &hf_lbmr_qir_queue_blk_port,
5979
14
            { "Port", "lbmr.qir.queue.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5980
14
        { &hf_lbmr_qir_queue_blk_idx,
5981
14
            { "Index", "lbmr.qir.queue.idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5982
14
        { &hf_lbmr_qir_queue_blk_grp_idx,
5983
14
            { "Group Index", "lbmr.qir.queue.grp_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5984
14
        { &hf_lbmr_qir_queue_blk_reserved,
5985
14
            { "Reserved", "lbmr.qir.queue.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
5986
14
        { &hf_lbmr_opts,
5987
14
            { "Options", "lbmr.opt", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5988
14
        { &hf_lbmr_opt_len,
5989
14
            { "Length Option", "lbmr.opt.len", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5990
14
        { &hf_lbmr_opt_len_type,
5991
14
            { "Type", "lbmr.opt.len.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
5992
14
        { &hf_lbmr_opt_len_len,
5993
14
            { "Length", "lbmr.opt.len.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5994
14
        { &hf_lbmr_opt_len_total_len,
5995
14
            { "Total Length", "lbmr.opt.len.total_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
5996
14
        { &hf_lbmr_opt_src_id,
5997
14
            { "Source ID Option", "lbmr.opt.src_id", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
5998
14
        { &hf_lbmr_opt_src_id_type,
5999
14
            { "Type", "lbmr.opt.src_id.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6000
14
        { &hf_lbmr_opt_src_id_len,
6001
14
            { "Length", "lbmr.opt.src_id.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6002
14
        { &hf_lbmr_opt_src_id_flags,
6003
14
            { "Flags", "lbmr.opt.src_id.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6004
14
        { &hf_lbmr_opt_src_id_flags_ignore,
6005
14
            { "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 } },
6006
14
        { &hf_lbmr_opt_src_id_src_id,
6007
14
            { "Source ID", "lbmr.opt.src_id.src_id", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6008
14
        { &hf_lbmr_opt_src_type,
6009
14
            { "Source Type Option", "lbmr.opt.src_type", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6010
14
        { &hf_lbmr_opt_src_type_type,
6011
14
            { "Type", "lbmr.opt.src_type.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6012
14
        { &hf_lbmr_opt_src_type_len,
6013
14
            { "Length", "lbmr.opt.src_type.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6014
14
        { &hf_lbmr_opt_src_type_flags,
6015
14
            { "Flags", "lbmr.opt.src_type.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6016
14
        { &hf_lbmr_opt_src_type_flags_ignore,
6017
14
            { "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 } },
6018
14
        { &hf_lbmr_opt_src_type_src_type,
6019
14
            { "Source Type", "lbmr.opt.src_type.src_type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_option_source_type), 0x0, NULL, HFILL } },
6020
14
        { &hf_lbmr_opt_version,
6021
14
            { "Version Option", "lbmr.opt.version", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6022
14
        { &hf_lbmr_opt_version_type,
6023
14
            { "Type", "lbmr.opt.version.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6024
14
        { &hf_lbmr_opt_version_len,
6025
14
            { "Length", "lbmr.opt.version.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6026
14
        { &hf_lbmr_opt_version_flags,
6027
14
            { "Flags", "lbmr.opt.version.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6028
14
        { &hf_lbmr_opt_version_flags_ignore,
6029
14
            { "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 } },
6030
14
        { &hf_lbmr_opt_version_flags_ume,
6031
14
            { "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 } },
6032
14
        { &hf_lbmr_opt_version_flags_umq,
6033
14
            { "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 } },
6034
14
        { &hf_lbmr_opt_version_version,
6035
14
            { "Version", "lbmr.opt.version.version", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6036
14
        { &hf_lbmr_opt_local_domain,
6037
14
            { "Local Domain Option", "lbmr.opt.local_domain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6038
14
        { &hf_lbmr_opt_local_domain_type,
6039
14
            { "Type", "lbmr.opt.local_domain.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6040
14
        { &hf_lbmr_opt_local_domain_len,
6041
14
            { "Length", "lbmr.opt.local_domain.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6042
14
        { &hf_lbmr_opt_local_domain_flags,
6043
14
            { "Flags", "lbmr.opt.local_domain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6044
14
        { &hf_lbmr_opt_local_domain_flags_ignore,
6045
14
            { "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 } },
6046
14
        { &hf_lbmr_opt_local_domain_flags_viral,
6047
14
            { "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 } },
6048
14
        { &hf_lbmr_opt_local_domain_local_domain_id,
6049
14
            { "Local Domain ID", "lbmr.opt.local_domain.local_domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6050
14
        { &hf_lbmr_opt_unknown,
6051
14
            { "Unknown ID Option", "lbmr.opt.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6052
14
        { &hf_lbmr_opt_unknown_type,
6053
14
            { "Type", "lbmr.opt.unknown.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_option_type), 0x0, NULL, HFILL } },
6054
14
        { &hf_lbmr_opt_unknown_len,
6055
14
            { "Length", "lbmr.opt.unknown.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6056
14
        { &hf_lbmr_opt_unknown_flags,
6057
14
            { "Flags", "lbmr.opt.unknown.flags", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6058
14
        { &hf_lbmr_opt_unknown_data,
6059
14
            { "Data", "lbmr.opt.unknown.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6060
14
        { &hf_lbmr_topic_res_request_flags,
6061
14
            { "Flags", "lbmr.topic_res_request.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6062
14
        { &hf_lbmr_topic_res_request_flags_gw_remote_interest,
6063
14
            { "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 } },
6064
14
        { &hf_lbmr_topic_res_request_flags_context_query,
6065
14
            { "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 } },
6066
14
        { &hf_lbmr_topic_res_request_flags_context_advertisement,
6067
14
            { "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 } },
6068
14
        { &hf_lbmr_topic_res_request_flags_gateway_meta,
6069
14
            { "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 } },
6070
14
        { &hf_lbmr_topic_res_request_flags_advertisement,
6071
14
            { "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 } },
6072
14
        { &hf_lbmr_topic_res_request_flags_query,
6073
14
            { "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 } },
6074
14
        { &hf_lbmr_topic_res_request_flags_wildcard_query,
6075
14
            { "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 } },
6076
14
        { &hf_lbmr_ctxinfo_len,
6077
14
            { "Length", "lbmr.ctxinfo.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6078
14
        { &hf_lbmr_ctxinfo_hop_count,
6079
14
            { "Hop Count", "lbmr.ctxinfo.hop_count", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6080
14
        { &hf_lbmr_ctxinfo_flags,
6081
14
            { "Flags", "lbmr.ctxinfo.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6082
14
        { &hf_lbmr_ctxinfo_flags_query,
6083
14
            { "Query", "lbmr.ctxinfo.flags.query", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_QUERY_FLAG, "Set if query, clear if response", HFILL } },
6084
14
        { &hf_lbmr_ctxinfo_flags_ip,
6085
14
            { "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 } },
6086
14
        { &hf_lbmr_ctxinfo_flags_instance,
6087
14
            { "Instance", "lbmr.ctxinfo.flags.instance", FT_BOOLEAN, 16, TFS(&tfs_present_not_present), LBMR_CTXINFO_INSTANCE_FLAG, "Set if context instance is included", HFILL } },
6088
14
        { &hf_lbmr_ctxinfo_flags_tnwg_src,
6089
14
            { "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 } },
6090
14
        { &hf_lbmr_ctxinfo_flags_tnwg_rcv,
6091
14
            { "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 } },
6092
14
        { &hf_lbmr_ctxinfo_flags_proxy,
6093
14
            { "Proxy", "lbmr.ctxinfo.flags.proxy", FT_BOOLEAN, 16, TFS(&tfs_set_notset), LBMR_CTXINFO_PROXY_FLAG, "Set if a proxy for another context", HFILL } },
6094
14
        { &hf_lbmr_ctxinfo_flags_name,
6095
14
            { "Name", "lbmr.ctxinfo.flags.name", FT_BOOLEAN, 16, TFS(&tfs_present_not_present), LBMR_CTXINFO_NAME_FLAG, "Set if context name is included", HFILL } },
6096
14
        { &hf_lbmr_ctxinfo_port,
6097
14
            { "Port", "lbmr.ctxinfo.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6098
14
        { &hf_lbmr_ctxinfo_ip,
6099
14
            { "IP Address", "lbmr.ctxinfo.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6100
14
        { &hf_lbmr_ctxinfo_instance,
6101
14
            { "Instance", "lbmr.ctxinfo.instance", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6102
14
        { &hf_lbmr_ctxinfo_name,
6103
14
            { "Name", "lbmr.ctxinfo.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6104
14
        { &hf_lbmr_tnwg_len,
6105
14
            { "Length", "lbmr.tnwg.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6106
14
        { &hf_lbmr_tnwg_type,
6107
14
            { "Type", "lbmr.tnwg.type", FT_UINT16, BASE_DEC_HEX, VALS(lbmr_tnwg_function_type), 0x0, NULL, HFILL } },
6108
14
        { &hf_lbmr_tnwg_reserved,
6109
14
            { "Reserved", "lbmr.tnwg.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6110
14
        { &hf_lbmr_tnwg_interest,
6111
14
            { "Interest", "lbmr.tnwg.interest", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6112
14
        { &hf_lbmr_tnwg_interest_len,
6113
14
            { "Length", "lbmr.tnwg.interest.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6114
14
        { &hf_lbmr_tnwg_interest_count,
6115
14
            { "Record Count", "lbmr.tnwg.interest.count", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6116
14
        { &hf_lbmr_tnwg_interest_rec,
6117
14
            { "Interest Record", "lbmr.tnwg.interest_rec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6118
14
        { &hf_lbmr_tnwg_interest_rec_len,
6119
14
            { "Length", "lbmr.tnwg.interest_rec.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6120
14
        { &hf_lbmr_tnwg_interest_rec_flags,
6121
14
            { "Flags", "lbmr.tnwg.interest_rec.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6122
14
        { &hf_lbmr_tnwg_interest_rec_flags_pattern,
6123
14
            { "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 } },
6124
14
        { &hf_lbmr_tnwg_interest_rec_flags_cancel,
6125
14
            { "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 } },
6126
14
        { &hf_lbmr_tnwg_interest_rec_flags_refresh,
6127
14
            { "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 } },
6128
14
        { &hf_lbmr_tnwg_interest_rec_pattype,
6129
14
            { "Pattern Type", "lbmr.tnwg.interest_rec.pattype", FT_UINT8, BASE_DEC_HEX, VALS(lbm_wildcard_pattern_type_short), 0x0, NULL, HFILL } },
6130
14
        { &hf_lbmr_tnwg_interest_rec_domain_id,
6131
14
            { "Domain ID", "lbmr.tnwg.interest_rec.domain_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6132
14
        { &hf_lbmr_tnwg_interest_rec_symbol,
6133
14
            { "Symbol", "lbmr.tnwg.interest_rec.symbol", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6134
14
        { &hf_lbmr_tnwg_ctxinfo,
6135
14
            { "Context Information", "lbmr.tnwg.ctxinfo", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6136
14
        { &hf_lbmr_tnwg_ctxinfo_len,
6137
14
            { "Length", "lbmr.tnwg.ctxinfo.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6138
14
        { &hf_lbmr_tnwg_ctxinfo_hop_count,
6139
14
            { "Hop Count", "lbmr.tnwg.ctxinfo.hop_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6140
14
        { &hf_lbmr_tnwg_ctxinfo_reserved,
6141
14
            { "Reserved", "lbmr.tnwg.ctxinfo.reserved", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6142
14
        { &hf_lbmr_tnwg_ctxinfo_flags1,
6143
14
            { "Flags1", "lbmr.tnwg.ctxinfo.flags1", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6144
14
        { &hf_lbmr_tnwg_ctxinfo_flags1_query,
6145
14
            { "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 } },
6146
14
        { &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_src,
6147
14
            { "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 } },
6148
14
        { &hf_lbmr_tnwg_ctxinfo_flags1_tnwg_rcv,
6149
14
            { "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 } },
6150
14
        { &hf_lbmr_tnwg_ctxinfo_flags1_proxy,
6151
14
            { "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 } },
6152
14
        { &hf_lbmr_tnwg_ctxinfo_flags2,
6153
14
            { "Flags2", "lbmr.tnwg.ctxinfo.flags2", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6154
14
        { &hf_lbmr_tnwg_trreq,
6155
14
            { "Topic Res Request", "lbmr.tnwg.trreq", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6156
14
        { &hf_lbmr_tnwg_trreq_len,
6157
14
            { "Length", "lbmr.tnwg.trreq.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6158
14
        { &hf_lbmr_tnwg_opt,
6159
14
            { "Unknown Option", "lbmr.tnwg.opt", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6160
14
        { &hf_lbmr_tnwg_opt_type,
6161
14
            { "Type", "lbmr.tnwg.opt.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6162
14
        { &hf_lbmr_tnwg_opt_len,
6163
14
            { "Length", "lbmr.tnwg.opt.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6164
14
        { &hf_lbmr_tnwg_opt_flags,
6165
14
            { "Flags", "lbmr.tnwg.opt.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6166
14
        { &hf_lbmr_tnwg_opt_flags_ignore,
6167
14
            { "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 } },
6168
14
        { &hf_lbmr_tnwg_opt_data,
6169
14
            { "Data", "lbmr.tnwg.opt.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6170
14
        { &hf_lbmr_tnwg_opt_ctxinst,
6171
14
            { "Context Instance Option", "lbmr.tnwg.opt_ctxinst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6172
14
        { &hf_lbmr_tnwg_opt_ctxinst_type,
6173
14
            { "Type", "lbmr.tnwg.opt_ctxinst.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6174
14
        { &hf_lbmr_tnwg_opt_ctxinst_len,
6175
14
            { "Length", "lbmr.tnwg.opt_ctxinst.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6176
14
        { &hf_lbmr_tnwg_opt_ctxinst_flags,
6177
14
            { "Flags", "lbmr.tnwg.opt_ctxinst.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6178
14
        { &hf_lbmr_tnwg_opt_ctxinst_flags_ignore,
6179
14
            { "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 } },
6180
14
        { &hf_lbmr_tnwg_opt_ctxinst_instance,
6181
14
            { "Context Instance", "lbmr.tnwg.opt_ctxinst.instance", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6182
14
        { &hf_lbmr_tnwg_opt_address,
6183
14
            { "Address Option", "lbmr.tnwg.opt_address", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6184
14
        { &hf_lbmr_tnwg_opt_address_type,
6185
14
            { "Type", "lbmr.tnwg.opt_address.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6186
14
        { &hf_lbmr_tnwg_opt_address_len,
6187
14
            { "Length", "lbmr.tnwg.opt_address.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6188
14
        { &hf_lbmr_tnwg_opt_address_flags,
6189
14
            { "Flags", "lbmr.tnwg.opt_address.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6190
14
        { &hf_lbmr_tnwg_opt_address_flags_ignore,
6191
14
            { "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 } },
6192
14
        { &hf_lbmr_tnwg_opt_address_port,
6193
14
            { "Port", "lbmr.tnwg.opt_address.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6194
14
        { &hf_lbmr_tnwg_opt_address_res,
6195
14
            { "Reserved", "lbmr.tnwg.opt_address.res", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6196
14
        { &hf_lbmr_tnwg_opt_address_ip,
6197
14
            { "IP Address", "lbmr.tnwg.opt_address.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6198
14
        { &hf_lbmr_tnwg_opt_domain,
6199
14
            { "Domain Option", "lbmr.tnwg.opt_domain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6200
14
        { &hf_lbmr_tnwg_opt_domain_type,
6201
14
            { "Type", "lbmr.tnwg.opt_domain.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6202
14
        { &hf_lbmr_tnwg_opt_domain_len,
6203
14
            { "Length", "lbmr.tnwg.opt_domain.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6204
14
        { &hf_lbmr_tnwg_opt_domain_flags,
6205
14
            { "Flags", "lbmr.tnwg.opt_domain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6206
14
        { &hf_lbmr_tnwg_opt_domain_flags_ignore,
6207
14
            { "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 } },
6208
14
        { &hf_lbmr_tnwg_opt_domain_domain_id,
6209
14
            { "Domain ID", "lbmr.tnwg.opt_domain.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6210
14
        { &hf_lbmr_tnwg_opt_name,
6211
14
            { "Name Option", "lbmr.tnwg.opt_name", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6212
14
        { &hf_lbmr_tnwg_opt_name_type,
6213
14
            { "Type", "lbmr.tnwg.opt_name.type", FT_UINT8, BASE_HEX_DEC, VALS(lbmr_tnwg_option_type), 0x0, NULL, HFILL } },
6214
14
        { &hf_lbmr_tnwg_opt_name_len,
6215
14
            { "Length", "lbmr.tnwg.opt_name.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6216
14
        { &hf_lbmr_tnwg_opt_name_flags,
6217
14
            { "Flags", "lbmr.tnwg.opt_name.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6218
14
        { &hf_lbmr_tnwg_opt_name_flags_ignore,
6219
14
            { "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 } },
6220
14
        { &hf_lbmr_tnwg_opt_name_name,
6221
14
            { "Name", "lbmr.tnwg.opt_name.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6222
14
        { &hf_lbmr_remote_domain_route_hdr_num_domains,
6223
14
            { "Number of Domains", "lbmr.remote_domain_route.num_domains", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6224
14
        { &hf_lbmr_remote_domain_route_hdr_ip,
6225
14
            { "IP Address", "lbmr.remote_domain_route.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6226
14
        { &hf_lbmr_remote_domain_route_hdr_port,
6227
14
            { "Port", "lbmr.remote_domain_route.port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6228
14
        { &hf_lbmr_remote_domain_route_hdr_route_index,
6229
14
            { "Route Index", "lbmr.remote_domain_route.route_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
6230
14
        { &hf_lbmr_remote_domain_route_hdr_length,
6231
14
            { "Length", "lbmr.remote_domain_route.length", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6232
14
        { &hf_lbmr_remote_domain_route_hdr_domain,
6233
14
            { "Domain", "lbmr.remote_domain_route.domain", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6234
14
        { &hf_lbmr_rctxinfo_len,
6235
14
            { "Length", "lbmr.rctxinfo.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6236
14
        { &hf_lbmr_rctxinfo_num_recs,
6237
14
            { "Number of Records", "lbmr.rctxinfo.num_recs", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6238
14
        { &hf_lbmr_rctxinfo_reserved,
6239
14
            { "Reserved", "lbmr.rctxinfo.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6240
14
        { &hf_lbmr_rctxinfo_rec,
6241
14
            { "Remote Context Information Record", "lbmr.rctxinfo.rec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6242
14
        { &hf_lbmr_rctxinfo_rec_len,
6243
14
            { "Length", "lbmr.rctxinfo.rec.len", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6244
14
        { &hf_lbmr_rctxinfo_rec_flags,
6245
14
            { "Flags", "lbmr.rctxinfo.rec.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6246
14
        { &hf_lbmr_rctxinfo_rec_flags_query,
6247
14
            { "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 } },
6248
14
        { &hf_lbmr_rctxinfo_rec_address,
6249
14
            { "Address Option", "lbmr.rctxinfo.rec.address", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6250
14
        { &hf_lbmr_rctxinfo_rec_address_type,
6251
14
            { "Type", "lbmr.rctxinfo.rec.address.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6252
14
        { &hf_lbmr_rctxinfo_rec_address_len,
6253
14
            { "Length", "lbmr.rctxinfo.rec.address.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6254
14
        { &hf_lbmr_rctxinfo_rec_address_flags,
6255
14
            { "Flags", "lbmr.rctxinfo.rec.address.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6256
14
        { &hf_lbmr_rctxinfo_rec_address_domain_id,
6257
14
            { "Domain ID", "lbmr.rctxinfo.rec.address.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6258
14
        { &hf_lbmr_rctxinfo_rec_address_ip,
6259
14
            { "Address", "lbmr.rctxinfo.rec.address.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6260
14
        { &hf_lbmr_rctxinfo_rec_address_port,
6261
14
            { "Port", "lbmr.rctxinfo.rec.address.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6262
14
        { &hf_lbmr_rctxinfo_rec_address_res,
6263
14
            { "Reserved", "lbmr.rctxinfo.rec.address.res", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6264
14
        { &hf_lbmr_rctxinfo_rec_instance,
6265
14
            { "Instance Option", "lbmr.rctxinfo.rec.instance", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6266
14
        { &hf_lbmr_rctxinfo_rec_instance_type,
6267
14
            { "Type", "lbmr.rctxinfo.rec.instance.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6268
14
        { &hf_lbmr_rctxinfo_rec_instance_len,
6269
14
            { "Length", "lbmr.rctxinfo.rec.instance.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6270
14
        { &hf_lbmr_rctxinfo_rec_instance_flags,
6271
14
            { "Flags", "lbmr.rctxinfo.rec.instance.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6272
14
        { &hf_lbmr_rctxinfo_rec_instance_instance,
6273
14
            { "Instance", "lbmr.rctxinfo.rec.instance.instance", FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } },
6274
14
        { &hf_lbmr_rctxinfo_rec_odomain,
6275
14
            { "Originating Domain Option", "lbmr.rctxinfo.rec.odomain", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6276
14
        { &hf_lbmr_rctxinfo_rec_odomain_type,
6277
14
            { "Type", "lbmr.rctxinfo.rec.odomain.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6278
14
        { &hf_lbmr_rctxinfo_rec_odomain_len,
6279
14
            { "Length", "lbmr.rctxinfo.rec.odomain.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6280
14
        { &hf_lbmr_rctxinfo_rec_odomain_flags,
6281
14
            { "Flags", "lbmr.rctxinfo.rec.odomain.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6282
14
        { &hf_lbmr_rctxinfo_rec_odomain_domain_id,
6283
14
            { "Domain ID", "lbmr.rctxinfo.rec.odomain.domain_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6284
14
        { &hf_lbmr_rctxinfo_rec_name,
6285
14
            { "Name Option", "lbmr.rctxinfo.rec.name", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6286
14
        { &hf_lbmr_rctxinfo_rec_name_type,
6287
14
            { "Type", "lbmr.rctxinfo.rec.name.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6288
14
        { &hf_lbmr_rctxinfo_rec_name_len,
6289
14
            { "Length", "lbmr.rctxinfo.rec.name.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6290
14
        { &hf_lbmr_rctxinfo_rec_name_flags,
6291
14
            { "Flags", "lbmr.rctxinfo.rec.name.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6292
14
        { &hf_lbmr_rctxinfo_rec_name_name,
6293
14
            { "Name", "lbmr.rctxinfo.rec.name.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6294
14
        { &hf_lbmr_rctxinfo_rec_unknown,
6295
14
            { "Unknown Option", "lbmr.rctxinfo.rec.unknown", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6296
14
        { &hf_lbmr_rctxinfo_rec_unknown_type,
6297
14
            { "Type", "lbmr.rctxinfo.rec.unknown.type", FT_UINT8, BASE_DEC_HEX, VALS(lbmr_rctxinfo_option_type), 0x0, NULL, HFILL } },
6298
14
        { &hf_lbmr_rctxinfo_rec_unknown_len,
6299
14
            { "Length", "lbmr.rctxinfo.rec.unknown.len", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6300
14
        { &hf_lbmr_rctxinfo_rec_unknown_flags,
6301
14
            { "Flags", "lbmr.rctxinfo.rec.unknown.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6302
14
        { &hf_lbmr_rctxinfo_rec_unknown_data,
6303
14
            { "Data", "lbmr.rctxinfo.rec.unknown.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6304
14
        { &hf_qmgmt_flags,
6305
14
            { "Flags", "lbmr.qmgmt.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6306
14
        { &hf_qmgmt_flags_i_flag,
6307
14
            { "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 } },
6308
14
        { &hf_qmgmt_flags_n_flag,
6309
14
            { "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 } },
6310
14
        { &hf_qmgmt_flags_il_l_flag,
6311
14
            { "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 } },
6312
14
        { &hf_qmgmt_flags_il_k_flag,
6313
14
            { "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 } },
6314
14
        { &hf_qmgmt_pckt_type,
6315
14
            { "Packet Type", "lbmr.qmgmt.pckt_type", FT_UINT8, BASE_HEX_DEC, VALS(umq_qmgmt_packet_type), 0x0, NULL, HFILL } },
6316
14
        { &hf_qmgmt_cfgsig,
6317
14
            { "Configuration Signature", "lbmr.qmgmt.cfg_sig", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6318
14
        { &hf_qmgmt_queue_id,
6319
14
            { "Queue ID", "lbmr.qmgmt.queue_id", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6320
14
        { &hf_qmgmt_queue_ver,
6321
14
            { "Queue Version", "lbmr.qmgmt.queue_ver", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6322
14
        { &hf_qmgmt_ip,
6323
14
            { "IP Address", "lbmr.qmgmt.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6324
14
        { &hf_qmgmt_port,
6325
14
            { "Port", "lbmr.qmgmt.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6326
14
        { &hf_qmgmt_inst_idx,
6327
14
            { "Instance Index", "lbmr.qmgmt.inst_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6328
14
        { &hf_qmgmt_grp_idx,
6329
14
            { "Group Index", "lbmr.qmgmt.grp_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6330
14
        { &hf_qmgmt_pckt_type_dep16,
6331
14
            { "Packet-Type Dependent Data", "lbmr.qmgmt.pckt_type_dep16", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6332
14
        { &hf_qmgmt_il_num_insts,
6333
14
            { "Number of IL Instances", "lbmr.qmgmt.il_num_insts", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6334
14
        { &hf_qmgmt_jrej_code,
6335
14
            { "Join Rejection Code", "lbmr.qmgmt.jrej_code", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6336
14
        { &hf_qmgmt_ev_bias,
6337
14
            { "EV Bias", "lbmr.qmgmt.ev_bias", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6338
14
        { &hf_qmgmt_il,
6339
14
            { "Instance List Header", "lbmr.qmgmt.il", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6340
14
        { &hf_qmgmt_il_highest_rcr_tsp,
6341
14
            { "Highest RCR TSP", "lbmr.qmgmt.il.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6342
14
        { &hf_qmgmt_il_inst,
6343
14
            { "Instance Header", "lbmr.qmgmt.il_inst", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6344
14
        { &hf_qmgmt_il_inst_ip,
6345
14
            { "IP", "lbmr.qmgmt.il_inst.ip", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6346
14
        { &hf_qmgmt_il_inst_port,
6347
14
            { "Port", "lbmr.qmgmt.il_inst.port", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6348
14
        { &hf_qmgmt_il_inst_inst_idx,
6349
14
            { "Instance Index", "lbmr.qmgmt.il_inst.inst_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6350
14
        { &hf_qmgmt_il_inst_grp_idx,
6351
14
            { "Group Index", "lbmr.qmgmt.il_inst.grp_idx", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6352
14
        { &hf_qmgmt_il_inst_flags,
6353
14
            { "Flags", "lbmr.qmgmt.il_inst.flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } },
6354
14
        { &hf_qmgmt_il_inst_flags_m_flag,
6355
14
            { "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 } },
6356
14
        { &hf_qmgmt_il_inst_flags_q_flag,
6357
14
            { "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 } },
6358
14
        { &hf_qmgmt_il_inst_flags_p_flag,
6359
14
            { "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 } },
6360
14
        { &hf_qmgmt_ec,
6361
14
            { "Election Call Header", "lbmr.qmgmt.ec", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6362
14
        { &hf_qmgmt_ec_queue_new_ver,
6363
14
            { "Queue New Version", "lbmr.qmgmt.ec.queue_new_ver", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6364
14
        { &hf_qmgmt_ev,
6365
14
            { "Election Vote Header", "lbmr.qmgmt.ev", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6366
14
        { &hf_qmgmt_ev_highest_rcr_tsp,
6367
14
            { "Highest RCR TSP", "lbmr.qmgmt.ev.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6368
14
        { &hf_qmgmt_ev_age,
6369
14
            { "Age", "lbmr.qmgmt.ev.age", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } },
6370
14
        { &hf_qmgmt_qro,
6371
14
            { "Queue Resume Operation Header", "lbmr.qmgmt.qro", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
6372
14
        { &hf_qmgmt_qro_highest_rcr_tsp,
6373
14
            { "Highest RCR TSP", "lbmr.qmgmt.qro.highest_rcr_tsp", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
6374
14
        { &hf_qmgmt_qname,
6375
14
            { "Queue Name", "lbmr.qmgmt.qname", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }
6376
14
    };
6377
14
    static int * ett[] =
6378
14
    {
6379
14
        &ett_lbmr,
6380
14
        &ett_lbmr_hdr,
6381
14
        &ett_lbmr_opts,
6382
14
        &ett_lbmr_opt_src_id,
6383
14
        &ett_lbmr_opt_src_id_flags,
6384
14
        &ett_lbmr_opt_len,
6385
14
        &ett_lbmr_opt_src_type,
6386
14
        &ett_lbmr_opt_src_type_flags,
6387
14
        &ett_lbmr_opt_version,
6388
14
        &ett_lbmr_opt_version_flags,
6389
14
        &ett_lbmr_opt_local_domain,
6390
14
        &ett_lbmr_opt_local_domain_flags,
6391
14
        &ett_lbmr_opt_unknown,
6392
14
        &ett_lbmr_tqrs,
6393
14
        &ett_lbmr_tqr,
6394
14
        &ett_lbmr_tirs,
6395
14
        &ett_lbmr_tir,
6396
14
        &ett_lbmr_tir_tcp,
6397
14
        &ett_lbmr_tir_lbtrm,
6398
14
        &ett_lbmr_tir_lbtru,
6399
14
        &ett_lbmr_tir_lbtipc,
6400
14
        &ett_lbmr_tir_lbtrdma,
6401
14
        &ett_lbmr_tir_lbtsmx,
6402
14
        &ett_lbmr_topts,
6403
14
        &ett_lbmr_topt_len,
6404
14
        &ett_lbmr_topt_ume,
6405
14
        &ett_lbmr_topt_ume_flags,
6406
14
        &ett_lbmr_topt_ume_store,
6407
14
        &ett_lbmr_topt_ume_store_flags,
6408
14
        &ett_lbmr_topt_ume_store_group,
6409
14
        &ett_lbmr_topt_ume_store_group_flags,
6410
14
        &ett_lbmr_topt_latejoin,
6411
14
        &ett_lbmr_topt_latejoin_flags,
6412
14
        &ett_lbmr_topt_umq_rcridx,
6413
14
        &ett_lbmr_topt_umq_rcridx_flags,
6414
14
        &ett_lbmr_topt_umq_qinfo,
6415
14
        &ett_lbmr_topt_umq_qinfo_flags,
6416
14
        &ett_lbmr_topt_cost,
6417
14
        &ett_lbmr_topt_cost_flags,
6418
14
        &ett_lbmr_topt_otid,
6419
14
        &ett_lbmr_topt_otid_flags,
6420
14
        &ett_lbmr_topt_ctxinst,
6421
14
        &ett_lbmr_topt_ctxinst_flags,
6422
14
        &ett_lbmr_topt_ctxinsts,
6423
14
        &ett_lbmr_topt_ctxinsts_flags,
6424
14
        &ett_lbmr_topt_ulb,
6425
14
        &ett_lbmr_topt_ulb_flags,
6426
14
        &ett_lbmr_topt_ctxinstq,
6427
14
        &ett_lbmr_topt_ctxinstq_flags,
6428
14
        &ett_lbmr_topt_domain_id,
6429
14
        &ett_lbmr_topt_domain_id_flags,
6430
14
        &ett_lbmr_topt_exfunc,
6431
14
        &ett_lbmr_topt_exfunc_flags,
6432
14
        &ett_lbmr_topt_exfunc_functionality_flags,
6433
14
        &ett_lbmr_topt_unknown,
6434
14
        &ett_lbmr_tmb,
6435
14
        &ett_lbmr_tmrs,
6436
14
        &ett_lbmr_tmr,
6437
14
        &ett_lbmr_tmr_flags,
6438
14
        &ett_lbmr_pser_flags,
6439
14
        &ett_lbmr_pser_opts,
6440
14
        &ett_lbmr_pser_opt_len,
6441
14
        &ett_lbmr_pser_opt_ctxinst,
6442
14
        &ett_lbmr_qqrs,
6443
14
        &ett_lbmr_qirs,
6444
14
        &ett_lbmr_qir,
6445
14
        &ett_lbmr_qir_options,
6446
14
        &ett_lbmr_qir_grp_blk,
6447
14
        &ett_lbmr_qir_queue_blk,
6448
14
        &ett_lbmr_qir_grp,
6449
14
        &ett_lbmr_qir_queue,
6450
14
        &ett_lbmr_topic_res_request_flags,
6451
14
        &ett_lbmr_ctxinfo_flags,
6452
14
        &ett_lbmr_tnwg,
6453
14
        &ett_lbmr_tnwg_interest,
6454
14
        &ett_lbmr_tnwg_interest_rec,
6455
14
        &ett_lbmr_tnwg_interest_rec_flags,
6456
14
        &ett_lbmr_tnwg_ctxinfo,
6457
14
        &ett_lbmr_tnwg_ctxinfo_flags1,
6458
14
        &ett_lbmr_tnwg_trreq,
6459
14
        &ett_lbmr_tnwg_ctxinst_opt,
6460
14
        &ett_lbmr_tnwg_ctxinst_opt_flags,
6461
14
        &ett_lbmr_tnwg_address_opt,
6462
14
        &ett_lbmr_tnwg_address_opt_flags,
6463
14
        &ett_lbmr_tnwg_domain_opt,
6464
14
        &ett_lbmr_tnwg_domain_opt_flags,
6465
14
        &ett_lbmr_tnwg_name_opt,
6466
14
        &ett_lbmr_tnwg_name_opt_flags,
6467
14
        &ett_lbmr_tnwg_unknown_opt,
6468
14
        &ett_lbmr_tnwg_unknown_opt_flags,
6469
14
        &ett_lbmr_remote_domain_route_hdr,
6470
14
        &ett_lbmr_rctxinfo,
6471
14
        &ett_lbmr_rctxinfo_rec,
6472
14
        &ett_lbmr_rctxinfo_rec_flags,
6473
14
        &ett_lbmr_rctxinfo_rec_address,
6474
14
        &ett_lbmr_rctxinfo_rec_instance,
6475
14
        &ett_lbmr_rctxinfo_rec_odomain,
6476
14
        &ett_lbmr_rctxinfo_rec_name,
6477
14
        &ett_lbmr_rctxinfo_rec_unknown,
6478
14
        &ett_qmgmt_flags,
6479
14
        &ett_qmgmt_il,
6480
14
        &ett_qmgmt_il_inst,
6481
14
        &ett_qmgmt_il_inst_flags,
6482
14
        &ett_qmgmt_ec,
6483
14
        &ett_qmgmt_ev,
6484
14
        &ett_qmgmt_qro
6485
14
    };
6486
14
    static ei_register_info ei[] =
6487
14
    {
6488
14
        { &ei_lbmr_analysis_length_incorrect, { "lbmr.analysis.length_incorrect", PI_MALFORMED, PI_ERROR, "Header length incorrect", EXPFILL } },
6489
14
        { &ei_lbmr_analysis_invalid_value, { "lbmr.analysis.invalid_value", PI_UNDECODED, PI_WARN, "Invalid value", EXPFILL } },
6490
14
        { &ei_lbmr_analysis_zero_len_option, { "lbmr.analysis.zero_len_option", PI_MALFORMED, PI_ERROR, "Zero-length LBMR option", EXPFILL } },
6491
14
    };
6492
14
    module_t * lbmr_module;
6493
14
    uint32_t addr;
6494
14
    uat_t * tag_uat;
6495
14
    expert_module_t * expert_lbmr;
6496
6497
14
    proto_lbmr = proto_register_protocol("LBM Topic Resolution Protocol",
6498
14
        "LBMR", "lbmr");
6499
6500
14
    proto_register_field_array(proto_lbmr, hf, array_length(hf));
6501
14
    proto_register_subtree_array(ett, array_length(ett));
6502
14
    expert_lbmr = expert_register_protocol(proto_lbmr);
6503
14
    expert_register_field_array(expert_lbmr, ei, array_length(ei));
6504
6505
14
    lbmr_dissector_handle = register_dissector("lbmr", dissect_lbmr, proto_lbmr);
6506
6507
14
    lbmr_module = prefs_register_protocol_subtree("29West", proto_lbmr, proto_reg_handoff_lbmr);
6508
14
    prefs_register_uint_preference(lbmr_module,
6509
14
        "mc_incoming_port",
6510
14
        "Incoming multicast UDP port (default " LBMR_DEFAULT_MC_INCOMING_UDP_PORT_STRING ")",
6511
14
        "Set the UDP port for incoming multicast topic resolution (context resolver_multicast_incoming_port)",
6512
14
        10,
6513
14
        &global_lbmr_mc_incoming_udp_port);
6514
14
    ws_inet_pton4(LBMR_DEFAULT_MC_INCOMING_ADDRESS, &addr);
6515
14
    lbmr_mc_incoming_address_host = g_ntohl(addr);
6516
14
    prefs_register_string_preference(lbmr_module,
6517
14
        "mc_incoming_address",
6518
14
        "Incoming multicast address (default " LBMR_DEFAULT_MC_INCOMING_ADDRESS ")",
6519
14
        "Set the multicast address for incoming multicast topic resolution (context resolver_multicast_incoming_address)",
6520
14
        &global_lbmr_mc_incoming_address);
6521
14
    prefs_register_uint_preference(lbmr_module,
6522
14
        "mc_outgoing_port",
6523
14
        "Outgoing multicast UDP port (default " LBMR_DEFAULT_MC_OUTGOING_UDP_PORT_STRING ")",
6524
14
        "Set the UDP port for outgoing multicast topic resolution (context resolver_multicast_outgoing_port)",
6525
14
        10,
6526
14
        &global_lbmr_mc_outgoing_udp_port);
6527
14
    ws_inet_pton4(LBMR_DEFAULT_MC_OUTGOING_ADDRESS, &addr);
6528
14
    lbmr_mc_outgoing_address_host = g_ntohl(addr);
6529
14
    prefs_register_string_preference(lbmr_module,
6530
14
        "mc_outgoing_address",
6531
14
        "Outgoing multicast address (default " LBMR_DEFAULT_MC_OUTGOING_ADDRESS ")",
6532
14
        "Set the multicast address for outgoing multicast topic resolution (context resolver_multicast_outgoing_address)",
6533
14
        &global_lbmr_mc_outgoing_address);
6534
14
    prefs_register_uint_preference(lbmr_module,
6535
14
        "uc_port_low",
6536
14
        "Unicast UDP port low (default " LBMR_DEFAULT_UC_PORT_LOW_STRING ")",
6537
14
        "Set the low UDP port for unicast topic resolution (context resolver_unicast_port_low)",
6538
14
        10,
6539
14
        &global_lbmr_uc_port_low);
6540
14
    prefs_register_uint_preference(lbmr_module,
6541
14
        "uc_port_high",
6542
14
        "Unicast UDP port high (default " LBMR_DEFAULT_UC_PORT_HIGH_STRING ")",
6543
14
        "Set the high UDP port for unicast topic resolution (context resolver_unicast_port_high)",
6544
14
        10,
6545
14
        &global_lbmr_uc_port_high);
6546
14
    prefs_register_uint_preference(lbmr_module,
6547
14
        "uc_dest_port",
6548
14
        "Unicast UDP destination port (default " LBMR_DEFAULT_UC_DEST_PORT_STRING ")",
6549
14
        "Set the destination port for unicast topic resolution (context resolver_unicast_destination_port)",
6550
14
        10,
6551
14
        &global_lbmr_uc_dest_port);
6552
14
    ws_inet_pton4(LBMR_DEFAULT_UC_ADDRESS, &addr);
6553
14
    lbmr_uc_address_host = g_ntohl(addr);
6554
14
    prefs_register_string_preference(lbmr_module,
6555
14
        "uc_address",
6556
14
        "Unicast resolver address (default " LBMR_DEFAULT_UC_ADDRESS ")",
6557
14
        "Set the address of the unicast resolver daemon (context resolver_unicast_address)",
6558
14
        &global_lbmr_uc_address);
6559
14
    prefs_register_bool_preference(lbmr_module,
6560
14
        "use_lbmr_domain",
6561
14
        "Use LBMR tag table",
6562
14
        "Use table of LBMR tags to decode the packet instead of above values",
6563
14
        &global_lbmr_use_tag);
6564
14
    tag_uat = uat_new("LBMR tag definitions",
6565
14
        sizeof(lbmr_tag_entry_t),
6566
14
        "lbmr_domains",
6567
14
        true,
6568
14
        (void * *)&lbmr_tag_entry,
6569
14
        &lbmr_tag_count,
6570
14
        UAT_AFFECTS_DISSECTION,
6571
14
        NULL,
6572
14
        lbmr_tag_copy_cb,
6573
14
        lbmr_tag_update_cb,
6574
14
        lbmr_tag_free_cb,
6575
14
        NULL,
6576
14
        NULL,
6577
14
        lbmr_tag_array);
6578
14
    prefs_register_uat_preference(lbmr_module,
6579
14
        "tnw_lbmr_tags",
6580
14
        "LBMR Tags",
6581
14
        "A table to define LBMR tags",
6582
14
        tag_uat);
6583
6584
14
    lbmr_topic_advertisement_tap_handle = register_tap(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING);
6585
14
    lbmr_topic_query_tap_handle = register_tap(LBMR_TOPIC_QUERY_TAP_STRING);
6586
14
    lbmr_pattern_query_tap_handle = register_tap(LBMR_PATTERN_QUERY_TAP_STRING);
6587
14
    lbmr_queue_advertisement_tap_handle = register_tap(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING);
6588
14
    lbmr_queue_query_tap_handle = register_tap(LBMR_QUEUE_QUERY_TAP_STRING);
6589
6590
14
    stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6591
14
        "lbmr_topic_ads_topic",
6592
14
        lbmr_stat_tree_name_topic_ads_topic,
6593
14
        0,
6594
14
        lbmr_topic_ads_topic_stats_tree_packet,
6595
14
        lbmr_topic_ads_topic_stats_tree_init,
6596
14
        NULL);
6597
14
    stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6598
14
        "lbmr_topic_ads_source",
6599
14
        lbmr_stat_tree_name_topic_ads_source,
6600
14
        0,
6601
14
        lbmr_topic_ads_source_stats_tree_packet,
6602
14
        lbmr_topic_ads_source_stats_tree_init,
6603
14
        NULL);
6604
14
    stats_tree_register(LBMR_TOPIC_ADVERTISEMENT_TAP_STRING,
6605
14
        "lbmr_topic_ads_transport",
6606
14
        lbmr_stat_tree_name_topic_ads_transport,
6607
14
        0,
6608
14
        lbmr_topic_ads_transport_stats_tree_packet,
6609
14
        lbmr_topic_ads_transport_stats_tree_init,
6610
14
        NULL);
6611
14
    stats_tree_register(LBMR_TOPIC_QUERY_TAP_STRING,
6612
14
        "lbmr_topic_queries_topic",
6613
14
        lbmr_stat_tree_name_topic_queries_topic,
6614
14
        0,
6615
14
        lbmr_topic_queries_topic_stats_tree_packet,
6616
14
        lbmr_topic_queries_topic_stats_tree_init,
6617
14
        NULL);
6618
14
    stats_tree_register(LBMR_TOPIC_QUERY_TAP_STRING,
6619
14
        "lbmr_topic_queries_receiver",
6620
14
        lbmr_stat_tree_name_topic_queries_receiver,
6621
14
        0,
6622
14
        lbmr_topic_queries_receiver_stats_tree_packet,
6623
14
        lbmr_topic_queries_receiver_stats_tree_init,
6624
14
        NULL);
6625
14
    stats_tree_register(LBMR_PATTERN_QUERY_TAP_STRING,
6626
14
        "lbmr_topic_queries_pattern",
6627
14
        lbmr_stat_tree_name_topic_queries_pattern,
6628
14
        0,
6629
14
        lbmr_topic_queries_pattern_stats_tree_packet,
6630
14
        lbmr_topic_queries_pattern_stats_tree_init,
6631
14
        NULL);
6632
14
    stats_tree_register(LBMR_PATTERN_QUERY_TAP_STRING,
6633
14
        "lbmr_topic_queries_pattern_receiver",
6634
14
        lbmr_stat_tree_name_topic_queries_pattern_receiver,
6635
14
        0,
6636
14
        lbmr_topic_queries_pattern_receiver_stats_tree_packet,
6637
14
        lbmr_topic_queries_pattern_receiver_stats_tree_init,
6638
14
        NULL);
6639
14
    stats_tree_register(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING,
6640
14
        "lbmr_queue_ads_queue",
6641
14
        lbmr_stat_tree_name_queue_ads_queue,
6642
14
        0,
6643
14
        lbmr_queue_ads_queue_stats_tree_packet,
6644
14
        lbmr_queue_ads_queue_stats_tree_init,
6645
14
        NULL);
6646
14
    stats_tree_register(LBMR_QUEUE_ADVERTISEMENT_TAP_STRING,
6647
14
        "lbmr_queue_ads_source",
6648
14
        lbmr_stat_tree_name_queue_ads_source,
6649
14
        0,
6650
14
        lbmr_queue_ads_source_stats_tree_packet,
6651
14
        lbmr_queue_ads_source_stats_tree_init,
6652
14
        NULL);
6653
14
    stats_tree_register(LBMR_QUEUE_QUERY_TAP_STRING,
6654
14
        "lbmr_queue_queries_queue",
6655
14
        lbmr_stat_tree_name_queue_queries_queue,
6656
14
        0,
6657
14
        lbmr_queue_queries_queue_stats_tree_packet,
6658
14
        lbmr_queue_queries_queue_stats_tree_init,
6659
14
        NULL);
6660
14
    stats_tree_register(LBMR_QUEUE_QUERY_TAP_STRING,
6661
14
        "lbmr_queue_queries_receiver",
6662
14
        lbmr_stat_tree_name_queue_queries_receiver,
6663
14
        0,
6664
14
        lbmr_queue_queries_receiver_stats_tree_packet,
6665
14
        lbmr_queue_queries_receiver_stats_tree_init,
6666
14
        NULL);
6667
6668
14
    lbm_topic_init();
6669
14
    lbtsmx_transport_init();
6670
14
    lbtipc_transport_init();
6671
14
    lbtrdma_transport_init();
6672
14
}
6673
6674
/* The registration hand-off routine */
6675
void proto_reg_handoff_lbmr(void)
6676
14
{
6677
14
    static bool already_registered = false;
6678
14
    uint32_t addr;
6679
6680
14
    if (!already_registered)
6681
14
    {
6682
14
        dissector_add_for_decode_as_with_preference("udp.port", lbmr_dissector_handle);
6683
14
        heur_dissector_add("udp", test_lbmr_packet, "LBM Topic Resolution over UDP", "lbmr_udp", proto_lbmr, HEURISTIC_ENABLE);
6684
14
    }
6685
6686
14
    lbmr_mc_incoming_udp_port = global_lbmr_mc_incoming_udp_port;
6687
14
    lbmr_mc_outgoing_udp_port = global_lbmr_mc_outgoing_udp_port;
6688
14
    ws_inet_pton4(global_lbmr_mc_incoming_address, &addr);
6689
14
    lbmr_mc_incoming_address_host = g_ntohl(addr);
6690
6691
14
    ws_inet_pton4(global_lbmr_mc_outgoing_address, &addr);
6692
14
    lbmr_mc_outgoing_address_host = g_ntohl(addr);
6693
6694
    /* Make sure the low port is <= the high port. If not, don't change them. */
6695
14
    if (global_lbmr_uc_port_low <= global_lbmr_uc_port_high)
6696
14
    {
6697
14
        lbmr_uc_port_high = global_lbmr_uc_port_high;
6698
14
        lbmr_uc_port_low = global_lbmr_uc_port_low;
6699
14
    }
6700
14
    lbmr_uc_dest_port = global_lbmr_uc_dest_port;
6701
14
    ws_inet_pton4(global_lbmr_uc_address, &addr);
6702
14
    lbmr_uc_address_host = g_ntohl(addr);
6703
14
    lbmr_use_tag = global_lbmr_use_tag;
6704
6705
    already_registered = true;
6706
14
}
6707
6708
/*
6709
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
6710
 *
6711
 * Local variables:
6712
 * c-basic-offset: 4
6713
 * tab-width: 8
6714
 * indent-tabs-mode: nil
6715
 * End:
6716
 *
6717
 * vi: set shiftwidth=4 tabstop=8 expandtab:
6718
 * :indentSize=4:tabSize=8:noTabs=true:
6719
 */