📄 bgp_debug.c
字号:
/* BGP-4, BGP-4+ packet debug routine Copyright (C) 1996, 97, 99 Kunihiro Ishiguro This file is part of GNU Zebra. GNU Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Zebra is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Zebra; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <zebra.h>#include "version.h"#include "prefix.h"#include "linklist.h"#include "stream.h"#include "command.h"#include "str.h"#include "log.h"#include "sockunion.h"#include "bgpd/bgpd.h"#include "bgpd/bgp_aspath.h"#include "bgpd/bgp_route.h"#include "bgpd/bgp_attr.h"#include "bgpd/bgp_debug.h"#include "bgpd/bgp_community.h"unsigned long conf_bgp_debug_fsm;unsigned long conf_bgp_debug_events;unsigned long conf_bgp_debug_packet;unsigned long conf_bgp_debug_filter;unsigned long conf_bgp_debug_keepalive;unsigned long conf_bgp_debug_update;unsigned long conf_bgp_debug_normal;unsigned long term_bgp_debug_fsm;unsigned long term_bgp_debug_events;unsigned long term_bgp_debug_packet;unsigned long term_bgp_debug_filter;unsigned long term_bgp_debug_keepalive;unsigned long term_bgp_debug_update;unsigned long term_bgp_debug_normal;/* messages for BGP-4 status */struct message bgp_status_msg[] = { { 0, "null" }, { Idle, "Idle" }, { Connect, "Connect" }, { Active, "Active" }, { OpenSent, "OpenSent" }, { OpenConfirm, "OpenConfirm" }, { Established, "Established" }, };int bgp_status_msg_max = BGP_STATUS_MAX;/* BGP message type string. */char *bgp_type_str[] = { NULL, "OPEN", "UPDATE", "NOTIFICATION", "KEEPALIVE", "ROUTE-REFRESH", "CAPABILITY" };/* message for BGP-4 Notify */struct message bgp_notify_msg[] = { { 0, "" }, { BGP_NOTIFY_HEADER_ERR, "Message Header Error"}, { BGP_NOTIFY_OPEN_ERR, "OPEN Message Error"}, { BGP_NOTIFY_UPDATE_ERR, "UPDATE Message Error"}, { BGP_NOTIFY_HOLD_ERR, "Hold Timer Expired"}, { BGP_NOTIFY_FSM_ERR, "Finite State Machine Error"}, { BGP_NOTIFY_CEASE, "Cease"}, { BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error"}, };int bgp_notify_msg_max = BGP_NOTIFY_MAX;struct message bgp_notify_head_msg[] = { { 0, "null"}, { BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized."}, { BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length."}, { BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type."} };int bgp_notify_head_msg_max = BGP_NOTIFY_HEADER_MAX;struct message bgp_notify_open_msg[] = { { 0, "null" }, { BGP_NOTIFY_OPEN_UNSUP_VERSION, "/Unsupported Version Number." }, { BGP_NOTIFY_OPEN_BAD_PEER_AS, "/Bad Peer AS."}, { BGP_NOTIFY_OPEN_BAD_BGP_IDENT, "/Bad BGP Identifier."}, { BGP_NOTIFY_OPEN_UNSUP_PARAM, "/Unsupported Optional Parameter."}, { BGP_NOTIFY_OPEN_AUTH_FAILURE, "/Authentication Failure."}, { BGP_NOTIFY_OPEN_UNACEP_HOLDTIME, "/Unacceptable Hold Time."}, { BGP_NOTIFY_OPEN_UNSUP_CAPBL, "/Unsupported Capability."}, };int bgp_notify_open_msg_max = BGP_NOTIFY_OPEN_MAX;struct message bgp_notify_update_msg[] = { { 0, "null"}, { BGP_NOTIFY_UPDATE_MAL_ATTR, "/Malformed Attribute List."}, { BGP_NOTIFY_UPDATE_UNREC_ATTR, "/Unrecognized Well-known Attribute."}, { BGP_NOTIFY_UPDATE_MISS_ATTR, "/Missing Well-known Attribute."}, { BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR, "/Attribute Flags Error."}, { BGP_NOTIFY_UPDATE_ATTR_LENG_ERR, "/Attribute Length Error."}, { BGP_NOTIFY_UPDATE_INVAL_ORIGIN, "/Invalid ORIGIN Attribute."}, { BGP_NOTIFY_UPDATE_AS_ROUTE_LOOP, "/AS Routing Loop."}, { BGP_NOTIFY_UPDATE_INVAL_NEXT_HOP, "/Invalid NEXT_HOP Attribute."}, { BGP_NOTIFY_UPDATE_OPT_ATTR_ERR, "/Optional Attribute Error."}, { BGP_NOTIFY_UPDATE_INVAL_NETWORK, "/Invalid Network Field."}, { BGP_NOTIFY_UPDATE_MAL_AS_PATH, "/Malformed AS_PATH."}, };int bgp_notify_update_msg_max = BGP_NOTIFY_UPDATE_MAX;struct message bgp_notify_cease_msg[] = { { 0, ""}, { BGP_NOTIFY_CEASE_MAX_PREFIX, "/Maximum Number of Prefixes Reached."}, { BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, "/Administratively Shutdown."}, { BGP_NOTIFY_CEASE_PEER_UNCONFIG, "/Peer Unconfigured."}, { BGP_NOTIFY_CEASE_ADMIN_RESET, "/Administratively Reset."}, { BGP_NOTIFY_CEASE_CONNECT_REJECT, "/Connection Rejected."}, { BGP_NOTIFY_CEASE_CONFIG_CHANGE, "/Other Configuration Change."}, { BGP_NOTIFY_CEASE_CONNECT_COLLISION, "/Connection Collision Resolution."}, };int bgp_notify_cease_msg_max = BGP_NOTIFY_CEASE_MAX;struct message bgp_notify_capability_msg[] = { { 0, "null" }, { BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value." }, { BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length."}, { BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value."}, };int bgp_notify_capability_msg_max = BGP_NOTIFY_CAPABILITY_MAX;/* Origin strings. */char *bgp_origin_str[] = {"i","e","?"};char *bgp_origin_long_str[] = {"IGP","EGP","incomplete"};/* Dump attribute. */voidbgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size){ if (! attr) return; snprintf (buf, size, "nexthop %s", inet_ntoa (attr->nexthop)); snprintf (buf + strlen (buf), size - strlen (buf), ", origin %s", bgp_origin_str[attr->origin]);#ifdef HAVE_IPV6 { char addrbuf[BUFSIZ]; /* Add MP case. */ if (attr->mp_nexthop_len == 16 || attr->mp_nexthop_len == 32) snprintf (buf + strlen (buf), size - strlen (buf), ", mp_nexthop %s", inet_ntop (AF_INET6, &attr->mp_nexthop_global, addrbuf, BUFSIZ)); if (attr->mp_nexthop_len == 32) snprintf (buf + strlen (buf), size - strlen (buf), "(%s)", inet_ntop (AF_INET6, &attr->mp_nexthop_local, addrbuf, BUFSIZ)); }#endif /* HAVE_IPV6 */ if (peer_sort (peer) == BGP_PEER_IBGP) snprintf (buf + strlen (buf), size - strlen (buf), ", localpref %d", attr->local_pref); if (attr->med) snprintf (buf + strlen (buf), size - strlen (buf), ", metric %d", attr->med); if (attr->community) snprintf (buf + strlen (buf), size - strlen (buf), ", community %s", community_str (attr->community)); if (attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE)) snprintf (buf + strlen (buf), size - strlen (buf), ", atomic-aggregate"); if (attr->aggregator_as) snprintf (buf + strlen (buf), size - strlen (buf), ", aggregated by %d %s", attr->aggregator_as, inet_ntoa (attr->aggregator_addr)); if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)) snprintf (buf + strlen (buf), size - strlen (buf), ", originator %s", inet_ntoa (attr->originator_id)); if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_CLUSTER_LIST)) { int i; snprintf (buf + strlen (buf), size - strlen (buf), ", clusterlist "); for (i = 0; i < attr->cluster->length / 4; i++) snprintf (buf + strlen (buf), size - strlen (buf), "%s", inet_ntoa (attr->cluster->list[i])); } if (attr->aspath) snprintf (buf + strlen (buf), size - strlen (buf), ", path %s", aspath_print (attr->aspath));}/* dump notify packet */voidbgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify, char *direct){ char *subcode_str; subcode_str = ""; switch (bgp_notify->code) { case BGP_NOTIFY_HEADER_ERR: subcode_str = LOOKUP (bgp_notify_head_msg, bgp_notify->subcode); break; case BGP_NOTIFY_OPEN_ERR: subcode_str = LOOKUP (bgp_notify_open_msg, bgp_notify->subcode); break; case BGP_NOTIFY_UPDATE_ERR: subcode_str = LOOKUP (bgp_notify_update_msg, bgp_notify->subcode); break; case BGP_NOTIFY_HOLD_ERR: subcode_str = ""; break; case BGP_NOTIFY_FSM_ERR: subcode_str = ""; break; case BGP_NOTIFY_CEASE: subcode_str = LOOKUP (bgp_notify_cease_msg, bgp_notify->subcode); break; case BGP_NOTIFY_CAPABILITY_ERR: subcode_str = LOOKUP (bgp_notify_capability_msg, bgp_notify->subcode); break; } if (BGP_DEBUG (normal, NORMAL)) plog_info (peer->log, "%s %s NOTIFICATION %d/%d (%s%s) %d bytes %s", peer ? peer->host : "", direct, bgp_notify->code, bgp_notify->subcode, LOOKUP (bgp_notify_msg, bgp_notify->code), subcode_str, bgp_notify->length, bgp_notify->data ? bgp_notify->data : "");}/* Debug option setting interface. */unsigned long bgp_debug_option = 0;int debug (unsigned int option){ return bgp_debug_option & option; }DEFUN (debug_bgp_fsm, debug_bgp_fsm_cmd, "debug bgp fsm", DEBUG_STR BGP_STR "BGP Finite State Machine\n"){ if (vty->node == CONFIG_NODE) DEBUG_ON (fsm, FSM); else { TERM_DEBUG_ON (fsm, FSM); vty_out (vty, "BGP fsm debugging is on%s", VTY_NEWLINE); } return CMD_SUCCESS;}DEFUN (no_debug_bgp_fsm, no_debug_bgp_fsm_cmd, "no debug bgp fsm", NO_STR DEBUG_STR BGP_STR "Finite State Machine\n"){ if (vty->node == CONFIG_NODE) DEBUG_OFF (fsm, FSM); else { TERM_DEBUG_OFF (fsm, FSM); vty_out (vty, "BGP fsm debugging is off%s", VTY_NEWLINE); } return CMD_SUCCESS;}ALIAS (no_debug_bgp_fsm, undebug_bgp_fsm_cmd, "undebug bgp fsm", UNDEBUG_STR DEBUG_STR BGP_STR "Finite State Machine\n");DEFUN (debug_bgp_events, debug_bgp_events_cmd, "debug bgp events", DEBUG_STR BGP_STR "BGP events\n"){ if (vty->node == CONFIG_NODE) DEBUG_ON (events, EVENTS); else { TERM_DEBUG_ON (events, EVENTS); vty_out (vty, "BGP events debugging is on%s", VTY_NEWLINE); } return CMD_SUCCESS;}DEFUN (no_debug_bgp_events, no_debug_bgp_events_cmd, "no debug bgp events", NO_STR DEBUG_STR BGP_STR "BGP events\n"){ if (vty->node == CONFIG_NODE) DEBUG_OFF (events, EVENTS); else { TERM_DEBUG_OFF (events, EVENTS); vty_out (vty, "BGP events debugging is off%s", VTY_NEWLINE); } return CMD_SUCCESS;}ALIAS (no_debug_bgp_events, undebug_bgp_events_cmd, "undebug bgp events", UNDEBUG_STR BGP_STR "BGP events\n");DEFUN (debug_bgp_filter, debug_bgp_filter_cmd, "debug bgp filters", DEBUG_STR BGP_STR "BGP filters\n"){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -