Coverage Report

Created: 2025-02-15 06:25

/src/wireshark/epan/dissectors/packet-zebra.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-zebra.c
2
 * Routines for zebra packet disassembly
3
 *
4
 * Jochen Friedrich <jochen@scram.de>
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
/*
14
 * The Zebra Protocol is the protocol used between the Zebra routing daemon and
15
 * other protocol daemons (ones for BGP, OSPF, etc.) within the Zebra, Quagga,
16
 * and FRRouting open-source routing suites.
17
 * Zebra itself (https://www.gnu.org/software/zebra) is discontinued,
18
 * and its successor is Quagga (http://www.nongnu.org/quagga).
19
 * The successor to Quagga is FRRouting (https://frrouting.org/).
20
 *
21
 * All three use the "Zebra Protocol" (or ZAPI), but starting with Quagga v0.99
22
 * there are different versions, with different header formats and more
23
 * commands/types.
24
 *
25
 * http://www.nongnu.org/quagga/docs/docs-info.html#Zebra-Protocol
26
 * http://docs.frrouting.org/projects/dev-guide/en/latest/zebra.html
27
 *
28
 * Version 0 (implicit): Zebra, Quagga up to version 0.98
29
 * Version 1: Quagga 0.99.3 through 0.99.20
30
 * Version 2: Quagga 0.99.21 though 0.99.23
31
 * Version 3: Quagga 0.99.24 and later
32
 * Version 4: FRRouting 2.0 through 3.0.3
33
 * Version 5: FRRouting 4.0 though 5.0.1
34
 * Version 6: FRRouting 6.0 and later
35
 *
36
 * FRRouting versions 4 and 5 have partially incompatible commands.
37
 * This dissector uses the commands of FRRRouting version 5.
38
 * FRRouting versions 6 and 7 have partially incompatible commands.
39
 * This dissector uses the commands of FRRRouting version 7.
40
 */
41
42
#include "config.h"
43
44
#include <wsutil/array.h>
45
#include <epan/packet.h>
46
47
/*  Function declarations */
48
void proto_reg_handoff_zebra(void);
49
void proto_register_zebra(void);
50
51
static dissector_handle_t zebra_handle;
52
53
static int proto_zebra;
54
static int hf_zebra_len;
55
static int hf_zebra_command;
56
static int hf_zebra_request;
57
static int hf_zebra_interface;
58
static int hf_zebra_index;
59
static int hf_zebra_indexnum;
60
static int hf_zebra_type_v0;
61
static int hf_zebra_type_v1;
62
static int hf_zebra_intflags;
63
static int hf_zebra_rtflags;
64
static int hf_zebra_distance;
65
static int hf_zebra_metric;
66
static int hf_zebra_mtu;
67
static int hf_zebra_mtu6;
68
static int hf_zebra_bandwidth;
69
static int hf_zebra_family;
70
static int hf_zebra_flags;
71
static int hf_zebra_message;
72
static int hf_zebra_route_safi;
73
static int hf_zebra_msg_nexthop;
74
static int hf_zebra_msg_index;
75
static int hf_zebra_msg_distance;
76
static int hf_zebra_msg_metric;
77
static int hf_zebra_nexthopnum;
78
static int hf_zebra_nexthop4;
79
static int hf_zebra_nexthop6;
80
static int hf_zebra_dest4;
81
static int hf_zebra_dest6;
82
static int hf_zebra_prefixlen;
83
static int hf_zebra_prefix4;
84
static int hf_zebra_prefix6;
85
static int hf_zebra_version;
86
static int hf_zebra_marker;
87
static int hf_zebra_intstatus;
88
static int hf_zebra_routeridaddress;
89
static int hf_zebra_routeridmask;
90
static int hf_zebra_mac;
91
static int hf_zebra_redist_default;
92
static int hf_zebra_vrfid;
93
static int hf_zebra_routeridfamily;
94
static int hf_zebra_nexthoptype;
95
static int hf_zebra_msg_mtu;
96
static int hf_zebra_msg_tag;
97
static int hf_zebra_tag;
98
static int hf_zebra_maclen;
99
static int hf_zebra_haslinkparam;
100
/* FRRouting, Zebra API v4, v5 and v6 */
101
static int hf_zebra_command_v4;
102
static int hf_zebra_command_v5;
103
static int hf_zebra_command_v6;
104
static int hf_zebra_type_v4;
105
static int hf_zebra_type_v5;
106
static int hf_zebra_ptmenable;
107
static int hf_zebra_ptmstatus;
108
static int hf_zebra_instance;
109
static int hf_zebra_rtflags_u32;
110
static int hf_zebra_speed;
111
static int hf_zebra_lltype;
112
static int hf_zebra_message4;
113
static int hf_zebra_message5;
114
static int hf_zebra_route_safi_u8;
115
static int hf_zebra_rmac;
116
static int hf_zebra_msg4_tag;
117
static int hf_zebra_msg4_mtu;
118
static int hf_zebra_msg4_srcpfx;
119
static int hf_zebra_msg5_distance;
120
static int hf_zebra_msg5_metric;
121
static int hf_zebra_msg5_tag;
122
static int hf_zebra_msg5_mtu;
123
static int hf_zebra_msg5_srcpfx;
124
static int hf_zebra_msg_label;
125
static int hf_zebra_msg_tableid;
126
static int hf_zebra_nexthopnum_u16;
127
static int hf_zebra_nexthoptype_frr;
128
static int hf_zebra_bhtype;
129
static int hf_zebra_srcprefixlen;
130
static int hf_zebra_srcprefix4;
131
static int hf_zebra_srcprefix6;
132
static int hf_zebra_tableid;
133
static int hf_zebra_afi;
134
static int hf_zebra_pid;
135
static int hf_zebra_vrf_table_id;
136
static int hf_zebra_vrf_netns_name;
137
static int hf_zebra_vrf_name;
138
static int hf_zebra_proto;
139
static int hf_zebra_label_chunk_keep;
140
static int hf_zebra_label_chunk_size;
141
static int hf_zebra_label_chunk_start;
142
static int hf_zebra_label_chunk_end;
143
static int hf_zebra_mpls_enabled;
144
static int hf_zebra_multipath_num;
145
static int hf_zebra_labelnum;
146
static int hf_zebra_label;
147
static int hf_zebra_receive_notify;
148
149
static int ett_zebra;
150
static int ett_zebra_request;
151
static int ett_message;
152
153
14
#define TCP_PORT_ZEBRA      2600 /* Not IANA registered */
154
155
/* Zebra message types. */
156
1
#define ZEBRA_INTERFACE_ADD                1
157
2
#define ZEBRA_INTERFACE_DELETE             2
158
3
#define ZEBRA_INTERFACE_ADDRESS_ADD        3
159
4
#define ZEBRA_INTERFACE_ADDRESS_DELETE     4
160
3
#define ZEBRA_INTERFACE_UP                 5
161
5
#define ZEBRA_INTERFACE_DOWN               6
162
30
#define ZEBRA_IPV4_ROUTE_ADD               7
163
30
#define ZEBRA_IPV4_ROUTE_DELETE            8
164
1
#define ZEBRA_IPV6_ROUTE_ADD               9
165
1
#define ZEBRA_IPV6_ROUTE_DELETE           10
166
0
#define ZEBRA_REDISTRIBUTE_ADD            11
167
1
#define ZEBRA_REDISTRIBUTE_DELETE         12
168
1
#define ZEBRA_REDISTRIBUTE_DEFAULT_ADD    13
169
0
#define ZEBRA_REDISTRIBUTE_DEFAULT_DELETE 14
170
0
#define ZEBRA_IPV4_NEXTHOP_LOOKUP         15
171
1
#define ZEBRA_IPV6_NEXTHOP_LOOKUP         16
172
0
#define ZEBRA_IPV4_IMPORT_LOOKUP          17
173
0
#define ZEBRA_IPV6_IMPORT_LOOKUP          18
174
#define ZEBRA_INTERFACE_RENAME            19
175
0
#define ZEBRA_ROUTER_ID_ADD               20
176
0
#define ZEBRA_ROUTER_ID_DELETE            21
177
0
#define ZEBRA_ROUTER_ID_UPDATE            22
178
1
#define ZEBRA_HELLO                       23
179
0
#define ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB    24
180
0
#define ZEBRA_VRF_UNREGISTER              25
181
0
#define ZEBRA_INTERFACE_LINK_PARAMS       26
182
0
#define ZEBRA_NEXTHOP_REGISTER            27
183
0
#define ZEBRA_NEXTHOP_UNREGISTER          28
184
0
#define ZEBRA_NEXTHOP_UPDATE              29
185
#define ZEBRA_MESSAGE_MAX                 30
186
187
188
static const value_string messages[] = {
189
  { ZEBRA_INTERFACE_ADD,      "Add Interface" },
190
  { ZEBRA_INTERFACE_DELETE,   "Delete Interface" },
191
  { ZEBRA_INTERFACE_ADDRESS_ADD,    "Add Interface Address" },
192
  { ZEBRA_INTERFACE_ADDRESS_DELETE, "Delete Interface Address" },
193
  { ZEBRA_INTERFACE_UP,     "Interface Up" },
194
  { ZEBRA_INTERFACE_DOWN,     "Interface Down" },
195
  { ZEBRA_IPV4_ROUTE_ADD,     "Add IPv4 Route" },
196
  { ZEBRA_IPV4_ROUTE_DELETE,    "Delete IPv4 Route" },
197
  { ZEBRA_IPV6_ROUTE_ADD,     "Add IPv6 Route" },
198
  { ZEBRA_IPV6_ROUTE_DELETE,    "Delete IPv6 Route" },
199
  { ZEBRA_REDISTRIBUTE_ADD,   "Add Redistribute" },
200
  { ZEBRA_REDISTRIBUTE_DELETE,    "Delete Redistribute" },
201
  { ZEBRA_REDISTRIBUTE_DEFAULT_ADD, "Add Default Redistribute" },
202
  { ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,  "Delete Default Redistribute" },
203
  { ZEBRA_IPV4_NEXTHOP_LOOKUP,    "IPv4 Nexthop Lookup" },
204
  { ZEBRA_IPV6_NEXTHOP_LOOKUP,    "IPv6 Nexthop Lookup" },
205
  { ZEBRA_IPV4_IMPORT_LOOKUP,   "IPv4 Import Lookup" },
206
  { ZEBRA_IPV6_IMPORT_LOOKUP,   "IPv6 Import Lookup" },
207
  { ZEBRA_INTERFACE_RENAME,   "Rename Interface" },
208
  { ZEBRA_ROUTER_ID_ADD,      "Router ID Add" },
209
  { ZEBRA_ROUTER_ID_DELETE,   "Router ID Delete" },
210
  { ZEBRA_ROUTER_ID_UPDATE,   "Router ID Update" },
211
  { ZEBRA_HELLO,        "Hello" },
212
  { ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB, "IPv4 Nexthop Lookup Multicast RIB" },
213
  { ZEBRA_VRF_UNREGISTER,     "VRF Unregister" },
214
  { ZEBRA_INTERFACE_LINK_PARAMS,    "Interface Link Parameters" },
215
  { ZEBRA_NEXTHOP_REGISTER,   "Nexthop Register" },
216
  { ZEBRA_NEXTHOP_UNREGISTER,   "Nexthop Unregister" },
217
  { ZEBRA_NEXTHOP_UPDATE,     "Nexthop Update" },
218
  { 0,          NULL },
219
};
220
221
/* FRRouting ZAPI v4 message types. */
222
enum {
223
  FRR_ZAPI4_INTERFACE_ADD,
224
  FRR_ZAPI4_INTERFACE_DELETE,
225
  FRR_ZAPI4_INTERFACE_ADDRESS_ADD,
226
  FRR_ZAPI4_INTERFACE_ADDRESS_DELETE,
227
  FRR_ZAPI4_INTERFACE_UP,
228
  FRR_ZAPI4_INTERFACE_DOWN,
229
  FRR_ZAPI4_IPV4_ROUTE_ADD,
230
  FRR_ZAPI4_IPV4_ROUTE_DELETE,
231
  FRR_ZAPI4_IPV6_ROUTE_ADD,
232
  FRR_ZAPI4_IPV6_ROUTE_DELETE,
233
  FRR_ZAPI4_REDISTRIBUTE_ADD,
234
  FRR_ZAPI4_REDISTRIBUTE_DELETE,
235
  FRR_ZAPI4_REDISTRIBUTE_DEFAULT_ADD,
236
  FRR_ZAPI4_REDISTRIBUTE_DEFAULT_DELETE,
237
  FRR_ZAPI4_ROUTER_ID_ADD,
238
  FRR_ZAPI4_ROUTER_ID_DELETE,
239
  FRR_ZAPI4_ROUTER_ID_UPDATE,
240
  FRR_ZAPI4_HELLO,
241
  FRR_ZAPI4_NEXTHOP_REGISTER,
242
  FRR_ZAPI4_NEXTHOP_UNREGISTER,
243
  FRR_ZAPI4_NEXTHOP_UPDATE,
244
  FRR_ZAPI4_INTERFACE_NBR_ADDRESS_ADD,
245
  FRR_ZAPI4_INTERFACE_NBR_ADDRESS_DELETE,
246
  FRR_ZAPI4_INTERFACE_BFD_DEST_UPDATE,
247
  FRR_ZAPI4_IMPORT_ROUTE_REGISTER,
248
  FRR_ZAPI4_IMPORT_ROUTE_UNREGISTER,
249
  FRR_ZAPI4_IMPORT_CHECK_UPDATE,
250
  FRR_ZAPI4_IPV4_ROUTE_IPV6_NEXTHOP_ADD,
251
  FRR_ZAPI4_BFD_DEST_REGISTER,
252
  FRR_ZAPI4_BFD_DEST_DEREGISTER,
253
  FRR_ZAPI4_BFD_DEST_UPDATE,
254
  FRR_ZAPI4_BFD_DEST_REPLAY,
255
  FRR_ZAPI4_REDISTRIBUTE_IPV4_ADD,
256
  FRR_ZAPI4_REDISTRIBUTE_IPV4_DEL,
257
  FRR_ZAPI4_REDISTRIBUTE_IPV6_ADD,
258
  FRR_ZAPI4_REDISTRIBUTE_IPV6_DEL,
259
  FRR_ZAPI4_VRF_UNREGISTER,
260
  FRR_ZAPI4_VRF_ADD,
261
  FRR_ZAPI4_VRF_DELETE,
262
  FRR_ZAPI4_INTERFACE_VRF_UPDATE,
263
  FRR_ZAPI4_BFD_CLIENT_REGISTER,
264
  FRR_ZAPI4_INTERFACE_ENABLE_RADV,
265
  FRR_ZAPI4_INTERFACE_DISABLE_RADV,
266
  FRR_ZAPI4_IPV4_NEXTHOP_LOOKUP_MRIB,
267
  FRR_ZAPI4_INTERFACE_LINK_PARAMS,
268
  FRR_ZAPI4_MPLS_LABELS_ADD,
269
  FRR_ZAPI4_MPLS_LABELS_DELETE,
270
  FRR_ZAPI4_IPV4_NEXTHOP_ADD,
271
  FRR_ZAPI4_IPV4_NEXTHOP_DELETE,
272
  FRR_ZAPI4_IPV6_NEXTHOP_ADD,
273
  FRR_ZAPI4_IPV6_NEXTHOP_DELETE,
274
  FRR_ZAPI4_IPMR_ROUTE_STATS,
275
  FRR_ZAPI4_LABEL_MANAGER_CONNECT,
276
  FRR_ZAPI4_GET_LABEL_CHUNK,
277
  FRR_ZAPI4_RELEASE_LABEL_CHUNK,
278
  FRR_ZAPI4_PW_ADD,
279
  FRR_ZAPI4_PW_DELETE,
280
  FRR_ZAPI4_PW_SET,
281
  FRR_ZAPI4_PW_UNSET,
282
  FRR_ZAPI4_PW_STATUS_UPDATE,
283
};
284
285
static const value_string frr_zapi4_messages[] = {
286
  { FRR_ZAPI4_INTERFACE_ADD,    "Add Interface" },
287
  { FRR_ZAPI4_INTERFACE_DELETE,   "Delete Interface" },
288
  { FRR_ZAPI4_INTERFACE_ADDRESS_ADD,  "Add Interface Address" },
289
  { FRR_ZAPI4_INTERFACE_ADDRESS_DELETE, "Delete Interface Address" },
290
  { FRR_ZAPI4_INTERFACE_UP,   "Interface Up" },
291
  { FRR_ZAPI4_INTERFACE_DOWN,   "Interface Down" },
292
  { FRR_ZAPI4_IPV4_ROUTE_ADD,   "Add IPv4 Route" },
293
  { FRR_ZAPI4_IPV4_ROUTE_DELETE,    "Delete IPv4 Route" },
294
  { FRR_ZAPI4_IPV6_ROUTE_ADD,   "Add IPv6 Route" },
295
  { FRR_ZAPI4_IPV6_ROUTE_DELETE,    "Delete IPv6 Route" },
296
  { FRR_ZAPI4_REDISTRIBUTE_ADD,   "Add Redistribute" },
297
  { FRR_ZAPI4_REDISTRIBUTE_DELETE,  "Delete Redistribute" },
298
  { FRR_ZAPI4_REDISTRIBUTE_DEFAULT_ADD, "Add Default Redistribute" },
299
  { FRR_ZAPI4_REDISTRIBUTE_DEFAULT_DELETE,"Delete Default Redistribute" },
300
  { FRR_ZAPI4_ROUTER_ID_ADD,    "Router ID Add" },
301
  { FRR_ZAPI4_ROUTER_ID_DELETE,   "Router ID Delete" },
302
  { FRR_ZAPI4_ROUTER_ID_UPDATE,   "Router ID Update" },
303
  { FRR_ZAPI4_HELLO,      "Hello" },
304
  { FRR_ZAPI4_NEXTHOP_REGISTER,   "Nexthop Register" },
305
  { FRR_ZAPI4_NEXTHOP_UNREGISTER,   "Nexthop Unregister" },
306
  { FRR_ZAPI4_NEXTHOP_UPDATE,   "Nexthop Update" },
307
  { FRR_ZAPI4_INTERFACE_NBR_ADDRESS_ADD,  "Interface Neighbor Address Add" },
308
  { FRR_ZAPI4_INTERFACE_NBR_ADDRESS_DELETE, "Interface Neighbor Address Delete" },
309
  { FRR_ZAPI4_INTERFACE_BFD_DEST_UPDATE,  "Interface BFD Destination Update" },
310
  { FRR_ZAPI4_IMPORT_ROUTE_REGISTER,  "Import Route Register" },
311
  { FRR_ZAPI4_IMPORT_ROUTE_UNREGISTER,  "Import Route Unregister" },
312
  { FRR_ZAPI4_IMPORT_CHECK_UPDATE,  "Import Check Update" },
313
  { FRR_ZAPI4_IPV4_ROUTE_IPV6_NEXTHOP_ADD,"Add IPv6 nexthop for IPv4 Route" },
314
  { FRR_ZAPI4_BFD_DEST_REGISTER,    "BFD Destination Register" },
315
  { FRR_ZAPI4_BFD_DEST_DEREGISTER,  "BFD Destination Deregister" },
316
  { FRR_ZAPI4_BFD_DEST_UPDATE,    "BFD Destination Update" },
317
  { FRR_ZAPI4_BFD_DEST_REPLAY,    "BFD Destination Replay" },
318
  { FRR_ZAPI4_REDISTRIBUTE_IPV4_ADD,  "Add Redistribute IPv4 Route" },
319
  { FRR_ZAPI4_REDISTRIBUTE_IPV4_DEL,  "Delete Redistribute IPv4 Route" },
320
  { FRR_ZAPI4_REDISTRIBUTE_IPV6_ADD,  "Add Redistribute IPv6 Route" },
321
  { FRR_ZAPI4_REDISTRIBUTE_IPV6_DEL,  "Delete Redistribute IPv6 Route" },
322
  { FRR_ZAPI4_VRF_UNREGISTER,   "VRF Unregister" },
323
  { FRR_ZAPI4_VRF_ADD,      "VRF Add" },
324
  { FRR_ZAPI4_VRF_DELETE,     "VRF Delete" },
325
  { FRR_ZAPI4_INTERFACE_VRF_UPDATE, "Interface VRF Update" },
326
  { FRR_ZAPI4_BFD_CLIENT_REGISTER,  "BFD Client Register" },
327
  { FRR_ZAPI4_INTERFACE_ENABLE_RADV,  "Interface Enable Router Advertisement" },
328
  { FRR_ZAPI4_INTERFACE_DISABLE_RADV, "Interface Disable Router Advertisement" },
329
  { FRR_ZAPI4_IPV4_NEXTHOP_LOOKUP_MRIB, "IPv4 Nexthop Lookup Multicast RIB" },
330
  { FRR_ZAPI4_INTERFACE_LINK_PARAMS,  "Interface Link Parameters" },
331
  { FRR_ZAPI4_MPLS_LABELS_ADD,    "MPLS Labels Add" },
332
  { FRR_ZAPI4_MPLS_LABELS_DELETE,   "MPLS Labels Delete" },
333
  { FRR_ZAPI4_IPV4_NEXTHOP_ADD,   "Add IPv4 Nexthop" },
334
  { FRR_ZAPI4_IPV4_NEXTHOP_DELETE,  "Delete IPv4 Nexthop" },
335
  { FRR_ZAPI4_IPV6_NEXTHOP_ADD,   "Add IPv6 Nexthop" },
336
  { FRR_ZAPI4_IPV6_NEXTHOP_DELETE,  "Delete IPv6 Nexthop" },
337
  { FRR_ZAPI4_IPMR_ROUTE_STATS,   "IPMR Route Statics" },
338
  { FRR_ZAPI4_LABEL_MANAGER_CONNECT,  "Label Manager Connect" },
339
  { FRR_ZAPI4_GET_LABEL_CHUNK,    "Get Label Chunk" },
340
  { FRR_ZAPI4_RELEASE_LABEL_CHUNK,  "Release Label Chunk" },
341
  { FRR_ZAPI4_PW_ADD,     "PseudoWire Add" },
342
  { FRR_ZAPI4_PW_DELETE,      "PseudoWire Delete" },
343
  { FRR_ZAPI4_PW_SET,     "PseudoWire Set" },
344
  { FRR_ZAPI4_PW_UNSET,     "PseudoWire Unset" },
345
  { FRR_ZAPI4_PW_STATUS_UPDATE,   "PseudoWire Status Update" },
346
  { 0,          NULL },
347
};
348
349
enum {
350
  FRR_ZAPI5_INTERFACE_ADD,
351
  FRR_ZAPI5_INTERFACE_DELETE,
352
  FRR_ZAPI5_INTERFACE_ADDRESS_ADD,
353
  FRR_ZAPI5_INTERFACE_ADDRESS_DELETE,
354
  FRR_ZAPI5_INTERFACE_UP,
355
  FRR_ZAPI5_INTERFACE_DOWN,
356
  FRR_ZAPI5_INTERFACE_SET_MASTER,
357
  FRR_ZAPI5_ROUTE_ADD,
358
  FRR_ZAPI5_ROUTE_DELETE,
359
  FRR_ZAPI5_ROUTE_NOTIFY_OWNER,
360
  FRR_ZAPI5_IPV4_ROUTE_ADD,
361
  FRR_ZAPI5_IPV4_ROUTE_DELETE,
362
  FRR_ZAPI5_IPV6_ROUTE_ADD,
363
  FRR_ZAPI5_IPV6_ROUTE_DELETE,
364
  FRR_ZAPI5_REDISTRIBUTE_ADD,
365
  FRR_ZAPI5_REDISTRIBUTE_DELETE,
366
  FRR_ZAPI5_REDISTRIBUTE_DEFAULT_ADD,
367
  FRR_ZAPI5_REDISTRIBUTE_DEFAULT_DELETE,
368
  FRR_ZAPI5_ROUTER_ID_ADD,
369
  FRR_ZAPI5_ROUTER_ID_DELETE,
370
  FRR_ZAPI5_ROUTER_ID_UPDATE,
371
  FRR_ZAPI5_HELLO,
372
  FRR_ZAPI5_CAPABILITIES,
373
  FRR_ZAPI5_NEXTHOP_REGISTER,
374
  FRR_ZAPI5_NEXTHOP_UNREGISTER,
375
  FRR_ZAPI5_NEXTHOP_UPDATE,
376
  FRR_ZAPI5_INTERFACE_NBR_ADDRESS_ADD,
377
  FRR_ZAPI5_INTERFACE_NBR_ADDRESS_DELETE,
378
  FRR_ZAPI5_INTERFACE_BFD_DEST_UPDATE,
379
  FRR_ZAPI5_IMPORT_ROUTE_REGISTER,
380
  FRR_ZAPI5_IMPORT_ROUTE_UNREGISTER,
381
  FRR_ZAPI5_IMPORT_CHECK_UPDATE,
382
  FRR_ZAPI5_IPV4_ROUTE_IPV6_NEXTHOP_ADD,
383
  FRR_ZAPI5_BFD_DEST_REGISTER,
384
  FRR_ZAPI5_BFD_DEST_DEREGISTER,
385
  FRR_ZAPI5_BFD_DEST_UPDATE,
386
  FRR_ZAPI5_BFD_DEST_REPLAY,
387
  FRR_ZAPI5_REDISTRIBUTE_ROUTE_ADD,
388
  FRR_ZAPI5_REDISTRIBUTE_ROUTE_DEL,
389
  FRR_ZAPI5_VRF_UNREGISTER,
390
  FRR_ZAPI5_VRF_ADD,
391
  FRR_ZAPI5_VRF_DELETE,
392
  FRR_ZAPI5_VRF_LABEL,
393
  FRR_ZAPI5_INTERFACE_VRF_UPDATE,
394
  FRR_ZAPI5_BFD_CLIENT_REGISTER,
395
  FRR_ZAPI5_INTERFACE_ENABLE_RADV,
396
  FRR_ZAPI5_INTERFACE_DISABLE_RADV,
397
  FRR_ZAPI5_IPV4_NEXTHOP_LOOKUP_MRIB,
398
  FRR_ZAPI5_INTERFACE_LINK_PARAMS,
399
  FRR_ZAPI5_MPLS_LABELS_ADD,
400
  FRR_ZAPI5_MPLS_LABELS_DELETE,
401
  FRR_ZAPI5_IPMR_ROUTE_STATS,
402
  FRR_ZAPI5_LABEL_MANAGER_CONNECT,
403
  FRR_ZAPI5_LABEL_MANAGER_CONNECT_ASYNC,
404
  FRR_ZAPI5_GET_LABEL_CHUNK,
405
  FRR_ZAPI5_RELEASE_LABEL_CHUNK,
406
  FRR_ZAPI5_FEC_REGISTER,
407
  FRR_ZAPI5_FEC_UNREGISTER,
408
  FRR_ZAPI5_FEC_UPDATE,
409
  FRR_ZAPI5_ADVERTISE_DEFAULT_GW,
410
  FRR_ZAPI5_ADVERTISE_SUBNET,
411
  FRR_ZAPI5_ADVERTISE_ALL_VNI,
412
  FRR_ZAPI5_VNI_ADD,
413
  FRR_ZAPI5_VNI_DEL,
414
  FRR_ZAPI5_L3VNI_ADD,
415
  FRR_ZAPI5_L3VNI_DEL,
416
  FRR_ZAPI5_REMOTE_VTEP_ADD,
417
  FRR_ZAPI5_REMOTE_VTEP_DEL,
418
  FRR_ZAPI5_MACIP_ADD,
419
  FRR_ZAPI5_MACIP_DEL,
420
  FRR_ZAPI5_IP_PREFIX_ROUTE_ADD,
421
  FRR_ZAPI5_IP_PREFIX_ROUTE_DEL,
422
  FRR_ZAPI5_REMOTE_MACIP_ADD,
423
  FRR_ZAPI5_REMOTE_MACIP_DEL,
424
  FRR_ZAPI5_PW_ADD,
425
  FRR_ZAPI5_PW_DELETE,
426
  FRR_ZAPI5_PW_SET,
427
  FRR_ZAPI5_PW_UNSET,
428
  FRR_ZAPI5_PW_STATUS_UPDATE,
429
  FRR_ZAPI5_RULE_ADD,
430
  FRR_ZAPI5_RULE_DELETE,
431
  FRR_ZAPI5_RULE_NOTIFY_OWNER,
432
  FRR_ZAPI5_TABLE_MANAGER_CONNECT,
433
  FRR_ZAPI5_GET_TABLE_CHUNK,
434
  FRR_ZAPI5_RELEASE_TABLE_CHUNK,
435
  FRR_ZAPI5_IPSET_CREATE,
436
  FRR_ZAPI5_IPSET_DESTROY,
437
  FRR_ZAPI5_IPSET_ENTRY_ADD,
438
  FRR_ZAPI5_IPSET_ENTRY_DELETE,
439
  FRR_ZAPI5_IPSET_NOTIFY_OWNER,
440
  FRR_ZAPI5_IPSET_ENTRY_NOTIFY_OWNER,
441
  FRR_ZAPI5_IPTABLE_ADD,
442
  FRR_ZAPI5_IPTABLE_DELETE,
443
  FRR_ZAPI5_IPTABLE_NOTIFY_OWNER,
444
};
445
446
static const value_string frr_zapi5_messages[] = {
447
  { FRR_ZAPI5_INTERFACE_ADD,    "Add Interface" },
448
  { FRR_ZAPI5_INTERFACE_DELETE,   "Delete Interface" },
449
  { FRR_ZAPI5_INTERFACE_ADDRESS_ADD,  "Add Interface Address" },
450
  { FRR_ZAPI5_INTERFACE_ADDRESS_DELETE, "Delete Interface Address" },
451
  { FRR_ZAPI5_INTERFACE_UP,   "Interface Up" },
452
  { FRR_ZAPI5_INTERFACE_DOWN,   "Interface Down" },
453
  { FRR_ZAPI5_ROUTE_ADD,      "Add Route" },
454
  { FRR_ZAPI5_ROUTE_DELETE,   "Delete Route" },
455
  { FRR_ZAPI5_IPV4_ROUTE_ADD,   "Add IPv4 Route" },
456
  { FRR_ZAPI5_IPV4_ROUTE_DELETE,    "Delete IPv4 Route" },
457
  { FRR_ZAPI5_IPV6_ROUTE_ADD,   "Add IPv6 Route" },
458
  { FRR_ZAPI5_IPV6_ROUTE_DELETE,    "Delete IPv6 Route" },
459
  { FRR_ZAPI5_REDISTRIBUTE_ADD,   "Add Redistribute" },
460
  { FRR_ZAPI5_REDISTRIBUTE_DELETE,  "Delete Redistribute" },
461
  { FRR_ZAPI5_REDISTRIBUTE_DEFAULT_ADD, "Add Default Redistribute" },
462
  { FRR_ZAPI5_REDISTRIBUTE_DEFAULT_DELETE,"Delete Default Redistribute" },
463
  { FRR_ZAPI5_ROUTER_ID_ADD,    "Router ID Add" },
464
  { FRR_ZAPI5_ROUTER_ID_DELETE,   "Router ID Delete" },
465
  { FRR_ZAPI5_ROUTER_ID_UPDATE,   "Router ID Update" },
466
  { FRR_ZAPI5_HELLO,      "Hello" },
467
  { FRR_ZAPI5_CAPABILITIES,   "Capabilities" },
468
  { FRR_ZAPI5_NEXTHOP_REGISTER,   "Nexthop Register" },
469
  { FRR_ZAPI5_NEXTHOP_UNREGISTER,   "Nexthop Unregister" },
470
  { FRR_ZAPI5_NEXTHOP_UPDATE,   "Nexthop Update" },
471
  { FRR_ZAPI5_INTERFACE_NBR_ADDRESS_ADD,  "Interface Neighbor Address Add" },
472
  { FRR_ZAPI5_INTERFACE_NBR_ADDRESS_DELETE, "Interface Neighbor Address Delete" },
473
  { FRR_ZAPI5_INTERFACE_BFD_DEST_UPDATE,  "Interface BFD Destination Update" },
474
  { FRR_ZAPI5_IMPORT_ROUTE_REGISTER,  "Import Route Register" },
475
  { FRR_ZAPI5_IMPORT_ROUTE_UNREGISTER,  "Import Route Unregister" },
476
  { FRR_ZAPI5_IMPORT_CHECK_UPDATE,  "Import Check Update" },
477
  { FRR_ZAPI5_IPV4_ROUTE_IPV6_NEXTHOP_ADD,"Add IPv6 nexthop for IPv4 Route" },
478
  { FRR_ZAPI5_BFD_DEST_REGISTER,    "BFD Destination Register" },
479
  { FRR_ZAPI5_BFD_DEST_DEREGISTER,  "BFD Destination Deregister" },
480
  { FRR_ZAPI5_BFD_DEST_UPDATE,    "BFD Destination Update" },
481
  { FRR_ZAPI5_BFD_DEST_REPLAY,    "BFD Destination Replay" },
482
  { FRR_ZAPI5_REDISTRIBUTE_ROUTE_ADD, "Add Redistribute Route" },
483
  { FRR_ZAPI5_REDISTRIBUTE_ROUTE_DEL, "Delete Redistribute Route" },
484
  { FRR_ZAPI5_VRF_UNREGISTER,   "VRF Unregister" },
485
  { FRR_ZAPI5_VRF_ADD,      "VRF Add" },
486
  { FRR_ZAPI5_VRF_DELETE,     "VRF Delete" },
487
  { FRR_ZAPI5_VRF_LABEL,      "VRF Label" },
488
  { FRR_ZAPI5_INTERFACE_VRF_UPDATE, "Interface VRF Update" },
489
  { FRR_ZAPI5_BFD_CLIENT_REGISTER,  "BFD Client Register" },
490
  { FRR_ZAPI5_INTERFACE_ENABLE_RADV,  "Interface Enable Router Advertisement" },
491
  { FRR_ZAPI5_INTERFACE_DISABLE_RADV, "Interface Disable Router Advertisement" },
492
  { FRR_ZAPI5_IPV4_NEXTHOP_LOOKUP_MRIB, "IPv4 Nexthop Lookup Multicast RIB" },
493
  { FRR_ZAPI5_INTERFACE_LINK_PARAMS,  "Interface Link Parameters" },
494
  { FRR_ZAPI5_MPLS_LABELS_ADD,    "MPLS Labels Add" },
495
  { FRR_ZAPI5_MPLS_LABELS_DELETE,   "MPLS Labels Delete" },
496
  { FRR_ZAPI5_IPMR_ROUTE_STATS,   "IPMR Route Statics" },
497
  { FRR_ZAPI5_LABEL_MANAGER_CONNECT,  "Label Manager Connect" },
498
  { FRR_ZAPI5_LABEL_MANAGER_CONNECT_ASYNC,"Label Manager Connect Asynchronous" },
499
  { FRR_ZAPI5_GET_LABEL_CHUNK,    "Get Label Chunk" },
500
  { FRR_ZAPI5_RELEASE_LABEL_CHUNK,  "Release Label Chunk" },
501
  { FRR_ZAPI5_FEC_REGISTER,   "FEC Register" },
502
  { FRR_ZAPI5_FEC_UNREGISTER,   "FEC Unregister" },
503
  { FRR_ZAPI5_FEC_UPDATE,     "FEC Update" },
504
  { FRR_ZAPI5_ADVERTISE_DEFAULT_GW, "Advertise Default Gateway" },
505
  { FRR_ZAPI5_ADVERTISE_SUBNET,   "Advertise Subnet" },
506
  { FRR_ZAPI5_ADVERTISE_ALL_VNI,    "Advertise all VNI" },
507
  { FRR_ZAPI5_VNI_ADD,      "VNI Add" },
508
  { FRR_ZAPI5_VNI_DEL,      "VNI Delete" },
509
  { FRR_ZAPI5_L3VNI_ADD,      "L3VNI Add" },
510
  { FRR_ZAPI5_L3VNI_DEL,      "L3VNI Delete" },
511
  { FRR_ZAPI5_REMOTE_VTEP_ADD,    "Remote VTEP Add" },
512
  { FRR_ZAPI5_REMOTE_VTEP_DEL,    "Remote VTEP Delete" },
513
  { FRR_ZAPI5_MACIP_ADD,      "MAC/IP Add" },
514
  { FRR_ZAPI5_MACIP_DEL,      "MAC/IP Delete" },
515
  { FRR_ZAPI5_IP_PREFIX_ROUTE_ADD,  "IP Prefix Route Add" },
516
  { FRR_ZAPI5_IP_PREFIX_ROUTE_DEL,  "IP Prefix Route Delete" },
517
  { FRR_ZAPI5_REMOTE_MACIP_ADD,   "Remote MAC/IP Add" },
518
  { FRR_ZAPI5_REMOTE_MACIP_DEL,   "Remote MAC/IP Delete" },
519
  { FRR_ZAPI5_PW_ADD,     "PseudoWire Add" },
520
  { FRR_ZAPI5_PW_DELETE,      "PseudoWire Delete" },
521
  { FRR_ZAPI5_PW_SET,     "PseudoWire Set" },
522
  { FRR_ZAPI5_PW_UNSET,     "PseudoWire Unset" },
523
  { FRR_ZAPI5_PW_STATUS_UPDATE,   "PseudoWire Status Update" },
524
  { FRR_ZAPI5_RULE_ADD,     "Rule Add" },
525
  { FRR_ZAPI5_RULE_DELETE,    "Rule Delete" },
526
  { FRR_ZAPI5_RULE_NOTIFY_OWNER,    "Rule Notify Owner" },
527
  { FRR_ZAPI5_TABLE_MANAGER_CONNECT,  "Table Manager Connect" },
528
  { FRR_ZAPI5_GET_TABLE_CHUNK,    "Get Table Chunk" },
529
  { FRR_ZAPI5_RELEASE_TABLE_CHUNK,  "Release Table Chunk" },
530
  { FRR_ZAPI5_IPSET_CREATE,   "IPSet Create" },
531
  { FRR_ZAPI5_IPSET_DESTROY,    "IPSet Destroy" },
532
  { FRR_ZAPI5_IPSET_ENTRY_ADD,    "IPSet Entry Add" },
533
  { FRR_ZAPI5_IPSET_ENTRY_DELETE,   "IPSet Entry Delete" },
534
  { FRR_ZAPI5_IPSET_NOTIFY_OWNER,   "IPSet Notify Oner" },
535
  { FRR_ZAPI5_IPSET_ENTRY_NOTIFY_OWNER, "IPSet Entry Notify Owner" },
536
  { FRR_ZAPI5_IPTABLE_ADD,    "IPTable Add" },
537
  { FRR_ZAPI5_IPTABLE_DELETE,   "IPTable Delete" },
538
  { FRR_ZAPI5_IPTABLE_NOTIFY_OWNER, "IPTable Notify Owner" },
539
  { 0,          NULL },
540
};
541
542
enum {
543
  FRR_ZAPI6_INTERFACE_ADD,
544
  FRR_ZAPI6_INTERFACE_DELETE,
545
  FRR_ZAPI6_INTERFACE_ADDRESS_ADD,
546
  FRR_ZAPI6_INTERFACE_ADDRESS_DELETE,
547
  FRR_ZAPI6_INTERFACE_UP,
548
  FRR_ZAPI6_INTERFACE_DOWN,
549
  FRR_ZAPI6_INTERFACE_SET_MASTER,
550
  FRR_ZAPI6_ROUTE_ADD,
551
  FRR_ZAPI6_ROUTE_DELETE,
552
  FRR_ZAPI6_ROUTE_NOTIFY_OWNER,
553
  FRR_ZAPI6_REDISTRIBUTE_ADD,
554
  FRR_ZAPI6_REDISTRIBUTE_DELETE,
555
  FRR_ZAPI6_REDISTRIBUTE_DEFAULT_ADD,
556
  FRR_ZAPI6_REDISTRIBUTE_DEFAULT_DELETE,
557
  FRR_ZAPI6_ROUTER_ID_ADD,
558
  FRR_ZAPI6_ROUTER_ID_DELETE,
559
  FRR_ZAPI6_ROUTER_ID_UPDATE,
560
  FRR_ZAPI6_HELLO,
561
  FRR_ZAPI6_CAPABILITIES,
562
  FRR_ZAPI6_NEXTHOP_REGISTER,
563
  FRR_ZAPI6_NEXTHOP_UNREGISTER,
564
  FRR_ZAPI6_NEXTHOP_UPDATE,
565
  FRR_ZAPI6_INTERFACE_NBR_ADDRESS_ADD,
566
  FRR_ZAPI6_INTERFACE_NBR_ADDRESS_DELETE,
567
  FRR_ZAPI6_INTERFACE_BFD_DEST_UPDATE,
568
  FRR_ZAPI6_IMPORT_ROUTE_REGISTER,
569
  FRR_ZAPI6_IMPORT_ROUTE_UNREGISTER,
570
  FRR_ZAPI6_IMPORT_CHECK_UPDATE,
571
  //FRR_ZAPI6_IPV4_ROUTE_IPV6_NEXTHOP_ADD,
572
  FRR_ZAPI6_BFD_DEST_REGISTER,
573
  FRR_ZAPI6_BFD_DEST_DEREGISTER,
574
  FRR_ZAPI6_BFD_DEST_UPDATE,
575
  FRR_ZAPI6_BFD_DEST_REPLAY,
576
  FRR_ZAPI6_REDISTRIBUTE_ROUTE_ADD,
577
  FRR_ZAPI6_REDISTRIBUTE_ROUTE_DEL,
578
  FRR_ZAPI6_VRF_UNREGISTER,
579
  FRR_ZAPI6_VRF_ADD,
580
  FRR_ZAPI6_VRF_DELETE,
581
  FRR_ZAPI6_VRF_LABEL,
582
  FRR_ZAPI6_INTERFACE_VRF_UPDATE,
583
  FRR_ZAPI6_BFD_CLIENT_REGISTER,
584
  FRR_ZAPI6_BFD_CLIENT_DEREGISTER,
585
  FRR_ZAPI6_INTERFACE_ENABLE_RADV,
586
  FRR_ZAPI6_INTERFACE_DISABLE_RADV,
587
  FRR_ZAPI6_IPV4_NEXTHOP_LOOKUP_MRIB,
588
  FRR_ZAPI6_INTERFACE_LINK_PARAMS,
589
  FRR_ZAPI6_MPLS_LABELS_ADD,
590
  FRR_ZAPI6_MPLS_LABELS_DELETE,
591
  FRR_ZAPI6_IPMR_ROUTE_STATS,
592
  FRR_ZAPI6_LABEL_MANAGER_CONNECT,
593
  FRR_ZAPI6_LABEL_MANAGER_CONNECT_ASYNC,
594
  FRR_ZAPI6_GET_LABEL_CHUNK,
595
  FRR_ZAPI6_RELEASE_LABEL_CHUNK,
596
  FRR_ZAPI6_FEC_REGISTER,
597
  FRR_ZAPI6_FEC_UNREGISTER,
598
  FRR_ZAPI6_FEC_UPDATE,
599
  FRR_ZAPI6_ADVERTISE_DEFAULT_GW,
600
  FRR_ZAPI6_ADVERTISE_SUBNET,
601
  FRR_ZAPI6_ADVERTISE_ALL_VNI,
602
  FRR_ZAPI6_LOCAL_ES_ADD,
603
  FRR_ZAPI6_LOCAL_ES_DEL,
604
  FRR_ZAPI6_VNI_ADD,
605
  FRR_ZAPI6_VNI_DEL,
606
  FRR_ZAPI6_L3VNI_ADD,
607
  FRR_ZAPI6_L3VNI_DEL,
608
  FRR_ZAPI6_REMOTE_VTEP_ADD,
609
  FRR_ZAPI6_REMOTE_VTEP_DEL,
610
  FRR_ZAPI6_MACIP_ADD,
611
  FRR_ZAPI6_MACIP_DEL,
612
  FRR_ZAPI6_IP_PREFIX_ROUTE_ADD,
613
  FRR_ZAPI6_IP_PREFIX_ROUTE_DEL,
614
  FRR_ZAPI6_REMOTE_MACIP_ADD,
615
  FRR_ZAPI6_REMOTE_MACIP_DEL,
616
  FRR_ZAPI6_DUPLICATE_ADDR_DETECTION,
617
  FRR_ZAPI6_PW_ADD,
618
  FRR_ZAPI6_PW_DELETE,
619
  FRR_ZAPI6_PW_SET,
620
  FRR_ZAPI6_PW_UNSET,
621
  FRR_ZAPI6_PW_STATUS_UPDATE,
622
  FRR_ZAPI6_RULE_ADD,
623
  FRR_ZAPI6_RULE_DELETE,
624
  FRR_ZAPI6_RULE_NOTIFY_OWNER,
625
  FRR_ZAPI6_TABLE_MANAGER_CONNECT,
626
  FRR_ZAPI6_GET_TABLE_CHUNK,
627
  FRR_ZAPI6_RELEASE_TABLE_CHUNK,
628
  FRR_ZAPI6_IPSET_CREATE,
629
  FRR_ZAPI6_IPSET_DESTROY,
630
  FRR_ZAPI6_IPSET_ENTRY_ADD,
631
  FRR_ZAPI6_IPSET_ENTRY_DELETE,
632
  FRR_ZAPI6_IPSET_NOTIFY_OWNER,
633
  FRR_ZAPI6_IPSET_ENTRY_NOTIFY_OWNER,
634
  FRR_ZAPI6_IPTABLE_ADD,
635
  FRR_ZAPI6_IPTABLE_DELETE,
636
  FRR_ZAPI6_IPTABLE_NOTIFY_OWNER,
637
  FRR_ZAPI6_VXLAN_FLOOD_CONTROL,
638
};
639
640
static const value_string frr_zapi6_messages[] = {
641
  { FRR_ZAPI6_INTERFACE_ADD,    "Add Interface" },
642
  { FRR_ZAPI6_INTERFACE_DELETE,   "Delete Interface" },
643
  { FRR_ZAPI6_INTERFACE_ADDRESS_ADD,  "Add Interface Address" },
644
  { FRR_ZAPI6_INTERFACE_ADDRESS_DELETE, "Delete Interface Address" },
645
  { FRR_ZAPI6_INTERFACE_UP,   "Interface Up" },
646
  { FRR_ZAPI6_INTERFACE_DOWN,   "Interface Down" },
647
  { FRR_ZAPI6_ROUTE_ADD,      "Add Route" },
648
  { FRR_ZAPI6_ROUTE_DELETE,   "Delete Route" },
649
  { FRR_ZAPI6_REDISTRIBUTE_ADD,   "Add Redistribute" },
650
  { FRR_ZAPI6_REDISTRIBUTE_DELETE,  "Delete Redistribute" },
651
  { FRR_ZAPI6_REDISTRIBUTE_DEFAULT_ADD, "Add Default Redistribute" },
652
  { FRR_ZAPI6_REDISTRIBUTE_DEFAULT_DELETE,"Delete Default Redistribute" },
653
  { FRR_ZAPI6_ROUTER_ID_ADD,    "Router ID Add" },
654
  { FRR_ZAPI6_ROUTER_ID_DELETE,   "Router ID Delete" },
655
  { FRR_ZAPI6_ROUTER_ID_UPDATE,   "Router ID Update" },
656
  { FRR_ZAPI6_HELLO,      "Hello" },
657
  { FRR_ZAPI6_CAPABILITIES,   "Capabilities" },
658
  { FRR_ZAPI6_NEXTHOP_REGISTER,   "Nexthop Register" },
659
  { FRR_ZAPI6_NEXTHOP_UNREGISTER,   "Nexthop Unregister" },
660
  { FRR_ZAPI6_NEXTHOP_UPDATE,   "Nexthop Update" },
661
  { FRR_ZAPI6_INTERFACE_NBR_ADDRESS_ADD,  "Interface Neighbor Address Add" },
662
  { FRR_ZAPI6_INTERFACE_NBR_ADDRESS_DELETE, "Interface Neighbor Address Delete" },
663
  { FRR_ZAPI6_INTERFACE_BFD_DEST_UPDATE,  "Interface BFD Destination Update" },
664
  { FRR_ZAPI6_IMPORT_ROUTE_REGISTER,  "Import Route Register" },
665
  { FRR_ZAPI6_IMPORT_ROUTE_UNREGISTER,  "Import Route Unregister" },
666
  { FRR_ZAPI6_IMPORT_CHECK_UPDATE,  "Import Check Update" },
667
  //{ FRR_ZAPI6_IPV4_ROUTE_IPV6_NEXTHOP_ADD,"Add IPv6 nexthop for IPv4 Route" },
668
  { FRR_ZAPI6_BFD_DEST_REGISTER,    "BFD Destination Register" },
669
  { FRR_ZAPI6_BFD_DEST_DEREGISTER,  "BFD Destination Deregister" },
670
  { FRR_ZAPI6_BFD_DEST_UPDATE,    "BFD Destination Update" },
671
  { FRR_ZAPI6_BFD_DEST_REPLAY,    "BFD Destination Replay" },
672
  { FRR_ZAPI6_REDISTRIBUTE_ROUTE_ADD, "Add Redistribute Route" },
673
  { FRR_ZAPI6_REDISTRIBUTE_ROUTE_DEL, "Delete Redistribute Route" },
674
  { FRR_ZAPI6_VRF_UNREGISTER,   "VRF Unregister" },
675
  { FRR_ZAPI6_VRF_ADD,      "VRF Add" },
676
  { FRR_ZAPI6_VRF_DELETE,     "VRF Delete" },
677
  { FRR_ZAPI6_VRF_LABEL,      "VRF Label" },
678
  { FRR_ZAPI6_INTERFACE_VRF_UPDATE, "Interface VRF Update" },
679
  { FRR_ZAPI6_BFD_CLIENT_REGISTER,  "BFD Client Register" },
680
  { FRR_ZAPI6_BFD_CLIENT_DEREGISTER,  "BFD Client Deregister" },
681
  { FRR_ZAPI6_INTERFACE_ENABLE_RADV,  "Interface Enable Router Advertisement" },
682
  { FRR_ZAPI6_INTERFACE_DISABLE_RADV, "Interface Disable Router Advertisement" },
683
  { FRR_ZAPI6_IPV4_NEXTHOP_LOOKUP_MRIB, "IPv4 Nexthop Lookup Multicast RIB" },
684
  { FRR_ZAPI6_INTERFACE_LINK_PARAMS,  "Interface Link Parameters" },
685
  { FRR_ZAPI6_MPLS_LABELS_ADD,    "MPLS Labels Add" },
686
  { FRR_ZAPI6_MPLS_LABELS_DELETE,   "MPLS Labels Delete" },
687
  { FRR_ZAPI6_IPMR_ROUTE_STATS,   "IPMR Route Statics" },
688
  { FRR_ZAPI6_LABEL_MANAGER_CONNECT,  "Label Manager Connect" },
689
  { FRR_ZAPI6_LABEL_MANAGER_CONNECT_ASYNC,"Label Manager Connect Asynchronous" },
690
  { FRR_ZAPI6_GET_LABEL_CHUNK,    "Get Label Chunk" },
691
  { FRR_ZAPI6_RELEASE_LABEL_CHUNK,  "Release Label Chunk" },
692
  { FRR_ZAPI6_FEC_REGISTER,   "FEC Register" },
693
  { FRR_ZAPI6_FEC_UNREGISTER,   "FEC Unregister" },
694
  { FRR_ZAPI6_FEC_UPDATE,     "FEC Update" },
695
  { FRR_ZAPI6_ADVERTISE_DEFAULT_GW, "Advertise Default Gateway" },
696
  { FRR_ZAPI6_ADVERTISE_SUBNET,   "Advertise Subnet" },
697
  { FRR_ZAPI6_ADVERTISE_ALL_VNI,    "Advertise all VNI" },
698
  { FRR_ZAPI6_LOCAL_ES_ADD,   "Local Ethernet Segment Add" },
699
  { FRR_ZAPI6_LOCAL_ES_DEL,   "Local Ethernet Segment Delete" },
700
  { FRR_ZAPI6_VNI_ADD,      "VNI Add" },
701
  { FRR_ZAPI6_VNI_DEL,      "VNI Delete" },
702
  { FRR_ZAPI6_L3VNI_ADD,      "L3VNI Add" },
703
  { FRR_ZAPI6_L3VNI_DEL,      "L3VNI Delete" },
704
  { FRR_ZAPI6_REMOTE_VTEP_ADD,    "Remote VTEP Add" },
705
  { FRR_ZAPI6_REMOTE_VTEP_DEL,    "Remote VTEP Delete" },
706
  { FRR_ZAPI6_MACIP_ADD,      "MAC/IP Add" },
707
  { FRR_ZAPI6_MACIP_DEL,      "MAC/IP Delete" },
708
  { FRR_ZAPI6_IP_PREFIX_ROUTE_ADD,  "IP Prefix Route Add" },
709
  { FRR_ZAPI6_IP_PREFIX_ROUTE_DEL,  "IP Prefix Route Delete" },
710
  { FRR_ZAPI6_REMOTE_MACIP_ADD,   "Remote MAC/IP Add" },
711
  { FRR_ZAPI6_REMOTE_MACIP_DEL,   "Remote MAC/IP Delete" },
712
  { FRR_ZAPI6_DUPLICATE_ADDR_DETECTION,   "Duplicate Address Detection" },
713
  { FRR_ZAPI6_PW_ADD,     "PseudoWire Add" },
714
  { FRR_ZAPI6_PW_DELETE,      "PseudoWire Delete" },
715
  { FRR_ZAPI6_PW_SET,     "PseudoWire Set" },
716
  { FRR_ZAPI6_PW_UNSET,     "PseudoWire Unset" },
717
  { FRR_ZAPI6_PW_STATUS_UPDATE,   "PseudoWire Status Update" },
718
  { FRR_ZAPI6_RULE_ADD,     "Rule Add" },
719
  { FRR_ZAPI6_RULE_DELETE,    "Rule Delete" },
720
  { FRR_ZAPI6_RULE_NOTIFY_OWNER,    "Rule Notify Owner" },
721
  { FRR_ZAPI6_TABLE_MANAGER_CONNECT,  "Table Manager Connect" },
722
  { FRR_ZAPI6_GET_TABLE_CHUNK,    "Get Table Chunk" },
723
  { FRR_ZAPI6_RELEASE_TABLE_CHUNK,  "Release Table Chunk" },
724
  { FRR_ZAPI6_IPSET_CREATE,   "IPSet Create" },
725
  { FRR_ZAPI6_IPSET_DESTROY,    "IPSet Destroy" },
726
  { FRR_ZAPI6_IPSET_ENTRY_ADD,    "IPSet Entry Add" },
727
  { FRR_ZAPI6_IPSET_ENTRY_DELETE,   "IPSet Entry Delete" },
728
  { FRR_ZAPI6_IPSET_NOTIFY_OWNER,   "IPSet Notify Oner" },
729
  { FRR_ZAPI6_IPSET_ENTRY_NOTIFY_OWNER, "IPSet Entry Notify Owner" },
730
  { FRR_ZAPI6_IPTABLE_ADD,    "IPTable Add" },
731
  { FRR_ZAPI6_IPTABLE_DELETE,   "IPTable Delete" },
732
  { FRR_ZAPI6_IPTABLE_NOTIFY_OWNER, "IPTable Notify Owner" },
733
  { FRR_ZAPI6_VXLAN_FLOOD_CONTROL,  "VXLAN Flood Control" },
734
  { 0,          NULL },
735
};
736
737
/* Zebra route's types. */
738
#define ZEBRA_ROUTE_SYSTEM               0
739
#define ZEBRA_ROUTE_KERNEL               1
740
#define ZEBRA_ROUTE_CONNECT              2
741
#define ZEBRA_ROUTE_STATIC               3
742
#define ZEBRA_ROUTE_RIP                  4
743
#define ZEBRA_ROUTE_RIPNG                5
744
#define ZEBRA_ROUTE_OSPF                 6
745
#define ZEBRA_ROUTE_OSPF6                7
746
#define ZEBRA_ROUTE_BGP                  8
747
748
static const value_string routes_v0[] = {
749
  { ZEBRA_ROUTE_SYSTEM,     "System Route" },
750
  { ZEBRA_ROUTE_KERNEL,     "Kernel Route" },
751
  { ZEBRA_ROUTE_CONNECT,      "Connected Route" },
752
  { ZEBRA_ROUTE_STATIC,     "Static Route" },
753
  { ZEBRA_ROUTE_RIP,      "RIP Route" },
754
  { ZEBRA_ROUTE_RIPNG,      "RIPnG Route" },
755
  { ZEBRA_ROUTE_OSPF,     "OSPF Route" },
756
  { ZEBRA_ROUTE_OSPF6,      "OSPF6 Route" },
757
  { ZEBRA_ROUTE_BGP,      "BGP Route" },
758
  { 0,          NULL },
759
};
760
761
/*
762
 * In Quagga, ISIS is type 8 and BGP is type 9, but Zebra didn't have ISIS...
763
 * so for Zebra BGP is type 8. So we dup the value_string table for quagga.
764
 */
765
#define QUAGGA_ROUTE_ISIS                 8
766
#define QUAGGA_ROUTE_BGP                  9
767
#define QUAGGA_ROUTE_HSLS                 10
768
#define QUAGGA_ROUTE_OLSR                 11
769
#define QUAGGA_ROUTE_BABEL                12
770
771
static const value_string routes_v1[] = {
772
  { ZEBRA_ROUTE_SYSTEM,     "System Route" },
773
  { ZEBRA_ROUTE_KERNEL,     "Kernel Route" },
774
  { ZEBRA_ROUTE_CONNECT,      "Connected Route" },
775
  { ZEBRA_ROUTE_STATIC,     "Static Route" },
776
  { ZEBRA_ROUTE_RIP,      "RIP Route" },
777
  { ZEBRA_ROUTE_RIPNG,      "RIPnG Route" },
778
  { ZEBRA_ROUTE_OSPF,     "OSPF Route" },
779
  { ZEBRA_ROUTE_OSPF6,      "OSPF6 Route" },
780
  { QUAGGA_ROUTE_ISIS,      "ISIS Route" },
781
  { QUAGGA_ROUTE_BGP,     "BGP Route" },
782
  { QUAGGA_ROUTE_HSLS,      "HSLS Route" },
783
  { QUAGGA_ROUTE_OLSR,      "OLSR Route" },
784
  { QUAGGA_ROUTE_BABEL,     "BABEL Route" },
785
  { 0,          NULL },
786
};
787
788
#define FRR_ZAPI4_ROUTE_PIM               10
789
#define FRR_ZAPI4_ROUTE_NHRP              11
790
#define FRR_ZAPI4_ROUTE_HSLS              12
791
#define FRR_ZAPI4_ROUTE_OLSR              13
792
#define FRR_ZAPI4_ROUTE_TABLE             14
793
#define FRR_ZAPI4_ROUTE_LDP               15
794
#define FRR_ZAPI4_ROUTE_VNC               16
795
#define FRR_ZAPI4_ROUTE_VNC_DIRECT        17
796
#define FRR_ZAPI4_ROUTE_VNC_DIRECT_RH     18
797
#define FRR_ZAPI4_ROUTE_BGP_DIRECT        19
798
#define FRR_ZAPI4_ROUTE_BGP_DIRECT_EXT    20
799
800
static const value_string routes_v4[] = {
801
  { ZEBRA_ROUTE_SYSTEM,     "System Route" },
802
  { ZEBRA_ROUTE_KERNEL,     "Kernel Route" },
803
  { ZEBRA_ROUTE_CONNECT,      "Connected Route" },
804
  { ZEBRA_ROUTE_STATIC,     "Static Route" },
805
  { ZEBRA_ROUTE_RIP,      "RIP Route" },
806
  { ZEBRA_ROUTE_RIPNG,      "RIPnG Route" },
807
  { ZEBRA_ROUTE_OSPF,     "OSPF Route" },
808
  { ZEBRA_ROUTE_OSPF6,      "OSPF6 Route" },
809
  { QUAGGA_ROUTE_ISIS,      "ISIS Route" },
810
  { QUAGGA_ROUTE_BGP,     "BGP Route" },
811
  { FRR_ZAPI4_ROUTE_PIM,      "PIM Route" },
812
  { FRR_ZAPI4_ROUTE_NHRP,     "NHRP Route" },
813
  { FRR_ZAPI4_ROUTE_HSLS,     "HSLS Route" },
814
  { FRR_ZAPI4_ROUTE_OLSR,     "OLSR Route" },
815
  { FRR_ZAPI4_ROUTE_TABLE,    "Table Route" },
816
  { FRR_ZAPI4_ROUTE_LDP,      "LDP Route" },
817
  { FRR_ZAPI4_ROUTE_VNC,      "VNC Route" },
818
  { FRR_ZAPI4_ROUTE_VNC_DIRECT,   "VNC Direct Route" },
819
  { FRR_ZAPI4_ROUTE_VNC_DIRECT_RH,  "VNC RN Route" },
820
  { FRR_ZAPI4_ROUTE_BGP_DIRECT,   "BGP Direct Route" },
821
  { FRR_ZAPI4_ROUTE_BGP_DIRECT_EXT, "BGP Direct to NVE groups Route" },
822
  { 0,          NULL},
823
};
824
825
#define FRR_ZAPI5_ROUTE_EIGRP             11
826
#define FRR_ZAPI5_ROUTE_NHRP              12
827
#define FRR_ZAPI5_ROUTE_HSLS              13
828
#define FRR_ZAPI5_ROUTE_OLSR              14
829
#define FRR_ZAPI5_ROUTE_TABLE             15
830
#define FRR_ZAPI5_ROUTE_LDP               16
831
#define FRR_ZAPI5_ROUTE_VNC               17
832
#define FRR_ZAPI5_ROUTE_VNC_DIRECT        18
833
#define FRR_ZAPI5_ROUTE_VNC_DIRECT_RH     19
834
#define FRR_ZAPI5_ROUTE_BGP_DIRECT        20
835
#define FRR_ZAPI5_ROUTE_BGP_DIRECT_EXT    21
836
#define FRR_ZAPI5_ROUTE_BABEL             22
837
#define FRR_ZAPI5_ROUTE_SHARP             23
838
#define FRR_ZAPI5_ROUTE_PBR               24
839
#define FRR_ZAPI6_ROUTE_BFD               25
840
#define FRR_ZAPI6_ROUTE_OPENFABRIC        26
841
842
static const value_string routes_v5[] = {
843
  { ZEBRA_ROUTE_SYSTEM,     "System Route" },
844
  { ZEBRA_ROUTE_KERNEL,     "Kernel Route" },
845
  { ZEBRA_ROUTE_CONNECT,      "Connected Route" },
846
  { ZEBRA_ROUTE_STATIC,     "Static Route" },
847
  { ZEBRA_ROUTE_RIP,      "RIP Route" },
848
  { ZEBRA_ROUTE_RIPNG,      "RIPnG Route" },
849
  { ZEBRA_ROUTE_OSPF,     "OSPF Route" },
850
  { ZEBRA_ROUTE_OSPF6,      "OSPF6 Route" },
851
  { QUAGGA_ROUTE_ISIS,      "ISIS Route" },
852
  { QUAGGA_ROUTE_BGP,     "BGP Route" },
853
  { FRR_ZAPI4_ROUTE_PIM,      "PIM Route" },
854
  { FRR_ZAPI5_ROUTE_EIGRP,    "EIGRP Route" },
855
  { FRR_ZAPI5_ROUTE_NHRP,     "NHRP Route" },
856
  { FRR_ZAPI5_ROUTE_HSLS,     "HSLS Route" },
857
  { FRR_ZAPI5_ROUTE_OLSR,     "OLSR Route" },
858
  { FRR_ZAPI5_ROUTE_TABLE,    "Table Route" },
859
  { FRR_ZAPI5_ROUTE_LDP,      "LDP Route" },
860
  { FRR_ZAPI5_ROUTE_VNC,      "VNC Route" },
861
  { FRR_ZAPI5_ROUTE_VNC_DIRECT,   "VNC Direct Route" },
862
  { FRR_ZAPI5_ROUTE_VNC_DIRECT_RH,  "VNC RN Route" },
863
  { FRR_ZAPI5_ROUTE_BGP_DIRECT,   "BGP Direct Route" },
864
  { FRR_ZAPI5_ROUTE_BGP_DIRECT_EXT, "BGP Direct to NVE groups Route" },
865
  { FRR_ZAPI5_ROUTE_BABEL,    "BABEL Route" },
866
  { FRR_ZAPI5_ROUTE_SHARP,    "SHARPd Route" },
867
  { FRR_ZAPI5_ROUTE_PBR,      "PBR Route" },
868
  { FRR_ZAPI6_ROUTE_BFD,      "BFD Route" },
869
  { FRR_ZAPI6_ROUTE_OPENFABRIC,   "OpenFabric Route" },
870
  { 0,          NULL },
871
};
872
873
/* Zebra's family types. */
874
0
#define ZEBRA_FAMILY_UNSPEC              0
875
64
#define ZEBRA_FAMILY_IPV4                2
876
69
#define ZEBRA_FAMILY_IPV6                10
877
878
static const value_string families[] = {
879
  { ZEBRA_FAMILY_IPV4,      "IPv4" },
880
  { ZEBRA_FAMILY_IPV6,      "IPv6" },
881
  { 0,          NULL },
882
};
883
884
/* Zebra message flags */
885
#define ZEBRA_FLAG_INTERNAL              0x01
886
#define ZEBRA_FLAG_SELFROUTE             0x02
887
#define ZEBRA_FLAG_BLACKHOLE             0x04
888
#define ZEBRA_FLAG_IBGP                  0x08
889
#define ZEBRA_FLAG_SELECTED              0x10
890
#define ZEBRA_FLAG_FIB_OVERRIDE          0x20
891
#define ZEBRA_FLAG_STATIC                0x40
892
#define ZEBRA_FLAG_REJECT                0x80
893
/* ZAPI v4 (FRRouting v3) message flags */
894
#define ZEBRA_FLAG_SCOPE_LINK            0x100
895
#define FRR_FLAG_FIB_OVERRIDE            0x200
896
/* ZAPI v5 (FRRouting v5) message flags */
897
0
#define ZEBRA_FLAG_EVPN_ROUTE            0x400
898
#define FRR_FLAG_ALLOW_RECURSION         0x01
899
/* ZAPI v6 (FRRouting v7) message flags */
900
#define FRR_ZAPI6_FLAG_IBGP              0x04
901
#define FRR_ZAPI6_FLAG_SELECTED          0x08
902
#define FRR_ZAPI6_FLAG_FIB_OVERRIDE      0x10
903
0
#define FRR_ZAPI6_FLAG_EVPN_ROUTE        0x20
904
#define FRR_ZAPI6_FLAG_RR_USE_DISTANCE   0x40
905
#define FRR_ZAPI6_FLAG_ONLINk            0x40
906
907
908
/* Zebra API message flag. */
909
45
#define ZEBRA_ZAPI_MESSAGE_NEXTHOP       0x01
910
38
#define ZEBRA_ZAPI_MESSAGE_IFINDEX       0x02
911
36
#define ZEBRA_ZAPI_MESSAGE_DISTANCE      0x04
912
36
#define ZEBRA_ZAPI_MESSAGE_METRIC        0x08
913
36
#define ZEBRA_ZAPI_MESSAGE_MTU           0x10
914
36
#define ZEBRA_ZAPI_MESSAGE_TAG           0x20
915
/* ZAPI v4 (FRRouting v3) API message flags */
916
14
#define FRR_ZAPI4_MESSAGE_TAG            0x10
917
14
#define FRR_ZAPI4_MESSAGE_MTU            0x20
918
14
#define FRR_ZAPI4_MESSAGE_SRCPFX         0x40
919
/* ZAPI v5 (FRRouting v5) API message flags */
920
14
#define FRR_ZAPI5_MESSAGE_DISTANCE       0x02
921
14
#define FRR_ZAPI5_MESSAGE_METRIC         0x04
922
14
#define FRR_ZAPI5_MESSAGE_TAG            0x08
923
14
#define FRR_ZAPI5_MESSAGE_MTU            0x10
924
14
#define FRR_ZAPI5_MESSAGE_SRCPFX         0x20
925
14
#define FRR_ZAPI5_MESSAGE_LABEL          0x40
926
14
#define FRR_ZAPI5_MESSAGE_TABLEID        0x80
927
928
/* Zebra NextHop Types */
929
3.65k
#define ZEBRA_NEXTHOP_TYPE_IFINDEX       0x01
930
3.64k
#define ZEBRA_NEXTHOP_TYPE_IFNAME        0x02
931
3.64k
#define ZEBRA_NEXTHOP_TYPE_IPV4          0x03
932
7.24k
#define ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX  0x04
933
5.39k
#define ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME   0x05
934
3.64k
#define ZEBRA_NEXTHOP_TYPE_IPV6          0x06
935
5.33k
#define ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX  0x07
936
3.45k
#define ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME   0x08
937
#define ZEBRA_NEXTHOP_TYPE_BLACKHOLE     0x09
938
939
static const value_string zebra_nht[] = {
940
  { ZEBRA_NEXTHOP_TYPE_IFINDEX,   "IFIndex" },
941
  { ZEBRA_NEXTHOP_TYPE_IFNAME,    "IFName" },
942
  { ZEBRA_NEXTHOP_TYPE_IPV4,    "IPv4" },
943
  { ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX,  "IPv4 IFIndex" },
944
  { ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME, "IPv4 IFName" },
945
  { ZEBRA_NEXTHOP_TYPE_IPV6,    "IPv6 Nexthop" },
946
  { ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX,  "IPv6 IFIndex" },
947
  { ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME, "IPv6 IFName" },
948
  { ZEBRA_NEXTHOP_TYPE_BLACKHOLE,   "Blackhole" },
949
  { 0,          NULL },
950
};
951
952
/* FRR NextHop Types */
953
#define FRR_NEXTHOP_TYPE_IFINDEX         0x01
954
0
#define FRR_NEXTHOP_TYPE_IPV4            0x02
955
0
#define FRR_NEXTHOP_TYPE_IPV4_IFINDEX    0x03
956
0
#define FRR_NEXTHOP_TYPE_IPV6            0x04
957
0
#define FRR_NEXTHOP_TYPE_IPV6_IFINDEX    0x05
958
0
#define FRR_NEXTHOP_TYPE_BLACKHOLE       0x06
959
static const value_string frr_nht[] = {
960
  { FRR_NEXTHOP_TYPE_IFINDEX,   "IFIndex" },
961
  { FRR_NEXTHOP_TYPE_IPV4,    "IPv4" },
962
  { FRR_NEXTHOP_TYPE_IPV4_IFINDEX,  "IPv4 IFIndex" },
963
  { FRR_NEXTHOP_TYPE_IPV6,    "IPv6" },
964
  { FRR_NEXTHOP_TYPE_IPV6_IFINDEX,  "IPv6 IFIndex" },
965
  { FRR_NEXTHOP_TYPE_BLACKHOLE,   "Blackhole" },
966
  { 0,          NULL },
967
};
968
969
/* Subsequent Address Family Identifier. */
970
#define ZEBRA_SAFI_UNICAST              1
971
#define ZEBRA_SAFI_MULTICAST            2
972
#define ZEBRA_SAFI_RESERVED_3           3
973
#define ZEBRA_SAFI_MPLS_VPN             4
974
975
static const value_string safi[] = {
976
  { ZEBRA_SAFI_UNICAST,     "Unicast" },
977
  { ZEBRA_SAFI_MULTICAST,     "Multicast" },
978
  { ZEBRA_SAFI_RESERVED_3,    "Reserved" },
979
  { ZEBRA_SAFI_MPLS_VPN,      "MPLS VPN" },
980
  { 0,          NULL },
981
};
982
983
enum blackhole_type {
984
  BLACKHOLE_UNSPEC = 0,
985
  BLACKHOLE_NULL,
986
  BLACKHOLE_REJECT,
987
  BLACKHOLE_ADMINPROHIB,
988
};
989
990
static const value_string blackhole_type[] = {
991
  { BLACKHOLE_UNSPEC,     "Unspec" },
992
  { BLACKHOLE_NULL,     "NULL" },
993
  { BLACKHOLE_REJECT,     "Reject" },
994
  { BLACKHOLE_ADMINPROHIB,    "Administrative Prohibit" },
995
  { 0,          NULL},
996
};
997
998
0
#define INTERFACE_NAMSIZ      20
999
1000
62
#define PSIZE(a) (((a) + 7) / (8))
1001
1002
typedef struct _zebra_header_t {
1003
  uint16_t len;
1004
  uint16_t command;
1005
  uint8_t version;
1006
1007
} zebra_header_t;
1008
1009
static int
1010
zebra_route_nexthop(proto_tree *tree, bool request, tvbuff_t *tvb,
1011
        int offset, uint16_t len, uint8_t family, uint8_t version)
1012
29
{
1013
29
  uint8_t nexthoptype = 0, interfacenamelength;
1014
29
  uint16_t nexthopcount;
1015
29
  if (version < 5) {
1016
29
    nexthopcount = tvb_get_uint8(tvb, offset);
1017
29
    proto_tree_add_uint(tree, hf_zebra_nexthopnum, tvb, offset, 1,
1018
29
            nexthopcount);
1019
29
    offset += 1;
1020
29
  } else {
1021
0
    nexthopcount = tvb_get_ntohs(tvb, offset);
1022
0
    proto_tree_add_uint(tree, hf_zebra_nexthopnum_u16, tvb, offset,
1023
0
            2, nexthopcount);
1024
0
    offset += 2;
1025
0
  }
1026
1027
29
  if (nexthopcount > len)
1028
0
    return offset; /* Sanity */
1029
1030
1.85k
  while (nexthopcount--) {
1031
1.82k
    if (version > 4) {
1032
0
      proto_tree_add_item(tree, hf_zebra_vrfid, tvb, offset,
1033
0
              4, ENC_BIG_ENDIAN);
1034
0
      offset += 4;
1035
0
    }
1036
1.82k
    if (version < 4 && request) { /* Quagga */
1037
1.82k
      nexthoptype = tvb_get_uint8(tvb, offset);
1038
1.82k
      proto_tree_add_item(tree, hf_zebra_nexthoptype, tvb,
1039
1.82k
              offset, 1, ENC_BIG_ENDIAN);
1040
1.82k
      offset += 1;
1041
1.82k
    } else if (version >= 4) { /* FRR */
1042
0
      nexthoptype = tvb_get_uint8(tvb, offset);
1043
0
      proto_tree_add_item(tree, hf_zebra_nexthoptype_frr, tvb,
1044
0
              offset, 1, ENC_BIG_ENDIAN);
1045
0
      offset += 1;
1046
0
    }
1047
1.82k
    if ((version < 4 &&
1048
1.82k
         ((request &&
1049
1.82k
           (nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4 ||
1050
1.82k
      nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX ||
1051
1.82k
      nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME)) ||
1052
1.82k
          (!request && family == ZEBRA_FAMILY_IPV4))) ||
1053
1.82k
        (version >= 4 &&
1054
1.78k
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV4 ||
1055
38
          nexthoptype == FRR_NEXTHOP_TYPE_IPV4_IFINDEX))) {
1056
38
      proto_tree_add_item(tree, hf_zebra_nexthop4, tvb,
1057
38
              offset, 4, ENC_NA);
1058
38
      offset += 4;
1059
38
    }
1060
1.82k
    if ((version < 4 &&
1061
1.82k
         ((request &&
1062
1.82k
           (nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6 ||
1063
1.82k
      nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX ||
1064
1.82k
      nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME)) ||
1065
1.82k
          (!request && family == ZEBRA_FAMILY_IPV6))) ||
1066
1.82k
        (version >= 4 &&
1067
1.67k
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV6 ||
1068
154
          nexthoptype == FRR_NEXTHOP_TYPE_IPV6_IFINDEX))) {
1069
154
      proto_tree_add_item(tree, hf_zebra_nexthop6, tvb,
1070
154
              offset, 16, ENC_NA);
1071
154
      offset += 16;
1072
154
    }
1073
1.82k
    if (nexthoptype == ZEBRA_NEXTHOP_TYPE_IFINDEX ||
1074
1.82k
        (version < 4 &&
1075
1.81k
         (nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX ||
1076
1.81k
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX)) ||
1077
1.82k
        (version >= 4 &&
1078
1.78k
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV4_IFINDEX ||
1079
41
          nexthoptype == FRR_NEXTHOP_TYPE_IPV6_IFINDEX))) {
1080
41
      proto_tree_add_item(tree, hf_zebra_index, tvb, offset,
1081
41
              4, ENC_BIG_ENDIAN);
1082
41
      offset += 4;
1083
41
    }
1084
1085
1.82k
    if (version < 4 &&
1086
1.82k
        (nexthoptype == ZEBRA_NEXTHOP_TYPE_IFNAME ||
1087
1.82k
         nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME ||
1088
1.82k
         nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME)) {
1089
62
      interfacenamelength = tvb_get_uint8(tvb, offset);
1090
62
      offset += 1;
1091
62
      proto_tree_add_item(tree, hf_zebra_interface, tvb,
1092
62
              offset, interfacenamelength,
1093
62
              ENC_ASCII | ENC_NA);
1094
62
      offset += interfacenamelength;
1095
62
    }
1096
1.82k
    if (version > 4 &&
1097
1.82k
        (nexthoptype == FRR_NEXTHOP_TYPE_BLACKHOLE)) {
1098
0
      proto_tree_add_item(tree, hf_zebra_bhtype, tvb, offset,
1099
0
              1, ENC_BIG_ENDIAN);
1100
0
      offset += 1;
1101
0
    }
1102
1.82k
  }
1103
29
  return offset;
1104
29
}
1105
1106
static int
1107
zebra_route_ifindex(proto_tree *tree, tvbuff_t *tvb, int offset, uint16_t len)
1108
22
{
1109
22
  uint16_t indexcount = tvb_get_uint8(tvb, offset);
1110
22
  proto_tree_add_uint(tree, hf_zebra_indexnum,
1111
22
          tvb, offset, 1, indexcount);
1112
22
  offset += 1;
1113
22
  if (indexcount > len)
1114
0
    return offset; /* Sanity */
1115
1116
528
  while (indexcount--) {
1117
506
    proto_tree_add_item(tree, hf_zebra_index, tvb, offset, 4,
1118
506
        ENC_BIG_ENDIAN);
1119
506
    offset += 4;
1120
506
  }
1121
22
  return offset;
1122
22
}
1123
1124
static int
1125
zebra_route_message(proto_tree *tree, tvbuff_t *tvb, int offset, uint8_t version)
1126
31
{
1127
31
  static int * const flags[] = {
1128
31
    &hf_zebra_msg_nexthop,
1129
31
    &hf_zebra_msg_index,
1130
31
    &hf_zebra_msg_distance,
1131
31
    &hf_zebra_msg_metric,
1132
31
    &hf_zebra_msg_mtu,
1133
31
    &hf_zebra_msg_tag,
1134
31
    NULL
1135
31
  };
1136
31
  static int * const flags4[] = {
1137
31
    &hf_zebra_msg_nexthop,
1138
31
    &hf_zebra_msg_index,
1139
31
    &hf_zebra_msg_distance,
1140
31
    &hf_zebra_msg_metric,
1141
31
    &hf_zebra_msg4_tag,
1142
31
    &hf_zebra_msg4_mtu,
1143
31
    &hf_zebra_msg4_srcpfx,
1144
31
    NULL
1145
31
  };
1146
31
  static int * const flags5[] = {
1147
31
    &hf_zebra_msg_nexthop,
1148
31
    &hf_zebra_msg5_distance,
1149
31
    &hf_zebra_msg5_metric,
1150
31
    &hf_zebra_msg5_tag,
1151
31
    &hf_zebra_msg5_mtu,
1152
31
    &hf_zebra_msg5_srcpfx,
1153
31
    &hf_zebra_msg_label,
1154
31
    &hf_zebra_msg_tableid,
1155
31
    NULL
1156
31
  };
1157
31
  if (version < 4) {
1158
31
    proto_tree_add_bitmask(tree, tvb, offset, hf_zebra_message,
1159
31
               ett_message, flags, ENC_NA);
1160
31
  } else if (version == 4) {
1161
0
    proto_tree_add_bitmask(tree, tvb, offset, hf_zebra_message4,
1162
0
               ett_message, flags4, ENC_NA);
1163
0
  } else {
1164
0
    proto_tree_add_bitmask(tree, tvb, offset, hf_zebra_message5,
1165
0
               ett_message, flags5, ENC_NA);
1166
0
  }
1167
1168
31
  offset += 1;
1169
1170
31
  return offset;
1171
31
}
1172
1173
static int
1174
zebra_route(proto_tree *tree, bool request, tvbuff_t *tvb, int offset,
1175
      uint16_t len, uint8_t family, uint16_t command, uint8_t version)
1176
31
{
1177
31
  uint32_t prefix4, srcprefix4, rtflags = 0;
1178
31
  uint8_t message, prefixlen, buffer6[16], srcprefixlen, srcbuffer6[16];
1179
1180
31
  if (version == 0) {
1181
31
    proto_tree_add_item(tree, hf_zebra_type_v0, tvb,
1182
31
            offset, 1, ENC_BIG_ENDIAN);
1183
31
  } else if (version < 4) {
1184
0
    proto_tree_add_item(tree, hf_zebra_type_v1, tvb,
1185
0
            offset, 1, ENC_BIG_ENDIAN);
1186
0
  } else if (version == 4) {
1187
0
    proto_tree_add_item(tree, hf_zebra_type_v4, tvb,
1188
0
            offset, 1, ENC_BIG_ENDIAN);
1189
0
  } else {
1190
0
    proto_tree_add_item(tree, hf_zebra_type_v5, tvb,
1191
0
            offset, 1, ENC_BIG_ENDIAN);
1192
0
  }
1193
31
  offset += 1;
1194
1195
31
  if (version > 3) {
1196
0
    proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1197
0
            ENC_BIG_ENDIAN);
1198
0
    offset += 2;
1199
0
    rtflags = tvb_get_ntohl(tvb, offset);
1200
0
    proto_tree_add_item(tree, hf_zebra_rtflags_u32, tvb, offset, 4,
1201
0
            ENC_BIG_ENDIAN);
1202
0
    offset += 4;
1203
31
  } else {
1204
31
    proto_tree_add_item(tree, hf_zebra_rtflags, tvb, offset, 1,
1205
31
            ENC_BIG_ENDIAN);
1206
31
    offset += 1;
1207
31
  }
1208
1209
31
  message = tvb_get_uint8(tvb, offset);
1210
31
  offset = zebra_route_message(tree, tvb, offset, version);
1211
1212
31
  if (version > 1 && version < 5) {
1213
    /* version 2 added safi */
1214
0
    if (((version == 2 || version == 3) && request)||
1215
0
        (version == 4 && (command == FRR_ZAPI4_IPV4_ROUTE_ADD ||
1216
0
              command == FRR_ZAPI4_IPV4_ROUTE_DELETE ||
1217
0
              command == FRR_ZAPI4_IPV6_ROUTE_ADD ||
1218
0
              command == FRR_ZAPI4_IPV6_ROUTE_DELETE))) {
1219
0
      proto_tree_add_item(tree, hf_zebra_route_safi, tvb,
1220
0
              offset, 2, ENC_BIG_ENDIAN);
1221
0
      offset += 2;
1222
0
    }
1223
31
  } else if (version >= 5) {
1224
    /* version 5: safi is 1 byte */
1225
0
    proto_tree_add_item(tree, hf_zebra_route_safi_u8, tvb, offset,
1226
0
            1, ENC_BIG_ENDIAN);
1227
0
    offset += 1;
1228
0
    if ((version == 5 &&rtflags & ZEBRA_FLAG_EVPN_ROUTE) ||
1229
0
        (version > 5 &&rtflags & FRR_ZAPI6_FLAG_EVPN_ROUTE)) {
1230
0
      proto_tree_add_item(tree, hf_zebra_rmac, tvb, offset, 6,
1231
0
              ENC_NA);
1232
0
      offset += 6;
1233
0
    }
1234
0
    family = tvb_get_uint8(tvb, offset);
1235
0
    proto_tree_add_item(tree, hf_zebra_family, tvb, offset, 1,
1236
0
            ENC_BIG_ENDIAN);
1237
0
    offset += 1;
1238
0
  }
1239
1240
31
  prefixlen = tvb_get_uint8(tvb, offset);
1241
31
  proto_tree_add_uint(tree, hf_zebra_prefixlen, tvb,
1242
31
          offset, 1, prefixlen);
1243
31
  offset += 1;
1244
1245
31
  if (family == ZEBRA_FAMILY_IPV6) {
1246
1
    memset(buffer6, '\0', sizeof buffer6);
1247
1
    tvb_memcpy(tvb, buffer6, offset,
1248
1
         MIN((unsigned) PSIZE(prefixlen), sizeof buffer6));
1249
1
    proto_tree_add_ipv6(tree, hf_zebra_prefix6,
1250
1
            tvb, offset, PSIZE(prefixlen), (ws_in6_addr *)buffer6);
1251
30
  } else if (family == ZEBRA_FAMILY_IPV4) {
1252
30
    prefix4 = 0;
1253
30
    tvb_memcpy(tvb, (uint8_t *)&prefix4, offset,
1254
30
         MIN((unsigned) PSIZE(prefixlen), sizeof prefix4));
1255
30
    proto_tree_add_ipv4(tree, hf_zebra_prefix4,
1256
30
            tvb, offset, PSIZE(prefixlen), prefix4);
1257
30
  }
1258
31
  offset += PSIZE(prefixlen);
1259
1260
31
  if ((version == 4 && family == ZEBRA_FAMILY_IPV6 &&
1261
31
       message & FRR_ZAPI4_MESSAGE_SRCPFX) ||
1262
31
      (version > 4 && message & FRR_ZAPI5_MESSAGE_SRCPFX)) {
1263
0
    srcprefixlen = tvb_get_uint8(tvb, offset);
1264
0
    proto_tree_add_uint(tree, hf_zebra_srcprefixlen, tvb, offset, 1,
1265
0
            srcprefixlen);
1266
0
    offset += 1;
1267
1268
0
    if (family == ZEBRA_FAMILY_IPV6) {
1269
0
      memset(srcbuffer6, '\0', sizeof srcbuffer6);
1270
0
      tvb_memcpy(tvb, srcbuffer6, offset,
1271
0
           MIN((unsigned)PSIZE(srcprefixlen),
1272
0
               sizeof srcbuffer6));
1273
0
      proto_tree_add_ipv6(tree, hf_zebra_srcprefix6, tvb,
1274
0
              offset, PSIZE(srcprefixlen),
1275
0
              (ws_in6_addr *)srcbuffer6);
1276
0
    } else if (family == ZEBRA_FAMILY_IPV4) {
1277
0
      prefix4 = 0;
1278
0
      tvb_memcpy(tvb, (uint8_t *)&srcprefix4, offset,
1279
0
           MIN((unsigned)PSIZE(srcprefixlen),
1280
0
               sizeof srcprefix4));
1281
0
      proto_tree_add_ipv4(tree, hf_zebra_srcprefix4, tvb,
1282
0
              offset, PSIZE(srcprefixlen),
1283
0
              srcprefix4);
1284
0
    }
1285
0
    offset += PSIZE(srcprefixlen);
1286
0
  }
1287
1288
31
  if (message & ZEBRA_ZAPI_MESSAGE_NEXTHOP) {
1289
29
    if (version == 4 &&
1290
29
        (command == FRR_ZAPI4_REDISTRIBUTE_IPV4_ADD ||
1291
0
         command == FRR_ZAPI4_REDISTRIBUTE_IPV4_DEL)) {
1292
0
      proto_tree_add_item(tree, hf_zebra_nexthopnum, tvb,
1293
0
              offset, 1, ENC_BIG_ENDIAN);
1294
0
      offset += 1;
1295
0
      proto_tree_add_item(tree, hf_zebra_nexthop4, tvb,
1296
0
              offset, 4, ENC_NA);
1297
0
      offset += 4;
1298
29
    } else if (version == 4 &&
1299
29
         (command == FRR_ZAPI4_REDISTRIBUTE_IPV6_ADD ||
1300
0
          command == FRR_ZAPI4_REDISTRIBUTE_IPV6_DEL)) {
1301
0
      proto_tree_add_item(tree, hf_zebra_nexthopnum, tvb,
1302
0
              offset, 1, ENC_BIG_ENDIAN);
1303
0
      offset += 1;
1304
0
      proto_tree_add_item(tree, hf_zebra_nexthop6, tvb,
1305
0
              offset, 16, ENC_NA);
1306
0
      offset += 16;
1307
29
    } else {
1308
29
      offset = zebra_route_nexthop(tree, request, tvb, offset,
1309
29
                 len, family, version);
1310
29
    }
1311
29
  }
1312
31
  if (version < 5 && message & ZEBRA_ZAPI_MESSAGE_IFINDEX) {
1313
22
    offset = zebra_route_ifindex(tree, tvb, offset, len);
1314
22
  }
1315
31
  if ((version < 5 && message & ZEBRA_ZAPI_MESSAGE_DISTANCE) ||
1316
31
      (version >= 5 && message & FRR_ZAPI5_MESSAGE_DISTANCE)) {
1317
3
    proto_tree_add_item(tree, hf_zebra_distance,
1318
3
            tvb, offset, 1, ENC_BIG_ENDIAN);
1319
3
    offset += 1;
1320
3
  }
1321
31
  if ((version < 5 && message & ZEBRA_ZAPI_MESSAGE_METRIC) ||
1322
31
      (version >= 5 && message & FRR_ZAPI5_MESSAGE_METRIC)) {
1323
4
    proto_tree_add_item(tree, hf_zebra_metric,
1324
4
            tvb, offset, 4, ENC_BIG_ENDIAN);
1325
4
    offset += 4;
1326
4
  }
1327
31
  if ((version < 4 && message & ZEBRA_ZAPI_MESSAGE_MTU) ||
1328
31
      (version == 4 && message & FRR_ZAPI4_MESSAGE_MTU) ||
1329
31
      (version > 4 && message & FRR_ZAPI5_MESSAGE_MTU)) {
1330
3
    proto_tree_add_item(tree, hf_zebra_mtu,
1331
3
            tvb, offset, 4, ENC_BIG_ENDIAN);
1332
3
    offset += 4;
1333
3
  }
1334
31
  if ((version < 4 && message & ZEBRA_ZAPI_MESSAGE_TAG) ||
1335
31
      (version == 4 && message & FRR_ZAPI4_MESSAGE_TAG) ||
1336
31
      (version > 4 && message & FRR_ZAPI5_MESSAGE_TAG)) {
1337
3
    proto_tree_add_item(tree, hf_zebra_tag,
1338
3
            tvb, offset, 4, ENC_BIG_ENDIAN);
1339
3
    offset += 4;
1340
3
  }
1341
31
  if (version > 4 && message & FRR_ZAPI5_MESSAGE_TABLEID) {
1342
0
    proto_tree_add_item(tree, hf_zebra_tableid,
1343
0
            tvb, offset, 4, ENC_BIG_ENDIAN);
1344
0
    offset += 4;
1345
0
  }
1346
31
  return offset;
1347
31
}
1348
1349
static int
1350
zebra_interface_address(proto_tree *tree, tvbuff_t *tvb, int offset)
1351
4
{
1352
4
  uint8_t family;
1353
4
  proto_tree_add_item(tree, hf_zebra_index, tvb,
1354
4
          offset, 4, ENC_BIG_ENDIAN);
1355
4
  offset += 4;
1356
4
  proto_tree_add_item(tree, hf_zebra_flags, tvb,
1357
4
          offset, 1, ENC_BIG_ENDIAN);
1358
4
  offset += 1;
1359
4
  proto_tree_add_item(tree, hf_zebra_family, tvb,
1360
4
          offset, 1, ENC_BIG_ENDIAN);
1361
4
  family = tvb_get_uint8(tvb, offset);
1362
4
  offset += 1;
1363
4
  if (family == ZEBRA_FAMILY_IPV4) {
1364
0
    proto_tree_add_item(tree, hf_zebra_prefix4,
1365
0
            tvb, offset, 4, ENC_BIG_ENDIAN);
1366
0
    offset += 4;
1367
0
  }
1368
4
  else if (family == ZEBRA_FAMILY_IPV6) {
1369
0
    proto_tree_add_item(tree, hf_zebra_prefix6,
1370
0
            tvb, offset, 16, ENC_NA);
1371
0
    offset += 16;
1372
0
  }
1373
4
  else
1374
4
    return offset;
1375
1376
0
  proto_tree_add_item(tree, hf_zebra_prefixlen, tvb,
1377
0
          offset, 1, ENC_BIG_ENDIAN);
1378
0
  offset += 1;
1379
1380
0
  if (family == ZEBRA_FAMILY_IPV4) {
1381
0
    proto_tree_add_item(tree, hf_zebra_dest4,
1382
0
            tvb, offset, 4, ENC_BIG_ENDIAN);
1383
0
    offset += 4;
1384
0
  }
1385
0
  else if (family == ZEBRA_FAMILY_IPV6) {
1386
0
    proto_tree_add_item(tree, hf_zebra_dest6,
1387
0
            tvb, offset, 16, ENC_NA);
1388
0
    offset += 16;
1389
0
  }
1390
0
  return offset;
1391
4
}
1392
1393
static int zebra_hello(proto_tree *tree, tvbuff_t *tvb, int offset, int left,
1394
           uint8_t version)
1395
1
{
1396
1
  proto_tree_add_item(tree, hf_zebra_redist_default, tvb, offset, 1,
1397
1
          ENC_BIG_ENDIAN);
1398
1
  offset += 1;
1399
1
  if (version > 3) {
1400
0
    proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1401
0
            ENC_BIG_ENDIAN);
1402
0
    offset += 2;
1403
0
  }
1404
1405
1
  if (version > 4 && left > offset) {
1406
0
    proto_tree_add_item(tree, hf_zebra_receive_notify, tvb, offset,
1407
0
            1, ENC_BIG_ENDIAN);
1408
0
    offset += 1;
1409
0
  }
1410
1
  return offset;
1411
1
}
1412
1413
static int zebra_redistribute(proto_tree *tree, tvbuff_t *tvb, int offset,
1414
            uint8_t version)
1415
1
{
1416
1
  if (version > 3) {
1417
0
    proto_tree_add_item(tree, hf_zebra_afi, tvb, offset, 1,
1418
0
            ENC_BIG_ENDIAN);
1419
0
    offset += 1;
1420
0
  }
1421
1
  if (version == 0) {
1422
1
    proto_tree_add_item(tree, hf_zebra_type_v0, tvb, offset, 1,
1423
1
            ENC_BIG_ENDIAN);
1424
1
  } else if (version < 4) {
1425
0
    proto_tree_add_item(tree, hf_zebra_type_v1, tvb, offset, 1,
1426
0
            ENC_BIG_ENDIAN);
1427
0
  } else if (version == 4) {
1428
0
    proto_tree_add_item(tree, hf_zebra_type_v4, tvb, offset, 1,
1429
0
            ENC_BIG_ENDIAN);
1430
0
  } else {
1431
0
    proto_tree_add_item(tree, hf_zebra_type_v5, tvb, offset, 1,
1432
0
            ENC_BIG_ENDIAN);
1433
0
  }
1434
1
  offset += 1;
1435
1
  if (version > 3) {
1436
0
    proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1437
0
            ENC_BIG_ENDIAN);
1438
0
    offset += 2;
1439
0
  }
1440
1441
1
  return offset;
1442
1
}
1443
1444
static int zebra_vrf(proto_tree *tree, tvbuff_t *tvb, int offset)
1445
0
{
1446
0
  proto_tree_add_item(tree, hf_zebra_vrf_table_id, tvb, offset, 4,
1447
0
          ENC_BIG_ENDIAN);
1448
0
  offset += 4;
1449
0
  proto_tree_add_item(tree, hf_zebra_vrf_netns_name, tvb, offset, 16,
1450
0
          ENC_ASCII | ENC_NA);
1451
0
  offset += 16;
1452
0
  proto_tree_add_item(tree, hf_zebra_vrf_name, tvb, offset, 36,
1453
0
          ENC_ASCII | ENC_NA);
1454
0
  offset += 36;
1455
0
  return offset;
1456
0
}
1457
1458
static int zebra_label_manager_connect(proto_tree *tree, tvbuff_t *tvb,
1459
               int offset)
1460
0
{
1461
0
  proto_tree_add_item(tree, hf_zebra_proto, tvb, offset, 1,
1462
0
          ENC_BIG_ENDIAN);
1463
0
  offset += 1;
1464
0
  proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1465
0
          ENC_BIG_ENDIAN);
1466
0
  offset += 2;
1467
0
  return offset;
1468
0
}
1469
1470
static int zebra_get_label_chunk(proto_tree *tree, bool request,
1471
         tvbuff_t *tvb, int offset)
1472
0
{
1473
0
  proto_tree_add_item(tree, hf_zebra_proto, tvb, offset, 1,
1474
0
          ENC_BIG_ENDIAN);
1475
0
  offset += 1;
1476
0
  proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1477
0
          ENC_BIG_ENDIAN);
1478
0
  offset += 2;
1479
0
  proto_tree_add_item(tree, hf_zebra_label_chunk_keep, tvb, offset, 1,
1480
0
          ENC_BIG_ENDIAN);
1481
0
  offset += 1;
1482
0
  if (request) {
1483
0
    proto_tree_add_item(tree, hf_zebra_label_chunk_size, tvb,
1484
0
            offset, 4, ENC_BIG_ENDIAN);
1485
0
    offset += 4;
1486
0
  } else {
1487
0
    proto_tree_add_item(tree, hf_zebra_label_chunk_start, tvb,
1488
0
            offset, 4, ENC_BIG_ENDIAN);
1489
0
    offset += 4;
1490
0
    proto_tree_add_item(tree, hf_zebra_label_chunk_end, tvb, offset,
1491
0
            4, ENC_BIG_ENDIAN);
1492
0
    offset += 4;
1493
0
  }
1494
1495
0
  return offset;
1496
0
}
1497
1498
static int zebra_capabilties(proto_tree *tree, tvbuff_t *tvb, int offset)
1499
0
{
1500
0
  proto_tree_add_item(tree, hf_zebra_mpls_enabled, tvb, offset, 1,
1501
0
          ENC_BIG_ENDIAN);
1502
0
  offset += 1;
1503
0
  proto_tree_add_item(tree, hf_zebra_multipath_num, tvb, offset, 4,
1504
0
          ENC_BIG_ENDIAN);
1505
0
  offset += 4;
1506
0
  return offset;
1507
0
}
1508
1509
static int zebra_nexthop_register(proto_tree *tree, tvbuff_t *tvb, int offset,
1510
          uint16_t len, int msg_offset)
1511
0
{
1512
0
  int     init_offset = offset, rest = (int)len - msg_offset;
1513
0
  uint16_t family = ZEBRA_FAMILY_UNSPEC;
1514
0
  while (rest > offset - init_offset) {
1515
0
    proto_tree_add_item(tree, hf_zebra_flags, tvb, offset, 1,
1516
0
            ENC_BIG_ENDIAN);
1517
0
    offset += 1;
1518
0
    family = tvb_get_ntohs(tvb, offset);
1519
0
    proto_tree_add_item(tree, hf_zebra_family, tvb, offset, 2,
1520
0
            ENC_BIG_ENDIAN);
1521
0
    offset += 2;
1522
0
    proto_tree_add_item(tree, hf_zebra_prefixlen, tvb, offset, 1,
1523
0
            ENC_BIG_ENDIAN);
1524
0
    offset += 1;
1525
0
    if (family == ZEBRA_FAMILY_IPV6) {
1526
0
      proto_tree_add_item(tree, hf_zebra_prefix6, tvb, offset,
1527
0
              16, ENC_NA);
1528
0
      offset += 16;
1529
0
    } else if (family == ZEBRA_FAMILY_IPV4) {
1530
0
      proto_tree_add_item(tree, hf_zebra_prefix4, tvb, offset,
1531
0
              4, ENC_BIG_ENDIAN);
1532
0
      offset += 4;
1533
0
    }
1534
0
  }
1535
0
  return offset;
1536
0
}
1537
1538
static int
1539
zebra_interface(proto_tree *tree, tvbuff_t *tvb, int offset,
1540
    uint16_t command, uint8_t version)
1541
0
{
1542
0
  int maclen;
1543
0
  proto_tree_add_item(tree, hf_zebra_interface,
1544
0
          tvb, offset, INTERFACE_NAMSIZ, ENC_ASCII);
1545
0
  offset += INTERFACE_NAMSIZ;
1546
0
  proto_tree_add_item(tree, hf_zebra_index, tvb,
1547
0
          offset, 4, ENC_BIG_ENDIAN);
1548
0
  offset += 4;
1549
0
  proto_tree_add_item(tree, hf_zebra_intstatus, tvb,
1550
0
          offset, 1, ENC_BIG_ENDIAN);
1551
0
  offset += 1;
1552
0
  if (version != 0) {
1553
0
    proto_tree_add_item(tree, hf_zebra_intflags, tvb,
1554
0
            offset, 8, ENC_BIG_ENDIAN);
1555
0
    offset += 8;
1556
0
  } else {
1557
0
    proto_tree_add_item(tree, hf_zebra_intflags, tvb,
1558
0
            offset, 4, ENC_BIG_ENDIAN);
1559
0
    offset += 4;
1560
0
  }
1561
0
  if (version >= 4) {
1562
0
    proto_tree_add_item(tree, hf_zebra_ptmenable, tvb, offset, 1,
1563
0
            ENC_BIG_ENDIAN);
1564
0
    offset += 1;
1565
0
    proto_tree_add_item(tree, hf_zebra_ptmstatus, tvb, offset, 1,
1566
0
            ENC_BIG_ENDIAN);
1567
0
    offset += 1;
1568
0
  }
1569
0
  proto_tree_add_item(tree, hf_zebra_metric, tvb, offset, 4,
1570
0
          ENC_BIG_ENDIAN);
1571
0
  offset += 4;
1572
0
  if (version >= 4) {
1573
0
    proto_tree_add_item(tree, hf_zebra_speed, tvb, offset, 4,
1574
0
            ENC_BIG_ENDIAN);
1575
0
    offset += 4;
1576
0
  }
1577
0
  proto_tree_add_item(tree, hf_zebra_mtu, tvb,
1578
0
          offset, 4, ENC_BIG_ENDIAN);
1579
0
  offset += 4;
1580
0
  if (version != 0) {
1581
0
    proto_tree_add_item(tree, hf_zebra_mtu6, tvb,
1582
0
            offset, 4, ENC_BIG_ENDIAN);
1583
0
    offset += 4;
1584
0
  }
1585
0
  proto_tree_add_item(tree, hf_zebra_bandwidth, tvb,
1586
0
          offset, 4, ENC_BIG_ENDIAN);
1587
0
  offset += 4;
1588
0
  if (version > 2 || (version <= 2 && command == ZEBRA_INTERFACE_ADD)) {
1589
0
    if (version > 2) {
1590
0
      proto_tree_add_item(tree, hf_zebra_lltype, tvb,
1591
0
              offset, 4, ENC_BIG_ENDIAN);
1592
0
      offset += 4;
1593
0
    }
1594
0
    if (version != 0) {
1595
0
      maclen = (int)tvb_get_ntohl(tvb, offset);
1596
0
      proto_tree_add_item(tree, hf_zebra_maclen, tvb,
1597
0
              offset, 4, ENC_BIG_ENDIAN);
1598
0
      offset += 4;
1599
0
      if (maclen > 0)
1600
0
        proto_tree_add_item(tree, hf_zebra_mac, tvb,
1601
0
                offset, maclen, ENC_NA);
1602
0
      offset += maclen;
1603
0
    }
1604
0
    if (version > 2) {
1605
0
      proto_tree_add_item(tree, hf_zebra_haslinkparam, tvb,
1606
0
              offset, 1, ENC_BIG_ENDIAN);
1607
0
      offset += 1;
1608
0
    }
1609
0
  }
1610
0
  return offset;
1611
0
}
1612
1613
static int
1614
zebra_nexthop_lookup(proto_tree *tree, bool request, tvbuff_t *tvb,
1615
         int offset, uint16_t len, uint8_t family, uint8_t version)
1616
1
{
1617
1
  if (family == ZEBRA_FAMILY_IPV6) {
1618
1
    proto_tree_add_item(tree, hf_zebra_dest6, tvb, offset, 16,
1619
1
            ENC_NA);
1620
1
    offset += 16;
1621
1
  }else {
1622
0
    proto_tree_add_item(tree, hf_zebra_dest4, tvb, offset, 4,
1623
0
            ENC_BIG_ENDIAN);
1624
0
    offset += 4;
1625
0
  }
1626
1
  if (!request) {
1627
0
    proto_tree_add_item(tree, hf_zebra_metric,tvb, offset, 4,
1628
0
            ENC_BIG_ENDIAN);
1629
0
    offset += 4;
1630
0
    offset = zebra_route_nexthop(tree, request, tvb, offset, len,
1631
0
               family, version);
1632
0
  }
1633
1
  return offset;
1634
1
}
1635
1636
static int
1637
zerba_router_update(proto_tree *tree, tvbuff_t *tvb, int offset)
1638
0
{
1639
0
  proto_tree_add_item(tree, hf_zebra_routeridfamily, tvb, offset, 1,
1640
0
          ENC_BIG_ENDIAN);
1641
0
  offset += 1;
1642
0
  proto_tree_add_item(tree, hf_zebra_routeridaddress, tvb,
1643
0
          offset, 4, ENC_BIG_ENDIAN);
1644
0
  offset += 4;
1645
0
  proto_tree_add_item(tree, hf_zebra_routeridmask, tvb,
1646
0
          offset, 1, ENC_BIG_ENDIAN);
1647
0
  offset += 1;
1648
0
  return offset;
1649
0
}
1650
1651
static int
1652
zebra_nexthop_update(proto_tree *tree, tvbuff_t *tvb, int offset,
1653
         uint8_t version)
1654
0
{
1655
0
  uint16_t family = tvb_get_ntohs(tvb, offset);
1656
0
  uint8_t prefixlen, nexthopcount, nexthoptype, labelnum;
1657
0
  proto_tree_add_item(tree, hf_zebra_family, tvb, offset, 2,
1658
0
          ENC_BIG_ENDIAN);
1659
0
  offset += 2;
1660
0
  prefixlen = tvb_get_uint8(tvb, offset);
1661
0
  proto_tree_add_uint(tree, hf_zebra_prefixlen, tvb, offset, 1,
1662
0
          prefixlen);
1663
0
  offset += 1;
1664
0
  if (family == ZEBRA_FAMILY_IPV6) {
1665
0
    proto_tree_add_item(tree, hf_zebra_prefix6, tvb, offset, 16,
1666
0
            ENC_NA);
1667
0
    offset += 16;
1668
0
  } else if (family == ZEBRA_FAMILY_IPV4) {
1669
0
    proto_tree_add_item(tree, hf_zebra_prefix4, tvb, offset, 4,
1670
0
            ENC_BIG_ENDIAN);
1671
0
    offset += 4;
1672
0
  }
1673
1674
0
  if (version > 4) {
1675
0
    proto_tree_add_item(tree, hf_zebra_type_v5, tvb, offset, 1,
1676
0
            ENC_BIG_ENDIAN);
1677
0
    offset += 1;
1678
0
  }
1679
1680
0
  if (version > 4) {
1681
0
    proto_tree_add_item(tree, hf_zebra_instance, tvb, offset, 2,
1682
0
            ENC_BIG_ENDIAN);
1683
0
    offset += 2;
1684
0
  }
1685
0
  if (version > 3) {
1686
0
    proto_tree_add_item(tree, hf_zebra_distance, tvb, offset, 1,
1687
0
            ENC_BIG_ENDIAN);
1688
0
    offset += 1;
1689
0
  }
1690
1691
0
  proto_tree_add_item(tree, hf_zebra_metric, tvb, offset, 4,
1692
0
          ENC_BIG_ENDIAN);
1693
0
  offset += 4;
1694
1695
0
  nexthopcount = tvb_get_uint8(tvb, offset);
1696
0
  proto_tree_add_uint(tree, hf_zebra_nexthopnum, tvb, offset, 1,
1697
0
          nexthopcount);
1698
0
  offset += 1;
1699
1700
0
  while (nexthopcount--) {
1701
0
    nexthoptype = tvb_get_uint8(tvb, offset);
1702
0
    if (version > 3) {
1703
0
      proto_tree_add_item(tree, hf_zebra_nexthoptype_frr, tvb,
1704
0
              offset, 1, ENC_BIG_ENDIAN);
1705
0
    } else {
1706
0
      proto_tree_add_item(tree, hf_zebra_nexthoptype, tvb,
1707
0
              offset, 1, ENC_BIG_ENDIAN);
1708
0
    }
1709
0
    offset += 1;
1710
1711
0
    if ((version < 4 &&
1712
0
         (nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6 ||
1713
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX ||
1714
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME)) ||
1715
0
        (version >= 4 &&
1716
0
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV6 ||
1717
0
          nexthoptype == FRR_NEXTHOP_TYPE_IPV6_IFINDEX))) {
1718
0
      proto_tree_add_item(tree, hf_zebra_nexthop6, tvb,
1719
0
              offset, 16, ENC_NA);
1720
0
      offset += 16;
1721
0
    }
1722
0
    if ((version < 4 &&
1723
0
         (nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4 ||
1724
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX ||
1725
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME)) ||
1726
0
        (version >= 4 &&
1727
0
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV4 ||
1728
0
          nexthoptype == FRR_NEXTHOP_TYPE_IPV4_IFINDEX))) {
1729
0
      proto_tree_add_item(tree, hf_zebra_nexthop4, tvb,
1730
0
              offset, 4, ENC_NA);
1731
0
      offset += 4;
1732
0
    }
1733
0
    if (nexthoptype == ZEBRA_NEXTHOP_TYPE_IFINDEX ||
1734
0
        (version < 4 &&
1735
0
         (nexthoptype == ZEBRA_NEXTHOP_TYPE_IFNAME ||
1736
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFINDEX ||
1737
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV4_IFNAME ||
1738
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFINDEX ||
1739
0
          nexthoptype == ZEBRA_NEXTHOP_TYPE_IPV6_IFNAME)) ||
1740
0
        (version >= 4 &&
1741
0
         (nexthoptype == FRR_NEXTHOP_TYPE_IPV4 ||
1742
0
          nexthoptype == FRR_NEXTHOP_TYPE_IPV4_IFINDEX ||
1743
0
          nexthoptype == FRR_NEXTHOP_TYPE_IPV6 ||
1744
0
          nexthoptype == FRR_NEXTHOP_TYPE_IPV6_IFINDEX))) {
1745
0
      proto_tree_add_item(tree, hf_zebra_index, tvb, offset,
1746
0
              4, ENC_BIG_ENDIAN);
1747
0
      offset += 4;
1748
0
    }
1749
0
    if (version > 4) {
1750
0
      labelnum = tvb_get_uint8(tvb, offset);
1751
0
      proto_tree_add_uint(tree, hf_zebra_labelnum, tvb,
1752
0
              offset, 1, labelnum);
1753
0
      offset += 1;
1754
0
      while (labelnum--) {
1755
0
        proto_tree_add_item(tree, hf_zebra_label, tvb,
1756
0
                offset, 4, ENC_BIG_ENDIAN);
1757
0
        offset += 4;
1758
0
      }
1759
0
    }
1760
0
  }
1761
0
  return offset;
1762
0
}
1763
1764
static int
1765
dissect_zebra_request(proto_tree *tree, bool request, tvbuff_t *tvb,
1766
          int offset, int left, uint16_t len, uint16_t command,
1767
          uint8_t version)
1768
49
{
1769
49
  int init_offset = offset;
1770
49
  proto_tree_add_uint(tree, hf_zebra_len, tvb, offset, 2, len);
1771
49
  offset += 2;
1772
49
  if (version != 0) {
1773
0
    proto_tree_add_item(tree, hf_zebra_marker, tvb, offset, 1, ENC_NA);
1774
0
    offset += 1;
1775
0
    proto_tree_add_uint(tree, hf_zebra_version, tvb, offset, 1,
1776
0
            version);
1777
0
    offset += 1;
1778
0
    if (version == 3 || version == 4) {
1779
0
      proto_tree_add_item(tree, hf_zebra_vrfid, tvb, offset,
1780
0
              2, ENC_BIG_ENDIAN);
1781
0
      offset += 2;
1782
0
    } else if (version > 4) {
1783
0
      proto_tree_add_item(tree, hf_zebra_vrfid, tvb, offset,
1784
0
              4, ENC_BIG_ENDIAN);
1785
0
      offset += 4;
1786
0
    }
1787
0
    if (version < 4) {
1788
0
      proto_tree_add_uint(tree, hf_zebra_command, tvb, offset,
1789
0
              2, command);
1790
0
    } else if (version == 4) {
1791
0
      proto_tree_add_uint(tree, hf_zebra_command_v4, tvb,
1792
0
              offset, 2, command);
1793
0
    } else if (version == 5) {
1794
0
      proto_tree_add_uint(tree, hf_zebra_command_v5, tvb,
1795
0
              offset, 2, command);
1796
0
    } else {
1797
0
      proto_tree_add_uint(tree, hf_zebra_command_v6, tvb,
1798
0
              offset, 2, command);
1799
0
    }
1800
0
    offset += 2;
1801
49
  } else {
1802
49
    proto_tree_add_uint(tree, hf_zebra_command, tvb, offset, 1,
1803
49
            command);
1804
49
    offset += 1;
1805
49
  }
1806
1807
49
  if (version < 4) {
1808
49
    switch (command) {
1809
1
    case ZEBRA_INTERFACE_ADD:
1810
2
    case ZEBRA_INTERFACE_DELETE:
1811
3
    case ZEBRA_INTERFACE_UP:
1812
5
    case ZEBRA_INTERFACE_DOWN:
1813
5
      if (request)
1814
5
        break; /* Request just subscribes to messages */
1815
0
      offset = zebra_interface(tree, tvb, offset, command,
1816
0
             version);
1817
0
      break;
1818
3
    case ZEBRA_INTERFACE_ADDRESS_ADD:
1819
4
    case ZEBRA_INTERFACE_ADDRESS_DELETE:
1820
4
      offset = zebra_interface_address(tree, tvb, offset);
1821
4
      break;
1822
30
    case ZEBRA_IPV4_ROUTE_ADD:
1823
30
    case ZEBRA_IPV4_ROUTE_DELETE:
1824
30
      offset = zebra_route(tree, request, tvb, offset, len,
1825
30
               ZEBRA_FAMILY_IPV4, command, version);
1826
30
      break;
1827
1
    case ZEBRA_IPV6_ROUTE_ADD:
1828
1
    case ZEBRA_IPV6_ROUTE_DELETE:
1829
1
      offset = zebra_route(tree, request, tvb, offset, len,
1830
1
               ZEBRA_FAMILY_IPV6, command, version);
1831
1
      break;
1832
0
    case ZEBRA_REDISTRIBUTE_ADD:
1833
1
    case ZEBRA_REDISTRIBUTE_DEFAULT_ADD:
1834
1
      offset = zebra_redistribute(tree, tvb, offset, version);
1835
1
      break;
1836
0
    case ZEBRA_IPV4_IMPORT_LOOKUP:
1837
0
    case ZEBRA_IPV4_NEXTHOP_LOOKUP:
1838
0
      offset = zebra_nexthop_lookup(tree, request, tvb,
1839
0
                  offset, len,
1840
0
                  ZEBRA_FAMILY_IPV4,
1841
0
                  version);
1842
0
      break;
1843
0
    case ZEBRA_IPV6_IMPORT_LOOKUP:
1844
1
    case ZEBRA_IPV6_NEXTHOP_LOOKUP:
1845
1
      offset = zebra_nexthop_lookup(tree, request, tvb,
1846
1
                  offset, len,
1847
1
                  ZEBRA_FAMILY_IPV6,
1848
1
                  version);
1849
1
      break;
1850
0
    case ZEBRA_ROUTER_ID_UPDATE:
1851
0
      offset = zerba_router_update(tree, tvb, offset);
1852
0
      break;
1853
0
    case ZEBRA_ROUTER_ID_ADD:
1854
0
    case ZEBRA_ROUTER_ID_DELETE:
1855
0
    case ZEBRA_REDISTRIBUTE_DEFAULT_DELETE:
1856
      /* nothing to do */
1857
0
      break;
1858
1
    case ZEBRA_REDISTRIBUTE_DELETE:
1859
      /* in version 1+, there's a route type field */
1860
1
      if (version > 0) {
1861
0
        proto_tree_add_item(tree, hf_zebra_type_v1, tvb,
1862
0
                offset, 1, ENC_BIG_ENDIAN);
1863
0
      }
1864
1
      break;
1865
1
    case ZEBRA_HELLO:
1866
1
      offset = zebra_hello(tree, tvb, offset, left, version);
1867
1
      break;
1868
0
    case ZEBRA_IPV4_NEXTHOP_LOOKUP_MRIB:
1869
0
    case ZEBRA_VRF_UNREGISTER:
1870
0
    case ZEBRA_INTERFACE_LINK_PARAMS:
1871
0
      break;
1872
0
    case ZEBRA_NEXTHOP_REGISTER:
1873
0
    case ZEBRA_NEXTHOP_UNREGISTER:
1874
0
      offset = zebra_nexthop_register(tree, tvb, offset, len,
1875
0
              offset - init_offset);
1876
0
      break;
1877
0
    case ZEBRA_NEXTHOP_UPDATE:
1878
0
      offset = zebra_nexthop_update(tree, tvb, offset, version);
1879
0
      break;
1880
49
    }
1881
49
  } else if (version == 4) {
1882
0
    switch (command) {
1883
0
    case FRR_ZAPI4_INTERFACE_ADD:
1884
0
    case FRR_ZAPI4_INTERFACE_UP:
1885
0
    case FRR_ZAPI4_INTERFACE_DOWN:
1886
0
    case FRR_ZAPI4_INTERFACE_DELETE:
1887
0
      if (request)
1888
0
        break; /* Request just subscribes to messages */
1889
0
      offset = zebra_interface(tree, tvb, offset, command,
1890
0
             version);
1891
0
      break;
1892
0
    case FRR_ZAPI4_INTERFACE_ADDRESS_ADD:
1893
0
    case FRR_ZAPI4_INTERFACE_ADDRESS_DELETE:
1894
0
      offset = zebra_interface_address(tree, tvb, offset);
1895
0
      break;
1896
0
    case FRR_ZAPI4_IPV4_ROUTE_ADD:
1897
0
    case FRR_ZAPI4_IPV4_ROUTE_DELETE:
1898
0
    case FRR_ZAPI4_REDISTRIBUTE_IPV4_ADD:
1899
0
    case FRR_ZAPI4_REDISTRIBUTE_IPV4_DEL:
1900
0
      offset = zebra_route(tree, request, tvb, offset, len,
1901
0
               ZEBRA_FAMILY_IPV4, command,
1902
0
               version);
1903
0
      break;
1904
0
    case FRR_ZAPI4_IPV6_ROUTE_ADD:
1905
0
    case FRR_ZAPI4_IPV6_ROUTE_DELETE:
1906
0
    case FRR_ZAPI4_REDISTRIBUTE_IPV6_ADD:
1907
0
    case FRR_ZAPI4_REDISTRIBUTE_IPV6_DEL:
1908
0
      offset = zebra_route(tree, request, tvb, offset, len,
1909
0
               ZEBRA_FAMILY_IPV6, command,
1910
0
               version);
1911
0
      break;
1912
0
    case FRR_ZAPI4_REDISTRIBUTE_ADD:
1913
0
    case FRR_ZAPI4_REDISTRIBUTE_DEFAULT_ADD:
1914
0
      offset = zebra_redistribute(tree, tvb, offset, version);
1915
0
      break;
1916
0
    case FRR_ZAPI4_ROUTER_ID_UPDATE:
1917
0
      offset = zerba_router_update(tree, tvb, offset);
1918
0
      break;
1919
0
    case FRR_ZAPI4_ROUTER_ID_ADD:
1920
0
    case FRR_ZAPI4_ROUTER_ID_DELETE:
1921
0
    case FRR_ZAPI4_REDISTRIBUTE_DEFAULT_DELETE:
1922
      /* nothing to do */
1923
0
      break;
1924
0
    case FRR_ZAPI4_REDISTRIBUTE_DELETE:
1925
0
      proto_tree_add_item(tree, hf_zebra_type_v4, tvb, offset,
1926
0
              1, ENC_BIG_ENDIAN);
1927
0
      offset += 1;
1928
0
      break;
1929
0
    case FRR_ZAPI4_HELLO:
1930
0
      offset = zebra_hello(tree, tvb, offset, left, version);
1931
0
      break;
1932
0
    case FRR_ZAPI4_NEXTHOP_REGISTER:
1933
0
    case FRR_ZAPI4_NEXTHOP_UNREGISTER:
1934
0
      offset = zebra_nexthop_register(tree, tvb, offset, len,
1935
0
              offset - init_offset);
1936
0
      break;
1937
0
    case FRR_ZAPI4_NEXTHOP_UPDATE:
1938
0
      offset = zebra_nexthop_update(tree, tvb, offset,
1939
0
                  version);
1940
0
      break;
1941
0
    case FRR_ZAPI4_INTERFACE_NBR_ADDRESS_ADD:
1942
0
    case FRR_ZAPI4_INTERFACE_NBR_ADDRESS_DELETE:
1943
0
    case FRR_ZAPI4_INTERFACE_BFD_DEST_UPDATE:
1944
0
    case FRR_ZAPI4_IMPORT_ROUTE_REGISTER:
1945
0
    case FRR_ZAPI4_IMPORT_ROUTE_UNREGISTER:
1946
0
    case FRR_ZAPI4_IMPORT_CHECK_UPDATE:
1947
0
    case FRR_ZAPI4_IPV4_ROUTE_IPV6_NEXTHOP_ADD:
1948
0
    case FRR_ZAPI4_BFD_DEST_REGISTER:
1949
0
    case FRR_ZAPI4_BFD_DEST_DEREGISTER:
1950
0
    case FRR_ZAPI4_BFD_DEST_UPDATE:
1951
0
    case FRR_ZAPI4_BFD_DEST_REPLAY:
1952
0
    case FRR_ZAPI4_VRF_UNREGISTER:
1953
0
    case FRR_ZAPI4_VRF_ADD:
1954
0
    case FRR_ZAPI4_VRF_DELETE:
1955
0
    case FRR_ZAPI4_INTERFACE_VRF_UPDATE:
1956
0
      break;
1957
0
    case FRR_ZAPI4_BFD_CLIENT_REGISTER:
1958
0
      proto_tree_add_item(tree, hf_zebra_pid, tvb, offset, 4,
1959
0
              ENC_BIG_ENDIAN);
1960
0
      offset += 4;
1961
0
      break;
1962
0
    case FRR_ZAPI4_INTERFACE_ENABLE_RADV:
1963
0
    case FRR_ZAPI4_INTERFACE_DISABLE_RADV:
1964
0
    case FRR_ZAPI4_IPV4_NEXTHOP_LOOKUP_MRIB:
1965
0
    case FRR_ZAPI4_INTERFACE_LINK_PARAMS:
1966
0
    case FRR_ZAPI4_MPLS_LABELS_ADD:
1967
0
    case FRR_ZAPI4_MPLS_LABELS_DELETE:
1968
0
    case FRR_ZAPI4_IPV4_NEXTHOP_ADD:
1969
0
    case FRR_ZAPI4_IPV4_NEXTHOP_DELETE:
1970
0
    case FRR_ZAPI4_IPV6_NEXTHOP_ADD:
1971
0
    case FRR_ZAPI4_IPV6_NEXTHOP_DELETE:
1972
0
    case FRR_ZAPI4_IPMR_ROUTE_STATS:
1973
0
    case FRR_ZAPI4_LABEL_MANAGER_CONNECT:
1974
0
    case FRR_ZAPI4_GET_LABEL_CHUNK:
1975
0
    case FRR_ZAPI4_RELEASE_LABEL_CHUNK:
1976
0
    case FRR_ZAPI4_PW_ADD:
1977
0
    case FRR_ZAPI4_PW_DELETE:
1978
0
    case FRR_ZAPI4_PW_SET:
1979
0
    case FRR_ZAPI4_PW_UNSET:
1980
0
    case FRR_ZAPI4_PW_STATUS_UPDATE:
1981
0
      break;
1982
0
    }
1983
0
  } else if (version == 5) {
1984
0
    switch (command) {
1985
0
    case FRR_ZAPI5_INTERFACE_ADD:
1986
0
    case FRR_ZAPI5_INTERFACE_UP:
1987
0
    case FRR_ZAPI5_INTERFACE_DOWN:
1988
0
    case FRR_ZAPI5_INTERFACE_DELETE:
1989
0
      if (request)
1990
0
        break; /* Request just subscribes to messages */
1991
0
      offset = zebra_interface(tree, tvb, offset, command,
1992
0
             version);
1993
0
      break;
1994
0
    case FRR_ZAPI5_INTERFACE_ADDRESS_ADD:
1995
0
    case FRR_ZAPI5_INTERFACE_ADDRESS_DELETE:
1996
0
      offset = zebra_interface_address(tree, tvb, offset);
1997
0
      break;
1998
0
    case FRR_ZAPI5_IPV4_ROUTE_ADD:
1999
0
    case FRR_ZAPI5_IPV4_ROUTE_DELETE:
2000
0
      offset = zebra_route(tree, request, tvb, offset, len,
2001
0
               ZEBRA_FAMILY_IPV4, command,
2002
0
               version);
2003
0
      break;
2004
0
    case FRR_ZAPI5_IPV6_ROUTE_ADD:
2005
0
    case FRR_ZAPI5_IPV6_ROUTE_DELETE:
2006
0
      offset = zebra_route(tree, request, tvb, offset, len,
2007
0
               ZEBRA_FAMILY_IPV6, command,
2008
0
               version);
2009
0
      break;
2010
0
    case FRR_ZAPI5_ROUTE_ADD:
2011
0
    case FRR_ZAPI5_ROUTE_DELETE:
2012
0
    case FRR_ZAPI5_REDISTRIBUTE_ROUTE_ADD:
2013
0
    case FRR_ZAPI5_REDISTRIBUTE_ROUTE_DEL:
2014
0
      offset = zebra_route(tree, request, tvb, offset, len,
2015
0
               ZEBRA_FAMILY_UNSPEC, command,
2016
0
               version);
2017
0
      break;
2018
0
    case FRR_ZAPI5_REDISTRIBUTE_ADD:
2019
0
    case FRR_ZAPI5_REDISTRIBUTE_DEFAULT_ADD:
2020
0
      offset = zebra_redistribute(tree, tvb, offset, version);
2021
0
      break;
2022
0
    case FRR_ZAPI5_ROUTER_ID_UPDATE:
2023
0
      offset = zerba_router_update(tree, tvb, offset);
2024
0
      break;
2025
0
    case FRR_ZAPI5_ROUTER_ID_ADD:
2026
0
    case FRR_ZAPI5_ROUTER_ID_DELETE:
2027
0
    case FRR_ZAPI5_REDISTRIBUTE_DEFAULT_DELETE:
2028
      /* nothing to do */
2029
0
      break;
2030
0
    case FRR_ZAPI5_REDISTRIBUTE_DELETE:
2031
0
      proto_tree_add_item(tree, hf_zebra_type_v5, tvb, offset,
2032
0
              1, ENC_BIG_ENDIAN);
2033
0
      offset += 1;
2034
0
      break;
2035
0
    case FRR_ZAPI5_HELLO:
2036
0
      offset = zebra_hello(tree, tvb, offset, left, version);
2037
0
      break;
2038
0
    case FRR_ZAPI5_CAPABILITIES:
2039
0
      offset = zebra_capabilties(tree, tvb, offset);
2040
0
      break;
2041
0
    case FRR_ZAPI5_NEXTHOP_REGISTER:
2042
0
    case FRR_ZAPI5_NEXTHOP_UNREGISTER:
2043
0
      offset = zebra_nexthop_register(tree, tvb, offset, len,
2044
0
              offset - init_offset);
2045
0
      break;
2046
0
    case FRR_ZAPI5_NEXTHOP_UPDATE:
2047
0
      offset = zebra_nexthop_update(tree, tvb, offset,
2048
0
                  version);
2049
0
      break;
2050
0
    case FRR_ZAPI5_INTERFACE_NBR_ADDRESS_ADD:
2051
0
    case FRR_ZAPI5_INTERFACE_NBR_ADDRESS_DELETE:
2052
0
    case FRR_ZAPI5_INTERFACE_BFD_DEST_UPDATE:
2053
0
    case FRR_ZAPI5_IMPORT_ROUTE_REGISTER:
2054
0
    case FRR_ZAPI5_IMPORT_ROUTE_UNREGISTER:
2055
0
    case FRR_ZAPI5_IMPORT_CHECK_UPDATE:
2056
0
    case FRR_ZAPI5_IPV4_ROUTE_IPV6_NEXTHOP_ADD:
2057
0
    case FRR_ZAPI5_BFD_DEST_REGISTER:
2058
0
    case FRR_ZAPI5_BFD_DEST_DEREGISTER:
2059
0
    case FRR_ZAPI5_BFD_DEST_UPDATE:
2060
0
    case FRR_ZAPI5_BFD_DEST_REPLAY:
2061
0
    case FRR_ZAPI5_VRF_UNREGISTER:
2062
0
      break;
2063
0
    case FRR_ZAPI5_VRF_ADD:
2064
0
      offset = zebra_vrf(tree, tvb, offset);
2065
0
      break;
2066
0
    case FRR_ZAPI5_VRF_DELETE:
2067
0
    case FRR_ZAPI5_VRF_LABEL:
2068
0
    case FRR_ZAPI5_INTERFACE_VRF_UPDATE:
2069
0
      break;
2070
0
    case FRR_ZAPI5_BFD_CLIENT_REGISTER:
2071
0
      proto_tree_add_item(tree, hf_zebra_pid, tvb, offset, 4,
2072
0
              ENC_BIG_ENDIAN);
2073
0
      offset += 4;
2074
0
      break;
2075
0
    case FRR_ZAPI5_INTERFACE_ENABLE_RADV:
2076
0
    case FRR_ZAPI5_INTERFACE_DISABLE_RADV:
2077
0
    case FRR_ZAPI5_IPV4_NEXTHOP_LOOKUP_MRIB:
2078
0
    case FRR_ZAPI5_INTERFACE_LINK_PARAMS:
2079
0
    case FRR_ZAPI5_MPLS_LABELS_ADD:
2080
0
    case FRR_ZAPI5_MPLS_LABELS_DELETE:
2081
0
    case FRR_ZAPI5_IPMR_ROUTE_STATS:
2082
0
      break;
2083
0
    case FRR_ZAPI5_LABEL_MANAGER_CONNECT:
2084
0
    case FRR_ZAPI5_LABEL_MANAGER_CONNECT_ASYNC:
2085
0
      offset = zebra_label_manager_connect(tree, tvb, offset);
2086
0
      break;
2087
0
    case FRR_ZAPI5_GET_LABEL_CHUNK:
2088
0
      offset =
2089
0
          zebra_get_label_chunk(tree, request, tvb, offset);
2090
0
      break;
2091
0
    case FRR_ZAPI5_RELEASE_LABEL_CHUNK:
2092
0
    case FRR_ZAPI5_FEC_REGISTER:
2093
0
    case FRR_ZAPI5_FEC_UNREGISTER:
2094
0
    case FRR_ZAPI5_FEC_UPDATE:
2095
0
    case FRR_ZAPI5_ADVERTISE_DEFAULT_GW:
2096
0
    case FRR_ZAPI5_ADVERTISE_SUBNET:
2097
0
    case FRR_ZAPI5_ADVERTISE_ALL_VNI:
2098
0
    case FRR_ZAPI5_VNI_ADD:
2099
0
    case FRR_ZAPI5_VNI_DEL:
2100
0
    case FRR_ZAPI5_L3VNI_ADD:
2101
0
    case FRR_ZAPI5_L3VNI_DEL:
2102
0
    case FRR_ZAPI5_REMOTE_VTEP_ADD:
2103
0
    case FRR_ZAPI5_REMOTE_VTEP_DEL:
2104
0
    case FRR_ZAPI5_MACIP_ADD:
2105
0
    case FRR_ZAPI5_MACIP_DEL:
2106
0
    case FRR_ZAPI5_IP_PREFIX_ROUTE_ADD:
2107
0
    case FRR_ZAPI5_IP_PREFIX_ROUTE_DEL:
2108
0
    case FRR_ZAPI5_REMOTE_MACIP_ADD:
2109
0
    case FRR_ZAPI5_REMOTE_MACIP_DEL:
2110
0
    case FRR_ZAPI5_PW_ADD:
2111
0
    case FRR_ZAPI5_PW_DELETE:
2112
0
    case FRR_ZAPI5_PW_SET:
2113
0
    case FRR_ZAPI5_PW_UNSET:
2114
0
    case FRR_ZAPI5_PW_STATUS_UPDATE:
2115
0
    case FRR_ZAPI5_RULE_ADD:
2116
0
    case FRR_ZAPI5_RULE_DELETE:
2117
0
    case FRR_ZAPI5_RULE_NOTIFY_OWNER:
2118
0
    case FRR_ZAPI5_TABLE_MANAGER_CONNECT:
2119
0
    case FRR_ZAPI5_GET_TABLE_CHUNK:
2120
0
    case FRR_ZAPI5_RELEASE_TABLE_CHUNK:
2121
0
    case FRR_ZAPI5_IPSET_CREATE:
2122
0
    case FRR_ZAPI5_IPSET_DESTROY:
2123
0
    case FRR_ZAPI5_IPSET_ENTRY_ADD:
2124
0
    case FRR_ZAPI5_IPSET_ENTRY_DELETE:
2125
0
    case FRR_ZAPI5_IPSET_NOTIFY_OWNER:
2126
0
    case FRR_ZAPI5_IPSET_ENTRY_NOTIFY_OWNER:
2127
0
    case FRR_ZAPI5_IPTABLE_ADD:
2128
0
    case FRR_ZAPI5_IPTABLE_DELETE:
2129
0
    case FRR_ZAPI5_IPTABLE_NOTIFY_OWNER:
2130
0
      break;
2131
0
    }
2132
0
  } else { /* version 6 */
2133
0
    switch (command) {
2134
0
    case FRR_ZAPI6_INTERFACE_ADD:
2135
0
    case FRR_ZAPI6_INTERFACE_UP:
2136
0
    case FRR_ZAPI6_INTERFACE_DOWN:
2137
0
    case FRR_ZAPI6_INTERFACE_DELETE:
2138
0
      if (request)
2139
0
        break; /* Request just subscribes to messages */
2140
0
      offset = zebra_interface(tree, tvb, offset, command,
2141
0
             version);
2142
0
      break;
2143
0
    case FRR_ZAPI6_INTERFACE_ADDRESS_ADD:
2144
0
    case FRR_ZAPI6_INTERFACE_ADDRESS_DELETE:
2145
0
      offset = zebra_interface_address(tree, tvb, offset);
2146
0
      break;
2147
0
    case FRR_ZAPI6_ROUTE_ADD:
2148
0
    case FRR_ZAPI6_ROUTE_DELETE:
2149
0
    case FRR_ZAPI6_REDISTRIBUTE_ROUTE_ADD:
2150
0
    case FRR_ZAPI6_REDISTRIBUTE_ROUTE_DEL:
2151
0
      offset = zebra_route(tree, request, tvb, offset, len,
2152
0
               ZEBRA_FAMILY_UNSPEC, command,
2153
0
               version);
2154
0
      break;
2155
0
    case FRR_ZAPI6_REDISTRIBUTE_ADD:
2156
0
    case FRR_ZAPI6_REDISTRIBUTE_DEFAULT_ADD:
2157
0
      offset = zebra_redistribute(tree, tvb, offset, version);
2158
0
      break;
2159
0
    case FRR_ZAPI6_ROUTER_ID_UPDATE:
2160
0
      offset = zerba_router_update(tree, tvb, offset);
2161
0
      break;
2162
0
    case FRR_ZAPI6_ROUTER_ID_ADD:
2163
0
    case FRR_ZAPI6_ROUTER_ID_DELETE:
2164
0
    case FRR_ZAPI6_REDISTRIBUTE_DEFAULT_DELETE:
2165
      /* nothing to do */
2166
0
      break;
2167
0
    case FRR_ZAPI6_REDISTRIBUTE_DELETE:
2168
0
      proto_tree_add_item(tree, hf_zebra_type_v5, tvb, offset,
2169
0
              1, ENC_BIG_ENDIAN);
2170
0
      offset += 1;
2171
0
      break;
2172
0
    case FRR_ZAPI6_HELLO:
2173
0
      offset = zebra_hello(tree, tvb, offset, left, version);
2174
0
      break;
2175
0
    case FRR_ZAPI6_CAPABILITIES:
2176
0
      offset = zebra_capabilties(tree, tvb, offset);
2177
0
      break;
2178
0
    case FRR_ZAPI6_NEXTHOP_REGISTER:
2179
0
    case FRR_ZAPI6_NEXTHOP_UNREGISTER:
2180
0
      offset = zebra_nexthop_register(tree, tvb, offset, len,
2181
0
              offset - init_offset);
2182
0
      break;
2183
0
    case FRR_ZAPI6_NEXTHOP_UPDATE:
2184
0
      offset = zebra_nexthop_update(tree, tvb, offset,
2185
0
                  version);
2186
0
      break;
2187
0
    case FRR_ZAPI6_INTERFACE_NBR_ADDRESS_ADD:
2188
0
    case FRR_ZAPI6_INTERFACE_NBR_ADDRESS_DELETE:
2189
0
    case FRR_ZAPI6_INTERFACE_BFD_DEST_UPDATE:
2190
0
    case FRR_ZAPI6_IMPORT_ROUTE_REGISTER:
2191
0
    case FRR_ZAPI6_IMPORT_ROUTE_UNREGISTER:
2192
0
    case FRR_ZAPI6_IMPORT_CHECK_UPDATE:
2193
    //case FRR_ZAPI6_IPV4_ROUTE_IPV6_NEXTHOP_ADD:
2194
0
    case FRR_ZAPI6_BFD_DEST_REGISTER:
2195
0
    case FRR_ZAPI6_BFD_DEST_DEREGISTER:
2196
0
    case FRR_ZAPI6_BFD_DEST_UPDATE:
2197
0
    case FRR_ZAPI6_BFD_DEST_REPLAY:
2198
0
    case FRR_ZAPI6_VRF_UNREGISTER:
2199
0
      break;
2200
0
    case FRR_ZAPI6_VRF_ADD:
2201
0
      offset = zebra_vrf(tree, tvb, offset);
2202
0
      break;
2203
0
    case FRR_ZAPI6_VRF_DELETE:
2204
0
    case FRR_ZAPI6_VRF_LABEL:
2205
0
    case FRR_ZAPI6_INTERFACE_VRF_UPDATE:
2206
0
      break;
2207
0
    case FRR_ZAPI6_BFD_CLIENT_REGISTER:
2208
0
      proto_tree_add_item(tree, hf_zebra_pid, tvb, offset, 4,
2209
0
              ENC_BIG_ENDIAN);
2210
0
      offset += 4;
2211
0
      break;
2212
0
    case FRR_ZAPI6_BFD_CLIENT_DEREGISTER:
2213
0
    case FRR_ZAPI6_INTERFACE_ENABLE_RADV:
2214
0
    case FRR_ZAPI6_INTERFACE_DISABLE_RADV:
2215
0
    case FRR_ZAPI6_IPV4_NEXTHOP_LOOKUP_MRIB:
2216
0
    case FRR_ZAPI6_INTERFACE_LINK_PARAMS:
2217
0
    case FRR_ZAPI6_MPLS_LABELS_ADD:
2218
0
    case FRR_ZAPI6_MPLS_LABELS_DELETE:
2219
0
    case FRR_ZAPI6_IPMR_ROUTE_STATS:
2220
0
      break;
2221
0
    case FRR_ZAPI6_LABEL_MANAGER_CONNECT:
2222
0
    case FRR_ZAPI6_LABEL_MANAGER_CONNECT_ASYNC:
2223
0
      offset = zebra_label_manager_connect(tree, tvb, offset);
2224
0
      break;
2225
0
    case FRR_ZAPI6_GET_LABEL_CHUNK:
2226
0
      offset =
2227
0
          zebra_get_label_chunk(tree, request, tvb, offset);
2228
0
      break;
2229
0
    case FRR_ZAPI6_RELEASE_LABEL_CHUNK:
2230
0
    case FRR_ZAPI6_FEC_REGISTER:
2231
0
    case FRR_ZAPI6_FEC_UNREGISTER:
2232
0
    case FRR_ZAPI6_FEC_UPDATE:
2233
0
    case FRR_ZAPI6_ADVERTISE_DEFAULT_GW:
2234
0
    case FRR_ZAPI6_ADVERTISE_SUBNET:
2235
0
    case FRR_ZAPI6_ADVERTISE_ALL_VNI:
2236
0
    case FRR_ZAPI6_LOCAL_ES_ADD:
2237
0
    case FRR_ZAPI6_LOCAL_ES_DEL:
2238
0
    case FRR_ZAPI6_VNI_ADD:
2239
0
    case FRR_ZAPI6_VNI_DEL:
2240
0
    case FRR_ZAPI6_L3VNI_ADD:
2241
0
    case FRR_ZAPI6_L3VNI_DEL:
2242
0
    case FRR_ZAPI6_REMOTE_VTEP_ADD:
2243
0
    case FRR_ZAPI6_REMOTE_VTEP_DEL:
2244
0
    case FRR_ZAPI6_MACIP_ADD:
2245
0
    case FRR_ZAPI6_MACIP_DEL:
2246
0
    case FRR_ZAPI6_IP_PREFIX_ROUTE_ADD:
2247
0
    case FRR_ZAPI6_IP_PREFIX_ROUTE_DEL:
2248
0
    case FRR_ZAPI6_REMOTE_MACIP_ADD:
2249
0
    case FRR_ZAPI6_REMOTE_MACIP_DEL:
2250
0
    case FRR_ZAPI6_PW_ADD:
2251
0
    case FRR_ZAPI6_PW_DELETE:
2252
0
    case FRR_ZAPI6_PW_SET:
2253
0
    case FRR_ZAPI6_PW_UNSET:
2254
0
    case FRR_ZAPI6_PW_STATUS_UPDATE:
2255
0
    case FRR_ZAPI6_RULE_ADD:
2256
0
    case FRR_ZAPI6_RULE_DELETE:
2257
0
    case FRR_ZAPI6_RULE_NOTIFY_OWNER:
2258
0
    case FRR_ZAPI6_TABLE_MANAGER_CONNECT:
2259
0
    case FRR_ZAPI6_GET_TABLE_CHUNK:
2260
0
    case FRR_ZAPI6_RELEASE_TABLE_CHUNK:
2261
0
    case FRR_ZAPI6_IPSET_CREATE:
2262
0
    case FRR_ZAPI6_IPSET_DESTROY:
2263
0
    case FRR_ZAPI6_IPSET_ENTRY_ADD:
2264
0
    case FRR_ZAPI6_IPSET_ENTRY_DELETE:
2265
0
    case FRR_ZAPI6_IPSET_NOTIFY_OWNER:
2266
0
    case FRR_ZAPI6_IPSET_ENTRY_NOTIFY_OWNER:
2267
0
    case FRR_ZAPI6_IPTABLE_ADD:
2268
0
    case FRR_ZAPI6_IPTABLE_DELETE:
2269
0
    case FRR_ZAPI6_IPTABLE_NOTIFY_OWNER:
2270
0
    case FRR_ZAPI6_VXLAN_FLOOD_CONTROL:
2271
0
      break;
2272
0
    }
2273
0
  }
2274
40
  return offset;
2275
49
}
2276
2277
/*
2278
 Zebra Protocol header version 0:
2279
  0                   1                   2                   3
2280
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2281
  +-------------------------------+---------------+
2282
  |           Length (2)          |   Command (1) |
2283
  +-------------------------------+---------------+
2284
2285
 Zebra Protocol header version 1, 2:
2286
  0                   1                   2                   3
2287
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2288
  +-------------------------------+---------------+-------------+
2289
  |           Length (2)          |   Marker (1)  | Version (1) |
2290
  +-------------------------------+---------------+-------------+
2291
  |          Command (2)          |
2292
  +-------------------------------+
2293
2294
 Version 3, 4:
2295
2296
   0                   1                   2                   3
2297
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2298
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2299
  |             Length            |     Marker    |    Version    |
2300
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2301
  |             VRF ID            |            Command            |
2302
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2303
2304
 Version 5, 6:
2305
2306
   0                   1                   2                   3
2307
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
2308
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2309
  |             Length            |     Marker    |    Version    |
2310
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2311
  |                             VRF ID                            |
2312
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2313
  |            Command            |
2314
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2315
2316
 The Marker byte in later versions uses reserved command values 0xFF (version
2317
 1-3, Quagga) or 0xFE (version 4-6, FRR) to distinguish later protocol versions
2318
 from version 0.
2319
 */
2320
2321
static bool
2322
zebra_get_header(tvbuff_t *tvb, int offset, zebra_header_t *header)
2323
110
{
2324
110
  uint16_t len, command;
2325
110
  uint8_t version;
2326
2327
110
  if (tvb_captured_length_remaining(tvb, offset) < 3) {
2328
20
    return false;
2329
20
  }
2330
2331
90
  len = tvb_get_ntohs(tvb, offset);
2332
90
  if (len < 3) {
2333
4
    return false;
2334
4
  }
2335
2336
86
  offset += 2;
2337
86
  command = tvb_get_uint8(tvb, offset);
2338
86
  if (command < 0xFE) { // version 0
2339
85
    version = 0;
2340
85
  } else { // not version 0
2341
1
    offset++;
2342
1
    if (tvb_captured_length_remaining(tvb, offset) < 3) {
2343
0
      return false;
2344
0
    }
2345
1
    version = tvb_get_uint8(tvb, offset);
2346
1
    if (version == 1 || version == 2) {
2347
0
      offset++;
2348
1
    } else if (version == 3 || version == 4) {
2349
0
      offset += 3;
2350
1
    } else if (version < 9) {
2351
      /* The current highest version is 6. Give room
2352
       * to invent a few more. */
2353
0
      offset += 5;
2354
1
    } else {
2355
1
      return false;
2356
1
    }
2357
0
    if (tvb_captured_length_remaining(tvb, offset) < 2) {
2358
0
      return false;
2359
0
    }
2360
0
    command = tvb_get_ntohs(tvb, offset);
2361
0
  }
2362
85
  if (header) {
2363
85
    header->len = len;
2364
85
    header->command = command;
2365
85
    header->version = version;
2366
85
  }
2367
85
  return true;
2368
86
}
2369
2370
static bool
2371
test_zebra(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
2372
39
{
2373
39
  zebra_header_t header;
2374
2375
39
  if (!zebra_get_header(tvb, offset, &header)) {
2376
3
    return false;
2377
3
  }
2378
2379
36
  if (header.len > 1024) {
2380
    /* There can be multiple PDUs in a segment, but PDUs themselves
2381
     * are small. Even 1024 is a generous overestimate.
2382
     */
2383
2
    return false;
2384
2
  }
2385
2386
34
  if (header.version < 4) {
2387
34
    if (!try_val_to_str(header.command, messages)) {
2388
3
      return false;
2389
3
    }
2390
34
  } else if (header.version == 4) {
2391
0
    if (!try_val_to_str(header.command, frr_zapi4_messages)) {
2392
0
      return false;
2393
0
    }
2394
0
  } else if (header.version == 5) {
2395
0
    if (!try_val_to_str(header.command, frr_zapi5_messages)) {
2396
0
      return false;
2397
0
    }
2398
0
  } else {
2399
0
    if (!try_val_to_str(header.command, frr_zapi6_messages)) {
2400
0
      return false;
2401
0
    }
2402
0
  }
2403
2404
31
  return true;
2405
34
}
2406
2407
static int
2408
dissect_zebra(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2409
39
{
2410
39
  proto_item  *ti;
2411
39
  proto_tree  *zebra_tree;
2412
39
  bool  request;
2413
39
  int   left, offset = 0;
2414
2415
39
  if (!test_zebra(pinfo, tvb, offset, data)) {
2416
8
    return 0;
2417
8
  }
2418
2419
31
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "ZEBRA");
2420
2421
31
  request = (pinfo->destport == pinfo->match_uint);
2422
31
  left = tvb_reported_length(tvb);
2423
2424
31
  col_set_str(pinfo->cinfo, COL_INFO,
2425
31
        request? "Zebra Request" : "Zebra Reply");
2426
2427
  /* if (tree) */ {
2428
31
    ti = proto_tree_add_item(tree, proto_zebra, tvb, offset, -1,
2429
31
           ENC_NA);
2430
31
    zebra_tree = proto_item_add_subtree(ti, ett_zebra);
2431
31
    ti = proto_tree_add_boolean(zebra_tree, hf_zebra_request,
2432
31
              tvb, offset, 0, request);
2433
31
    proto_item_set_hidden(ti);
2434
2435
71
    for (;;) {
2436
71
      zebra_header_t header;
2437
71
      proto_tree  *zebra_request_tree;
2438
2439
71
      if (!zebra_get_header(tvb, offset, &header)) {
2440
22
        break;
2441
22
      }
2442
2443
49
      if (header.version < 4) {
2444
49
        col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
2445
49
            val_to_str(header.command, messages,
2446
49
                 "Command Type 0x%02d"));
2447
49
        ti = proto_tree_add_uint(zebra_tree, hf_zebra_command,
2448
49
               tvb, offset, header.len,
2449
49
               header.command);
2450
49
      } else if (header.version == 4) {
2451
0
        ti = proto_tree_add_uint(zebra_tree, hf_zebra_command_v4,
2452
0
               tvb, offset, header.len,
2453
0
               header.command);
2454
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
2455
0
            val_to_str(header.command, frr_zapi4_messages,
2456
0
                 "Command Type 0x%02d"));
2457
0
      } else if (header.version == 5) {
2458
0
        ti = proto_tree_add_uint(zebra_tree, hf_zebra_command_v5,
2459
0
               tvb, offset, header.len,
2460
0
               header.command);
2461
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
2462
0
            val_to_str(header.command, frr_zapi5_messages,
2463
0
                 "Command Type 0x%02d"));
2464
0
      } else {
2465
0
        ti = proto_tree_add_uint(zebra_tree, hf_zebra_command_v6,
2466
0
               tvb, offset, header.len,
2467
0
               header.command);
2468
0
        col_append_fstr(pinfo->cinfo, COL_INFO, ": %s",
2469
0
            val_to_str(header.command, frr_zapi6_messages,
2470
0
                 "Command Type 0x%02d"));
2471
0
      }
2472
49
      zebra_request_tree = proto_item_add_subtree(ti,
2473
49
              ett_zebra_request);
2474
49
      dissect_zebra_request(zebra_request_tree, request, tvb,
2475
49
                offset, left, header.len,
2476
49
                header.command, header.version);
2477
49
      offset += header.len;
2478
49
      left -= header.len;
2479
49
    }
2480
31
  }
2481
2482
31
  return tvb_captured_length(tvb);
2483
39
}
2484
2485
void
2486
proto_register_zebra(void)
2487
14
{
2488
2489
14
  static hf_register_info hf[] = {
2490
14
    { &hf_zebra_len,
2491
14
      { "Length",   "zebra.len",
2492
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
2493
14
        "Length of Zebra request", HFILL }},
2494
14
    { &hf_zebra_version,
2495
14
      { "Version",    "zebra.version",
2496
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2497
14
        "Zebra srv version", HFILL }},
2498
14
    { &hf_zebra_marker,
2499
14
      { "Marker",     "zebra.marker",
2500
14
        FT_UINT8, BASE_HEX, NULL, 0x0,
2501
14
        "Zebra srv marker", HFILL }},
2502
14
    { &hf_zebra_request,
2503
14
      { "Request",    "zebra.request",
2504
14
        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2505
14
        "true if Zebra request", HFILL }},
2506
14
    { &hf_zebra_command,
2507
14
      { "Command",    "zebra.command",
2508
14
        FT_UINT16, BASE_DEC, VALS(messages), 0x0,
2509
14
        "Zebra command", HFILL }},
2510
14
    { &hf_zebra_interface,
2511
14
      { "Interface",    "zebra.interface",
2512
14
        FT_STRING, BASE_NONE, NULL, 0x0,
2513
14
        "Interface name of Zebra request", HFILL }},
2514
14
    { &hf_zebra_index,
2515
14
      { "Index",    "zebra.index",
2516
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2517
14
        "Index of interface", HFILL }},
2518
14
    { &hf_zebra_intstatus,
2519
14
      { "Status",   "zebra.intstatus",
2520
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2521
14
        "Status of interface", HFILL}},
2522
14
    { &hf_zebra_indexnum,
2523
14
      { "Index Number",   "zebra.indexnum",
2524
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2525
14
        "Number of indices for route", HFILL }},
2526
14
    { &hf_zebra_intflags,
2527
14
      { "Flags",    "zebra.intflags",
2528
14
        FT_UINT64, BASE_DEC, NULL, 0x0,
2529
14
        "Flags of interface", HFILL }},
2530
14
    { &hf_zebra_rtflags,
2531
14
      { "Flags",    "zebra.rtflags",
2532
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2533
14
        "Flags of route", HFILL }},
2534
14
    { &hf_zebra_message,
2535
14
      { "Message",    "zebra.message",
2536
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2537
14
        "Message type of route", HFILL }},
2538
14
    { &hf_zebra_route_safi,
2539
14
      { "SAFI",   "zebra.safi",
2540
14
        FT_UINT16, BASE_DEC, VALS(safi), 0x0,
2541
14
        "Subsequent Address Family Identifier", HFILL }},
2542
14
    { &hf_zebra_msg_nexthop,
2543
14
      { "Message Nexthop",  "zebra.message.nexthop",
2544
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_NEXTHOP,
2545
14
        "Message contains nexthop", HFILL }},
2546
14
    { &hf_zebra_msg_index,
2547
14
      { "Message Index",  "zebra.message.index",
2548
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_IFINDEX,
2549
14
        "Message contains index", HFILL }},
2550
14
    { &hf_zebra_msg_distance,
2551
14
      { "Message Distance", "zebra.message.distance",
2552
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_DISTANCE,
2553
14
        "Message contains distance", HFILL }},
2554
14
    { &hf_zebra_msg_metric,
2555
14
      { "Message Metric", "zebra.message.metric",
2556
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_METRIC,
2557
14
        "Message contains metric", HFILL }},
2558
14
    { &hf_zebra_type_v0,
2559
14
      { "Type",     "zebra.type",
2560
14
        FT_UINT8, BASE_DEC, VALS(routes_v0), 0x0,
2561
14
        "Type of route", HFILL }},
2562
14
    { &hf_zebra_type_v1,
2563
14
      { "Type",     "zebra.type",
2564
14
        FT_UINT8, BASE_DEC, VALS(routes_v1), 0x0,
2565
14
        "Type of route", HFILL }},
2566
14
    { &hf_zebra_distance,
2567
14
      { "Distance",   "zebra.distance",
2568
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2569
14
        "Distance of route", HFILL }},
2570
14
    { &hf_zebra_metric,
2571
14
      { "Metric",   "zebra.metric",
2572
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2573
14
        "Metric of interface or route", HFILL }},
2574
14
    { &hf_zebra_mtu,
2575
14
      { "MTU",      "zebra.mtu",
2576
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2577
14
        "MTU of interface", HFILL }},
2578
14
    { &hf_zebra_mtu6,
2579
14
      { "MTUv6",    "zebra.mtu6",
2580
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2581
14
        "MTUv6 of interface", HFILL }},
2582
14
    { &hf_zebra_bandwidth,
2583
14
      { "Bandwidth",    "zebra.bandwidth",
2584
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2585
14
        "Bandwidth of interface", HFILL }},
2586
14
    { &hf_zebra_family,
2587
14
      { "Family",   "zebra.family",
2588
14
        FT_UINT16, BASE_DEC, VALS(families), 0x0,
2589
14
        "Family of IP address", HFILL }},
2590
14
    { &hf_zebra_flags,
2591
14
      { "Flags",    "zebra.flags",
2592
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2593
14
        "Flags of Address Info", HFILL }},
2594
14
    { &hf_zebra_dest4,
2595
14
      { "Destination",    "zebra.dest4",
2596
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
2597
14
        "Destination IPv4 field", HFILL }},
2598
14
    { &hf_zebra_dest6,
2599
14
      { "Destination",    "zebra.dest6",
2600
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
2601
14
        "Destination IPv6 field", HFILL }},
2602
14
    { &hf_zebra_nexthopnum,
2603
14
      { "Nexthop Number", "zebra.nexthopnum",
2604
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2605
14
        "Number of nexthops in route", HFILL }},
2606
14
    { &hf_zebra_nexthop4,
2607
14
      { "Nexthop",    "zebra.nexthop4",
2608
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
2609
14
        "Nethop IPv4 field of route", HFILL }},
2610
14
    { &hf_zebra_nexthop6,
2611
14
      { "Nexthop",    "zebra.nexthop6",
2612
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
2613
14
        "Nethop IPv6 field of route", HFILL }},
2614
14
    { &hf_zebra_prefixlen,
2615
14
      { "Prefix length",  "zebra.prefixlen",
2616
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2617
14
        NULL, HFILL }},
2618
14
    { &hf_zebra_prefix4,
2619
14
      { "Prefix",   "zebra.prefix4",
2620
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
2621
14
        "Prefix IPv4", HFILL }},
2622
14
    { &hf_zebra_prefix6,
2623
14
      { "Prefix",   "zebra.prefix6",
2624
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
2625
14
        "Prefix IPv6", HFILL }},
2626
14
    { &hf_zebra_routeridaddress,
2627
14
      { "Router ID address",  "zebra.routerIDAddress",
2628
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
2629
14
        NULL, HFILL }},
2630
14
    { &hf_zebra_routeridmask,
2631
14
      { "Router ID mask", "zebra.routerIDMask",
2632
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2633
14
        "netmask of Router ID", HFILL }},
2634
14
    { &hf_zebra_mac,
2635
14
      { "MAC address",  "zebra.macaddress",
2636
14
        FT_ETHER, BASE_NONE, NULL, 0x0,
2637
14
        "MAC address of interface", HFILL }},
2638
14
    { &hf_zebra_redist_default,
2639
14
      { "Redistribute default",   "zebra.redist_default",
2640
14
        FT_BOOLEAN,  BASE_NONE, NULL, 0x0,
2641
14
        "true if redistribute default", HFILL }},
2642
14
    { &hf_zebra_vrfid,
2643
14
      { "VRF-ID",   "zebra.vrfid",
2644
14
        FT_UINT32, BASE_HEX, NULL, 0x0,
2645
14
        "VRF ID", HFILL }},
2646
14
    { &hf_zebra_routeridfamily,
2647
14
      { "Router ID Family", "zebra.routeridfamily",
2648
14
        FT_UINT8, BASE_DEC, VALS(families), 0x0,
2649
14
        "Family of Router ID", HFILL }},
2650
14
    { &hf_zebra_nexthoptype,
2651
14
      { "Nexthop Type", "zebra.nexthoptype",
2652
14
        FT_UINT8, BASE_DEC, VALS(zebra_nht), 0x0,
2653
14
        "Type of Nexthop", HFILL }},
2654
14
    { &hf_zebra_msg_mtu,
2655
14
      { "Message MTU",  "zebra.message.mtu",
2656
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_MTU,
2657
14
        "Message contains MTU", HFILL }},
2658
14
    { &hf_zebra_msg_tag,
2659
14
      { "Message TAG",  "zebra.message.tag",
2660
14
        FT_BOOLEAN, 8, NULL, ZEBRA_ZAPI_MESSAGE_TAG,
2661
14
        "Message contains TAG", HFILL }},
2662
14
    { &hf_zebra_tag,
2663
14
      { "Tag",    "zebra.tag",
2664
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2665
14
        "Route Tag", HFILL }},
2666
14
    { &hf_zebra_maclen,
2667
14
      { "MAC address length", "zebra.maclen",
2668
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2669
14
        "Length of MAC address of interface", HFILL }},
2670
14
    { &hf_zebra_haslinkparam,
2671
14
      { "Message has link parameters", "zebra.haslinkparam",
2672
14
        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2673
14
        "Interface message has link parameters", HFILL }},
2674
    /* FRRouting, Zebra API v4, v5 and v6 */
2675
14
    { &hf_zebra_command_v4,
2676
14
      { "Command",    "zebra.command",
2677
14
        FT_UINT16, BASE_DEC, VALS(frr_zapi4_messages), 0x0,
2678
14
        "Zebra command", HFILL }},
2679
14
    { &hf_zebra_command_v5,
2680
14
      { "Command",    "zebra.command",
2681
14
        FT_UINT16, BASE_DEC, VALS(frr_zapi5_messages), 0x0,
2682
14
        "Zebra command", HFILL }},
2683
14
    { &hf_zebra_command_v6,
2684
14
      { "Command",    "zebra.command",
2685
14
        FT_UINT16, BASE_DEC, VALS(frr_zapi6_messages), 0x0,
2686
14
        "Zebra command", HFILL }},
2687
14
    { &hf_zebra_type_v4,
2688
14
      { "Type",   "zebra.type",
2689
14
        FT_UINT8, BASE_DEC, VALS(routes_v4), 0x0,
2690
14
        "Type of route", HFILL }},
2691
14
    { &hf_zebra_type_v5,
2692
14
      { "Type",   "zebra.type",
2693
14
        FT_UINT8, BASE_DEC, VALS(routes_v5), 0x0,
2694
14
        "Type of route", HFILL }},
2695
14
    { &hf_zebra_ptmenable,
2696
14
      { "PTM Enable", "zebra.ptmenable",
2697
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2698
14
        "PTM (Prescriptive Topology Manager) Enable", HFILL }},
2699
14
    { &hf_zebra_ptmstatus,
2700
14
      { "PTM Status", "zebra.ptmstatus",
2701
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2702
14
        "PTM (Prescriptive Topology Manager) Status", HFILL }},
2703
14
    { &hf_zebra_instance,
2704
14
      { "Instance",   "zebra.instance",
2705
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
2706
14
        "Routing Instance", HFILL }},
2707
14
    { &hf_zebra_rtflags_u32,
2708
14
      { "Flags",    "zebra.rtflags",
2709
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2710
14
        "Flags of route", HFILL }},
2711
14
    { &hf_zebra_speed,
2712
14
      { "Speed",    "zebra.speed",
2713
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2714
14
        "Speed of interface", HFILL }},
2715
14
    { &hf_zebra_lltype,
2716
14
      { "LLType",   "zebra.lltype",
2717
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2718
14
        "Link Layer Type", HFILL }},
2719
14
    { &hf_zebra_message4,
2720
14
      { "Message",    "zebra.message",
2721
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2722
14
        "Message type of route", HFILL }},
2723
14
    { &hf_zebra_message5,
2724
14
      { "Message",    "zebra.message",
2725
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2726
14
        "Message type of route", HFILL }},
2727
14
    { &hf_zebra_route_safi_u8,
2728
14
      { "SAFI",   "zebra.safi",
2729
14
        FT_UINT8, BASE_DEC, VALS(safi), 0x0,
2730
14
        "Subsequent Address Family Identifier", HFILL }},
2731
14
    { &hf_zebra_rmac,
2732
14
      { "RMAC",   "zebra.rmac",
2733
14
        FT_ETHER, BASE_NONE, NULL, 0x0,
2734
14
        "Remote MAC", HFILL }},
2735
14
    { &hf_zebra_msg4_tag,
2736
14
      { "Message TAG",  "zebra.message.tag",
2737
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI4_MESSAGE_TAG,
2738
14
        "Message contains TAG", HFILL }},
2739
14
    { &hf_zebra_msg4_mtu,
2740
14
      { "Message MTU",  "zebra.message.mtu",
2741
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI4_MESSAGE_MTU,
2742
14
        "Message contains MTU", HFILL }},
2743
14
    { &hf_zebra_msg4_srcpfx,
2744
14
      { "Message Source Prefix", "zebra.message.srcpfx",
2745
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI4_MESSAGE_SRCPFX,
2746
14
        "Message contains Source Prefix",
2747
14
        HFILL }},
2748
14
    { &hf_zebra_msg5_distance,
2749
14
      { "Message Distance", "zebra.message.distance",
2750
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_DISTANCE,
2751
14
        "Message contains distance", HFILL }},
2752
14
    { &hf_zebra_msg5_metric,
2753
14
      { "Message Metric", "zebra.message.metric",
2754
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_METRIC,
2755
14
        "Message contains metric", HFILL }},
2756
14
    { &hf_zebra_msg5_tag,
2757
14
      { "Message TAG",  "zebra.message.tag",
2758
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_TAG,
2759
14
        "Message contains TAG", HFILL }},
2760
14
    { &hf_zebra_msg5_mtu,
2761
14
      { "Message MTU",  "zebra.message.mtu",
2762
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_MTU,
2763
14
        "Message contains MTU", HFILL }},
2764
14
    { &hf_zebra_msg5_srcpfx,
2765
14
      { "Message Source Prefix", "zebra.message.srcpfx",
2766
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_SRCPFX,
2767
14
        "Message contains Source Prefix", HFILL }},
2768
14
    { &hf_zebra_msg_label,
2769
14
      { "Message Label",  "zebra.message.label",
2770
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_LABEL,
2771
14
        "Message contains Label", HFILL }},
2772
14
    { &hf_zebra_msg_tableid,
2773
14
      { "Message Table ID", "zebra.message.tableid",
2774
14
        FT_BOOLEAN, 8, NULL, FRR_ZAPI5_MESSAGE_TABLEID,
2775
14
        "Message contains Table ID", HFILL }},
2776
14
    { &hf_zebra_nexthopnum_u16,
2777
14
      { "Nexthop Number", "zebra.nexthopnum",
2778
14
        FT_UINT16, BASE_DEC, NULL, 0x0,
2779
14
        "Number of nexthops in route", HFILL }},
2780
14
    { &hf_zebra_nexthoptype_frr,
2781
14
      { "Nexthop Type", "zebra.nexthoptype",
2782
14
        FT_UINT8, BASE_DEC, VALS(frr_nht), 0x0,
2783
14
        "Type of Nexthop", HFILL }},
2784
14
    { &hf_zebra_bhtype,
2785
14
      { "BHType",   "zebra.bhtype",
2786
14
        FT_UINT8, BASE_DEC, VALS(blackhole_type), 0x0,
2787
14
        "Blackhole Type", HFILL }},
2788
14
    { &hf_zebra_srcprefixlen,
2789
14
      { "Source Prefix length", "zebra.srcprefixlen",
2790
14
        FT_UINT32, BASE_DEC,
2791
14
        NULL, 0x0, NULL, HFILL }},
2792
14
    { &hf_zebra_srcprefix4,
2793
14
      { "Source Prefix",  "zebra.srcprefix4",
2794
14
        FT_IPv4, BASE_NONE, NULL, 0x0,
2795
14
        "Source Prefix IPv4", HFILL }},
2796
14
    { &hf_zebra_srcprefix6,
2797
14
      { "Source Prefix",  "zebra.srcprefix6",
2798
14
        FT_IPv6, BASE_NONE, NULL, 0x0,
2799
14
        "Source Prefix IPv6", HFILL }},
2800
14
    { &hf_zebra_tableid,
2801
14
      { "Table ID",   "zebra.tableid",
2802
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2803
14
        "Routing Table ID", HFILL }},
2804
14
    { &hf_zebra_afi,
2805
14
      { "AFI",    "zebra.afi",
2806
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2807
14
        "AFI (Address Family Identifiers)", HFILL }},
2808
14
    { &hf_zebra_pid,
2809
14
      { "PID",    "zebra.pid",
2810
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2811
14
        "Process ID", HFILL }},
2812
14
    { &hf_zebra_vrf_table_id,
2813
14
      { "VRF Table ID", "zebra.vrftableid",
2814
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2815
14
        "VRF Routing Table ID", HFILL }},
2816
14
    { &hf_zebra_vrf_netns_name,
2817
14
      { "VRF NETNS Name", "zebra.vrfnetnsname",
2818
14
        FT_STRING, BASE_NONE, NULL, 0x0,
2819
14
        "VRF (Virtual Routing and Forwarding) Network Namespace Name",
2820
14
        HFILL }},
2821
14
    { &hf_zebra_vrf_name,
2822
14
      { "VRF Name",   "zebra.vrfname",
2823
14
        FT_STRING, BASE_NONE, NULL, 0x0,
2824
14
        "VRF (Virtual Routing and Forwarding) Name", HFILL }},
2825
14
    { &hf_zebra_proto,
2826
14
      { "Protocol",   "zebra.proto",
2827
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2828
14
        "Protocol of client", HFILL }},
2829
14
    { &hf_zebra_label_chunk_keep,
2830
14
      { "Label Chunk Keep", "zebra.label_chunk_keep",
2831
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2832
14
        "Keep of Label Chunk", HFILL }},
2833
14
    { &hf_zebra_label_chunk_size,
2834
14
      { "Label Chunk Size", "zebra.label_chunk_size",
2835
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2836
14
        "Size of Label Chunk", HFILL }},
2837
14
    { &hf_zebra_label_chunk_start,
2838
14
      { "Label Chunk Start","zebra.label_chunk_start",
2839
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2840
14
        "Start of Label Chunk", HFILL }},
2841
14
    { &hf_zebra_label_chunk_end,
2842
14
      { "Label Chunk End",  "zebra.label_chunk_end",
2843
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2844
14
        "End of Label Chunk", HFILL }},
2845
14
    { &hf_zebra_mpls_enabled,
2846
14
      { "MPLS Enabled", "zebra.mpls_enabled",
2847
14
        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2848
14
        "MPLS enabled capability", HFILL }},
2849
14
    { &hf_zebra_multipath_num,
2850
14
      { "Multipath Number", "zebra.multipath_num",
2851
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2852
14
        "Number of Multipath", HFILL }},
2853
14
    { &hf_zebra_labelnum,
2854
14
      { "Label Number", "zebra.labelnum",
2855
14
        FT_UINT8, BASE_DEC, NULL, 0x0,
2856
14
        "Number of Labels", HFILL }},
2857
14
    { &hf_zebra_label,
2858
14
      { "Label",    "zebra.label",
2859
14
        FT_UINT32, BASE_DEC, NULL, 0x0,
2860
14
        "MPLS Label", HFILL }},
2861
14
    { &hf_zebra_receive_notify,
2862
14
      { "Receive Notify", "zebra.receive_notify",
2863
14
        FT_BOOLEAN, BASE_NONE, NULL, 0x0,
2864
14
        "true if receive notify", HFILL }}
2865
14
  };
2866
2867
14
  static int *ett[] = {
2868
14
    &ett_zebra,
2869
14
    &ett_zebra_request,
2870
14
    &ett_message,
2871
14
  };
2872
2873
14
  proto_zebra = proto_register_protocol("Zebra Protocol", "ZEBRA", "zebra");
2874
14
  proto_register_field_array(proto_zebra, hf, array_length(hf));
2875
14
  proto_register_subtree_array(ett, array_length(ett));
2876
14
  zebra_handle = register_dissector("zebra", dissect_zebra, proto_zebra);
2877
14
}
2878
2879
void
2880
proto_reg_handoff_zebra(void)
2881
14
{
2882
14
  dissector_add_uint_with_preference("tcp.port", TCP_PORT_ZEBRA, zebra_handle);
2883
14
}
2884
2885
/*
2886
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
2887
 *
2888
 * Local variables:
2889
 * c-basic-offset: 8
2890
 * tab-width: 8
2891
 * indent-tabs-mode: t
2892
 * End:
2893
 *
2894
 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
2895
 * :indentSize=8:tabSize=8:noTabs=false:
2896
 */