bgp_debug.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:21k
源码类别:

网络

开发平台:

Unix_Linux

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