blob: 60e2777ec88bafaa27a4ed109e04a043388cc6f9 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/* 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
gdt5e4fa162004-03-16 14:38:36 +000023#include <lib/version.h>
paul718e3742002-12-13 20:15:29 +000024#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"
Donald Sharp04907292016-01-07 10:03:01 -050031#include "filter.h"
paul718e3742002-12-13 20:15:29 +000032
33#include "bgpd/bgpd.h"
34#include "bgpd/bgp_aspath.h"
35#include "bgpd/bgp_route.h"
36#include "bgpd/bgp_attr.h"
37#include "bgpd/bgp_debug.h"
38#include "bgpd/bgp_community.h"
39
Paul Jakma0b2aa3a2007-10-14 22:32:21 +000040unsigned long conf_bgp_debug_as4;
paul718e3742002-12-13 20:15:29 +000041unsigned long conf_bgp_debug_fsm;
42unsigned long conf_bgp_debug_events;
43unsigned long conf_bgp_debug_packet;
44unsigned long conf_bgp_debug_filter;
45unsigned long conf_bgp_debug_keepalive;
46unsigned long conf_bgp_debug_update;
47unsigned long conf_bgp_debug_normal;
Andrew J. Schorra39275d2006-11-30 16:36:57 +000048unsigned long conf_bgp_debug_zebra;
paul718e3742002-12-13 20:15:29 +000049
Paul Jakma0b2aa3a2007-10-14 22:32:21 +000050unsigned long term_bgp_debug_as4;
paul718e3742002-12-13 20:15:29 +000051unsigned long term_bgp_debug_fsm;
52unsigned long term_bgp_debug_events;
53unsigned long term_bgp_debug_packet;
54unsigned long term_bgp_debug_filter;
55unsigned long term_bgp_debug_keepalive;
56unsigned long term_bgp_debug_update;
57unsigned long term_bgp_debug_normal;
Andrew J. Schorra39275d2006-11-30 16:36:57 +000058unsigned long term_bgp_debug_zebra;
paul718e3742002-12-13 20:15:29 +000059
60/* messages for BGP-4 status */
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -070061const struct message bgp_status_msg[] =
paul718e3742002-12-13 20:15:29 +000062{
paul718e3742002-12-13 20:15:29 +000063 { Idle, "Idle" },
64 { Connect, "Connect" },
65 { Active, "Active" },
66 { OpenSent, "OpenSent" },
67 { OpenConfirm, "OpenConfirm" },
68 { Established, "Established" },
Paul Jakmaca058a32006-09-14 02:58:49 +000069 { Clearing, "Clearing" },
70 { Deleted, "Deleted" },
paul718e3742002-12-13 20:15:29 +000071};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -070072const int bgp_status_msg_max = BGP_STATUS_MAX;
paul718e3742002-12-13 20:15:29 +000073
74/* BGP message type string. */
paulfd79ac92004-10-13 05:06:08 +000075const char *bgp_type_str[] =
paul718e3742002-12-13 20:15:29 +000076{
77 NULL,
78 "OPEN",
79 "UPDATE",
80 "NOTIFICATION",
81 "KEEPALIVE",
82 "ROUTE-REFRESH",
83 "CAPABILITY"
84};
85
86/* message for BGP-4 Notify */
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -070087static const struct message bgp_notify_msg[] =
paul718e3742002-12-13 20:15:29 +000088{
paul718e3742002-12-13 20:15:29 +000089 { BGP_NOTIFY_HEADER_ERR, "Message Header Error"},
90 { BGP_NOTIFY_OPEN_ERR, "OPEN Message Error"},
91 { BGP_NOTIFY_UPDATE_ERR, "UPDATE Message Error"},
92 { BGP_NOTIFY_HOLD_ERR, "Hold Timer Expired"},
93 { BGP_NOTIFY_FSM_ERR, "Finite State Machine Error"},
94 { BGP_NOTIFY_CEASE, "Cease"},
95 { BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error"},
96};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -070097static const int bgp_notify_msg_max = BGP_NOTIFY_MAX;
paul718e3742002-12-13 20:15:29 +000098
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -070099static const struct message bgp_notify_head_msg[] =
paul718e3742002-12-13 20:15:29 +0000100{
hasso3950fda2004-05-20 10:22:49 +0000101 { BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized"},
102 { BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length"},
103 { BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type"}
paul718e3742002-12-13 20:15:29 +0000104};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700105static const int bgp_notify_head_msg_max = BGP_NOTIFY_HEADER_MAX;
paul718e3742002-12-13 20:15:29 +0000106
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700107static const struct message bgp_notify_open_msg[] =
paul718e3742002-12-13 20:15:29 +0000108{
Dmitrij Tejblum4b4e07d2011-09-21 23:13:22 +0400109 { BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
hasso3950fda2004-05-20 10:22:49 +0000110 { BGP_NOTIFY_OPEN_UNSUP_VERSION, "/Unsupported Version Number" },
111 { BGP_NOTIFY_OPEN_BAD_PEER_AS, "/Bad Peer AS"},
112 { BGP_NOTIFY_OPEN_BAD_BGP_IDENT, "/Bad BGP Identifier"},
113 { BGP_NOTIFY_OPEN_UNSUP_PARAM, "/Unsupported Optional Parameter"},
114 { BGP_NOTIFY_OPEN_AUTH_FAILURE, "/Authentication Failure"},
115 { BGP_NOTIFY_OPEN_UNACEP_HOLDTIME, "/Unacceptable Hold Time"},
116 { BGP_NOTIFY_OPEN_UNSUP_CAPBL, "/Unsupported Capability"},
paul718e3742002-12-13 20:15:29 +0000117};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700118static const int bgp_notify_open_msg_max = BGP_NOTIFY_OPEN_MAX;
paul718e3742002-12-13 20:15:29 +0000119
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700120static const struct message bgp_notify_update_msg[] =
paul718e3742002-12-13 20:15:29 +0000121{
Dmitrij Tejblum4b4e07d2011-09-21 23:13:22 +0400122 { BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
hasso3950fda2004-05-20 10:22:49 +0000123 { BGP_NOTIFY_UPDATE_MAL_ATTR, "/Malformed Attribute List"},
124 { BGP_NOTIFY_UPDATE_UNREC_ATTR, "/Unrecognized Well-known Attribute"},
125 { BGP_NOTIFY_UPDATE_MISS_ATTR, "/Missing Well-known Attribute"},
126 { BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR, "/Attribute Flags Error"},
127 { BGP_NOTIFY_UPDATE_ATTR_LENG_ERR, "/Attribute Length Error"},
128 { BGP_NOTIFY_UPDATE_INVAL_ORIGIN, "/Invalid ORIGIN Attribute"},
129 { BGP_NOTIFY_UPDATE_AS_ROUTE_LOOP, "/AS Routing Loop"},
130 { BGP_NOTIFY_UPDATE_INVAL_NEXT_HOP, "/Invalid NEXT_HOP Attribute"},
131 { BGP_NOTIFY_UPDATE_OPT_ATTR_ERR, "/Optional Attribute Error"},
132 { BGP_NOTIFY_UPDATE_INVAL_NETWORK, "/Invalid Network Field"},
133 { BGP_NOTIFY_UPDATE_MAL_AS_PATH, "/Malformed AS_PATH"},
paul718e3742002-12-13 20:15:29 +0000134};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700135static const int bgp_notify_update_msg_max = BGP_NOTIFY_UPDATE_MAX;
paul718e3742002-12-13 20:15:29 +0000136
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700137static const struct message bgp_notify_cease_msg[] =
paul718e3742002-12-13 20:15:29 +0000138{
Dmitrij Tejblum4b4e07d2011-09-21 23:13:22 +0400139 { BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
hasso3950fda2004-05-20 10:22:49 +0000140 { BGP_NOTIFY_CEASE_MAX_PREFIX, "/Maximum Number of Prefixes Reached"},
141 { BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, "/Administratively Shutdown"},
142 { BGP_NOTIFY_CEASE_PEER_UNCONFIG, "/Peer Unconfigured"},
143 { BGP_NOTIFY_CEASE_ADMIN_RESET, "/Administratively Reset"},
144 { BGP_NOTIFY_CEASE_CONNECT_REJECT, "/Connection Rejected"},
145 { BGP_NOTIFY_CEASE_CONFIG_CHANGE, "/Other Configuration Change"},
146 { BGP_NOTIFY_CEASE_COLLISION_RESOLUTION, "/Connection collision resolution"},
147 { BGP_NOTIFY_CEASE_OUT_OF_RESOURCE, "/Out of Resource"},
paul718e3742002-12-13 20:15:29 +0000148};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700149static const int bgp_notify_cease_msg_max = BGP_NOTIFY_CEASE_MAX;
paul718e3742002-12-13 20:15:29 +0000150
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700151static const struct message bgp_notify_capability_msg[] =
paul718e3742002-12-13 20:15:29 +0000152{
Dmitrij Tejblum4b4e07d2011-09-21 23:13:22 +0400153 { BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
hasso3950fda2004-05-20 10:22:49 +0000154 { BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value" },
155 { BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length"},
156 { BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value"},
paul718e3742002-12-13 20:15:29 +0000157};
Stephen Hemmingerb2d933f2009-05-15 10:48:03 -0700158static const int bgp_notify_capability_msg_max = BGP_NOTIFY_CAPABILITY_MAX;
paul718e3742002-12-13 20:15:29 +0000159
160/* Origin strings. */
paulfd79ac92004-10-13 05:06:08 +0000161const char *bgp_origin_str[] = {"i","e","?"};
162const char *bgp_origin_long_str[] = {"IGP","EGP","incomplete"};
paul718e3742002-12-13 20:15:29 +0000163
164/* Dump attribute. */
paule01f9cb2004-07-09 17:48:53 +0000165int
paul718e3742002-12-13 20:15:29 +0000166bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size)
167{
paul718e3742002-12-13 20:15:29 +0000168 if (! attr)
paule01f9cb2004-07-09 17:48:53 +0000169 return 0;
paul718e3742002-12-13 20:15:29 +0000170
paule01f9cb2004-07-09 17:48:53 +0000171 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP)))
172 snprintf (buf, size, "nexthop %s", inet_ntoa (attr->nexthop));
173
174 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_ORIGIN)))
175 snprintf (buf + strlen (buf), size - strlen (buf), ", origin %s",
176 bgp_origin_str[attr->origin]);
paul718e3742002-12-13 20:15:29 +0000177
Paul Jakmafb982c22007-05-04 20:15:47 +0000178 if (attr->extra)
179 {
180 char addrbuf[BUFSIZ];
paul718e3742002-12-13 20:15:29 +0000181
Paul Jakmafb982c22007-05-04 20:15:47 +0000182 /* 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));
paul718e3742002-12-13 20:15:29 +0000188
Paul Jakmafb982c22007-05-04 20:15:47 +0000189 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 }
paul718e3742002-12-13 20:15:29 +0000194
paule01f9cb2004-07-09 17:48:53 +0000195 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)))
Jorge Boncompte [DTI2]ddc943d2012-04-13 13:46:07 +0200196 snprintf (buf + strlen (buf), size - strlen (buf), ", localpref %u",
paul718e3742002-12-13 20:15:29 +0000197 attr->local_pref);
198
paule01f9cb2004-07-09 17:48:53 +0000199 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC)))
Jorge Boncompte [DTI2]ddc943d2012-04-13 13:46:07 +0200200 snprintf (buf + strlen (buf), size - strlen (buf), ", metric %u",
paul718e3742002-12-13 20:15:29 +0000201 attr->med);
202
paule01f9cb2004-07-09 17:48:53 +0000203 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_COMMUNITIES)))
paul718e3742002-12-13 20:15:29 +0000204 snprintf (buf + strlen (buf), size - strlen (buf), ", community %s",
205 community_str (attr->community));
206
paule01f9cb2004-07-09 17:48:53 +0000207 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE)))
paul718e3742002-12-13 20:15:29 +0000208 snprintf (buf + strlen (buf), size - strlen (buf), ", atomic-aggregate");
209
paule01f9cb2004-07-09 17:48:53 +0000210 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR)))
Denis Ovsienkoaea339f2009-04-30 17:16:22 +0400211 snprintf (buf + strlen (buf), size - strlen (buf), ", aggregated by %u %s",
Paul Jakmafb982c22007-05-04 20:15:47 +0000212 attr->extra->aggregator_as,
213 inet_ntoa (attr->extra->aggregator_addr));
paul718e3742002-12-13 20:15:29 +0000214
paule01f9cb2004-07-09 17:48:53 +0000215 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)))
paul718e3742002-12-13 20:15:29 +0000216 snprintf (buf + strlen (buf), size - strlen (buf), ", originator %s",
Paul Jakmafb982c22007-05-04 20:15:47 +0000217 inet_ntoa (attr->extra->originator_id));
paul718e3742002-12-13 20:15:29 +0000218
paule01f9cb2004-07-09 17:48:53 +0000219 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_CLUSTER_LIST)))
paul718e3742002-12-13 20:15:29 +0000220 {
221 int i;
222
paule01f9cb2004-07-09 17:48:53 +0000223 snprintf (buf + strlen (buf), size - strlen (buf), ", clusterlist");
Paul Jakmafb982c22007-05-04 20:15:47 +0000224 for (i = 0; i < attr->extra->cluster->length / 4; i++)
paule01f9cb2004-07-09 17:48:53 +0000225 snprintf (buf + strlen (buf), size - strlen (buf), " %s",
Paul Jakmafb982c22007-05-04 20:15:47 +0000226 inet_ntoa (attr->extra->cluster->list[i]));
paul718e3742002-12-13 20:15:29 +0000227 }
228
paule01f9cb2004-07-09 17:48:53 +0000229 if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AS_PATH)))
paul718e3742002-12-13 20:15:29 +0000230 snprintf (buf + strlen (buf), size - strlen (buf), ", path %s",
231 aspath_print (attr->aspath));
paule01f9cb2004-07-09 17:48:53 +0000232
233 if (strlen (buf) > 1)
234 return 1;
235 else
236 return 0;
paul718e3742002-12-13 20:15:29 +0000237}
238
239/* dump notify packet */
240void
paulfd79ac92004-10-13 05:06:08 +0000241bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify,
242 const char *direct)
paul718e3742002-12-13 20:15:29 +0000243{
paulfd79ac92004-10-13 05:06:08 +0000244 const char *subcode_str;
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000245 const char *code_str;
paul718e3742002-12-13 20:15:29 +0000246
247 subcode_str = "";
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000248 code_str = LOOKUP_DEF (bgp_notify_msg, bgp_notify->code,
249 "Unrecognized Error Code");
paul718e3742002-12-13 20:15:29 +0000250
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000251 switch (bgp_notify->code)
paul718e3742002-12-13 20:15:29 +0000252 {
253 case BGP_NOTIFY_HEADER_ERR:
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000254 subcode_str = LOOKUP_DEF (bgp_notify_head_msg, bgp_notify->subcode,
255 "Unrecognized Error Subcode");
paul718e3742002-12-13 20:15:29 +0000256 break;
257 case BGP_NOTIFY_OPEN_ERR:
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000258 subcode_str = LOOKUP_DEF (bgp_notify_open_msg, bgp_notify->subcode,
259 "Unrecognized Error Subcode");
paul718e3742002-12-13 20:15:29 +0000260 break;
261 case BGP_NOTIFY_UPDATE_ERR:
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000262 subcode_str = LOOKUP_DEF (bgp_notify_update_msg, bgp_notify->subcode,
263 "Unrecognized Error Subcode");
paul718e3742002-12-13 20:15:29 +0000264 break;
265 case BGP_NOTIFY_HOLD_ERR:
paul718e3742002-12-13 20:15:29 +0000266 break;
267 case BGP_NOTIFY_FSM_ERR:
paul718e3742002-12-13 20:15:29 +0000268 break;
269 case BGP_NOTIFY_CEASE:
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000270 subcode_str = LOOKUP_DEF (bgp_notify_cease_msg, bgp_notify->subcode,
271 "Unrecognized Error Subcode");
paul718e3742002-12-13 20:15:29 +0000272 break;
273 case BGP_NOTIFY_CAPABILITY_ERR:
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000274 subcode_str = LOOKUP_DEF (bgp_notify_capability_msg, bgp_notify->subcode,
275 "Unrecognized Error Subcode");
paul718e3742002-12-13 20:15:29 +0000276 break;
277 }
hasso3950fda2004-05-20 10:22:49 +0000278
279 if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
280 zlog_info ("%%NOTIFICATION: %s neighbor %s %d/%d (%s%s) %d bytes %s",
281 strcmp (direct, "received") == 0 ? "received from" : "sent to",
282 peer->host, bgp_notify->code, bgp_notify->subcode,
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000283 code_str, subcode_str, bgp_notify->length,
hasso3950fda2004-05-20 10:22:49 +0000284 bgp_notify->data ? bgp_notify->data : "");
285 else if (BGP_DEBUG (normal, NORMAL))
ajs557865c2004-12-08 19:59:11 +0000286 plog_debug (peer->log, "%s %s NOTIFICATION %d/%d (%s%s) %d bytes %s",
paul718e3742002-12-13 20:15:29 +0000287 peer ? peer->host : "",
288 direct, bgp_notify->code, bgp_notify->subcode,
Leonid Rosenboim1e0ce7c2012-12-07 21:31:07 +0000289 code_str, subcode_str, bgp_notify->length,
paul718e3742002-12-13 20:15:29 +0000290 bgp_notify->data ? bgp_notify->data : "");
291}
David Lamparter6b0655a2014-06-04 06:53:35 +0200292
paul718e3742002-12-13 20:15:29 +0000293/* Debug option setting interface. */
294unsigned long bgp_debug_option = 0;
295
296int
297debug (unsigned int option)
298{
299 return bgp_debug_option & option;
300}
301
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000302DEFUN (debug_bgp_as4,
303 debug_bgp_as4_cmd,
304 "debug bgp as4",
305 DEBUG_STR
306 BGP_STR
307 "BGP AS4 actions\n")
308{
309 if (vty->node == CONFIG_NODE)
310 DEBUG_ON (as4, AS4);
311 else
312 {
313 TERM_DEBUG_ON (as4, AS4);
314 vty_out (vty, "BGP as4 debugging is on%s", VTY_NEWLINE);
315 }
316 return CMD_SUCCESS;
317}
318
319DEFUN (no_debug_bgp_as4,
320 no_debug_bgp_as4_cmd,
321 "no debug bgp as4",
322 NO_STR
323 DEBUG_STR
324 BGP_STR
325 "BGP AS4 actions\n")
326{
327 if (vty->node == CONFIG_NODE)
328 DEBUG_OFF (as4, AS4);
329 else
330 {
331 TERM_DEBUG_OFF (as4, AS4);
332 vty_out (vty, "BGP as4 debugging is off%s", VTY_NEWLINE);
333 }
334 return CMD_SUCCESS;
335}
336
337ALIAS (no_debug_bgp_as4,
338 undebug_bgp_as4_cmd,
339 "undebug bgp as4",
340 UNDEBUG_STR
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000341 BGP_STR
342 "BGP AS4 actions\n")
343
344DEFUN (debug_bgp_as4_segment,
345 debug_bgp_as4_segment_cmd,
346 "debug bgp as4 segment",
347 DEBUG_STR
348 BGP_STR
David Ward6e22b902011-01-17 10:58:52 +0300349 "BGP AS4 actions\n"
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000350 "BGP AS4 aspath segment handling\n")
351{
352 if (vty->node == CONFIG_NODE)
353 DEBUG_ON (as4, AS4_SEGMENT);
354 else
355 {
356 TERM_DEBUG_ON (as4, AS4_SEGMENT);
357 vty_out (vty, "BGP as4 segment debugging is on%s", VTY_NEWLINE);
358 }
359 return CMD_SUCCESS;
360}
361
362DEFUN (no_debug_bgp_as4_segment,
363 no_debug_bgp_as4_segment_cmd,
364 "no debug bgp as4 segment",
365 NO_STR
366 DEBUG_STR
367 BGP_STR
David Ward6e22b902011-01-17 10:58:52 +0300368 "BGP AS4 actions\n"
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000369 "BGP AS4 aspath segment handling\n")
370{
371 if (vty->node == CONFIG_NODE)
372 DEBUG_OFF (as4, AS4_SEGMENT);
373 else
374 {
375 TERM_DEBUG_OFF (as4, AS4_SEGMENT);
376 vty_out (vty, "BGP as4 segment debugging is off%s", VTY_NEWLINE);
377 }
378 return CMD_SUCCESS;
379}
380
381ALIAS (no_debug_bgp_as4_segment,
382 undebug_bgp_as4_segment_cmd,
383 "undebug bgp as4 segment",
384 UNDEBUG_STR
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000385 BGP_STR
David Ward6e22b902011-01-17 10:58:52 +0300386 "BGP AS4 actions\n"
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000387 "BGP AS4 aspath segment handling\n")
388
paul718e3742002-12-13 20:15:29 +0000389DEFUN (debug_bgp_fsm,
390 debug_bgp_fsm_cmd,
391 "debug bgp fsm",
392 DEBUG_STR
393 BGP_STR
394 "BGP Finite State Machine\n")
395{
396 if (vty->node == CONFIG_NODE)
397 DEBUG_ON (fsm, FSM);
398 else
399 {
400 TERM_DEBUG_ON (fsm, FSM);
401 vty_out (vty, "BGP fsm debugging is on%s", VTY_NEWLINE);
402 }
403 return CMD_SUCCESS;
404}
405
406DEFUN (no_debug_bgp_fsm,
407 no_debug_bgp_fsm_cmd,
408 "no debug bgp fsm",
409 NO_STR
410 DEBUG_STR
411 BGP_STR
412 "Finite State Machine\n")
413{
414 if (vty->node == CONFIG_NODE)
415 DEBUG_OFF (fsm, FSM);
416 else
417 {
418 TERM_DEBUG_OFF (fsm, FSM);
419 vty_out (vty, "BGP fsm debugging is off%s", VTY_NEWLINE);
420 }
421 return CMD_SUCCESS;
422}
423
424ALIAS (no_debug_bgp_fsm,
425 undebug_bgp_fsm_cmd,
426 "undebug bgp fsm",
427 UNDEBUG_STR
paul718e3742002-12-13 20:15:29 +0000428 BGP_STR
429 "Finite State Machine\n")
430
431DEFUN (debug_bgp_events,
432 debug_bgp_events_cmd,
433 "debug bgp events",
434 DEBUG_STR
435 BGP_STR
436 "BGP events\n")
437{
438 if (vty->node == CONFIG_NODE)
439 DEBUG_ON (events, EVENTS);
440 else
441 {
442 TERM_DEBUG_ON (events, EVENTS);
443 vty_out (vty, "BGP events debugging is on%s", VTY_NEWLINE);
444 }
445 return CMD_SUCCESS;
446}
447
448DEFUN (no_debug_bgp_events,
449 no_debug_bgp_events_cmd,
450 "no debug bgp events",
451 NO_STR
452 DEBUG_STR
453 BGP_STR
454 "BGP events\n")
455{
456 if (vty->node == CONFIG_NODE)
457 DEBUG_OFF (events, EVENTS);
458 else
459 {
460 TERM_DEBUG_OFF (events, EVENTS);
461 vty_out (vty, "BGP events debugging is off%s", VTY_NEWLINE);
462 }
463 return CMD_SUCCESS;
464}
465
466ALIAS (no_debug_bgp_events,
467 undebug_bgp_events_cmd,
468 "undebug bgp events",
469 UNDEBUG_STR
470 BGP_STR
471 "BGP events\n")
472
473DEFUN (debug_bgp_filter,
474 debug_bgp_filter_cmd,
475 "debug bgp filters",
476 DEBUG_STR
477 BGP_STR
478 "BGP filters\n")
479{
480 if (vty->node == CONFIG_NODE)
481 DEBUG_ON (filter, FILTER);
482 else
483 {
484 TERM_DEBUG_ON (filter, FILTER);
485 vty_out (vty, "BGP filters debugging is on%s", VTY_NEWLINE);
486 }
487 return CMD_SUCCESS;
488}
489
490DEFUN (no_debug_bgp_filter,
491 no_debug_bgp_filter_cmd,
492 "no debug bgp filters",
493 NO_STR
494 DEBUG_STR
495 BGP_STR
496 "BGP filters\n")
497{
498 if (vty->node == CONFIG_NODE)
499 DEBUG_OFF (filter, FILTER);
500 else
501 {
502 TERM_DEBUG_OFF (filter, FILTER);
503 vty_out (vty, "BGP filters debugging is off%s", VTY_NEWLINE);
504 }
505 return CMD_SUCCESS;
506}
507
508ALIAS (no_debug_bgp_filter,
509 undebug_bgp_filter_cmd,
510 "undebug bgp filters",
511 UNDEBUG_STR
512 BGP_STR
513 "BGP filters\n")
514
515DEFUN (debug_bgp_keepalive,
516 debug_bgp_keepalive_cmd,
517 "debug bgp keepalives",
518 DEBUG_STR
519 BGP_STR
520 "BGP keepalives\n")
521{
522 if (vty->node == CONFIG_NODE)
523 DEBUG_ON (keepalive, KEEPALIVE);
524 else
525 {
526 TERM_DEBUG_ON (keepalive, KEEPALIVE);
527 vty_out (vty, "BGP keepalives debugging is on%s", VTY_NEWLINE);
528 }
529 return CMD_SUCCESS;
530}
531
532DEFUN (no_debug_bgp_keepalive,
533 no_debug_bgp_keepalive_cmd,
534 "no debug bgp keepalives",
535 NO_STR
536 DEBUG_STR
537 BGP_STR
538 "BGP keepalives\n")
539{
540 if (vty->node == CONFIG_NODE)
541 DEBUG_OFF (keepalive, KEEPALIVE);
542 else
543 {
544 TERM_DEBUG_OFF (keepalive, KEEPALIVE);
545 vty_out (vty, "BGP keepalives debugging is off%s", VTY_NEWLINE);
546 }
547 return CMD_SUCCESS;
548}
549
550ALIAS (no_debug_bgp_keepalive,
551 undebug_bgp_keepalive_cmd,
552 "undebug bgp keepalives",
553 UNDEBUG_STR
554 BGP_STR
555 "BGP keepalives\n")
556
557DEFUN (debug_bgp_update,
558 debug_bgp_update_cmd,
559 "debug bgp updates",
560 DEBUG_STR
561 BGP_STR
562 "BGP updates\n")
563{
564 if (vty->node == CONFIG_NODE)
565 {
566 DEBUG_ON (update, UPDATE_IN);
567 DEBUG_ON (update, UPDATE_OUT);
568 }
569 else
570 {
571 TERM_DEBUG_ON (update, UPDATE_IN);
572 TERM_DEBUG_ON (update, UPDATE_OUT);
573 vty_out (vty, "BGP updates debugging is on%s", VTY_NEWLINE);
574 }
575 return CMD_SUCCESS;
576}
577
578DEFUN (debug_bgp_update_direct,
579 debug_bgp_update_direct_cmd,
580 "debug bgp updates (in|out)",
581 DEBUG_STR
582 BGP_STR
583 "BGP updates\n"
584 "Inbound updates\n"
585 "Outbound updates\n")
586{
587 if (vty->node == CONFIG_NODE)
588 {
589 if (strncmp ("i", argv[0], 1) == 0)
590 {
591 DEBUG_OFF (update, UPDATE_OUT);
592 DEBUG_ON (update, UPDATE_IN);
593 }
594 else
595 {
596 DEBUG_OFF (update, UPDATE_IN);
597 DEBUG_ON (update, UPDATE_OUT);
598 }
599 }
600 else
601 {
602 if (strncmp ("i", argv[0], 1) == 0)
603 {
604 TERM_DEBUG_OFF (update, UPDATE_OUT);
605 TERM_DEBUG_ON (update, UPDATE_IN);
606 vty_out (vty, "BGP updates debugging is on (inbound)%s", VTY_NEWLINE);
607 }
608 else
609 {
610 TERM_DEBUG_OFF (update, UPDATE_IN);
611 TERM_DEBUG_ON (update, UPDATE_OUT);
612 vty_out (vty, "BGP updates debugging is on (outbound)%s", VTY_NEWLINE);
613 }
614 }
615 return CMD_SUCCESS;
616}
617
618DEFUN (no_debug_bgp_update,
619 no_debug_bgp_update_cmd,
620 "no debug bgp updates",
621 NO_STR
622 DEBUG_STR
623 BGP_STR
624 "BGP updates\n")
625{
626 if (vty->node == CONFIG_NODE)
627 {
628 DEBUG_OFF (update, UPDATE_IN);
629 DEBUG_OFF (update, UPDATE_OUT);
630 }
631 else
632 {
633 TERM_DEBUG_OFF (update, UPDATE_IN);
634 TERM_DEBUG_OFF (update, UPDATE_OUT);
635 vty_out (vty, "BGP updates debugging is off%s", VTY_NEWLINE);
636 }
637 return CMD_SUCCESS;
638}
639
640ALIAS (no_debug_bgp_update,
641 undebug_bgp_update_cmd,
642 "undebug bgp updates",
643 UNDEBUG_STR
644 BGP_STR
645 "BGP updates\n")
646
647DEFUN (debug_bgp_normal,
648 debug_bgp_normal_cmd,
649 "debug bgp",
650 DEBUG_STR
651 BGP_STR)
652{
653 if (vty->node == CONFIG_NODE)
654 DEBUG_ON (normal, NORMAL);
655 else
656 {
657 TERM_DEBUG_ON (normal, NORMAL);
658 vty_out (vty, "BGP debugging is on%s", VTY_NEWLINE);
659 }
660 return CMD_SUCCESS;
661}
662
663DEFUN (no_debug_bgp_normal,
664 no_debug_bgp_normal_cmd,
665 "no debug bgp",
666 NO_STR
667 DEBUG_STR
668 BGP_STR)
669{
670 if (vty->node == CONFIG_NODE)
671 DEBUG_OFF (normal, NORMAL);
672 else
673 {
674 TERM_DEBUG_OFF (normal, NORMAL);
675 vty_out (vty, "BGP debugging is off%s", VTY_NEWLINE);
676 }
677 return CMD_SUCCESS;
678}
679
680ALIAS (no_debug_bgp_normal,
681 undebug_bgp_normal_cmd,
682 "undebug bgp",
683 UNDEBUG_STR
684 BGP_STR)
685
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000686DEFUN (debug_bgp_zebra,
687 debug_bgp_zebra_cmd,
688 "debug bgp zebra",
689 DEBUG_STR
690 BGP_STR
691 "BGP Zebra messages\n")
692{
693 if (vty->node == CONFIG_NODE)
694 DEBUG_ON (zebra, ZEBRA);
695 else
696 {
697 TERM_DEBUG_ON (zebra, ZEBRA);
698 vty_out (vty, "BGP zebra debugging is on%s", VTY_NEWLINE);
699 }
700 return CMD_SUCCESS;
701}
702
703DEFUN (no_debug_bgp_zebra,
704 no_debug_bgp_zebra_cmd,
705 "no debug bgp zebra",
706 NO_STR
707 DEBUG_STR
708 BGP_STR
709 "BGP Zebra messages\n")
710{
711 if (vty->node == CONFIG_NODE)
712 DEBUG_OFF (zebra, ZEBRA);
713 else
714 {
715 TERM_DEBUG_OFF (zebra, ZEBRA);
716 vty_out (vty, "BGP zebra debugging is off%s", VTY_NEWLINE);
717 }
718 return CMD_SUCCESS;
719}
720
721ALIAS (no_debug_bgp_zebra,
722 undebug_bgp_zebra_cmd,
723 "undebug bgp zebra",
724 UNDEBUG_STR
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000725 BGP_STR
726 "BGP Zebra messages\n")
727
paul718e3742002-12-13 20:15:29 +0000728DEFUN (no_debug_bgp_all,
729 no_debug_bgp_all_cmd,
730 "no debug all bgp",
731 NO_STR
732 DEBUG_STR
733 "Enable all debugging\n"
734 BGP_STR)
735{
736 TERM_DEBUG_OFF (normal, NORMAL);
737 TERM_DEBUG_OFF (events, EVENTS);
738 TERM_DEBUG_OFF (keepalive, KEEPALIVE);
739 TERM_DEBUG_OFF (update, UPDATE_IN);
740 TERM_DEBUG_OFF (update, UPDATE_OUT);
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000741 TERM_DEBUG_OFF (as4, AS4);
742 TERM_DEBUG_OFF (as4, AS4_SEGMENT);
paul718e3742002-12-13 20:15:29 +0000743 TERM_DEBUG_OFF (fsm, FSM);
744 TERM_DEBUG_OFF (filter, FILTER);
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000745 TERM_DEBUG_OFF (zebra, ZEBRA);
paul718e3742002-12-13 20:15:29 +0000746 vty_out (vty, "All possible debugging has been turned off%s", VTY_NEWLINE);
747
748 return CMD_SUCCESS;
749}
750
751ALIAS (no_debug_bgp_all,
752 undebug_bgp_all_cmd,
753 "undebug all bgp",
754 UNDEBUG_STR
755 "Enable all debugging\n"
756 BGP_STR)
757
758DEFUN (show_debugging_bgp,
759 show_debugging_bgp_cmd,
760 "show debugging bgp",
761 SHOW_STR
762 DEBUG_STR
763 BGP_STR)
764{
765 vty_out (vty, "BGP debugging status:%s", VTY_NEWLINE);
766
767 if (BGP_DEBUG (normal, NORMAL))
768 vty_out (vty, " BGP debugging is on%s", VTY_NEWLINE);
769 if (BGP_DEBUG (events, EVENTS))
770 vty_out (vty, " BGP events debugging is on%s", VTY_NEWLINE);
771 if (BGP_DEBUG (keepalive, KEEPALIVE))
772 vty_out (vty, " BGP keepalives debugging is on%s", VTY_NEWLINE);
773 if (BGP_DEBUG (update, UPDATE_IN) && BGP_DEBUG (update, UPDATE_OUT))
774 vty_out (vty, " BGP updates debugging is on%s", VTY_NEWLINE);
775 else if (BGP_DEBUG (update, UPDATE_IN))
776 vty_out (vty, " BGP updates debugging is on (inbound)%s", VTY_NEWLINE);
777 else if (BGP_DEBUG (update, UPDATE_OUT))
778 vty_out (vty, " BGP updates debugging is on (outbound)%s", VTY_NEWLINE);
779 if (BGP_DEBUG (fsm, FSM))
780 vty_out (vty, " BGP fsm debugging is on%s", VTY_NEWLINE);
781 if (BGP_DEBUG (filter, FILTER))
782 vty_out (vty, " BGP filter debugging is on%s", VTY_NEWLINE);
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000783 if (BGP_DEBUG (zebra, ZEBRA))
784 vty_out (vty, " BGP zebra debugging is on%s", VTY_NEWLINE);
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000785 if (BGP_DEBUG (as4, AS4))
786 vty_out (vty, " BGP as4 debugging is on%s", VTY_NEWLINE);
787 if (BGP_DEBUG (as4, AS4_SEGMENT))
788 vty_out (vty, " BGP as4 aspath segment debugging is on%s", VTY_NEWLINE);
paul718e3742002-12-13 20:15:29 +0000789 vty_out (vty, "%s", VTY_NEWLINE);
790 return CMD_SUCCESS;
791}
792
paul94f2b392005-06-28 12:44:16 +0000793static int
paul718e3742002-12-13 20:15:29 +0000794bgp_config_write_debug (struct vty *vty)
795{
796 int write = 0;
797
798 if (CONF_BGP_DEBUG (normal, NORMAL))
799 {
800 vty_out (vty, "debug bgp%s", VTY_NEWLINE);
801 write++;
802 }
803
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000804 if (CONF_BGP_DEBUG (as4, AS4))
805 {
806 vty_out (vty, "debug bgp as4%s", VTY_NEWLINE);
807 write++;
808 }
809
810 if (CONF_BGP_DEBUG (as4, AS4_SEGMENT))
811 {
812 vty_out (vty, "debug bgp as4 segment%s", VTY_NEWLINE);
813 write++;
814 }
815
paul718e3742002-12-13 20:15:29 +0000816 if (CONF_BGP_DEBUG (events, EVENTS))
817 {
818 vty_out (vty, "debug bgp events%s", VTY_NEWLINE);
819 write++;
820 }
821
822 if (CONF_BGP_DEBUG (keepalive, KEEPALIVE))
823 {
824 vty_out (vty, "debug bgp keepalives%s", VTY_NEWLINE);
825 write++;
826 }
827
828 if (CONF_BGP_DEBUG (update, UPDATE_IN) && CONF_BGP_DEBUG (update, UPDATE_OUT))
829 {
830 vty_out (vty, "debug bgp updates%s", VTY_NEWLINE);
831 write++;
832 }
833 else if (CONF_BGP_DEBUG (update, UPDATE_IN))
834 {
835 vty_out (vty, "debug bgp updates in%s", VTY_NEWLINE);
836 write++;
837 }
838 else if (CONF_BGP_DEBUG (update, UPDATE_OUT))
839 {
840 vty_out (vty, "debug bgp updates out%s", VTY_NEWLINE);
841 write++;
842 }
843
844 if (CONF_BGP_DEBUG (fsm, FSM))
845 {
846 vty_out (vty, "debug bgp fsm%s", VTY_NEWLINE);
847 write++;
848 }
849
850 if (CONF_BGP_DEBUG (filter, FILTER))
851 {
852 vty_out (vty, "debug bgp filters%s", VTY_NEWLINE);
853 write++;
854 }
855
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000856 if (CONF_BGP_DEBUG (zebra, ZEBRA))
857 {
858 vty_out (vty, "debug bgp zebra%s", VTY_NEWLINE);
859 write++;
860 }
861
paul718e3742002-12-13 20:15:29 +0000862 return write;
863}
864
Stephen Hemminger7fc626d2008-12-01 11:10:34 -0800865static struct cmd_node debug_node =
paul718e3742002-12-13 20:15:29 +0000866{
867 DEBUG_NODE,
868 "",
869 1
870};
871
872void
paul94f2b392005-06-28 12:44:16 +0000873bgp_debug_init (void)
paul718e3742002-12-13 20:15:29 +0000874{
875 install_node (&debug_node, bgp_config_write_debug);
876
877 install_element (ENABLE_NODE, &show_debugging_bgp_cmd);
878
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000879 install_element (ENABLE_NODE, &debug_bgp_as4_cmd);
880 install_element (CONFIG_NODE, &debug_bgp_as4_cmd);
881 install_element (ENABLE_NODE, &debug_bgp_as4_segment_cmd);
882 install_element (CONFIG_NODE, &debug_bgp_as4_segment_cmd);
883
paul718e3742002-12-13 20:15:29 +0000884 install_element (ENABLE_NODE, &debug_bgp_fsm_cmd);
885 install_element (CONFIG_NODE, &debug_bgp_fsm_cmd);
886 install_element (ENABLE_NODE, &debug_bgp_events_cmd);
887 install_element (CONFIG_NODE, &debug_bgp_events_cmd);
888 install_element (ENABLE_NODE, &debug_bgp_filter_cmd);
889 install_element (CONFIG_NODE, &debug_bgp_filter_cmd);
890 install_element (ENABLE_NODE, &debug_bgp_keepalive_cmd);
891 install_element (CONFIG_NODE, &debug_bgp_keepalive_cmd);
892 install_element (ENABLE_NODE, &debug_bgp_update_cmd);
893 install_element (CONFIG_NODE, &debug_bgp_update_cmd);
894 install_element (ENABLE_NODE, &debug_bgp_update_direct_cmd);
895 install_element (CONFIG_NODE, &debug_bgp_update_direct_cmd);
896 install_element (ENABLE_NODE, &debug_bgp_normal_cmd);
897 install_element (CONFIG_NODE, &debug_bgp_normal_cmd);
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000898 install_element (ENABLE_NODE, &debug_bgp_zebra_cmd);
899 install_element (CONFIG_NODE, &debug_bgp_zebra_cmd);
paul718e3742002-12-13 20:15:29 +0000900
Paul Jakma0b2aa3a2007-10-14 22:32:21 +0000901 install_element (ENABLE_NODE, &no_debug_bgp_as4_cmd);
902 install_element (ENABLE_NODE, &undebug_bgp_as4_cmd);
903 install_element (CONFIG_NODE, &no_debug_bgp_as4_cmd);
904 install_element (ENABLE_NODE, &no_debug_bgp_as4_segment_cmd);
905 install_element (ENABLE_NODE, &undebug_bgp_as4_segment_cmd);
906 install_element (CONFIG_NODE, &no_debug_bgp_as4_segment_cmd);
907
paul718e3742002-12-13 20:15:29 +0000908 install_element (ENABLE_NODE, &no_debug_bgp_fsm_cmd);
909 install_element (ENABLE_NODE, &undebug_bgp_fsm_cmd);
910 install_element (CONFIG_NODE, &no_debug_bgp_fsm_cmd);
911 install_element (ENABLE_NODE, &no_debug_bgp_events_cmd);
912 install_element (ENABLE_NODE, &undebug_bgp_events_cmd);
913 install_element (CONFIG_NODE, &no_debug_bgp_events_cmd);
914 install_element (ENABLE_NODE, &no_debug_bgp_filter_cmd);
915 install_element (ENABLE_NODE, &undebug_bgp_filter_cmd);
916 install_element (CONFIG_NODE, &no_debug_bgp_filter_cmd);
917 install_element (ENABLE_NODE, &no_debug_bgp_keepalive_cmd);
918 install_element (ENABLE_NODE, &undebug_bgp_keepalive_cmd);
919 install_element (CONFIG_NODE, &no_debug_bgp_keepalive_cmd);
920 install_element (ENABLE_NODE, &no_debug_bgp_update_cmd);
921 install_element (ENABLE_NODE, &undebug_bgp_update_cmd);
922 install_element (CONFIG_NODE, &no_debug_bgp_update_cmd);
923 install_element (ENABLE_NODE, &no_debug_bgp_normal_cmd);
924 install_element (ENABLE_NODE, &undebug_bgp_normal_cmd);
925 install_element (CONFIG_NODE, &no_debug_bgp_normal_cmd);
Andrew J. Schorra39275d2006-11-30 16:36:57 +0000926 install_element (ENABLE_NODE, &no_debug_bgp_zebra_cmd);
927 install_element (ENABLE_NODE, &undebug_bgp_zebra_cmd);
928 install_element (CONFIG_NODE, &no_debug_bgp_zebra_cmd);
paul718e3742002-12-13 20:15:29 +0000929 install_element (ENABLE_NODE, &no_debug_bgp_all_cmd);
930 install_element (ENABLE_NODE, &undebug_bgp_all_cmd);
931}