]> git.proxmox.com Git - mirror_frr.git/blob - zebra/debug.c
Merge branch 'stable/2.0-for-merge'
[mirror_frr.git] / zebra / debug.c
1 /*
2 * Zebra debug related function
3 * Copyright (C) 1999 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22
23 #include <zebra.h>
24 #include "command.h"
25 #include "debug.h"
26
27 /* For debug statement. */
28 unsigned long zebra_debug_event;
29 unsigned long zebra_debug_packet;
30 unsigned long zebra_debug_kernel;
31 unsigned long zebra_debug_rib;
32 unsigned long zebra_debug_fpm;
33 unsigned long zebra_debug_nht;
34 unsigned long zebra_debug_mpls;
35
36 DEFUN (show_debugging_zebra,
37 show_debugging_zebra_cmd,
38 "show debugging zebra",
39 SHOW_STR
40 "Debugging information\n"
41 "Zebra configuration\n")
42 {
43 vty_out (vty, "Zebra debugging status:%s", VTY_NEWLINE);
44
45 if (IS_ZEBRA_DEBUG_EVENT)
46 vty_out (vty, " Zebra event debugging is on%s", VTY_NEWLINE);
47
48 if (IS_ZEBRA_DEBUG_PACKET)
49 {
50 if (IS_ZEBRA_DEBUG_SEND && IS_ZEBRA_DEBUG_RECV)
51 {
52 vty_out (vty, " Zebra packet%s debugging is on%s",
53 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
54 VTY_NEWLINE);
55 }
56 else
57 {
58 if (IS_ZEBRA_DEBUG_SEND)
59 vty_out (vty, " Zebra packet send%s debugging is on%s",
60 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
61 VTY_NEWLINE);
62 else
63 vty_out (vty, " Zebra packet receive%s debugging is on%s",
64 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
65 VTY_NEWLINE);
66 }
67 }
68
69 if (IS_ZEBRA_DEBUG_KERNEL)
70 vty_out (vty, " Zebra kernel debugging is on%s", VTY_NEWLINE);
71 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND)
72 vty_out (vty, " Zebra kernel netlink message dumps (send) are on%s", VTY_NEWLINE);
73 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV)
74 vty_out (vty, " Zebra kernel netlink message dumps (recv) are on%s", VTY_NEWLINE);
75
76 /* Check here using flags as the 'macro' does an OR */
77 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB))
78 vty_out (vty, " Zebra RIB debugging is on%s", VTY_NEWLINE);
79 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED))
80 vty_out (vty, " Zebra RIB detailed debugging is on%s", VTY_NEWLINE);
81
82 if (IS_ZEBRA_DEBUG_FPM)
83 vty_out (vty, " Zebra FPM debugging is on%s", VTY_NEWLINE);
84 if (IS_ZEBRA_DEBUG_NHT)
85 vty_out (vty, " Zebra next-hop tracking debugging is on%s", VTY_NEWLINE);
86 if (IS_ZEBRA_DEBUG_MPLS)
87 vty_out (vty, " Zebra MPLS debugging is on%s", VTY_NEWLINE);
88
89 return CMD_SUCCESS;
90 }
91
92 DEFUN (debug_zebra_events,
93 debug_zebra_events_cmd,
94 "debug zebra events",
95 DEBUG_STR
96 "Zebra configuration\n"
97 "Debug option set for zebra events\n")
98 {
99 zebra_debug_event = ZEBRA_DEBUG_EVENT;
100 return CMD_WARNING;
101 }
102
103 DEFUN (debug_zebra_nht,
104 debug_zebra_nht_cmd,
105 "debug zebra nht",
106 DEBUG_STR
107 "Zebra configuration\n"
108 "Debug option set for zebra next hop tracking\n")
109 {
110 zebra_debug_nht = ZEBRA_DEBUG_NHT;
111 return CMD_WARNING;
112 }
113
114 DEFUN (debug_zebra_mpls,
115 debug_zebra_mpls_cmd,
116 "debug zebra mpls",
117 DEBUG_STR
118 "Zebra configuration\n"
119 "Debug option set for zebra MPLS LSPs\n")
120 {
121 zebra_debug_mpls = ZEBRA_DEBUG_MPLS;
122 return CMD_WARNING;
123 }
124
125 DEFUN (debug_zebra_packet,
126 debug_zebra_packet_cmd,
127 "debug zebra packet [<recv|send>] [detail]",
128 DEBUG_STR
129 "Zebra configuration\n"
130 "Debug option set for zebra packet\n"
131 "Debug option set for receive packet\n"
132 "Debug option set for send packet\n"
133 "Debug option set for detailed info\n")
134 {
135 int idx = 0;
136 zebra_debug_packet = ZEBRA_DEBUG_PACKET;
137
138 if (argv_find (argv, argc, "send", &idx))
139 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
140 idx = 0;
141 if (argv_find (argv, argc, "recv", &idx))
142 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
143 idx = 0;
144 if (argv_find (argv, argc, "detail", &idx))
145 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_DETAIL);
146
147 if (!(zebra_debug_packet & ZEBRA_DEBUG_SEND & ZEBRA_DEBUG_RECV))
148 {
149 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
150 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
151 }
152 return CMD_SUCCESS;
153 }
154
155 DEFUN (debug_zebra_kernel,
156 debug_zebra_kernel_cmd,
157 "debug zebra kernel",
158 DEBUG_STR
159 "Zebra configuration\n"
160 "Debug option set for zebra between kernel interface\n")
161 {
162 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL);
163 return CMD_SUCCESS;
164 }
165
166 DEFUN (debug_zebra_kernel_msgdump,
167 debug_zebra_kernel_msgdump_cmd,
168 "debug zebra kernel msgdump [<recv|send>]",
169 DEBUG_STR
170 "Zebra configuration\n"
171 "Debug option set for zebra between kernel interface\n"
172 "Dump raw netlink messages, sent and received\n"
173 "Dump raw netlink messages received\n"
174 "Dump raw netlink messages sent\n")
175 {
176 int idx_recv_send = 4;
177 if (argv[idx_recv_send]->arg && strncmp(argv[idx_recv_send]->arg, "recv", strlen(argv[idx_recv_send]->arg)) == 0)
178 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV);
179 if (!argv[idx_recv_send]->arg || strncmp(argv[idx_recv_send]->arg, "send", strlen(argv[idx_recv_send]->arg)) == 0)
180 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND);
181 return CMD_SUCCESS;
182 }
183
184 DEFUN (debug_zebra_rib,
185 debug_zebra_rib_cmd,
186 "debug zebra rib",
187 DEBUG_STR
188 "Zebra configuration\n"
189 "Debug RIB events\n")
190 {
191 SET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB);
192 return CMD_SUCCESS;
193 }
194
195 DEFUN (debug_zebra_rib_detailed,
196 debug_zebra_rib_detailed_cmd,
197 "debug zebra rib detailed",
198 DEBUG_STR
199 "Zebra configuration\n"
200 "Debug RIB events\n"
201 "Detailed debugs\n")
202 {
203 SET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED);
204 return CMD_SUCCESS;
205 }
206
207 DEFUN (debug_zebra_fpm,
208 debug_zebra_fpm_cmd,
209 "debug zebra fpm",
210 DEBUG_STR
211 "Zebra configuration\n"
212 "Debug zebra FPM events\n")
213 {
214 SET_FLAG (zebra_debug_fpm, ZEBRA_DEBUG_FPM);
215 return CMD_SUCCESS;
216 }
217
218 DEFUN (no_debug_zebra_events,
219 no_debug_zebra_events_cmd,
220 "no debug zebra events",
221 NO_STR
222 DEBUG_STR
223 "Zebra configuration\n"
224 "Debug option set for zebra events\n")
225 {
226 zebra_debug_event = 0;
227 return CMD_SUCCESS;
228 }
229
230 DEFUN (no_debug_zebra_nht,
231 no_debug_zebra_nht_cmd,
232 "no debug zebra nht",
233 NO_STR
234 DEBUG_STR
235 "Zebra configuration\n"
236 "Debug option set for zebra next hop tracking\n")
237 {
238 zebra_debug_nht = 0;
239 return CMD_SUCCESS;
240 }
241
242 DEFUN (no_debug_zebra_mpls,
243 no_debug_zebra_mpls_cmd,
244 "no debug zebra mpls",
245 NO_STR
246 DEBUG_STR
247 "Zebra configuration\n"
248 "Debug option set for zebra MPLS LSPs\n")
249 {
250 zebra_debug_mpls = 0;
251 return CMD_SUCCESS;
252 }
253
254 DEFUN (no_debug_zebra_packet,
255 no_debug_zebra_packet_cmd,
256 "no debug zebra packet [<recv|send>]",
257 NO_STR
258 DEBUG_STR
259 "Zebra configuration\n"
260 "Debug option set for zebra packet\n"
261 "Debug option set for receive packet\n"
262 "Debug option set for send packet\n")
263 {
264 int idx = 0;
265 if (argc == 4 || argv_find (argv, argc, "send", &idx))
266 UNSET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
267 if (argc == 4 || argv_find (argv, argc, "recv", &idx))
268 UNSET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
269 return CMD_SUCCESS;
270 }
271
272 DEFUN (no_debug_zebra_kernel,
273 no_debug_zebra_kernel_cmd,
274 "no debug zebra kernel",
275 NO_STR
276 DEBUG_STR
277 "Zebra configuration\n"
278 "Debug option set for zebra between kernel interface\n")
279 {
280 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL);
281 return CMD_SUCCESS;
282 }
283
284 DEFUN (no_debug_zebra_kernel_msgdump,
285 no_debug_zebra_kernel_msgdump_cmd,
286 "no debug zebra kernel msgdump [<recv|send>]",
287 NO_STR
288 DEBUG_STR
289 "Zebra configuration\n"
290 "Debug option set for zebra between kernel interface\n"
291 "Dump raw netlink messages, sent and received\n"
292 "Dump raw netlink messages received\n"
293 "Dump raw netlink messages sent\n")
294 {
295 int idx = 0;
296 if (argc == 5 || argv_find (argv, argc, "recv", &idx))
297 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV);
298 if (argc == 5 || argv_find (argv, argc, "send", &idx))
299 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND);
300
301 return CMD_SUCCESS;
302 }
303
304 DEFUN (no_debug_zebra_rib,
305 no_debug_zebra_rib_cmd,
306 "no debug zebra rib",
307 NO_STR
308 DEBUG_STR
309 "Zebra configuration\n"
310 "Debug zebra RIB\n")
311 {
312 zebra_debug_rib = 0;
313 return CMD_SUCCESS;
314 }
315
316 DEFUN (no_debug_zebra_rib_detailed,
317 no_debug_zebra_rib_detailed_cmd,
318 "no debug zebra rib detailed",
319 NO_STR
320 DEBUG_STR
321 "Zebra configuration\n"
322 "Debug zebra RIB\n"
323 "Detailed debugs\n")
324 {
325 UNSET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED);
326 return CMD_SUCCESS;
327 }
328
329 DEFUN (no_debug_zebra_fpm,
330 no_debug_zebra_fpm_cmd,
331 "no debug zebra fpm",
332 NO_STR
333 DEBUG_STR
334 "Zebra configuration\n"
335 "Debug zebra FPM events\n")
336 {
337 zebra_debug_fpm = 0;
338 return CMD_SUCCESS;
339 }
340
341 /* Debug node. */
342 struct cmd_node debug_node =
343 {
344 DEBUG_NODE,
345 "", /* Debug node has no interface. */
346 1
347 };
348
349 static int
350 config_write_debug (struct vty *vty)
351 {
352 int write = 0;
353
354 if (IS_ZEBRA_DEBUG_EVENT)
355 {
356 vty_out (vty, "debug zebra events%s", VTY_NEWLINE);
357 write++;
358 }
359 if (IS_ZEBRA_DEBUG_PACKET)
360 {
361 if (IS_ZEBRA_DEBUG_SEND && IS_ZEBRA_DEBUG_RECV)
362 {
363 vty_out (vty, "debug zebra packet%s%s",
364 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
365 VTY_NEWLINE);
366 write++;
367 }
368 else
369 {
370 if (IS_ZEBRA_DEBUG_SEND)
371 vty_out (vty, "debug zebra packet send%s%s",
372 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
373 VTY_NEWLINE);
374 else
375 vty_out (vty, "debug zebra packet recv%s%s",
376 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
377 VTY_NEWLINE);
378 write++;
379 }
380 }
381 if (IS_ZEBRA_DEBUG_KERNEL)
382 {
383 vty_out (vty, "debug zebra kernel%s", VTY_NEWLINE);
384 write++;
385 }
386 /* Check here using flags as the 'macro' does an OR */
387 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB))
388 {
389 vty_out (vty, "debug zebra rib%s", VTY_NEWLINE);
390 write++;
391 }
392 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED))
393 {
394 vty_out (vty, "debug zebra rib detailed%s", VTY_NEWLINE);
395 write++;
396 }
397 if (IS_ZEBRA_DEBUG_FPM)
398 {
399 vty_out (vty, "debug zebra fpm%s", VTY_NEWLINE);
400 write++;
401 }
402 if (IS_ZEBRA_DEBUG_MPLS)
403 {
404 vty_out (vty, "debug zebra mpls%s", VTY_NEWLINE);
405 write++;
406 }
407 return write;
408 }
409
410 void
411 zebra_debug_init (void)
412 {
413 zebra_debug_event = 0;
414 zebra_debug_packet = 0;
415 zebra_debug_kernel = 0;
416 zebra_debug_rib = 0;
417 zebra_debug_fpm = 0;
418 zebra_debug_mpls = 0;
419
420 install_node (&debug_node, config_write_debug);
421
422 install_element (VIEW_NODE, &show_debugging_zebra_cmd);
423
424 install_element (ENABLE_NODE, &debug_zebra_events_cmd);
425 install_element (ENABLE_NODE, &debug_zebra_nht_cmd);
426 install_element (ENABLE_NODE, &debug_zebra_mpls_cmd);
427 install_element (ENABLE_NODE, &debug_zebra_packet_cmd);
428 install_element (ENABLE_NODE, &debug_zebra_kernel_cmd);
429 install_element (ENABLE_NODE, &debug_zebra_kernel_msgdump_cmd);
430 install_element (ENABLE_NODE, &debug_zebra_rib_cmd);
431 install_element (ENABLE_NODE, &debug_zebra_rib_detailed_cmd);
432 install_element (ENABLE_NODE, &debug_zebra_fpm_cmd);
433 install_element (ENABLE_NODE, &no_debug_zebra_events_cmd);
434 install_element (ENABLE_NODE, &no_debug_zebra_nht_cmd);
435 install_element (ENABLE_NODE, &no_debug_zebra_mpls_cmd);
436 install_element (ENABLE_NODE, &no_debug_zebra_packet_cmd);
437 install_element (ENABLE_NODE, &no_debug_zebra_kernel_cmd);
438 install_element (ENABLE_NODE, &no_debug_zebra_kernel_msgdump_cmd);
439 install_element (ENABLE_NODE, &no_debug_zebra_rib_cmd);
440 install_element (ENABLE_NODE, &no_debug_zebra_rib_detailed_cmd);
441 install_element (ENABLE_NODE, &no_debug_zebra_fpm_cmd);
442
443 install_element (CONFIG_NODE, &debug_zebra_events_cmd);
444 install_element (CONFIG_NODE, &debug_zebra_nht_cmd);
445 install_element (CONFIG_NODE, &debug_zebra_mpls_cmd);
446 install_element (CONFIG_NODE, &debug_zebra_packet_cmd);
447 install_element (CONFIG_NODE, &debug_zebra_kernel_cmd);
448 install_element (CONFIG_NODE, &debug_zebra_kernel_msgdump_cmd);
449 install_element (CONFIG_NODE, &debug_zebra_rib_cmd);
450 install_element (CONFIG_NODE, &debug_zebra_rib_detailed_cmd);
451 install_element (CONFIG_NODE, &debug_zebra_fpm_cmd);
452 install_element (CONFIG_NODE, &no_debug_zebra_events_cmd);
453 install_element (CONFIG_NODE, &no_debug_zebra_nht_cmd);
454 install_element (CONFIG_NODE, &no_debug_zebra_mpls_cmd);
455 install_element (CONFIG_NODE, &no_debug_zebra_packet_cmd);
456 install_element (CONFIG_NODE, &no_debug_zebra_kernel_cmd);
457 install_element (CONFIG_NODE, &no_debug_zebra_kernel_msgdump_cmd);
458 install_element (CONFIG_NODE, &no_debug_zebra_rib_cmd);
459 install_element (CONFIG_NODE, &no_debug_zebra_rib_detailed_cmd);
460 install_element (CONFIG_NODE, &no_debug_zebra_fpm_cmd);
461 }