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 <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 39unsigned long conf_bgp_debug_as4; 40unsigned long conf_bgp_debug_fsm; 41unsigned long conf_bgp_debug_events; 42unsigned long conf_bgp_debug_packet; 43unsigned long conf_bgp_debug_filter; 44unsigned long conf_bgp_debug_keepalive; 45unsigned long conf_bgp_debug_update; 46unsigned long conf_bgp_debug_normal; 47unsigned long conf_bgp_debug_zebra; 48 49unsigned long term_bgp_debug_as4; 50unsigned long term_bgp_debug_fsm; 51unsigned long term_bgp_debug_events; 52unsigned long term_bgp_debug_packet; 53unsigned long term_bgp_debug_filter; 54unsigned long term_bgp_debug_keepalive; 55unsigned long term_bgp_debug_update; 56unsigned long term_bgp_debug_normal; 57unsigned long term_bgp_debug_zebra; 58 59/* messages for BGP-4 status */ 60const 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}; 71const int bgp_status_msg_max = BGP_STATUS_MAX; 72 73/* BGP message type string. */ 74const 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 */ 86static 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}; 96static const int bgp_notify_msg_max = BGP_NOTIFY_MAX; 97 98static 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}; 104static const int bgp_notify_head_msg_max = BGP_NOTIFY_HEADER_MAX; 105 106static 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}; 117static const int bgp_notify_open_msg_max = BGP_NOTIFY_OPEN_MAX; 118 119static 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}; 134static const int bgp_notify_update_msg_max = BGP_NOTIFY_UPDATE_MAX; 135 136static 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}; 148static const int bgp_notify_cease_msg_max = BGP_NOTIFY_CEASE_MAX; 149 150static 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}; 157static const int bgp_notify_capability_msg_max = BGP_NOTIFY_CAPABILITY_MAX; 158 159/* Origin strings. */ 160const char *bgp_origin_str[] = {"i","e","?"}; 161const char *bgp_origin_long_str[] = {"IGP","EGP","incomplete"}; 162 163/* Dump attribute. */ 164int 165bgp_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 %u", 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 %u", 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 */ 241void 242bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify, 243 const char *direct) 244{ 245 const char *subcode_str; 246 const char *code_str; 247 248 subcode_str = ""; 249 code_str = LOOKUP_DEF (bgp_notify_msg, bgp_notify->code, 250 "Unrecognized Error Code"); 251 252 switch (bgp_notify->code) 253 { 254 case BGP_NOTIFY_HEADER_ERR: 255 subcode_str = LOOKUP_DEF (bgp_notify_head_msg, bgp_notify->subcode, 256 "Unrecognized Error Subcode"); 257 break; 258 case BGP_NOTIFY_OPEN_ERR: 259 subcode_str = LOOKUP_DEF (bgp_notify_open_msg, bgp_notify->subcode, 260 "Unrecognized Error Subcode"); 261 break; 262 case BGP_NOTIFY_UPDATE_ERR: 263 subcode_str = LOOKUP_DEF (bgp_notify_update_msg, bgp_notify->subcode, 264 "Unrecognized Error Subcode"); 265 break; 266 case BGP_NOTIFY_HOLD_ERR: 267 break; 268 case BGP_NOTIFY_FSM_ERR: 269 break; 270 case BGP_NOTIFY_CEASE: 271 subcode_str = LOOKUP_DEF (bgp_notify_cease_msg, bgp_notify->subcode, 272 "Unrecognized Error Subcode"); 273 break; 274 case BGP_NOTIFY_CAPABILITY_ERR: 275 subcode_str = LOOKUP_DEF (bgp_notify_capability_msg, bgp_notify->subcode, 276 "Unrecognized Error Subcode"); 277 break; 278 } 279 280 if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) 281 zlog_info ("%%NOTIFICATION: %s neighbor %s %d/%d (%s%s) %d bytes %s", 282 strcmp (direct, "received") == 0 ? "received from" : "sent to", 283 peer->host, bgp_notify->code, bgp_notify->subcode, 284 code_str, subcode_str, bgp_notify->length, 285 bgp_notify->data ? bgp_notify->data : ""); 286 else if (BGP_DEBUG (normal, NORMAL)) 287 plog_debug (peer->log, "%s %s NOTIFICATION %d/%d (%s%s) %d bytes %s", 288 peer ? peer->host : "", 289 direct, bgp_notify->code, bgp_notify->subcode, 290 code_str, subcode_str, bgp_notify->length, 291 bgp_notify->data ? bgp_notify->data : ""); 292} 293 294/* Debug option setting interface. */ 295unsigned long bgp_debug_option = 0; 296 297int 298debug (unsigned int option) 299{ 300 return bgp_debug_option & option; 301} 302 303DEFUN (debug_bgp_as4, 304 debug_bgp_as4_cmd, 305 "debug bgp as4", 306 DEBUG_STR 307 BGP_STR 308 "BGP AS4 actions\n") 309{ 310 if (vty->node == CONFIG_NODE) 311 DEBUG_ON (as4, AS4); 312 else 313 { 314 TERM_DEBUG_ON (as4, AS4); 315 vty_out (vty, "BGP as4 debugging is on%s", VTY_NEWLINE); 316 } 317 return CMD_SUCCESS; 318} 319 320DEFUN (no_debug_bgp_as4, 321 no_debug_bgp_as4_cmd, 322 "no debug bgp as4", 323 NO_STR 324 DEBUG_STR 325 BGP_STR 326 "BGP AS4 actions\n") 327{ 328 if (vty->node == CONFIG_NODE) 329 DEBUG_OFF (as4, AS4); 330 else 331 { 332 TERM_DEBUG_OFF (as4, AS4); 333 vty_out (vty, "BGP as4 debugging is off%s", VTY_NEWLINE); 334 } 335 return CMD_SUCCESS; 336} 337 338ALIAS (no_debug_bgp_as4, 339 undebug_bgp_as4_cmd, 340 "undebug bgp as4", 341 UNDEBUG_STR 342 BGP_STR 343 "BGP AS4 actions\n") 344 345DEFUN (debug_bgp_as4_segment, 346 debug_bgp_as4_segment_cmd, 347 "debug bgp as4 segment", 348 DEBUG_STR 349 BGP_STR 350 "BGP AS4 actions\n" 351 "BGP AS4 aspath segment handling\n") 352{ 353 if (vty->node == CONFIG_NODE) 354 DEBUG_ON (as4, AS4_SEGMENT); 355 else 356 { 357 TERM_DEBUG_ON (as4, AS4_SEGMENT); 358 vty_out (vty, "BGP as4 segment debugging is on%s", VTY_NEWLINE); 359 } 360 return CMD_SUCCESS; 361} 362 363DEFUN (no_debug_bgp_as4_segment, 364 no_debug_bgp_as4_segment_cmd, 365 "no debug bgp as4 segment", 366 NO_STR 367 DEBUG_STR 368 BGP_STR 369 "BGP AS4 actions\n" 370 "BGP AS4 aspath segment handling\n") 371{ 372 if (vty->node == CONFIG_NODE) 373 DEBUG_OFF (as4, AS4_SEGMENT); 374 else 375 { 376 TERM_DEBUG_OFF (as4, AS4_SEGMENT); 377 vty_out (vty, "BGP as4 segment debugging is off%s", VTY_NEWLINE); 378 } 379 return CMD_SUCCESS; 380} 381 382ALIAS (no_debug_bgp_as4_segment, 383 undebug_bgp_as4_segment_cmd, 384 "undebug bgp as4 segment", 385 UNDEBUG_STR 386 BGP_STR 387 "BGP AS4 actions\n" 388 "BGP AS4 aspath segment handling\n") 389 390DEFUN (debug_bgp_fsm, 391 debug_bgp_fsm_cmd, 392 "debug bgp fsm", 393 DEBUG_STR 394 BGP_STR 395 "BGP Finite State Machine\n") 396{ 397 if (vty->node == CONFIG_NODE) 398 DEBUG_ON (fsm, FSM); 399 else 400 { 401 TERM_DEBUG_ON (fsm, FSM); 402 vty_out (vty, "BGP fsm debugging is on%s", VTY_NEWLINE); 403 } 404 return CMD_SUCCESS; 405} 406 407DEFUN (no_debug_bgp_fsm, 408 no_debug_bgp_fsm_cmd, 409 "no debug bgp fsm", 410 NO_STR 411 DEBUG_STR 412 BGP_STR 413 "Finite State Machine\n") 414{ 415 if (vty->node == CONFIG_NODE) 416 DEBUG_OFF (fsm, FSM); 417 else 418 { 419 TERM_DEBUG_OFF (fsm, FSM); 420 vty_out (vty, "BGP fsm debugging is off%s", VTY_NEWLINE); 421 } 422 return CMD_SUCCESS; 423} 424 425ALIAS (no_debug_bgp_fsm, 426 undebug_bgp_fsm_cmd, 427 "undebug bgp fsm", 428 UNDEBUG_STR 429 BGP_STR 430 "Finite State Machine\n") 431 432DEFUN (debug_bgp_events, 433 debug_bgp_events_cmd, 434 "debug bgp events", 435 DEBUG_STR 436 BGP_STR 437 "BGP events\n") 438{ 439 if (vty->node == CONFIG_NODE) 440 DEBUG_ON (events, EVENTS); 441 else 442 { 443 TERM_DEBUG_ON (events, EVENTS); 444 vty_out (vty, "BGP events debugging is on%s", VTY_NEWLINE); 445 } 446 return CMD_SUCCESS; 447} 448 449DEFUN (no_debug_bgp_events, 450 no_debug_bgp_events_cmd, 451 "no debug bgp events", 452 NO_STR 453 DEBUG_STR 454 BGP_STR 455 "BGP events\n") 456{ 457 if (vty->node == CONFIG_NODE) 458 DEBUG_OFF (events, EVENTS); 459 else 460 { 461 TERM_DEBUG_OFF (events, EVENTS); 462 vty_out (vty, "BGP events debugging is off%s", VTY_NEWLINE); 463 } 464 return CMD_SUCCESS; 465} 466 467ALIAS (no_debug_bgp_events, 468 undebug_bgp_events_cmd, 469 "undebug bgp events", 470 UNDEBUG_STR 471 BGP_STR 472 "BGP events\n") 473 474DEFUN (debug_bgp_filter, 475 debug_bgp_filter_cmd, 476 "debug bgp filters", 477 DEBUG_STR 478 BGP_STR 479 "BGP filters\n") 480{ 481 if (vty->node == CONFIG_NODE) 482 DEBUG_ON (filter, FILTER); 483 else 484 { 485 TERM_DEBUG_ON (filter, FILTER); 486 vty_out (vty, "BGP filters debugging is on%s", VTY_NEWLINE); 487 } 488 return CMD_SUCCESS; 489} 490 491DEFUN (no_debug_bgp_filter, 492 no_debug_bgp_filter_cmd, 493 "no debug bgp filters", 494 NO_STR 495 DEBUG_STR 496 BGP_STR 497 "BGP filters\n") 498{ 499 if (vty->node == CONFIG_NODE) 500 DEBUG_OFF (filter, FILTER); 501 else 502 { 503 TERM_DEBUG_OFF (filter, FILTER); 504 vty_out (vty, "BGP filters debugging is off%s", VTY_NEWLINE); 505 } 506 return CMD_SUCCESS; 507} 508 509ALIAS (no_debug_bgp_filter, 510 undebug_bgp_filter_cmd, 511 "undebug bgp filters", 512 UNDEBUG_STR 513 BGP_STR 514 "BGP filters\n") 515 516DEFUN (debug_bgp_keepalive, 517 debug_bgp_keepalive_cmd, 518 "debug bgp keepalives", 519 DEBUG_STR 520 BGP_STR 521 "BGP keepalives\n") 522{ 523 if (vty->node == CONFIG_NODE) 524 DEBUG_ON (keepalive, KEEPALIVE); 525 else 526 { 527 TERM_DEBUG_ON (keepalive, KEEPALIVE); 528 vty_out (vty, "BGP keepalives debugging is on%s", VTY_NEWLINE); 529 } 530 return CMD_SUCCESS; 531} 532 533DEFUN (no_debug_bgp_keepalive, 534 no_debug_bgp_keepalive_cmd, 535 "no debug bgp keepalives", 536 NO_STR 537 DEBUG_STR 538 BGP_STR 539 "BGP keepalives\n") 540{ 541 if (vty->node == CONFIG_NODE) 542 DEBUG_OFF (keepalive, KEEPALIVE); 543 else 544 { 545 TERM_DEBUG_OFF (keepalive, KEEPALIVE); 546 vty_out (vty, "BGP keepalives debugging is off%s", VTY_NEWLINE); 547 } 548 return CMD_SUCCESS; 549} 550 551ALIAS (no_debug_bgp_keepalive, 552 undebug_bgp_keepalive_cmd, 553 "undebug bgp keepalives", 554 UNDEBUG_STR 555 BGP_STR 556 "BGP keepalives\n") 557 558DEFUN (debug_bgp_update, 559 debug_bgp_update_cmd, 560 "debug bgp updates", 561 DEBUG_STR 562 BGP_STR 563 "BGP updates\n") 564{ 565 if (vty->node == CONFIG_NODE) 566 { 567 DEBUG_ON (update, UPDATE_IN); 568 DEBUG_ON (update, UPDATE_OUT); 569 } 570 else 571 { 572 TERM_DEBUG_ON (update, UPDATE_IN); 573 TERM_DEBUG_ON (update, UPDATE_OUT); 574 vty_out (vty, "BGP updates debugging is on%s", VTY_NEWLINE); 575 } 576 return CMD_SUCCESS; 577} 578 579DEFUN (debug_bgp_update_direct, 580 debug_bgp_update_direct_cmd, 581 "debug bgp updates (in|out)", 582 DEBUG_STR 583 BGP_STR 584 "BGP updates\n" 585 "Inbound updates\n" 586 "Outbound updates\n") 587{ 588 if (vty->node == CONFIG_NODE) 589 { 590 if (strncmp ("i", argv[0], 1) == 0) 591 { 592 DEBUG_OFF (update, UPDATE_OUT); 593 DEBUG_ON (update, UPDATE_IN); 594 } 595 else 596 { 597 DEBUG_OFF (update, UPDATE_IN); 598 DEBUG_ON (update, UPDATE_OUT); 599 } 600 } 601 else 602 { 603 if (strncmp ("i", argv[0], 1) == 0) 604 { 605 TERM_DEBUG_OFF (update, UPDATE_OUT); 606 TERM_DEBUG_ON (update, UPDATE_IN); 607 vty_out (vty, "BGP updates debugging is on (inbound)%s", VTY_NEWLINE); 608 } 609 else 610 { 611 TERM_DEBUG_OFF (update, UPDATE_IN); 612 TERM_DEBUG_ON (update, UPDATE_OUT); 613 vty_out (vty, "BGP updates debugging is on (outbound)%s", VTY_NEWLINE); 614 } 615 } 616 return CMD_SUCCESS; 617} 618 619DEFUN (no_debug_bgp_update, 620 no_debug_bgp_update_cmd, 621 "no debug bgp updates", 622 NO_STR 623 DEBUG_STR 624 BGP_STR 625 "BGP updates\n") 626{ 627 if (vty->node == CONFIG_NODE) 628 { 629 DEBUG_OFF (update, UPDATE_IN); 630 DEBUG_OFF (update, UPDATE_OUT); 631 } 632 else 633 { 634 TERM_DEBUG_OFF (update, UPDATE_IN); 635 TERM_DEBUG_OFF (update, UPDATE_OUT); 636 vty_out (vty, "BGP updates debugging is off%s", VTY_NEWLINE); 637 } 638 return CMD_SUCCESS; 639} 640 641ALIAS (no_debug_bgp_update, 642 undebug_bgp_update_cmd, 643 "undebug bgp updates", 644 UNDEBUG_STR 645 BGP_STR 646 "BGP updates\n") 647 648DEFUN (debug_bgp_normal, 649 debug_bgp_normal_cmd, 650 "debug bgp", 651 DEBUG_STR 652 BGP_STR) 653{ 654 if (vty->node == CONFIG_NODE) 655 DEBUG_ON (normal, NORMAL); 656 else 657 { 658 TERM_DEBUG_ON (normal, NORMAL); 659 vty_out (vty, "BGP debugging is on%s", VTY_NEWLINE); 660 } 661 return CMD_SUCCESS; 662} 663 664DEFUN (no_debug_bgp_normal, 665 no_debug_bgp_normal_cmd, 666 "no debug bgp", 667 NO_STR 668 DEBUG_STR 669 BGP_STR) 670{ 671 if (vty->node == CONFIG_NODE) 672 DEBUG_OFF (normal, NORMAL); 673 else 674 { 675 TERM_DEBUG_OFF (normal, NORMAL); 676 vty_out (vty, "BGP debugging is off%s", VTY_NEWLINE); 677 } 678 return CMD_SUCCESS; 679} 680 681ALIAS (no_debug_bgp_normal, 682 undebug_bgp_normal_cmd, 683 "undebug bgp", 684 UNDEBUG_STR 685 BGP_STR) 686 687DEFUN (debug_bgp_zebra, 688 debug_bgp_zebra_cmd, 689 "debug bgp zebra", 690 DEBUG_STR 691 BGP_STR 692 "BGP Zebra messages\n") 693{ 694 if (vty->node == CONFIG_NODE) 695 DEBUG_ON (zebra, ZEBRA); 696 else 697 { 698 TERM_DEBUG_ON (zebra, ZEBRA); 699 vty_out (vty, "BGP zebra debugging is on%s", VTY_NEWLINE); 700 } 701 return CMD_SUCCESS; 702} 703 704DEFUN (no_debug_bgp_zebra, 705 no_debug_bgp_zebra_cmd, 706 "no debug bgp zebra", 707 NO_STR 708 DEBUG_STR 709 BGP_STR 710 "BGP Zebra messages\n") 711{ 712 if (vty->node == CONFIG_NODE) 713 DEBUG_OFF (zebra, ZEBRA); 714 else 715 { 716 TERM_DEBUG_OFF (zebra, ZEBRA); 717 vty_out (vty, "BGP zebra debugging is off%s", VTY_NEWLINE); 718 } 719 return CMD_SUCCESS; 720} 721 722ALIAS (no_debug_bgp_zebra, 723 undebug_bgp_zebra_cmd, 724 "undebug bgp zebra", 725 UNDEBUG_STR 726 BGP_STR 727 "BGP Zebra messages\n") 728 729DEFUN (no_debug_bgp_all, 730 no_debug_bgp_all_cmd, 731 "no debug all bgp", 732 NO_STR 733 DEBUG_STR 734 "Enable all debugging\n" 735 BGP_STR) 736{ 737 TERM_DEBUG_OFF (normal, NORMAL); 738 TERM_DEBUG_OFF (events, EVENTS); 739 TERM_DEBUG_OFF (keepalive, KEEPALIVE); 740 TERM_DEBUG_OFF (update, UPDATE_IN); 741 TERM_DEBUG_OFF (update, UPDATE_OUT); 742 TERM_DEBUG_OFF (as4, AS4); 743 TERM_DEBUG_OFF (as4, AS4_SEGMENT); 744 TERM_DEBUG_OFF (fsm, FSM); 745 TERM_DEBUG_OFF (filter, FILTER); 746 TERM_DEBUG_OFF (zebra, ZEBRA); 747 vty_out (vty, "All possible debugging has been turned off%s", VTY_NEWLINE); 748 749 return CMD_SUCCESS; 750} 751 752ALIAS (no_debug_bgp_all, 753 undebug_bgp_all_cmd, 754 "undebug all bgp", 755 UNDEBUG_STR 756 "Enable all debugging\n" 757 BGP_STR) 758 759DEFUN (show_debugging_bgp, 760 show_debugging_bgp_cmd, 761 "show debugging bgp", 762 SHOW_STR 763 DEBUG_STR 764 BGP_STR) 765{ 766 vty_out (vty, "BGP debugging status:%s", VTY_NEWLINE); 767 768 if (BGP_DEBUG (normal, NORMAL)) 769 vty_out (vty, " BGP debugging is on%s", VTY_NEWLINE); 770 if (BGP_DEBUG (events, EVENTS)) 771 vty_out (vty, " BGP events debugging is on%s", VTY_NEWLINE); 772 if (BGP_DEBUG (keepalive, KEEPALIVE)) 773 vty_out (vty, " BGP keepalives debugging is on%s", VTY_NEWLINE); 774 if (BGP_DEBUG (update, UPDATE_IN) && BGP_DEBUG (update, UPDATE_OUT)) 775 vty_out (vty, " BGP updates debugging is on%s", VTY_NEWLINE); 776 else if (BGP_DEBUG (update, UPDATE_IN)) 777 vty_out (vty, " BGP updates debugging is on (inbound)%s", VTY_NEWLINE); 778 else if (BGP_DEBUG (update, UPDATE_OUT)) 779 vty_out (vty, " BGP updates debugging is on (outbound)%s", VTY_NEWLINE); 780 if (BGP_DEBUG (fsm, FSM)) 781 vty_out (vty, " BGP fsm debugging is on%s", VTY_NEWLINE); 782 if (BGP_DEBUG (filter, FILTER)) 783 vty_out (vty, " BGP filter debugging is on%s", VTY_NEWLINE); 784 if (BGP_DEBUG (zebra, ZEBRA)) 785 vty_out (vty, " BGP zebra debugging is on%s", VTY_NEWLINE); 786 if (BGP_DEBUG (as4, AS4)) 787 vty_out (vty, " BGP as4 debugging is on%s", VTY_NEWLINE); 788 if (BGP_DEBUG (as4, AS4_SEGMENT)) 789 vty_out (vty, " BGP as4 aspath segment debugging is on%s", VTY_NEWLINE); 790 vty_out (vty, "%s", VTY_NEWLINE); 791 return CMD_SUCCESS; 792} 793 794static int 795bgp_config_write_debug (struct vty *vty) 796{ 797 int write = 0; 798 799 if (CONF_BGP_DEBUG (normal, NORMAL)) 800 { 801 vty_out (vty, "debug bgp%s", VTY_NEWLINE); 802 write++; 803 } 804 805 if (CONF_BGP_DEBUG (as4, AS4)) 806 { 807 vty_out (vty, "debug bgp as4%s", VTY_NEWLINE); 808 write++; 809 } 810 811 if (CONF_BGP_DEBUG (as4, AS4_SEGMENT)) 812 { 813 vty_out (vty, "debug bgp as4 segment%s", VTY_NEWLINE); 814 write++; 815 } 816 817 if (CONF_BGP_DEBUG (events, EVENTS)) 818 { 819 vty_out (vty, "debug bgp events%s", VTY_NEWLINE); 820 write++; 821 } 822 823 if (CONF_BGP_DEBUG (keepalive, KEEPALIVE)) 824 { 825 vty_out (vty, "debug bgp keepalives%s", VTY_NEWLINE); 826 write++; 827 } 828 829 if (CONF_BGP_DEBUG (update, UPDATE_IN) && CONF_BGP_DEBUG (update, UPDATE_OUT)) 830 { 831 vty_out (vty, "debug bgp updates%s", VTY_NEWLINE); 832 write++; 833 } 834 else if (CONF_BGP_DEBUG (update, UPDATE_IN)) 835 { 836 vty_out (vty, "debug bgp updates in%s", VTY_NEWLINE); 837 write++; 838 } 839 else if (CONF_BGP_DEBUG (update, UPDATE_OUT)) 840 { 841 vty_out (vty, "debug bgp updates out%s", VTY_NEWLINE); 842 write++; 843 } 844 845 if (CONF_BGP_DEBUG (fsm, FSM)) 846 { 847 vty_out (vty, "debug bgp fsm%s", VTY_NEWLINE); 848 write++; 849 } 850 851 if (CONF_BGP_DEBUG (filter, FILTER)) 852 { 853 vty_out (vty, "debug bgp filters%s", VTY_NEWLINE); 854 write++; 855 } 856 857 if (CONF_BGP_DEBUG (zebra, ZEBRA)) 858 { 859 vty_out (vty, "debug bgp zebra%s", VTY_NEWLINE); 860 write++; 861 } 862 863 return write; 864} 865 866static struct cmd_node debug_node = 867{ 868 DEBUG_NODE, 869 "", 870 1 871}; 872 873void 874bgp_debug_init (void) 875{ 876 install_node (&debug_node, bgp_config_write_debug); 877 878 install_element (ENABLE_NODE, &show_debugging_bgp_cmd); 879 880 install_element (ENABLE_NODE, &debug_bgp_as4_cmd); 881 install_element (CONFIG_NODE, &debug_bgp_as4_cmd); 882 install_element (ENABLE_NODE, &debug_bgp_as4_segment_cmd); 883 install_element (CONFIG_NODE, &debug_bgp_as4_segment_cmd); 884 885 install_element (ENABLE_NODE, &debug_bgp_fsm_cmd); 886 install_element (CONFIG_NODE, &debug_bgp_fsm_cmd); 887 install_element (ENABLE_NODE, &debug_bgp_events_cmd); 888 install_element (CONFIG_NODE, &debug_bgp_events_cmd); 889 install_element (ENABLE_NODE, &debug_bgp_filter_cmd); 890 install_element (CONFIG_NODE, &debug_bgp_filter_cmd); 891 install_element (ENABLE_NODE, &debug_bgp_keepalive_cmd); 892 install_element (CONFIG_NODE, &debug_bgp_keepalive_cmd); 893 install_element (ENABLE_NODE, &debug_bgp_update_cmd); 894 install_element (CONFIG_NODE, &debug_bgp_update_cmd); 895 install_element (ENABLE_NODE, &debug_bgp_update_direct_cmd); 896 install_element (CONFIG_NODE, &debug_bgp_update_direct_cmd); 897 install_element (ENABLE_NODE, &debug_bgp_normal_cmd); 898 install_element (CONFIG_NODE, &debug_bgp_normal_cmd); 899 install_element (ENABLE_NODE, &debug_bgp_zebra_cmd); 900 install_element (CONFIG_NODE, &debug_bgp_zebra_cmd); 901 902 install_element (ENABLE_NODE, &no_debug_bgp_as4_cmd); 903 install_element (ENABLE_NODE, &undebug_bgp_as4_cmd); 904 install_element (CONFIG_NODE, &no_debug_bgp_as4_cmd); 905 install_element (ENABLE_NODE, &no_debug_bgp_as4_segment_cmd); 906 install_element (ENABLE_NODE, &undebug_bgp_as4_segment_cmd); 907 install_element (CONFIG_NODE, &no_debug_bgp_as4_segment_cmd); 908 909 install_element (ENABLE_NODE, &no_debug_bgp_fsm_cmd); 910 install_element (ENABLE_NODE, &undebug_bgp_fsm_cmd); 911 install_element (CONFIG_NODE, &no_debug_bgp_fsm_cmd); 912 install_element (ENABLE_NODE, &no_debug_bgp_events_cmd); 913 install_element (ENABLE_NODE, &undebug_bgp_events_cmd); 914 install_element (CONFIG_NODE, &no_debug_bgp_events_cmd); 915 install_element (ENABLE_NODE, &no_debug_bgp_filter_cmd); 916 install_element (ENABLE_NODE, &undebug_bgp_filter_cmd); 917 install_element (CONFIG_NODE, &no_debug_bgp_filter_cmd); 918 install_element (ENABLE_NODE, &no_debug_bgp_keepalive_cmd); 919 install_element (ENABLE_NODE, &undebug_bgp_keepalive_cmd); 920 install_element (CONFIG_NODE, &no_debug_bgp_keepalive_cmd); 921 install_element (ENABLE_NODE, &no_debug_bgp_update_cmd); 922 install_element (ENABLE_NODE, &undebug_bgp_update_cmd); 923 install_element (CONFIG_NODE, &no_debug_bgp_update_cmd); 924 install_element (ENABLE_NODE, &no_debug_bgp_normal_cmd); 925 install_element (ENABLE_NODE, &undebug_bgp_normal_cmd); 926 install_element (CONFIG_NODE, &no_debug_bgp_normal_cmd); 927 install_element (ENABLE_NODE, &no_debug_bgp_zebra_cmd); 928 install_element (ENABLE_NODE, &undebug_bgp_zebra_cmd); 929 install_element (CONFIG_NODE, &no_debug_bgp_zebra_cmd); 930 install_element (ENABLE_NODE, &no_debug_bgp_all_cmd); 931 install_element (ENABLE_NODE, &undebug_bgp_all_cmd); 932} 933