File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / bgpd / bgp_debug.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:10 2016 UTC (8 years ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>