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