Annotation of embedaddon/quagga/bgpd/bgp_debug.c, revision 1.1

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

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