2002-12-13 21:15:29 +01:00
|
|
|
/* BGP-4, BGP-4+ packet debug routine
|
2017-05-13 10:25:29 +02:00
|
|
|
* 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 this program; see the file COPYING; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
#include <zebra.h>
|
|
|
|
|
2004-03-16 15:38:36 +01:00
|
|
|
#include <lib/version.h>
|
2002-12-13 21:15:29 +01:00
|
|
|
#include "prefix.h"
|
|
|
|
#include "linklist.h"
|
|
|
|
#include "stream.h"
|
|
|
|
#include "command.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include "sockunion.h"
|
2015-05-20 02:58:12 +02:00
|
|
|
#include "memory.h"
|
2015-05-20 03:03:47 +02:00
|
|
|
#include "queue.h"
|
2016-01-07 16:03:01 +01:00
|
|
|
#include "filter.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
#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"
|
2015-05-20 03:03:47 +02:00
|
|
|
#include "bgpd/bgp_updgrp.h"
|
2016-08-10 01:02:03 +02:00
|
|
|
#include "bgpd/bgp_mplsvpn.h"
|
2017-05-15 21:35:15 +02:00
|
|
|
#include "bgpd/bgp_ecommunity.h"
|
2017-05-15 23:52:17 +02:00
|
|
|
#include "bgpd/bgp_label.h"
|
|
|
|
#include "bgpd/bgp_evpn.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
unsigned long conf_bgp_debug_as4;
|
2015-05-20 02:58:12 +02:00
|
|
|
unsigned long conf_bgp_debug_neighbor_events;
|
2002-12-13 21:15:29 +01:00
|
|
|
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;
|
2015-05-20 03:04:02 +02:00
|
|
|
unsigned long conf_bgp_debug_bestpath;
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
unsigned long conf_bgp_debug_zebra;
|
2016-05-07 16:35:21 +02:00
|
|
|
unsigned long conf_bgp_debug_allow_martians;
|
2015-05-20 02:40:34 +02:00
|
|
|
unsigned long conf_bgp_debug_nht;
|
2015-05-20 03:03:47 +02:00
|
|
|
unsigned long conf_bgp_debug_update_groups;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
unsigned long term_bgp_debug_as4;
|
2015-05-20 02:58:12 +02:00
|
|
|
unsigned long term_bgp_debug_neighbor_events;
|
2002-12-13 21:15:29 +01:00
|
|
|
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;
|
2015-05-20 03:04:02 +02:00
|
|
|
unsigned long term_bgp_debug_bestpath;
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
unsigned long term_bgp_debug_zebra;
|
2016-05-07 16:35:21 +02:00
|
|
|
unsigned long term_bgp_debug_allow_martians;
|
2015-05-20 02:40:34 +02:00
|
|
|
unsigned long term_bgp_debug_nht;
|
2015-05-20 03:03:47 +02:00
|
|
|
unsigned long term_bgp_debug_update_groups;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
struct list *bgp_debug_neighbor_events_peers = NULL;
|
|
|
|
struct list *bgp_debug_keepalive_peers = NULL;
|
|
|
|
struct list *bgp_debug_update_out_peers = NULL;
|
|
|
|
struct list *bgp_debug_update_in_peers = NULL;
|
|
|
|
struct list *bgp_debug_update_prefixes = NULL;
|
2015-05-20 03:04:02 +02:00
|
|
|
struct list *bgp_debug_bestpath_prefixes = NULL;
|
2015-05-20 02:58:12 +02:00
|
|
|
struct list *bgp_debug_zebra_prefixes = NULL;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* messages for BGP-4 status */
|
2017-07-17 14:03:14 +02:00
|
|
|
const struct message bgp_status_msg[] = {{Idle, "Idle"},
|
|
|
|
{Connect, "Connect"},
|
|
|
|
{Active, "Active"},
|
|
|
|
{OpenSent, "OpenSent"},
|
|
|
|
{OpenConfirm, "OpenConfirm"},
|
|
|
|
{Established, "Established"},
|
|
|
|
{Clearing, "Clearing"},
|
|
|
|
{Deleted, "Deleted"},
|
|
|
|
{0}};
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* BGP message type string. */
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_type_str[] = {NULL, "OPEN", "UPDATE",
|
|
|
|
"NOTIFICATION", "KEEPALIVE", "ROUTE-REFRESH",
|
|
|
|
"CAPABILITY"};
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* message for BGP-4 Notify */
|
2017-07-17 14:03:14 +02:00
|
|
|
static const struct message bgp_notify_msg[] = {
|
|
|
|
{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, "Neighbor Events Error"},
|
|
|
|
{BGP_NOTIFY_CEASE, "Cease"},
|
|
|
|
{BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error"},
|
|
|
|
{0}};
|
|
|
|
|
|
|
|
static const struct message bgp_notify_head_msg[] = {
|
|
|
|
{BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized"},
|
|
|
|
{BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length"},
|
|
|
|
{BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type"},
|
|
|
|
{0}};
|
|
|
|
|
|
|
|
static const struct message bgp_notify_open_msg[] = {
|
|
|
|
{BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
|
|
|
|
{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"},
|
|
|
|
{0}};
|
|
|
|
|
|
|
|
static const struct message bgp_notify_update_msg[] = {
|
|
|
|
{BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
|
|
|
|
{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"},
|
|
|
|
{0}};
|
|
|
|
|
|
|
|
static const struct message bgp_notify_cease_msg[] = {
|
|
|
|
{BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
|
|
|
|
{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_COLLISION_RESOLUTION,
|
|
|
|
"/Connection collision resolution"},
|
|
|
|
{BGP_NOTIFY_CEASE_OUT_OF_RESOURCE, "/Out of Resource"},
|
|
|
|
{0}};
|
|
|
|
|
|
|
|
static const struct message bgp_notify_capability_msg[] = {
|
|
|
|
{BGP_NOTIFY_SUBCODE_UNSPECIFIC, "/Unspecific"},
|
|
|
|
{BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value"},
|
|
|
|
{BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length"},
|
|
|
|
{BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value"},
|
|
|
|
{0}};
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Origin strings. */
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_origin_str[] = {"i", "e", "?"};
|
|
|
|
const char *bgp_origin_long_str[] = {"IGP", "EGP", "incomplete"};
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
|
|
|
|
/* Given a string return a pointer the corresponding peer structure */
|
2017-07-17 14:03:14 +02:00
|
|
|
static struct peer *bgp_find_peer(struct vty *vty, const char *peer_str)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
struct bgp *bgp = VTY_GET_CONTEXT(bgp);
|
|
|
|
int ret;
|
|
|
|
union sockunion su;
|
|
|
|
struct peer *peer;
|
|
|
|
|
|
|
|
if (!bgp) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
ret = str2sockunion(peer_str, &su);
|
|
|
|
|
|
|
|
/* 'swpX' string */
|
|
|
|
if (ret < 0) {
|
|
|
|
peer = peer_lookup_by_conf_if(bgp, peer_str);
|
|
|
|
|
|
|
|
if (!peer)
|
|
|
|
peer = peer_lookup_by_hostname(bgp, peer_str);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
} else
|
|
|
|
return peer_lookup(bgp, &su);
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static void bgp_debug_list_free(struct list *list)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (list)
|
|
|
|
for (ALL_LIST_ELEMENTS(list, node, nnode, filter)) {
|
|
|
|
listnode_delete(list, filter);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (filter->p)
|
|
|
|
prefix_free(filter->p);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (filter->host)
|
|
|
|
XFREE(MTYPE_BGP_DEBUG_STR, filter->host);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
XFREE(MTYPE_BGP_DEBUG_FILTER, filter);
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Print the desc along with a list of peers/prefixes this debug is
|
|
|
|
* enabled for */
|
2017-07-17 14:03:14 +02:00
|
|
|
static void bgp_debug_list_print(struct vty *vty, const char *desc,
|
|
|
|
struct list *list)
|
|
|
|
{
|
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
char buf[INET6_ADDRSTRLEN];
|
|
|
|
|
|
|
|
vty_out(vty, "%s", desc);
|
|
|
|
|
|
|
|
if (list && !list_isempty(list)) {
|
|
|
|
vty_out(vty, " for");
|
|
|
|
for (ALL_LIST_ELEMENTS(list, node, nnode, filter)) {
|
|
|
|
if (filter->host)
|
|
|
|
vty_out(vty, " %s", filter->host);
|
|
|
|
|
|
|
|
if (filter->p)
|
|
|
|
vty_out(vty, " %s/%d",
|
|
|
|
inet_ntop(filter->p->family,
|
|
|
|
&filter->p->u.prefix, buf,
|
|
|
|
INET6_ADDRSTRLEN),
|
|
|
|
filter->p->prefixlen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vty_out(vty, "\n");
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 03:04:06 +02:00
|
|
|
/* Print the command to enable the debug for each peer/prefix this debug is
|
|
|
|
* enabled for
|
|
|
|
*/
|
2017-07-17 14:03:14 +02:00
|
|
|
static int bgp_debug_list_conf_print(struct vty *vty, const char *desc,
|
|
|
|
struct list *list)
|
|
|
|
{
|
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
char buf[INET6_ADDRSTRLEN];
|
|
|
|
int write = 0;
|
|
|
|
|
|
|
|
if (list && !list_isempty(list)) {
|
|
|
|
for (ALL_LIST_ELEMENTS(list, node, nnode, filter)) {
|
|
|
|
if (filter->host) {
|
|
|
|
vty_out(vty, "%s %s\n", desc, filter->host);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (filter->p) {
|
|
|
|
vty_out(vty, "%s %s/%d\n", desc,
|
|
|
|
inet_ntop(filter->p->family,
|
|
|
|
&filter->p->u.prefix, buf,
|
|
|
|
INET6_ADDRSTRLEN),
|
|
|
|
filter->p->prefixlen);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!write) {
|
|
|
|
vty_out(vty, "%s\n", desc);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return write;
|
2015-05-20 03:04:06 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static void bgp_debug_list_add_entry(struct list *list, const char *host,
|
|
|
|
const struct prefix *p)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
|
|
|
|
filter = XCALLOC(MTYPE_BGP_DEBUG_FILTER,
|
|
|
|
sizeof(struct bgp_debug_filter));
|
|
|
|
|
|
|
|
if (host) {
|
|
|
|
filter->host = XSTRDUP(MTYPE_BGP_DEBUG_STR, host);
|
|
|
|
filter->p = NULL;
|
|
|
|
} else if (p) {
|
|
|
|
filter->host = NULL;
|
|
|
|
filter->p = prefix_new();
|
|
|
|
prefix_copy(filter->p, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
listnode_add(list, filter);
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static int bgp_debug_list_remove_entry(struct list *list, const char *host,
|
|
|
|
struct prefix *p)
|
|
|
|
{
|
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS(list, node, nnode, filter)) {
|
|
|
|
if (host && strcmp(filter->host, host) == 0) {
|
|
|
|
listnode_delete(list, filter);
|
|
|
|
XFREE(MTYPE_BGP_DEBUG_STR, filter->host);
|
|
|
|
XFREE(MTYPE_BGP_DEBUG_FILTER, filter);
|
|
|
|
return 1;
|
|
|
|
} else if (p && filter->p->prefixlen == p->prefixlen
|
|
|
|
&& prefix_match(filter->p, p)) {
|
|
|
|
listnode_delete(list, filter);
|
|
|
|
prefix_free(filter->p);
|
|
|
|
XFREE(MTYPE_BGP_DEBUG_FILTER, filter);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static int bgp_debug_list_has_entry(struct list *list, const char *host,
|
|
|
|
const struct prefix *p)
|
|
|
|
{
|
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS(list, node, nnode, filter)) {
|
|
|
|
if (host) {
|
|
|
|
if (strcmp(filter->host, host) == 0) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
} else if (p) {
|
|
|
|
if (filter->p->prefixlen == p->prefixlen
|
|
|
|
&& prefix_match(filter->p, p)) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_peer_updout_enabled(char *host)
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
return (bgp_debug_list_has_entry(bgp_debug_update_out_peers, host,
|
|
|
|
NULL));
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Dump attribute. */
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_dump_attr(struct attr *attr, char *buf, size_t size)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
char addrbuf[BUFSIZ];
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (!attr)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_NEXT_HOP)))
|
|
|
|
snprintf(buf, size, "nexthop %s", inet_ntoa(attr->nexthop));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_ORIGIN)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf), ", origin %s",
|
|
|
|
bgp_origin_str[attr->origin]);
|
|
|
|
|
|
|
|
/* Add MP case. */
|
|
|
|
if (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL
|
|
|
|
|| attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
|
|
|
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 == BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL)
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf), "(%s)",
|
|
|
|
inet_ntop(AF_INET6, &attr->mp_nexthop_local, addrbuf,
|
|
|
|
BUFSIZ));
|
|
|
|
|
|
|
|
if (attr->mp_nexthop_len == BGP_ATTR_NHLEN_IPV4)
|
|
|
|
snprintf(buf, size, "nexthop %s", inet_ntoa(attr->nexthop));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", localpref %u", attr->local_pref);
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf), ", metric %u",
|
|
|
|
attr->med);
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_COMMUNITIES)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
2017-11-17 02:43:56 +01:00
|
|
|
", community %s", community_str(attr->community,
|
|
|
|
false));
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", extcommunity %s", ecommunity_str(attr->ecommunity));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", atomic-aggregate");
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_AGGREGATOR)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", aggregated by %u %s", attr->aggregator_as,
|
|
|
|
inet_ntoa(attr->aggregator_addr));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", originator %s", inet_ntoa(attr->originator_id));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(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 (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_AS_PATH)))
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf), ", path %s",
|
|
|
|
aspath_print(attr->aspath));
|
|
|
|
|
|
|
|
if (CHECK_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_PREFIX_SID))) {
|
|
|
|
if (attr->label_index != BGP_INVALID_LABEL_INDEX)
|
|
|
|
snprintf(buf + strlen(buf), size - strlen(buf),
|
|
|
|
", label-index %u", attr->label_index);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strlen(buf) > 1)
|
|
|
|
return 1;
|
|
|
|
else
|
|
|
|
return 0;
|
2015-09-16 04:14:06 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_notify_code_str(char code)
|
2015-09-16 04:14:06 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
return lookup_msg(bgp_notify_msg, code, "Unrecognized Error Code");
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_notify_subcode_str(char code, char subcode)
|
|
|
|
{
|
|
|
|
|
|
|
|
switch (code) {
|
|
|
|
case BGP_NOTIFY_HEADER_ERR:
|
|
|
|
return lookup_msg(bgp_notify_head_msg, subcode,
|
|
|
|
"Unrecognized Error Subcode");
|
|
|
|
case BGP_NOTIFY_OPEN_ERR:
|
|
|
|
return lookup_msg(bgp_notify_open_msg, subcode,
|
|
|
|
"Unrecognized Error Subcode");
|
|
|
|
case BGP_NOTIFY_UPDATE_ERR:
|
|
|
|
return lookup_msg(bgp_notify_update_msg, subcode,
|
|
|
|
"Unrecognized Error Subcode");
|
|
|
|
case BGP_NOTIFY_HOLD_ERR:
|
|
|
|
break;
|
|
|
|
case BGP_NOTIFY_FSM_ERR:
|
|
|
|
break;
|
|
|
|
case BGP_NOTIFY_CEASE:
|
|
|
|
return lookup_msg(bgp_notify_cease_msg, subcode,
|
|
|
|
"Unrecognized Error Subcode");
|
|
|
|
case BGP_NOTIFY_CAPABILITY_ERR:
|
|
|
|
return lookup_msg(bgp_notify_capability_msg, subcode,
|
|
|
|
"Unrecognized Error Subcode");
|
|
|
|
}
|
|
|
|
return "";
|
2015-09-16 04:14:06 +02:00
|
|
|
}
|
|
|
|
|
2017-01-25 04:03:38 +01:00
|
|
|
/* extract notify admin reason if correctly present */
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_notify_admin_message(char *buf, size_t bufsz, u_char *data,
|
|
|
|
size_t datalen)
|
2017-01-25 04:03:38 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (!data || datalen < 1)
|
|
|
|
return NULL;
|
2017-01-25 04:03:38 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
u_char len = data[0];
|
|
|
|
if (len > 128 || len > datalen - 1)
|
|
|
|
return NULL;
|
2017-01-25 04:03:38 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return zlog_sanitize(buf, bufsz, data + 1, len);
|
2017-01-25 04:03:38 +01:00
|
|
|
}
|
|
|
|
|
2015-09-16 04:14:06 +02:00
|
|
|
/* dump notify packet */
|
2017-07-17 14:03:14 +02:00
|
|
|
void bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify,
|
|
|
|
const char *direct)
|
|
|
|
{
|
|
|
|
const char *subcode_str;
|
|
|
|
const char *code_str;
|
|
|
|
const char *msg_str = NULL;
|
|
|
|
char msg_buf[1024];
|
|
|
|
|
|
|
|
if (BGP_DEBUG(neighbor_events, NEIGHBOR_EVENTS)
|
|
|
|
|| bgp_flag_check(peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) {
|
|
|
|
code_str = bgp_notify_code_str(bgp_notify->code);
|
|
|
|
subcode_str = bgp_notify_subcode_str(bgp_notify->code,
|
|
|
|
bgp_notify->subcode);
|
|
|
|
|
|
|
|
if (bgp_notify->code == BGP_NOTIFY_CEASE
|
|
|
|
&& (bgp_notify->subcode == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
|
|
|
|
|| bgp_notify->subcode
|
|
|
|
== BGP_NOTIFY_CEASE_ADMIN_RESET)) {
|
|
|
|
msg_str = bgp_notify_admin_message(
|
|
|
|
msg_buf, sizeof(msg_buf), bgp_notify->raw_data,
|
|
|
|
bgp_notify->length);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg_str) {
|
|
|
|
zlog_info(
|
|
|
|
"%%NOTIFICATION: %s neighbor %s %d/%d (%s%s) \"%s\"",
|
|
|
|
strcmp(direct, "received") == 0
|
|
|
|
? "received from"
|
|
|
|
: "sent to",
|
|
|
|
peer->host, bgp_notify->code,
|
|
|
|
bgp_notify->subcode, code_str, subcode_str,
|
|
|
|
msg_str);
|
|
|
|
} else {
|
|
|
|
msg_str = bgp_notify->data ? bgp_notify->data : "";
|
|
|
|
zlog_info(
|
|
|
|
"%%NOTIFICATION: %s neighbor %s %d/%d (%s%s) %d bytes %s",
|
|
|
|
strcmp(direct, "received") == 0
|
|
|
|
? "received from"
|
|
|
|
: "sent to",
|
|
|
|
peer->host, bgp_notify->code,
|
|
|
|
bgp_notify->subcode, code_str, subcode_str,
|
|
|
|
bgp_notify->length, msg_str);
|
|
|
|
}
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static void bgp_debug_clear_updgrp_update_dbg(struct bgp *bgp)
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (!bgp)
|
|
|
|
bgp = bgp_get_default();
|
|
|
|
update_group_walk(bgp, update_group_clear_update_dbg, NULL);
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Debug option setting interface. */
|
|
|
|
unsigned long bgp_debug_option = 0;
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int debug(unsigned int option)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
return bgp_debug_option & option;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
DEFUN (debug_bgp_as4,
|
|
|
|
debug_bgp_as4_cmd,
|
|
|
|
"debug bgp as4",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP AS4 actions\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(as4, AS4);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(as4, AS4);
|
|
|
|
vty_out(vty, "BGP as4 debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_as4,
|
|
|
|
no_debug_bgp_as4_cmd,
|
|
|
|
"no debug bgp as4",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP AS4 actions\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(as4, AS4);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(as4, AS4);
|
|
|
|
vty_out(vty, "BGP as4 debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (debug_bgp_as4_segment,
|
|
|
|
debug_bgp_as4_segment_cmd,
|
|
|
|
"debug bgp as4 segment",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2011-01-17 08:58:52 +01:00
|
|
|
"BGP AS4 actions\n"
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
"BGP AS4 aspath segment handling\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(as4, AS4_SEGMENT);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(as4, AS4_SEGMENT);
|
|
|
|
vty_out(vty, "BGP as4 segment debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_as4_segment,
|
|
|
|
no_debug_bgp_as4_segment_cmd,
|
|
|
|
"no debug bgp as4 segment",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2011-01-17 08:58:52 +01:00
|
|
|
"BGP AS4 actions\n"
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
"BGP AS4 aspath segment handling\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(as4, AS4_SEGMENT);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(as4, AS4_SEGMENT);
|
|
|
|
vty_out(vty, "BGP as4 segment debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Merge AS4 support
2007-10-14 Paul Jakma <paul.jakma@sun.com>
* NEWS: Note that MRT dumps are now version 2
* (general) Merge in Juergen Kammer's AS4 patch.
2007-09-27 Paul Jakma <paul.jakma@sun.com>
* bgp_aspath.c: (assegment_normalise) remove duplicates from
from sets.
(aspath_reconcile_as4) disregard a broken part of the RFC around
error handling in path reconciliation.
* aspath_test.c: Test dupe-weeding from sets.
Test that reconciliation merges AS_PATH and AS4_PATH where
former is shorter than latter.
2007-09-26 Paul Jakma <paul.jakma@sun.com>
* aspath_test.c: Test AS4_PATH reconcilation where length
of AS_PATH and AS4_PATH is same.
2007-09-25 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (peek_for_as4_capability) Fix to work.
* bgp_packet.c: (bgp_open_receive) Fix sanity check of as4.
* tests/bgp_capability_test.c: (general) Extend tests to validate
peek_for_as4_capability.
Add test of full OPEN Option block, with multiple capabilities,
both as a series of Option, and a single option.
Add some crap to beginning of stream, to prevent code depending
on getp == 0.
2007-09-18 Paul Jakma <paul.jakma@sun.com>
* bgp_open.c: (bgp_capability_as4) debug printf inline with others.
(peek_for_as4_capability) There's no need to signal failure, as
failure is better dealt with through full capability parser -
just return the AS4, simpler.
* bgp_packet.c: (bgp_open_receive) Update to match
peek_for_as4_capability change.
Allow use of BGP_AS_TRANS by 2b speakers.
Use NOTIFY_OPEN_ERR rather than CEASE for OPEN parsing errors.
(bgp_capability_msg_parse) missing argument to debug print
(bgp_capability_receive) missing return values.
* tests/bgp_capability_test.c: (parse_test) update for changes to
peek_for_as4_capability
2007-07-25 Paul Jakma <paul.jakma@sun.com>
* Remove 2-byte size macros, just make existing macros take
argument to indicate which size to use.
Adjust all users - typically they want '1'.
* bgp_aspath.c: (aspath_has_as4) New, return 1 if there are any
as4's in a path.
(aspath_put) Return the number of bytes actually written, to
fix the bug Juergen noted: Splitting of segments will change
the number of bytes written from that already written to the
AS_PATH header.
(aspath_snmp_pathseg) Pass 2-byte flag to aspath_put. SNMP
is still defined as 2b.
(aspath_aggregate) fix latent bug.
(aspath_reconcile_as4) AS_PATH+NEW_AS_PATH reconciliation
function.
(aspath_key_make) Hash the AS_PATH string, rather than
just taking the addition of assegment ASes as the hash value,
hopefully sligthly more collision resistant.
(bgp_attr_munge_as4_attrs) Collide the NEW_ attributes
together with the OLD 2-byte forms, code Juergen
had in bgp_attr_parse but re-organised a bit.
(bgp_attr_parse) Bunch of code from Juergen moves
to previous function.
(bgp_packet_attribute) Compact significantly by
just /always/ using extended-length attr header.
Fix bug Juergen noted, by using aspath_put's
(new) returned size value for the attr header rather
than the (guesstimate) of aspath_size() - the two could
differ when aspath_put had to split large segments, unlikely
this bug was ever hit in the 'wild'.
(bgp_dump_routes_attr) Always use extended-len and
use aspath_put return for header length. Output 4b ASN
for AS_PATH and AGGREGATOR.
* bgp_ecommunity.c: (ecommunity_{hash_make,cmp}) fix
hash callback declarations to match prototypes.
(ecommunity_gettoken) Updated for ECOMMUNITY_ENCODE_AS4,
complete rewrite of Juergen's changes (no asdot support)
* bgp_open.c: (bgp_capability_as4) New, does what it says
on the tin.
(peek_for_as4_capability) Rewritten to use streams and
bgp_capability_as4.
* bgp_packet.c: (bgp_open_send) minor edit
checked (in the abstract at least) with Juergen.
Changes are to be more accepting, e.g, allow AS_TRANS on
a 2-byte session.
* (general) Update all commands to use CMD_AS_RANGE.
* bgp_vty.c: (bgp_clear) Fix return vals to use CMD_..
Remove stuff replicated by VTY_GET_LONG
(bgp_clear_vty) Return bgp_clear directly to vty.
* tests/aspath_test.c: Exercise 32bit parsing. Test reconcile
function.
* tests/ecommunity_test.c: New, test AS4 ecommunity changes,
positive test only at this time, error cases not tested yet.
2007-07-25 Juergen Kammer <j.kammer@eurodata.de>
* (general) AS4 support.
* bgpd.h: as_t changes to 4-bytes.
* bgp_aspath.h: Add BGP_AS4_MAX and BGP_AS_TRANS defines.
* bgp_aspath.c: AS_VALUE_SIZE becomes 4-byte, AS16_VALUE_SIZE
added for 2-byte.
Add AS16 versions of length calc macros.
(aspath_count_numas) New, count number of ASes.
(aspath_has_as4) New, return 1 if there are any as4's in a
path.
(assegments_parse) Interpret assegment as 4 or 2 byte,
according to how the caller instructs us, with a new
argument.
(aspath_parse) Add use32bit argument to pass to
assegments_parse. Adjust all its callers to pass 1, unless
otherwise noted.
(assegment_data_put) Adjust to be able to write 2 or 4 byte
AS, according to new use32bit argument.
(aspath_put) Adjust to write 2 or 4.
(aspath_gettoken) Use a long for passed in asno.
* bgp_attr.c: (attr_str) Add BGP_ATTR_AS4_PATH and
BGP_ATTR_AS4_AGGREGATOR.
(bgp_attr_aspath) Call aspath_parse with right 2/4 arg, as
determined by received-capability flag.
(bgp_attr_aspath_check) New, code previously in attr_aspath
but moved to new func so it can be run after NEW_AS_PATH
reconciliation.
(bgp_attr_as4_path) New, handle NEW_AS_PATH.
(bgp_attr_aggregator) Adjust to cope with 2/4 byte ASes.
(bgp_attr_as4_aggregator) New, read NEW_AGGREGATOR.
(bgp_attr_parse) Add handoffs to previous parsers for the two
new AS4 NEW_ attributes.
Various checks added for NEW/OLD reconciliation.
(bgp_packet_attribute) Support 2/4 for AS_PATH and
AGGREGATOR, detect when NEW_ attrs need to be sent.
* bgp_debug.{c,h}: Add 'debug bgp as4'.
* bgp_dump.c: MRTv2 support, unconditionally enabled, which
supports AS4. Based on patches from Erik (RIPE?).
* bgp_ecommunity.c: (ecommunity_ecom2str) ECOMMUNITY_ENCODE_AS4
support.
* bgp_open.c: (peek_for_as4_capability) New, peek for AS4
capability prior to full capability parsing, so we know which
ASN to use for struct peer lookup.
(bgp_open_capability) Always send AS4 capability.
* bgp_packet.c: (bgp_open_send) AS4 handling for AS field
(bgp_open_receive) Peek for AS4 capability first, and figure
out which AS to believe.
* bgp_vty.c: (bgp_show_peer) Print AS4 cap
* tests/aspath_test.c: Support asn32 changes, call aspath_parse
with 16 bit.
* vtysh/extract.pl: AS4 compatibility for router bgp ASNUMBER
* vtysh/extract.pl.in: AS4 compatibility for router bgp ASNUMBER
* vtysh/vtysh.c: AS4 compatibility for router bgp ASNUMBER
2007-10-15 00:32:21 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
/* debug bgp neighbor_events */
|
|
|
|
DEFUN (debug_bgp_neighbor_events,
|
|
|
|
debug_bgp_neighbor_events_cmd,
|
|
|
|
"debug bgp neighbor-events",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP Neighbor Events\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_neighbor_events_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
vty_out(vty, "BGP neighbor-events debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (debug_bgp_neighbor_events_peer,
|
|
|
|
debug_bgp_neighbor_events_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp neighbor-events <A.B.C.D|X:X::X:X|WORD>",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP Neighbor Events\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_peer = 3;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
|
|
|
|
if (!bgp_debug_neighbor_events_peers)
|
|
|
|
bgp_debug_neighbor_events_peers = list_new();
|
|
|
|
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_neighbor_events_peers, host,
|
|
|
|
NULL)) {
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP neighbor-events debugging is already enabled for %s\n",
|
|
|
|
host);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_neighbor_events_peers, host, NULL);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
vty_out(vty, "BGP neighbor-events debugging is on for %s\n",
|
|
|
|
host);
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_neighbor_events,
|
|
|
|
no_debug_bgp_neighbor_events_cmd,
|
|
|
|
"no debug bgp neighbor-events",
|
|
|
|
NO_STR
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"Neighbor Events\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_neighbor_events_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
vty_out(vty, "BGP neighbor-events debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_neighbor_events_peer,
|
|
|
|
no_debug_bgp_neighbor_events_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp neighbor-events <A.B.C.D|X:X::X:X|WORD>",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"Neighbor Events\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_peer = 4;
|
|
|
|
int found_peer = 0;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
|
|
|
|
if (bgp_debug_neighbor_events_peers
|
|
|
|
&& !list_isempty(bgp_debug_neighbor_events_peers)) {
|
|
|
|
found_peer = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_neighbor_events_peers, host, NULL);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_neighbor_events_peers)) {
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
else
|
|
|
|
TERM_DEBUG_OFF(neighbor_events,
|
|
|
|
NEIGHBOR_EVENTS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_peer)
|
|
|
|
vty_out(vty, "BGP neighbor-events debugging is off for %s\n",
|
|
|
|
host);
|
|
|
|
else
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP neighbor-events debugging was not enabled for %s\n",
|
|
|
|
host);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
/* debug bgp nht */
|
2015-05-20 02:40:34 +02:00
|
|
|
DEFUN (debug_bgp_nht,
|
|
|
|
debug_bgp_nht_cmd,
|
|
|
|
"debug bgp nht",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP nexthop tracking events\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(nht, NHT);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(nht, NHT);
|
|
|
|
vty_out(vty, "BGP nexthop tracking debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:40:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_nht,
|
|
|
|
no_debug_bgp_nht_cmd,
|
|
|
|
"no debug bgp nht",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP nexthop tracking events\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(nht, NHT);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(nht, NHT);
|
|
|
|
vty_out(vty, "BGP nexthop tracking debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:40:34 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
/* debug bgp keepalives */
|
|
|
|
DEFUN (debug_bgp_keepalive,
|
|
|
|
debug_bgp_keepalive_cmd,
|
|
|
|
"debug bgp keepalives",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP keepalives\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_keepalive_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(keepalive, KEEPALIVE);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(keepalive, KEEPALIVE);
|
|
|
|
vty_out(vty, "BGP keepalives debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (debug_bgp_keepalive_peer,
|
|
|
|
debug_bgp_keepalive_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp keepalives <A.B.C.D|X:X::X:X|WORD>",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP Neighbor Events\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_peer = 3;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
|
|
|
|
if (!bgp_debug_keepalive_peers)
|
|
|
|
bgp_debug_keepalive_peers = list_new();
|
|
|
|
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_keepalive_peers, host, NULL)) {
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP keepalive debugging is already enabled for %s\n",
|
|
|
|
host);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_keepalive_peers, host, NULL);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(keepalive, KEEPALIVE);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(keepalive, KEEPALIVE);
|
|
|
|
vty_out(vty, "BGP keepalives debugging is on for %s\n", host);
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_keepalive,
|
|
|
|
no_debug_bgp_keepalive_cmd,
|
|
|
|
"no debug bgp keepalives",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP keepalives\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_keepalive_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(keepalive, KEEPALIVE);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(keepalive, KEEPALIVE);
|
|
|
|
vty_out(vty, "BGP keepalives debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_keepalive_peer,
|
|
|
|
no_debug_bgp_keepalive_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp keepalives <A.B.C.D|X:X::X:X|WORD>",
|
2015-05-20 02:58:12 +02:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
2002-12-13 21:15:29 +01:00
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP keepalives\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_peer = 4;
|
|
|
|
int found_peer = 0;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
|
|
|
|
if (bgp_debug_keepalive_peers
|
|
|
|
&& !list_isempty(bgp_debug_keepalive_peers)) {
|
|
|
|
found_peer = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_keepalive_peers, host, NULL);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_keepalive_peers)) {
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(keepalive, KEEPALIVE);
|
|
|
|
else
|
|
|
|
TERM_DEBUG_OFF(keepalive, KEEPALIVE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_peer)
|
|
|
|
vty_out(vty, "BGP keepalives debugging is off for %s\n", host);
|
|
|
|
else
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP keepalives debugging was not enabled for %s\n",
|
|
|
|
host);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 03:04:02 +02:00
|
|
|
/* debug bgp bestpath */
|
2017-09-20 17:12:17 +02:00
|
|
|
DEFUN (debug_bgp_bestpath_prefix,
|
2015-05-20 03:04:02 +02:00
|
|
|
debug_bgp_bestpath_prefix_cmd,
|
2017-09-20 17:12:17 +02:00
|
|
|
"debug bgp bestpath <A.B.C.D/M|X:X::X:X/M>",
|
2015-05-20 03:04:02 +02:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP bestpath\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2015-05-20 03:04:02 +02:00
|
|
|
{
|
2017-09-19 15:38:35 +02:00
|
|
|
struct prefix *argv_p;
|
|
|
|
int idx_ipv4_ipv6_prefixlen = 3;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (!bgp_debug_bestpath_prefixes)
|
|
|
|
bgp_debug_bestpath_prefixes = list_new();
|
|
|
|
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_bestpath_prefixes, NULL,
|
2017-09-20 17:12:17 +02:00
|
|
|
argv_p)) {
|
2017-07-17 14:03:14 +02:00
|
|
|
vty_out(vty,
|
|
|
|
"BGP bestpath debugging is already enabled for %s\n",
|
2017-09-20 17:12:17 +02:00
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
2017-07-17 14:03:14 +02:00
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2017-09-20 17:12:17 +02:00
|
|
|
bgp_debug_list_add_entry(bgp_debug_bestpath_prefixes, NULL, argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_ON(bestpath, BESTPATH);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_ON(bestpath, BESTPATH);
|
|
|
|
vty_out(vty, "BGP bestpath debugging is on for %s\n",
|
2017-09-20 17:12:17 +02:00
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
2017-07-17 14:03:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:04:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_bestpath_prefix,
|
|
|
|
no_debug_bgp_bestpath_prefix_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp bestpath <A.B.C.D/M|X:X::X:X/M>",
|
2015-05-20 03:04:02 +02:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP bestpath\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2015-05-20 03:04:02 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_ipv4_ipv6_prefixlen = 4;
|
|
|
|
struct prefix *argv_p;
|
|
|
|
int found_prefix = 0;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (bgp_debug_bestpath_prefixes
|
|
|
|
&& !list_isempty(bgp_debug_bestpath_prefixes)) {
|
|
|
|
found_prefix = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_bestpath_prefixes, NULL, argv_p);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_bestpath_prefixes)) {
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_OFF(bestpath, BESTPATH);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_OFF(bestpath, BESTPATH);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP bestpath debugging (per prefix) is off\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_prefix)
|
|
|
|
vty_out(vty, "BGP bestpath debugging is off for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
else
|
|
|
|
vty_out(vty, "BGP bestpath debugging was not enabled for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:04:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_bestpath,
|
|
|
|
no_debug_bgp_bestpath_cmd,
|
|
|
|
"no debug bgp bestpath",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP bestpath\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_bestpath_prefixes);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(bestpath, BESTPATH);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(bestpath, BESTPATH);
|
|
|
|
vty_out(vty, "BGP bestpath debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:04:02 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
/* debug bgp updates */
|
2002-12-13 21:15:29 +01:00
|
|
|
DEFUN (debug_bgp_update,
|
|
|
|
debug_bgp_update_cmd,
|
|
|
|
"debug bgp updates",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_update_in_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_out_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_prefixes);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_ON(update, UPDATE_IN);
|
|
|
|
DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_IN);
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
vty_out(vty, "BGP updates debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (debug_bgp_update_direct,
|
|
|
|
debug_bgp_update_direct_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp updates <in|out>",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n"
|
|
|
|
"Inbound updates\n"
|
|
|
|
"Outbound updates\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_in_out = 3;
|
|
|
|
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0)
|
|
|
|
bgp_debug_list_free(bgp_debug_update_in_peers);
|
|
|
|
else
|
|
|
|
bgp_debug_list_free(bgp_debug_update_out_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0)
|
|
|
|
DEBUG_ON(update, UPDATE_IN);
|
|
|
|
else
|
|
|
|
DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
} else {
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0) {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_IN);
|
|
|
|
vty_out(vty, "BGP updates debugging is on (inbound)\n");
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is on (outbound)\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (debug_bgp_update_direct_peer,
|
|
|
|
debug_bgp_update_direct_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp updates <in|out> <A.B.C.D|X:X::X:X|WORD>",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP updates\n"
|
|
|
|
"Inbound updates\n"
|
|
|
|
"Outbound updates\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_in_out = 3;
|
|
|
|
int idx_peer = 4;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
int inbound;
|
|
|
|
|
|
|
|
if (!bgp_debug_update_in_peers)
|
|
|
|
bgp_debug_update_in_peers = list_new();
|
|
|
|
|
|
|
|
if (!bgp_debug_update_out_peers)
|
|
|
|
bgp_debug_update_out_peers = list_new();
|
|
|
|
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0)
|
|
|
|
inbound = 1;
|
|
|
|
else
|
|
|
|
inbound = 0;
|
|
|
|
|
|
|
|
if (inbound) {
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_update_in_peers, host,
|
|
|
|
NULL)) {
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP inbound update debugging is already enabled for %s\n",
|
|
|
|
host);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_update_out_peers, host,
|
|
|
|
NULL)) {
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP outbound update debugging is already enabled for %s\n",
|
|
|
|
host);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (inbound)
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_update_in_peers, host, NULL);
|
|
|
|
else {
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_af *paf;
|
|
|
|
int afidx;
|
|
|
|
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_update_out_peers, host,
|
|
|
|
NULL);
|
|
|
|
peer = bgp_find_peer(vty, host);
|
|
|
|
|
|
|
|
if (peer) {
|
|
|
|
for (afidx = BGP_AF_START; afidx < BGP_AF_MAX;
|
|
|
|
afidx++) {
|
|
|
|
paf = peer->peer_af_array[afidx];
|
|
|
|
if (paf != NULL) {
|
|
|
|
if (PAF_SUBGRP(paf)) {
|
|
|
|
UPDGRP_PEER_DBG_EN(
|
|
|
|
PAF_SUBGRP(paf)
|
|
|
|
->update_group);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
if (inbound)
|
|
|
|
DEBUG_ON(update, UPDATE_IN);
|
|
|
|
else
|
|
|
|
DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
} else {
|
|
|
|
if (inbound) {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_IN);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is on (inbound) for %s\n",
|
|
|
|
argv[idx_peer]->arg);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_OUT);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is on (outbound) for %s\n",
|
|
|
|
argv[idx_peer]->arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 03:04:06 +02:00
|
|
|
DEFUN (no_debug_bgp_update_direct,
|
|
|
|
no_debug_bgp_update_direct_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp updates <in|out>",
|
2015-05-20 03:04:06 +02:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n"
|
|
|
|
"Inbound updates\n"
|
|
|
|
"Outbound updates\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_in_out = 4;
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0) {
|
|
|
|
bgp_debug_list_free(bgp_debug_update_in_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is off (inbound)\n");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
bgp_debug_list_free(bgp_debug_update_out_peers);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is off (outbound)\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:04:06 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_update_direct_peer,
|
|
|
|
no_debug_bgp_update_direct_peer_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp updates <in|out> <A.B.C.D|X:X::X:X|WORD>",
|
2015-05-20 02:58:12 +02:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
2002-12-13 21:15:29 +01:00
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP updates\n"
|
|
|
|
"Inbound updates\n"
|
|
|
|
"Outbound updates\n"
|
|
|
|
"BGP neighbor IP address to debug\n"
|
|
|
|
"BGP IPv6 neighbor to debug\n"
|
|
|
|
"BGP neighbor on interface to debug\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_in_out = 4;
|
|
|
|
int idx_peer = 5;
|
|
|
|
int inbound;
|
|
|
|
int found_peer = 0;
|
|
|
|
const char *host = argv[idx_peer]->arg;
|
|
|
|
|
|
|
|
if (strncmp("i", argv[idx_in_out]->arg, 1) == 0)
|
|
|
|
inbound = 1;
|
|
|
|
else
|
|
|
|
inbound = 0;
|
|
|
|
|
|
|
|
if (inbound && bgp_debug_update_in_peers
|
|
|
|
&& !list_isempty(bgp_debug_update_in_peers)) {
|
|
|
|
found_peer = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_update_in_peers, host, NULL);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_update_in_peers)) {
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (inbound) is off\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!inbound && bgp_debug_update_out_peers
|
|
|
|
&& !list_isempty(bgp_debug_update_out_peers)) {
|
|
|
|
found_peer = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_update_out_peers, host, NULL);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_update_out_peers)) {
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (outbound) is off\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_af *paf;
|
|
|
|
int afidx;
|
|
|
|
peer = bgp_find_peer(vty, host);
|
|
|
|
|
|
|
|
if (peer) {
|
|
|
|
for (afidx = BGP_AF_START; afidx < BGP_AF_MAX;
|
|
|
|
afidx++) {
|
|
|
|
paf = peer->peer_af_array[afidx];
|
|
|
|
if (paf != NULL) {
|
|
|
|
if (PAF_SUBGRP(paf)) {
|
|
|
|
UPDGRP_PEER_DBG_DIS(
|
|
|
|
PAF_SUBGRP(paf)
|
|
|
|
->update_group);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_peer)
|
|
|
|
if (inbound)
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (inbound) is off for %s\n",
|
|
|
|
host);
|
|
|
|
else
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (outbound) is off for %s\n",
|
|
|
|
host);
|
|
|
|
else if (inbound)
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (inbound) was not enabled for %s\n",
|
|
|
|
host);
|
|
|
|
else
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (outbound) was not enabled for %s\n",
|
|
|
|
host);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (debug_bgp_update_prefix,
|
|
|
|
debug_bgp_update_prefix_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp updates prefix <A.B.C.D/M|X:X::X:X/M>",
|
2002-12-13 21:15:29 +01:00
|
|
|
DEBUG_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n"
|
|
|
|
"Specify a prefix to debug\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_ipv4_ipv6_prefixlen = 4;
|
|
|
|
struct prefix *argv_p;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (!bgp_debug_update_prefixes)
|
|
|
|
bgp_debug_update_prefixes = list_new();
|
|
|
|
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_update_prefixes, NULL, argv_p)) {
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging is already enabled for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_update_prefixes, NULL, argv_p);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_ON(update, UPDATE_PREFIX);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_ON(update, UPDATE_PREFIX);
|
|
|
|
vty_out(vty, "BGP updates debugging is on for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_update_prefix,
|
|
|
|
no_debug_bgp_update_prefix_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp updates prefix <A.B.C.D/M|X:X::X:X/M>",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n"
|
|
|
|
"Specify a prefix to debug\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_ipv4_ipv6_prefixlen = 5;
|
|
|
|
struct prefix *argv_p;
|
|
|
|
int found_prefix = 0;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (bgp_debug_update_prefixes
|
|
|
|
&& !list_isempty(bgp_debug_update_prefixes)) {
|
|
|
|
found_prefix = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_update_prefixes, NULL, argv_p);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_update_prefixes)) {
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_OFF(update, UPDATE_PREFIX);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_PREFIX);
|
|
|
|
vty_out(vty,
|
|
|
|
"BGP updates debugging (per prefix) is off\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_prefix)
|
|
|
|
vty_out(vty, "BGP updates debugging is off for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
else
|
|
|
|
vty_out(vty, "BGP updates debugging was not enabled for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_update,
|
|
|
|
no_debug_bgp_update_cmd,
|
|
|
|
"no debug bgp updates",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP updates\n")
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-08-10 23:01:59 +02:00
|
|
|
struct listnode *ln;
|
|
|
|
struct bgp *bgp;
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_update_in_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_out_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_prefixes);
|
|
|
|
|
2017-08-10 23:01:59 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO(bm->bgp, ln, bgp))
|
|
|
|
bgp_debug_clear_updgrp_update_dbg(bgp);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE) {
|
|
|
|
DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
DEBUG_OFF(update, UPDATE_PREFIX);
|
|
|
|
} else {
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_PREFIX);
|
|
|
|
vty_out(vty, "BGP updates debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
/* debug bgp zebra */
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
DEFUN (debug_bgp_zebra,
|
|
|
|
debug_bgp_zebra_cmd,
|
|
|
|
"debug bgp zebra",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP Zebra messages\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(zebra, ZEBRA);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(zebra, ZEBRA);
|
|
|
|
vty_out(vty, "BGP zebra debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (debug_bgp_zebra_prefix,
|
|
|
|
debug_bgp_zebra_prefix_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"debug bgp zebra prefix <A.B.C.D/M|X:X::X:X/M>",
|
2015-05-20 02:58:12 +02:00
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP Zebra messages\n"
|
|
|
|
"Specify a prefix to debug\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_ipv4_ipv6_prefixlen = 4;
|
|
|
|
struct prefix *argv_p;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (!bgp_debug_zebra_prefixes)
|
|
|
|
bgp_debug_zebra_prefixes = list_new();
|
|
|
|
|
|
|
|
if (bgp_debug_list_has_entry(bgp_debug_zebra_prefixes, NULL, argv_p)) {
|
|
|
|
vty_out(vty, "BGP zebra debugging is already enabled for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
return CMD_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
bgp_debug_list_add_entry(bgp_debug_zebra_prefixes, NULL, argv_p);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(zebra, ZEBRA);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(zebra, ZEBRA);
|
|
|
|
vty_out(vty, "BGP zebra debugging is on for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
DEFUN (no_debug_bgp_zebra,
|
|
|
|
no_debug_bgp_zebra_cmd,
|
|
|
|
"no debug bgp zebra",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP Zebra messages\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_zebra_prefixes);
|
|
|
|
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(zebra, ZEBRA);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(zebra, ZEBRA);
|
|
|
|
vty_out(vty, "BGP zebra debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp_zebra_prefix,
|
|
|
|
no_debug_bgp_zebra_prefix_cmd,
|
2016-09-23 15:47:20 +02:00
|
|
|
"no debug bgp zebra prefix <A.B.C.D/M|X:X::X:X/M>",
|
2015-05-20 02:58:12 +02:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
[bgpd] Implement 'debug bgp zebra' to log all messages to and from zebra.
2006-11-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* bgp_debug.h: Declare new bgp_debug_zebra conf and term flags,
and define BGP_DEBUG_ZEBRA.
* bgp_debug.c: Declare conf_bgp_debug_zebra and term_bgp_debug_zebra.
(debug_bgp_zebra, no_debug_bgp_zebra, undebug_bgp_zebra) New
functions to enable/disable bgp zebra debugging.
(no_debug_bgp_all) Turn off zebra debugging.
(show_debugging_bgp) Show whether zebra debugging is on.
(bgp_config_write_debug) Add 'debug bgp zebra' if configured.
(bgp_debug_init) Add new zebra debugging commands.
* bgp_zebra.c: (bgp_router_id_update, bgp_interface_add,
bgp_interface_delete, bgp_interface_up, bgp_interface_down,
bgp_interface_address_add, bgp_interface_address_delete,
zebra_read_ipv4, zebra_read_ipv6, bgp_zebra_announce,
bgp_zebra_withdraw, bgp_redistribute_set, bgp_redistribute_unset)
If zebra debugging is enabled, log an appropriate debug message.
2006-11-30 17:36:57 +01:00
|
|
|
BGP_STR
|
2015-05-20 02:58:12 +02:00
|
|
|
"BGP Zebra messages\n"
|
|
|
|
"Specify a prefix to debug\n"
|
2016-10-28 01:18:26 +02:00
|
|
|
"IPv4 prefix\n"
|
|
|
|
"IPv6 prefix\n")
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int idx_ipv4_ipv6_prefixlen = 5;
|
|
|
|
struct prefix *argv_p;
|
|
|
|
int found_prefix = 0;
|
|
|
|
|
|
|
|
argv_p = prefix_new();
|
2017-09-20 17:12:17 +02:00
|
|
|
(void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
|
2017-09-19 15:38:35 +02:00
|
|
|
apply_mask(argv_p);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
if (bgp_debug_zebra_prefixes
|
|
|
|
&& !list_isempty(bgp_debug_zebra_prefixes)) {
|
|
|
|
found_prefix = bgp_debug_list_remove_entry(
|
|
|
|
bgp_debug_zebra_prefixes, NULL, argv_p);
|
|
|
|
|
|
|
|
if (list_isempty(bgp_debug_zebra_prefixes)) {
|
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(zebra, ZEBRA);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(zebra, ZEBRA);
|
|
|
|
vty_out(vty, "BGP zebra debugging is off\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (found_prefix)
|
|
|
|
vty_out(vty, "BGP zebra debugging is off for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
else
|
|
|
|
vty_out(vty, "BGP zebra debugging was not enabled for %s\n",
|
|
|
|
argv[idx_ipv4_ipv6_prefixlen]->arg);
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2016-05-07 16:35:21 +02:00
|
|
|
DEFUN (debug_bgp_allow_martians,
|
|
|
|
debug_bgp_allow_martians_cmd,
|
|
|
|
"debug bgp allow-martians",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP allow martian next hops\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(allow_martians, ALLOW_MARTIANS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(allow_martians, ALLOW_MARTIANS);
|
|
|
|
vty_out(vty, "BGP allow_martian next hop debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2016-05-07 16:35:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_allow_martians,
|
|
|
|
no_debug_bgp_allow_martians_cmd,
|
|
|
|
"no debug bgp allow-martians",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP allow martian next hops\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(allow_martians, ALLOW_MARTIANS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(allow_martians, ALLOW_MARTIANS);
|
|
|
|
vty_out(vty, "BGP allow martian next hop debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2016-05-07 16:35:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* debug bgp update-groups */
|
|
|
|
DEFUN (debug_bgp_update_groups,
|
|
|
|
debug_bgp_update_groups_cmd,
|
|
|
|
"debug bgp update-groups",
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP update-groups\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_ON(update_groups, UPDATE_GROUPS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_ON(update_groups, UPDATE_GROUPS);
|
|
|
|
vty_out(vty, "BGP update-groups debugging is on\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DEFUN (no_debug_bgp_update_groups,
|
|
|
|
no_debug_bgp_update_groups_cmd,
|
|
|
|
"no debug bgp update-groups",
|
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR
|
|
|
|
"BGP update-groups\n")
|
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (vty->node == CONFIG_NODE)
|
|
|
|
DEBUG_OFF(update_groups, UPDATE_GROUPS);
|
|
|
|
else {
|
|
|
|
TERM_DEBUG_OFF(update_groups, UPDATE_GROUPS);
|
|
|
|
vty_out(vty, "BGP update-groups debugging is off\n");
|
|
|
|
}
|
|
|
|
return CMD_SUCCESS;
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
|
2015-05-20 02:58:12 +02:00
|
|
|
DEFUN (no_debug_bgp,
|
|
|
|
no_debug_bgp_cmd,
|
|
|
|
"no debug bgp",
|
2002-12-13 21:15:29 +01:00
|
|
|
NO_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR)
|
|
|
|
{
|
2017-08-10 23:01:59 +02:00
|
|
|
struct bgp *bgp;
|
|
|
|
struct listnode *ln;
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
bgp_debug_list_free(bgp_debug_neighbor_events_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_keepalive_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_in_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_out_peers);
|
|
|
|
bgp_debug_list_free(bgp_debug_update_prefixes);
|
|
|
|
bgp_debug_list_free(bgp_debug_bestpath_prefixes);
|
|
|
|
bgp_debug_list_free(bgp_debug_zebra_prefixes);
|
|
|
|
|
2017-08-10 23:01:59 +02:00
|
|
|
for (ALL_LIST_ELEMENTS_RO(bm->bgp, ln, bgp))
|
|
|
|
bgp_debug_clear_updgrp_update_dbg(bgp);
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
TERM_DEBUG_OFF(keepalive, KEEPALIVE);
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_IN);
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_OUT);
|
|
|
|
TERM_DEBUG_OFF(update, UPDATE_PREFIX);
|
|
|
|
TERM_DEBUG_OFF(bestpath, BESTPATH);
|
|
|
|
TERM_DEBUG_OFF(as4, AS4);
|
|
|
|
TERM_DEBUG_OFF(as4, AS4_SEGMENT);
|
|
|
|
TERM_DEBUG_OFF(neighbor_events, NEIGHBOR_EVENTS);
|
|
|
|
TERM_DEBUG_OFF(zebra, ZEBRA);
|
|
|
|
TERM_DEBUG_OFF(allow_martians, ALLOW_MARTIANS);
|
2017-10-18 20:49:59 +02:00
|
|
|
TERM_DEBUG_OFF(nht, NHT);
|
2017-07-17 14:03:14 +02:00
|
|
|
vty_out(vty, "All possible debugging has been turned off\n");
|
|
|
|
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2017-08-18 18:50:13 +02:00
|
|
|
DEFUN_NOSH (show_debugging_bgp,
|
|
|
|
show_debugging_bgp_cmd,
|
|
|
|
"show debugging [bgp]",
|
|
|
|
SHOW_STR
|
|
|
|
DEBUG_STR
|
|
|
|
BGP_STR)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
vty_out(vty, "BGP debugging status:\n");
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(as4, AS4))
|
|
|
|
vty_out(vty, " BGP as4 debugging is on\n");
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(as4, AS4_SEGMENT))
|
|
|
|
vty_out(vty, " BGP as4 aspath segment debugging is on\n");
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(bestpath, BESTPATH))
|
|
|
|
bgp_debug_list_print(vty, " BGP bestpath debugging is on",
|
|
|
|
bgp_debug_bestpath_prefixes);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(keepalive, KEEPALIVE))
|
|
|
|
bgp_debug_list_print(vty, " BGP keepalives debugging is on",
|
|
|
|
bgp_debug_keepalive_peers);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(neighbor_events, NEIGHBOR_EVENTS))
|
|
|
|
bgp_debug_list_print(vty,
|
|
|
|
" BGP neighbor-events debugging is on",
|
|
|
|
bgp_debug_neighbor_events_peers);
|
2015-05-20 03:04:06 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(nht, NHT))
|
|
|
|
vty_out(vty, " BGP next-hop tracking debugging is on\n");
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update_groups, UPDATE_GROUPS))
|
|
|
|
vty_out(vty, " BGP update-groups debugging is on\n");
|
2015-05-20 03:04:06 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_PREFIX))
|
|
|
|
bgp_debug_list_print(vty, " BGP updates debugging is on",
|
|
|
|
bgp_debug_update_prefixes);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_IN))
|
|
|
|
bgp_debug_list_print(vty,
|
|
|
|
" BGP updates debugging is on (inbound)",
|
|
|
|
bgp_debug_update_in_peers);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_OUT))
|
|
|
|
bgp_debug_list_print(vty,
|
|
|
|
" BGP updates debugging is on (outbound)",
|
|
|
|
bgp_debug_update_out_peers);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(zebra, ZEBRA))
|
|
|
|
bgp_debug_list_print(vty, " BGP zebra debugging is on",
|
|
|
|
bgp_debug_zebra_prefixes);
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(allow_martians, ALLOW_MARTIANS))
|
|
|
|
vty_out(vty, " BGP allow martian next hop debugging is on\n");
|
|
|
|
vty_out(vty, "\n");
|
|
|
|
return CMD_SUCCESS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2016-09-24 15:09:36 +02:00
|
|
|
/* return count of number of debug flags set */
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_count(void)
|
2016-09-24 15:09:36 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int ret = 0;
|
|
|
|
if (BGP_DEBUG(as4, AS4))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(as4, AS4_SEGMENT))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(bestpath, BESTPATH))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(keepalive, KEEPALIVE))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(neighbor_events, NEIGHBOR_EVENTS))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(nht, NHT))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update_groups, UPDATE_GROUPS))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_PREFIX))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_IN))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(update, UPDATE_OUT))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(zebra, ZEBRA))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(allow_martians, ALLOW_MARTIANS))
|
|
|
|
ret++;
|
2016-09-24 15:09:36 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return ret;
|
2016-09-24 15:09:36 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static int bgp_config_write_debug(struct vty *vty)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
int write = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (CONF_BGP_DEBUG(as4, AS4)) {
|
|
|
|
vty_out(vty, "debug bgp as4\n");
|
|
|
|
write++;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (CONF_BGP_DEBUG(as4, AS4_SEGMENT)) {
|
|
|
|
vty_out(vty, "debug bgp as4 segment\n");
|
|
|
|
write++;
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (CONF_BGP_DEBUG(bestpath, BESTPATH)) {
|
|
|
|
write += bgp_debug_list_conf_print(vty, "debug bgp bestpath",
|
|
|
|
bgp_debug_bestpath_prefixes);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(keepalive, KEEPALIVE)) {
|
|
|
|
write += bgp_debug_list_conf_print(vty, "debug bgp keepalives",
|
|
|
|
bgp_debug_keepalive_peers);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(neighbor_events, NEIGHBOR_EVENTS)) {
|
|
|
|
write += bgp_debug_list_conf_print(
|
|
|
|
vty, "debug bgp neighbor-events",
|
|
|
|
bgp_debug_neighbor_events_peers);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(nht, NHT)) {
|
|
|
|
vty_out(vty, "debug bgp nht\n");
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(update_groups, UPDATE_GROUPS)) {
|
|
|
|
vty_out(vty, "debug bgp update-groups\n");
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(update, UPDATE_PREFIX)) {
|
|
|
|
write += bgp_debug_list_conf_print(vty,
|
|
|
|
"debug bgp updates prefix",
|
|
|
|
bgp_debug_update_prefixes);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(update, UPDATE_IN)) {
|
|
|
|
write += bgp_debug_list_conf_print(vty, "debug bgp updates in",
|
|
|
|
bgp_debug_update_in_peers);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (CONF_BGP_DEBUG(update, UPDATE_OUT)) {
|
|
|
|
write += bgp_debug_list_conf_print(vty, "debug bgp updates out",
|
|
|
|
bgp_debug_update_out_peers);
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (CONF_BGP_DEBUG(zebra, ZEBRA)) {
|
|
|
|
if (!bgp_debug_zebra_prefixes
|
|
|
|
|| list_isempty(bgp_debug_zebra_prefixes)) {
|
|
|
|
vty_out(vty, "debug bgp zebra\n");
|
|
|
|
write++;
|
|
|
|
} else {
|
|
|
|
write += bgp_debug_list_conf_print(
|
|
|
|
vty, "debug bgp zebra prefix",
|
|
|
|
bgp_debug_zebra_prefixes);
|
|
|
|
}
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (CONF_BGP_DEBUG(allow_martians, ALLOW_MARTIANS)) {
|
|
|
|
vty_out(vty, "debug bgp allow-martians\n");
|
|
|
|
write++;
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return write;
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
static struct cmd_node debug_node = {DEBUG_NODE, "", 1};
|
|
|
|
|
|
|
|
void bgp_debug_init(void)
|
|
|
|
{
|
|
|
|
install_node(&debug_node, bgp_config_write_debug);
|
|
|
|
|
|
|
|
install_element(ENABLE_NODE, &show_debugging_bgp_cmd);
|
|
|
|
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_as4_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_as4_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_as4_segment_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_as4_segment_cmd);
|
|
|
|
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_neighbor_events_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_neighbor_events_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_nht_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_nht_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_keepalive_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_keepalive_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_update_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_update_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_zebra_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_zebra_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_allow_martians_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_allow_martians_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_update_groups_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_update_groups_cmd);
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_bestpath_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_bestpath_prefix_cmd);
|
|
|
|
|
|
|
|
/* debug bgp updates (in|out) */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_update_direct_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_update_direct_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_update_direct_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_update_direct_cmd);
|
|
|
|
|
|
|
|
/* debug bgp updates (in|out) A.B.C.D */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_update_direct_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_update_direct_peer_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_update_direct_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_update_direct_peer_cmd);
|
|
|
|
|
|
|
|
/* debug bgp updates prefix A.B.C.D/M */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_update_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_update_prefix_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_update_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_update_prefix_cmd);
|
|
|
|
|
|
|
|
/* debug bgp zebra prefix A.B.C.D/M */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_zebra_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_zebra_prefix_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_zebra_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_zebra_prefix_cmd);
|
|
|
|
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_as4_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_as4_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_as4_segment_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_as4_segment_cmd);
|
|
|
|
|
|
|
|
/* debug bgp neighbor-events A.B.C.D */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_neighbor_events_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_neighbor_events_peer_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_neighbor_events_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_neighbor_events_peer_cmd);
|
|
|
|
|
|
|
|
/* debug bgp keepalive A.B.C.D */
|
|
|
|
install_element(ENABLE_NODE, &debug_bgp_keepalive_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &debug_bgp_keepalive_peer_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_keepalive_peer_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_keepalive_peer_cmd);
|
|
|
|
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_neighbor_events_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_neighbor_events_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_nht_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_nht_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_keepalive_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_keepalive_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_update_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_update_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_zebra_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_zebra_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_allow_martians_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_allow_martians_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_update_groups_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_update_groups_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_bestpath_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_bestpath_cmd);
|
|
|
|
install_element(ENABLE_NODE, &no_debug_bgp_bestpath_prefix_cmd);
|
|
|
|
install_element(CONFIG_NODE, &no_debug_bgp_bestpath_prefix_cmd);
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
/* Return true if this prefix is on the per_prefix_list of prefixes to debug
|
|
|
|
* for BGP_DEBUG_TYPE
|
|
|
|
*/
|
|
|
|
static int bgp_debug_per_prefix(struct prefix *p,
|
|
|
|
unsigned long term_bgp_debug_type,
|
|
|
|
unsigned int BGP_DEBUG_TYPE,
|
|
|
|
struct list *per_prefix_list)
|
|
|
|
{
|
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
if (term_bgp_debug_type & BGP_DEBUG_TYPE) {
|
|
|
|
/* We are debugging all prefixes so return true */
|
|
|
|
if (!per_prefix_list || list_isempty(per_prefix_list))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
else {
|
|
|
|
if (!p)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS(per_prefix_list, node, nnode,
|
|
|
|
filter))
|
|
|
|
if (filter->p->prefixlen == p->prefixlen
|
|
|
|
&& prefix_match(filter->p, p))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Return true if this peer is on the per_peer_list of peers to debug
|
|
|
|
* for BGP_DEBUG_TYPE
|
|
|
|
*/
|
2017-07-17 14:03:14 +02:00
|
|
|
static int bgp_debug_per_peer(char *host, unsigned long term_bgp_debug_type,
|
|
|
|
unsigned int BGP_DEBUG_TYPE,
|
|
|
|
struct list *per_peer_list)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
struct bgp_debug_filter *filter;
|
|
|
|
struct listnode *node, *nnode;
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (term_bgp_debug_type & BGP_DEBUG_TYPE) {
|
|
|
|
/* We are debugging all peers so return true */
|
|
|
|
if (!per_peer_list || list_isempty(per_peer_list))
|
|
|
|
return 1;
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
else {
|
|
|
|
if (!host)
|
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
for (ALL_LIST_ELEMENTS(per_peer_list, node, nnode,
|
|
|
|
filter))
|
|
|
|
if (strcmp(filter->host, host) == 0)
|
|
|
|
return 1;
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2015-05-20 02:58:12 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_neighbor_events(struct peer *peer)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
char *host = NULL;
|
2015-05-20 03:04:21 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (peer)
|
|
|
|
host = peer->host;
|
2015-05-20 03:04:21 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return bgp_debug_per_peer(host, term_bgp_debug_neighbor_events,
|
|
|
|
BGP_DEBUG_NEIGHBOR_EVENTS,
|
|
|
|
bgp_debug_neighbor_events_peers);
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_keepalive(struct peer *peer)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
char *host = NULL;
|
2015-05-20 03:04:21 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
if (peer)
|
|
|
|
host = peer->host;
|
2015-05-20 03:04:21 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
return bgp_debug_per_peer(host, term_bgp_debug_keepalive,
|
|
|
|
BGP_DEBUG_KEEPALIVE,
|
|
|
|
bgp_debug_keepalive_peers);
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_update(struct peer *peer, struct prefix *p,
|
|
|
|
struct update_group *updgrp, unsigned int inbound)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
char *host = NULL;
|
|
|
|
|
|
|
|
if (peer)
|
|
|
|
host = peer->host;
|
|
|
|
|
|
|
|
if (inbound) {
|
|
|
|
if (bgp_debug_per_peer(host, term_bgp_debug_update,
|
|
|
|
BGP_DEBUG_UPDATE_IN,
|
|
|
|
bgp_debug_update_in_peers))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* outbound */
|
|
|
|
else {
|
|
|
|
if (bgp_debug_per_peer(host, term_bgp_debug_update,
|
|
|
|
BGP_DEBUG_UPDATE_OUT,
|
|
|
|
bgp_debug_update_out_peers))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
/* Check if update debugging implicitly enabled for the group.
|
|
|
|
*/
|
|
|
|
if (updgrp && UPDGRP_DBG_ON(updgrp))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (BGP_DEBUG(update, UPDATE_PREFIX)) {
|
|
|
|
if (bgp_debug_per_prefix(p, term_bgp_debug_update,
|
|
|
|
BGP_DEBUG_UPDATE_PREFIX,
|
|
|
|
bgp_debug_update_prefixes))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2015-05-20 02:58:12 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_bestpath(struct prefix *p)
|
2015-05-20 03:04:02 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(bestpath, BESTPATH)) {
|
|
|
|
if (bgp_debug_per_prefix(p, term_bgp_debug_bestpath,
|
|
|
|
BGP_DEBUG_BESTPATH,
|
|
|
|
bgp_debug_bestpath_prefixes))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2015-05-20 03:04:02 +02:00
|
|
|
}
|
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
int bgp_debug_zebra(struct prefix *p)
|
2015-05-20 02:58:12 +02:00
|
|
|
{
|
2017-07-17 14:03:14 +02:00
|
|
|
if (BGP_DEBUG(zebra, ZEBRA)) {
|
|
|
|
if (bgp_debug_per_prefix(p, term_bgp_debug_zebra,
|
|
|
|
BGP_DEBUG_ZEBRA,
|
|
|
|
bgp_debug_zebra_prefixes))
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2016-08-10 01:02:03 +02:00
|
|
|
|
2017-07-17 14:03:14 +02:00
|
|
|
const char *bgp_debug_rdpfxpath2str(afi_t afi, safi_t safi,
|
|
|
|
struct prefix_rd *prd,
|
|
|
|
union prefixconstptr pu,
|
|
|
|
mpls_label_t *label, int addpath_valid,
|
|
|
|
u_int32_t addpath_id, char *str, int size)
|
|
|
|
{
|
|
|
|
char rd_buf[RD_ADDRSTRLEN];
|
|
|
|
char pfx_buf[PREFIX_STRLEN];
|
|
|
|
char tag_buf[30];
|
|
|
|
/* ' with addpath ID ' 17
|
|
|
|
* max strlen of uint32 + 10
|
|
|
|
* +/- (just in case) + 1
|
|
|
|
* null terminator + 1
|
|
|
|
* ============================ 29 */
|
|
|
|
char pathid_buf[30];
|
|
|
|
|
|
|
|
if (size < BGP_PRD_PATH_STRLEN)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Note: Path-id is created by default, but only included in update
|
|
|
|
* sometimes. */
|
|
|
|
pathid_buf[0] = '\0';
|
|
|
|
if (addpath_valid)
|
|
|
|
snprintf(pathid_buf, sizeof(pathid_buf), " with addpath ID %u",
|
|
|
|
addpath_id);
|
|
|
|
|
|
|
|
tag_buf[0] = '\0';
|
|
|
|
if (bgp_labeled_safi(safi) && label) {
|
|
|
|
u_int32_t label_value;
|
|
|
|
|
|
|
|
label_value = decode_label(label);
|
|
|
|
sprintf(tag_buf, " label %u", label_value);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prd)
|
2017-10-28 21:04:49 +02:00
|
|
|
snprintf(str, size, "RD %s %s%s%s %s %s",
|
2017-07-17 14:03:14 +02:00
|
|
|
prefix_rd2str(prd, rd_buf, sizeof(rd_buf)),
|
|
|
|
prefix2str(pu, pfx_buf, sizeof(pfx_buf)), tag_buf,
|
2017-10-28 21:04:49 +02:00
|
|
|
pathid_buf, afi2str(afi), safi2str(safi));
|
2017-07-17 14:03:14 +02:00
|
|
|
else
|
2017-10-28 21:04:49 +02:00
|
|
|
snprintf(str, size, "%s%s%s %s %s",
|
2017-07-17 14:03:14 +02:00
|
|
|
prefix2str(pu, pfx_buf, sizeof(pfx_buf)), tag_buf,
|
2017-10-28 21:04:49 +02:00
|
|
|
pathid_buf, afi2str(afi), safi2str(safi));
|
2017-07-17 14:03:14 +02:00
|
|
|
|
|
|
|
return str;
|
2016-08-10 01:02:03 +02:00
|
|
|
}
|