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