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