1/* BGP-4, BGP-4+ packet debug routine
2   Copyright (C) 1996, 97, 99 Kunihiro Ishiguro
3
4This file is part of GNU Zebra.
5
6GNU Zebra is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 2, or (at your option) any
9later version.
10
11GNU Zebra is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Zebra; see the file COPYING.  If not, write to the Free
18Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1902111-1307, USA.  */
20
21#include <zebra.h>
22
23#include "version.h"
24#include "prefix.h"
25#include "linklist.h"
26#include "stream.h"
27#include "command.h"
28#include "str.h"
29#include "log.h"
30#include "sockunion.h"
31
32#include "bgpd/bgpd.h"
33#include "bgpd/bgp_aspath.h"
34#include "bgpd/bgp_route.h"
35#include "bgpd/bgp_attr.h"
36#include "bgpd/bgp_debug.h"
37#include "bgpd/bgp_community.h"
38
39unsigned long conf_bgp_debug_fsm;
40unsigned long conf_bgp_debug_events;
41unsigned long conf_bgp_debug_packet;
42unsigned long conf_bgp_debug_filter;
43unsigned long conf_bgp_debug_keepalive;
44unsigned long conf_bgp_debug_update;
45unsigned long conf_bgp_debug_normal;
46
47unsigned long term_bgp_debug_fsm;
48unsigned long term_bgp_debug_events;
49unsigned long term_bgp_debug_packet;
50unsigned long term_bgp_debug_filter;
51unsigned long term_bgp_debug_keepalive;
52unsigned long term_bgp_debug_update;
53unsigned long term_bgp_debug_normal;
54
55/* messages for BGP-4 status */
56struct message bgp_status_msg[] =
57{
58  { 0, "null" },
59  { Idle, "Idle" },
60  { Connect, "Connect" },
61  { Active, "Active" },
62  { OpenSent, "OpenSent" },
63  { OpenConfirm, "OpenConfirm" },
64  { Established, "Established" },
65};
66int bgp_status_msg_max = BGP_STATUS_MAX;
67
68/* BGP message type string. */
69char *bgp_type_str[] =
70{
71  NULL,
72  "OPEN",
73  "UPDATE",
74  "NOTIFICATION",
75  "KEEPALIVE",
76  "ROUTE-REFRESH",
77  "CAPABILITY"
78};
79
80/* message for BGP-4 Notify */
81struct message bgp_notify_msg[] =
82{
83  { 0, "" },
84  { BGP_NOTIFY_HEADER_ERR, "Message Header Error"},
85  { BGP_NOTIFY_OPEN_ERR, "OPEN Message Error"},
86  { BGP_NOTIFY_UPDATE_ERR, "UPDATE Message Error"},
87  { BGP_NOTIFY_HOLD_ERR, "Hold Timer Expired"},
88  { BGP_NOTIFY_FSM_ERR, "Finite State Machine Error"},
89  { BGP_NOTIFY_CEASE, "Cease"},
90  { BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error"},
91};
92int bgp_notify_msg_max = BGP_NOTIFY_MAX;
93
94struct message bgp_notify_head_msg[] =
95{
96  { 0, "null"},
97  { BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized."},
98  { BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length."},
99  { BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type."}
100};
101int bgp_notify_head_msg_max = BGP_NOTIFY_HEADER_MAX;
102
103struct message bgp_notify_open_msg[] =
104{
105  { 0, "null" },
106  { BGP_NOTIFY_OPEN_UNSUP_VERSION, "/Unsupported Version Number." },
107  { BGP_NOTIFY_OPEN_BAD_PEER_AS, "/Bad Peer AS."},
108  { BGP_NOTIFY_OPEN_BAD_BGP_IDENT, "/Bad BGP Identifier."},
109  { BGP_NOTIFY_OPEN_UNSUP_PARAM, "/Unsupported Optional Parameter."},
110  { BGP_NOTIFY_OPEN_AUTH_FAILURE, "/Authentication Failure."},
111  { BGP_NOTIFY_OPEN_UNACEP_HOLDTIME, "/Unacceptable Hold Time."},
112  { BGP_NOTIFY_OPEN_UNSUP_CAPBL, "/Unsupported Capability."},
113};
114int bgp_notify_open_msg_max = BGP_NOTIFY_OPEN_MAX;
115
116struct message bgp_notify_update_msg[] =
117{
118  { 0, "null"},
119  { BGP_NOTIFY_UPDATE_MAL_ATTR, "/Malformed Attribute List."},
120  { BGP_NOTIFY_UPDATE_UNREC_ATTR, "/Unrecognized Well-known Attribute."},
121  { BGP_NOTIFY_UPDATE_MISS_ATTR, "/Missing Well-known Attribute."},
122  { BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR, "/Attribute Flags Error."},
123  { BGP_NOTIFY_UPDATE_ATTR_LENG_ERR, "/Attribute Length Error."},
124  { BGP_NOTIFY_UPDATE_INVAL_ORIGIN, "/Invalid ORIGIN Attribute."},
125  { BGP_NOTIFY_UPDATE_AS_ROUTE_LOOP, "/AS Routing Loop."},
126  { BGP_NOTIFY_UPDATE_INVAL_NEXT_HOP, "/Invalid NEXT_HOP Attribute."},
127  { BGP_NOTIFY_UPDATE_OPT_ATTR_ERR, "/Optional Attribute Error."},
128  { BGP_NOTIFY_UPDATE_INVAL_NETWORK, "/Invalid Network Field."},
129  { BGP_NOTIFY_UPDATE_MAL_AS_PATH, "/Malformed AS_PATH."},
130};
131int bgp_notify_update_msg_max = BGP_NOTIFY_UPDATE_MAX;
132
133struct message bgp_notify_cease_msg[] =
134{
135  { 0, ""},
136  { BGP_NOTIFY_CEASE_MAX_PREFIX, "/Maximum Number of Prefixes Reached."},
137  { BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, "/Administratively Shutdown."},
138  { BGP_NOTIFY_CEASE_PEER_UNCONFIG, "/Peer Unconfigured."},
139  { BGP_NOTIFY_CEASE_ADMIN_RESET, "/Administratively Reset."},
140  { BGP_NOTIFY_CEASE_CONNECT_REJECT, "/Connection Rejected."},
141  { BGP_NOTIFY_CEASE_CONFIG_CHANGE, "/Other Configuration Change."},
142};
143int bgp_notify_cease_msg_max = BGP_NOTIFY_CEASE_MAX;
144
145struct message bgp_notify_capability_msg[] =
146{
147  { 0, "null" },
148  { BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value." },
149  { BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length."},
150  { BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value."},
151};
152int bgp_notify_capability_msg_max = BGP_NOTIFY_CAPABILITY_MAX;
153
154/* Origin strings. */
155char *bgp_origin_str[] = {"i","e","?"};
156char *bgp_origin_long_str[] = {"IGP","EGP","incomplete"};
157
158/* Dump attribute. */
159void
160bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size)
161{
162
163  if (! attr)
164    return;
165
166  snprintf (buf, size, "nexthop %s", inet_ntoa (attr->nexthop));
167  snprintf (buf + strlen (buf), size - strlen (buf), ", origin %s",
168	    bgp_origin_str[attr->origin]);
169
170#ifdef HAVE_IPV6
171  {
172    char addrbuf[BUFSIZ];
173
174    /* Add MP case. */
175    if (attr->mp_nexthop_len == 16 || attr->mp_nexthop_len == 32)
176      snprintf (buf + strlen (buf), size - strlen (buf), ", mp_nexthop %s",
177		inet_ntop (AF_INET6, &attr->mp_nexthop_global,
178			   addrbuf, BUFSIZ));
179
180    if (attr->mp_nexthop_len == 32)
181      snprintf (buf + strlen (buf), size - strlen (buf), "(%s)",
182		inet_ntop (AF_INET6, &attr->mp_nexthop_local,
183			   addrbuf, BUFSIZ));
184  }
185#endif /* HAVE_IPV6 */
186
187  if (peer_sort (peer) == BGP_PEER_IBGP)
188    snprintf (buf + strlen (buf), size - strlen (buf), ", localpref %d",
189	      attr->local_pref);
190
191  if (attr->med)
192    snprintf (buf + strlen (buf), size - strlen (buf), ", metric %d",
193	      attr->med);
194
195  if (attr->community)
196    snprintf (buf + strlen (buf), size - strlen (buf), ", community %s",
197	      community_str (attr->community));
198
199  if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
200    snprintf (buf + strlen (buf), size - strlen (buf), ", atomic-aggregate");
201
202  if (attr->aggregator_as)
203    snprintf (buf + strlen (buf), size - strlen (buf), ", aggregated by %d %s",
204	      attr->aggregator_as, inet_ntoa (attr->aggregator_addr));
205
206  if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
207    snprintf (buf + strlen (buf), size - strlen (buf), ", originator %s",
208	      inet_ntoa (attr->originator_id));
209
210  if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_CLUSTER_LIST))
211    {
212      int i;
213
214      snprintf (buf + strlen (buf), size - strlen (buf), ", clusterlist ");
215      for (i = 0; i < attr->cluster->length / 4; i++)
216	snprintf (buf + strlen (buf), size - strlen (buf), "%s",
217		  inet_ntoa (attr->cluster->list[i]));
218    }
219
220  if (attr->aspath)
221    snprintf (buf + strlen (buf), size - strlen (buf), ", path %s",
222	      aspath_print (attr->aspath));
223}
224
225/* dump notify packet */
226void
227bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify, char *direct)
228{
229  char *subcode_str;
230
231  subcode_str = "";
232
233  switch (bgp_notify->code)
234    {
235    case BGP_NOTIFY_HEADER_ERR:
236      subcode_str = LOOKUP (bgp_notify_head_msg, bgp_notify->subcode);
237      break;
238    case BGP_NOTIFY_OPEN_ERR:
239      subcode_str = LOOKUP (bgp_notify_open_msg, bgp_notify->subcode);
240      break;
241    case BGP_NOTIFY_UPDATE_ERR:
242      subcode_str = LOOKUP (bgp_notify_update_msg, bgp_notify->subcode);
243      break;
244    case BGP_NOTIFY_HOLD_ERR:
245      subcode_str = "";
246      break;
247    case BGP_NOTIFY_FSM_ERR:
248      subcode_str = "";
249      break;
250    case BGP_NOTIFY_CEASE:
251      subcode_str = LOOKUP (bgp_notify_cease_msg, bgp_notify->subcode);
252      break;
253    case BGP_NOTIFY_CAPABILITY_ERR:
254      subcode_str = LOOKUP (bgp_notify_capability_msg, bgp_notify->subcode);
255      break;
256    }
257  if (BGP_DEBUG (normal, NORMAL))
258    plog_info (peer->log, "%s %s NOTIFICATION %d/%d (%s%s) %d bytes %s",
259	       peer ? peer->host : "",
260	       direct, bgp_notify->code, bgp_notify->subcode,
261	       LOOKUP (bgp_notify_msg, bgp_notify->code),
262	       subcode_str, bgp_notify->length,
263	       bgp_notify->data ? bgp_notify->data : "");
264}
265
266/* Debug option setting interface. */
267unsigned long bgp_debug_option = 0;
268
269int
270debug (unsigned int option)
271{
272  return bgp_debug_option & option;
273}
274
275DEFUN (debug_bgp_fsm,
276       debug_bgp_fsm_cmd,
277       "debug bgp fsm",
278       DEBUG_STR
279       BGP_STR
280       "BGP Finite State Machine\n")
281{
282  if (vty->node == CONFIG_NODE)
283    DEBUG_ON (fsm, FSM);
284  else
285    {
286      TERM_DEBUG_ON (fsm, FSM);
287      vty_out (vty, "BGP fsm debugging is on%s", VTY_NEWLINE);
288    }
289  return CMD_SUCCESS;
290}
291
292DEFUN (no_debug_bgp_fsm,
293       no_debug_bgp_fsm_cmd,
294       "no debug bgp fsm",
295       NO_STR
296       DEBUG_STR
297       BGP_STR
298       "Finite State Machine\n")
299{
300  if (vty->node == CONFIG_NODE)
301    DEBUG_OFF (fsm, FSM);
302  else
303    {
304      TERM_DEBUG_OFF (fsm, FSM);
305      vty_out (vty, "BGP fsm debugging is off%s", VTY_NEWLINE);
306    }
307  return CMD_SUCCESS;
308}
309
310ALIAS (no_debug_bgp_fsm,
311       undebug_bgp_fsm_cmd,
312       "undebug bgp fsm",
313       UNDEBUG_STR
314       DEBUG_STR
315       BGP_STR
316       "Finite State Machine\n")
317
318DEFUN (debug_bgp_events,
319       debug_bgp_events_cmd,
320       "debug bgp events",
321       DEBUG_STR
322       BGP_STR
323       "BGP events\n")
324{
325  if (vty->node == CONFIG_NODE)
326    DEBUG_ON (events, EVENTS);
327  else
328    {
329      TERM_DEBUG_ON (events, EVENTS);
330      vty_out (vty, "BGP events debugging is on%s", VTY_NEWLINE);
331    }
332  return CMD_SUCCESS;
333}
334
335DEFUN (no_debug_bgp_events,
336       no_debug_bgp_events_cmd,
337       "no debug bgp events",
338       NO_STR
339       DEBUG_STR
340       BGP_STR
341       "BGP events\n")
342{
343  if (vty->node == CONFIG_NODE)
344    DEBUG_OFF (events, EVENTS);
345  else
346    {
347      TERM_DEBUG_OFF (events, EVENTS);
348      vty_out (vty, "BGP events debugging is off%s", VTY_NEWLINE);
349    }
350  return CMD_SUCCESS;
351}
352
353ALIAS (no_debug_bgp_events,
354       undebug_bgp_events_cmd,
355       "undebug bgp events",
356       UNDEBUG_STR
357       BGP_STR
358       "BGP events\n")
359
360DEFUN (debug_bgp_filter,
361       debug_bgp_filter_cmd,
362       "debug bgp filters",
363       DEBUG_STR
364       BGP_STR
365       "BGP filters\n")
366{
367  if (vty->node == CONFIG_NODE)
368    DEBUG_ON (filter, FILTER);
369  else
370    {
371      TERM_DEBUG_ON (filter, FILTER);
372      vty_out (vty, "BGP filters debugging is on%s", VTY_NEWLINE);
373    }
374  return CMD_SUCCESS;
375}
376
377DEFUN (no_debug_bgp_filter,
378       no_debug_bgp_filter_cmd,
379       "no debug bgp filters",
380       NO_STR
381       DEBUG_STR
382       BGP_STR
383       "BGP filters\n")
384{
385  if (vty->node == CONFIG_NODE)
386    DEBUG_OFF (filter, FILTER);
387  else
388    {
389      TERM_DEBUG_OFF (filter, FILTER);
390      vty_out (vty, "BGP filters debugging is off%s", VTY_NEWLINE);
391    }
392  return CMD_SUCCESS;
393}
394
395ALIAS (no_debug_bgp_filter,
396       undebug_bgp_filter_cmd,
397       "undebug bgp filters",
398       UNDEBUG_STR
399       BGP_STR
400       "BGP filters\n")
401
402DEFUN (debug_bgp_keepalive,
403       debug_bgp_keepalive_cmd,
404       "debug bgp keepalives",
405       DEBUG_STR
406       BGP_STR
407       "BGP keepalives\n")
408{
409  if (vty->node == CONFIG_NODE)
410    DEBUG_ON (keepalive, KEEPALIVE);
411  else
412    {
413      TERM_DEBUG_ON (keepalive, KEEPALIVE);
414      vty_out (vty, "BGP keepalives debugging is on%s", VTY_NEWLINE);
415    }
416  return CMD_SUCCESS;
417}
418
419DEFUN (no_debug_bgp_keepalive,
420       no_debug_bgp_keepalive_cmd,
421       "no debug bgp keepalives",
422       NO_STR
423       DEBUG_STR
424       BGP_STR
425       "BGP keepalives\n")
426{
427  if (vty->node == CONFIG_NODE)
428    DEBUG_OFF (keepalive, KEEPALIVE);
429  else
430    {
431      TERM_DEBUG_OFF (keepalive, KEEPALIVE);
432      vty_out (vty, "BGP keepalives debugging is off%s", VTY_NEWLINE);
433    }
434  return CMD_SUCCESS;
435}
436
437ALIAS (no_debug_bgp_keepalive,
438       undebug_bgp_keepalive_cmd,
439       "undebug bgp keepalives",
440       UNDEBUG_STR
441       BGP_STR
442       "BGP keepalives\n")
443
444DEFUN (debug_bgp_update,
445       debug_bgp_update_cmd,
446       "debug bgp updates",
447       DEBUG_STR
448       BGP_STR
449       "BGP updates\n")
450{
451  if (vty->node == CONFIG_NODE)
452    {
453      DEBUG_ON (update, UPDATE_IN);
454      DEBUG_ON (update, UPDATE_OUT);
455    }
456  else
457    {
458      TERM_DEBUG_ON (update, UPDATE_IN);
459      TERM_DEBUG_ON (update, UPDATE_OUT);
460      vty_out (vty, "BGP updates debugging is on%s", VTY_NEWLINE);
461    }
462  return CMD_SUCCESS;
463}
464
465DEFUN (debug_bgp_update_direct,
466       debug_bgp_update_direct_cmd,
467       "debug bgp updates (in|out)",
468       DEBUG_STR
469       BGP_STR
470       "BGP updates\n"
471       "Inbound updates\n"
472       "Outbound updates\n")
473{
474  if (vty->node == CONFIG_NODE)
475    {
476      if (strncmp ("i", argv[0], 1) == 0)
477	{
478	  DEBUG_OFF (update, UPDATE_OUT);
479	  DEBUG_ON (update, UPDATE_IN);
480	}
481      else
482	{
483	  DEBUG_OFF (update, UPDATE_IN);
484	  DEBUG_ON (update, UPDATE_OUT);
485	}
486    }
487  else
488    {
489      if (strncmp ("i", argv[0], 1) == 0)
490	{
491	  TERM_DEBUG_OFF (update, UPDATE_OUT);
492	  TERM_DEBUG_ON (update, UPDATE_IN);
493	  vty_out (vty, "BGP updates debugging is on (inbound)%s", VTY_NEWLINE);
494	}
495      else
496	{
497	  TERM_DEBUG_OFF (update, UPDATE_IN);
498	  TERM_DEBUG_ON (update, UPDATE_OUT);
499	  vty_out (vty, "BGP updates debugging is on (outbound)%s", VTY_NEWLINE);
500	}
501    }
502  return CMD_SUCCESS;
503}
504
505DEFUN (no_debug_bgp_update,
506       no_debug_bgp_update_cmd,
507       "no debug bgp updates",
508       NO_STR
509       DEBUG_STR
510       BGP_STR
511       "BGP updates\n")
512{
513  if (vty->node == CONFIG_NODE)
514    {
515      DEBUG_OFF (update, UPDATE_IN);
516      DEBUG_OFF (update, UPDATE_OUT);
517    }
518  else
519    {
520      TERM_DEBUG_OFF (update, UPDATE_IN);
521      TERM_DEBUG_OFF (update, UPDATE_OUT);
522      vty_out (vty, "BGP updates debugging is off%s", VTY_NEWLINE);
523    }
524  return CMD_SUCCESS;
525}
526
527ALIAS (no_debug_bgp_update,
528       undebug_bgp_update_cmd,
529       "undebug bgp updates",
530       UNDEBUG_STR
531       BGP_STR
532       "BGP updates\n")
533
534DEFUN (debug_bgp_normal,
535       debug_bgp_normal_cmd,
536       "debug bgp",
537       DEBUG_STR
538       BGP_STR)
539{
540  if (vty->node == CONFIG_NODE)
541    DEBUG_ON (normal, NORMAL);
542  else
543    {
544      TERM_DEBUG_ON (normal, NORMAL);
545      vty_out (vty, "BGP debugging is on%s", VTY_NEWLINE);
546    }
547  return CMD_SUCCESS;
548}
549
550DEFUN (no_debug_bgp_normal,
551       no_debug_bgp_normal_cmd,
552       "no debug bgp",
553       NO_STR
554       DEBUG_STR
555       BGP_STR)
556{
557  if (vty->node == CONFIG_NODE)
558    DEBUG_OFF (normal, NORMAL);
559  else
560    {
561      TERM_DEBUG_OFF (normal, NORMAL);
562      vty_out (vty, "BGP debugging is off%s", VTY_NEWLINE);
563    }
564  return CMD_SUCCESS;
565}
566
567ALIAS (no_debug_bgp_normal,
568       undebug_bgp_normal_cmd,
569       "undebug bgp",
570       UNDEBUG_STR
571       BGP_STR)
572
573DEFUN (no_debug_bgp_all,
574       no_debug_bgp_all_cmd,
575       "no debug all bgp",
576       NO_STR
577       DEBUG_STR
578       "Enable all debugging\n"
579       BGP_STR)
580{
581  TERM_DEBUG_OFF (normal, NORMAL);
582  TERM_DEBUG_OFF (events, EVENTS);
583  TERM_DEBUG_OFF (keepalive, KEEPALIVE);
584  TERM_DEBUG_OFF (update, UPDATE_IN);
585  TERM_DEBUG_OFF (update, UPDATE_OUT);
586  TERM_DEBUG_OFF (fsm, FSM);
587  TERM_DEBUG_OFF (filter, FILTER);
588  vty_out (vty, "All possible debugging has been turned off%s", VTY_NEWLINE);
589
590  return CMD_SUCCESS;
591}
592
593ALIAS (no_debug_bgp_all,
594       undebug_bgp_all_cmd,
595       "undebug all bgp",
596       UNDEBUG_STR
597       "Enable all debugging\n"
598       BGP_STR)
599
600DEFUN (show_debugging_bgp,
601       show_debugging_bgp_cmd,
602       "show debugging bgp",
603       SHOW_STR
604       DEBUG_STR
605       BGP_STR)
606{
607  vty_out (vty, "BGP debugging status:%s", VTY_NEWLINE);
608
609  if (BGP_DEBUG (normal, NORMAL))
610    vty_out (vty, "  BGP debugging is on%s", VTY_NEWLINE);
611  if (BGP_DEBUG (events, EVENTS))
612    vty_out (vty, "  BGP events debugging is on%s", VTY_NEWLINE);
613  if (BGP_DEBUG (keepalive, KEEPALIVE))
614    vty_out (vty, "  BGP keepalives debugging is on%s", VTY_NEWLINE);
615  if (BGP_DEBUG (update, UPDATE_IN) && BGP_DEBUG (update, UPDATE_OUT))
616    vty_out (vty, "  BGP updates debugging is on%s", VTY_NEWLINE);
617  else if (BGP_DEBUG (update, UPDATE_IN))
618    vty_out (vty, "  BGP updates debugging is on (inbound)%s", VTY_NEWLINE);
619  else if (BGP_DEBUG (update, UPDATE_OUT))
620    vty_out (vty, "  BGP updates debugging is on (outbound)%s", VTY_NEWLINE);
621  if (BGP_DEBUG (fsm, FSM))
622    vty_out (vty, "  BGP fsm debugging is on%s", VTY_NEWLINE);
623  if (BGP_DEBUG (filter, FILTER))
624    vty_out (vty, "  BGP filter debugging is on%s", VTY_NEWLINE);
625  vty_out (vty, "%s", VTY_NEWLINE);
626  return CMD_SUCCESS;
627}
628
629int
630bgp_config_write_debug (struct vty *vty)
631{
632  int write = 0;
633
634  if (CONF_BGP_DEBUG (normal, NORMAL))
635    {
636      vty_out (vty, "debug bgp%s", VTY_NEWLINE);
637      write++;
638    }
639
640  if (CONF_BGP_DEBUG (events, EVENTS))
641    {
642      vty_out (vty, "debug bgp events%s", VTY_NEWLINE);
643      write++;
644    }
645
646  if (CONF_BGP_DEBUG (keepalive, KEEPALIVE))
647    {
648      vty_out (vty, "debug bgp keepalives%s", VTY_NEWLINE);
649      write++;
650    }
651
652  if (CONF_BGP_DEBUG (update, UPDATE_IN) && CONF_BGP_DEBUG (update, UPDATE_OUT))
653    {
654      vty_out (vty, "debug bgp updates%s", VTY_NEWLINE);
655      write++;
656    }
657  else if (CONF_BGP_DEBUG (update, UPDATE_IN))
658    {
659      vty_out (vty, "debug bgp updates in%s", VTY_NEWLINE);
660      write++;
661    }
662  else if (CONF_BGP_DEBUG (update, UPDATE_OUT))
663    {
664      vty_out (vty, "debug bgp updates out%s", VTY_NEWLINE);
665      write++;
666    }
667
668  if (CONF_BGP_DEBUG (fsm, FSM))
669    {
670      vty_out (vty, "debug bgp fsm%s", VTY_NEWLINE);
671      write++;
672    }
673
674  if (CONF_BGP_DEBUG (filter, FILTER))
675    {
676      vty_out (vty, "debug bgp filters%s", VTY_NEWLINE);
677      write++;
678    }
679
680  return write;
681}
682
683struct cmd_node debug_node =
684{
685  DEBUG_NODE,
686  "",
687  1
688};
689
690void
691bgp_debug_init ()
692{
693  install_node (&debug_node, bgp_config_write_debug);
694
695  install_element (ENABLE_NODE, &show_debugging_bgp_cmd);
696
697  install_element (ENABLE_NODE, &debug_bgp_fsm_cmd);
698  install_element (CONFIG_NODE, &debug_bgp_fsm_cmd);
699  install_element (ENABLE_NODE, &debug_bgp_events_cmd);
700  install_element (CONFIG_NODE, &debug_bgp_events_cmd);
701  install_element (ENABLE_NODE, &debug_bgp_filter_cmd);
702  install_element (CONFIG_NODE, &debug_bgp_filter_cmd);
703  install_element (ENABLE_NODE, &debug_bgp_keepalive_cmd);
704  install_element (CONFIG_NODE, &debug_bgp_keepalive_cmd);
705  install_element (ENABLE_NODE, &debug_bgp_update_cmd);
706  install_element (CONFIG_NODE, &debug_bgp_update_cmd);
707  install_element (ENABLE_NODE, &debug_bgp_update_direct_cmd);
708  install_element (CONFIG_NODE, &debug_bgp_update_direct_cmd);
709  install_element (ENABLE_NODE, &debug_bgp_normal_cmd);
710  install_element (CONFIG_NODE, &debug_bgp_normal_cmd);
711
712  install_element (ENABLE_NODE, &no_debug_bgp_fsm_cmd);
713  install_element (ENABLE_NODE, &undebug_bgp_fsm_cmd);
714  install_element (CONFIG_NODE, &no_debug_bgp_fsm_cmd);
715  install_element (ENABLE_NODE, &no_debug_bgp_events_cmd);
716  install_element (ENABLE_NODE, &undebug_bgp_events_cmd);
717  install_element (CONFIG_NODE, &no_debug_bgp_events_cmd);
718  install_element (ENABLE_NODE, &no_debug_bgp_filter_cmd);
719  install_element (ENABLE_NODE, &undebug_bgp_filter_cmd);
720  install_element (CONFIG_NODE, &no_debug_bgp_filter_cmd);
721  install_element (ENABLE_NODE, &no_debug_bgp_keepalive_cmd);
722  install_element (ENABLE_NODE, &undebug_bgp_keepalive_cmd);
723  install_element (CONFIG_NODE, &no_debug_bgp_keepalive_cmd);
724  install_element (ENABLE_NODE, &no_debug_bgp_update_cmd);
725  install_element (ENABLE_NODE, &undebug_bgp_update_cmd);
726  install_element (CONFIG_NODE, &no_debug_bgp_update_cmd);
727  install_element (ENABLE_NODE, &no_debug_bgp_normal_cmd);
728  install_element (ENABLE_NODE, &undebug_bgp_normal_cmd);
729  install_element (CONFIG_NODE, &no_debug_bgp_normal_cmd);
730  install_element (ENABLE_NODE, &no_debug_bgp_all_cmd);
731  install_element (ENABLE_NODE, &undebug_bgp_all_cmd);
732}
733