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"
2018-07-21 20:08:51 +02:00
# include "bgpd/bgp_evpn_private.h"
2018-07-31 23:35:54 +02:00
# include "bgpd/bgp_evpn_vty.h"
2018-07-21 20:08:51 +02:00
# include "bgpd/bgp_vty.h"
2018-02-20 10:58:42 +01:00
# include "bgpd/bgp_flowspec.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 ;
2018-03-09 21:52:55 +01:00
unsigned long conf_bgp_debug_vpn ;
2018-02-20 10:58:42 +01:00
unsigned long conf_bgp_debug_flowspec ;
2018-04-07 20:13:07 +02:00
unsigned long conf_bgp_debug_labelpool ;
2018-03-09 10:02:25 +01:00
unsigned long conf_bgp_debug_pbr ;
2019-10-23 07:40:22 +02:00
unsigned long conf_bgp_debug_graceful_restart ;
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 ;
2018-03-09 21:52:55 +01:00
unsigned long term_bgp_debug_vpn ;
2018-02-20 10:58:42 +01:00
unsigned long term_bgp_debug_flowspec ;
2018-04-07 20:13:07 +02:00
unsigned long term_bgp_debug_labelpool ;
2018-03-09 10:02:25 +01:00
unsigned long term_bgp_debug_pbr ;
2019-10-23 07:40:22 +02:00
unsigned long term_bgp_debug_graceful_restart ;
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. */
2019-11-20 17:26:59 +01:00
const char * const bgp_type_str [ ] = { NULL , " OPEN " , " UPDATE " ,
2017-07-17 14:03:14 +02:00
" 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. */
2019-11-20 17:26:59 +01:00
const char * const bgp_origin_str [ ] = { " i " , " e " , " ? " } ;
const char * const bgp_origin_long_str [ ] = { " IGP " , " EGP " , " incomplete " } ;
2002-12-13 21:15:29 +01:00
2018-07-21 20:08:51 +02:00
static int bgp_debug_print_evpn_prefix ( struct vty * vty , const char * desc ,
struct prefix * p ) ;
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 ) ;
2020-03-11 17:16:23 +01:00
prefix_free ( & filter - > p ) ;
XFREE ( MTYPE_BGP_DEBUG_STR , filter - > host ) ;
2017-07-17 14:03:14 +02:00
XFREE ( MTYPE_BGP_DEBUG_FILTER , filter ) ;
}
2015-05-20 02:58:12 +02:00
}
2018-07-31 22:44:45 +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 ,
2018-07-31 22:44:45 +02:00
struct list * list )
2017-07-17 14:03:14 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2018-07-21 20:08:51 +02:00
char buf [ PREFIX2STR_BUFFER ] ;
2017-07-17 14:03:14 +02:00
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 ) ;
2018-07-31 22:44:45 +02:00
if ( filter - > p & & filter - > p - > family = = AF_EVPN )
bgp_debug_print_evpn_prefix ( vty , " " , filter - > p ) ;
else if ( filter - > p ) {
prefix2str ( filter - > p , buf , sizeof ( buf ) ) ;
vty_out ( vty , " %s " , buf ) ;
2018-07-21 20:08:51 +02:00
}
2017-07-17 14:03:14 +02:00
}
}
vty_out ( vty , " \n " ) ;
2015-05-20 02:58:12 +02:00
}
2018-07-31 22:44:45 +02:00
/*
* Print the command to enable the debug for each peer / prefix this debug is
2015-05-20 03:04:06 +02:00
* enabled for
*/
2017-07-17 14:03:14 +02:00
static int bgp_debug_list_conf_print ( struct vty * vty , const char * desc ,
2018-07-31 22:44:45 +02:00
struct list * list )
2017-07-17 14:03:14 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2018-07-21 20:08:51 +02:00
char buf [ PREFIX2STR_BUFFER ] ;
2017-07-17 14:03:14 +02:00
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 + + ;
}
2018-07-31 22:44:45 +02:00
if ( filter - > p & & filter - > p - > family = = AF_EVPN ) {
bgp_debug_print_evpn_prefix ( vty , desc ,
filter - > p ) ;
write + + ;
} else if ( filter - > p ) {
prefix2str ( filter - > p , buf , sizeof ( buf ) ) ;
vty_out ( vty , " %s %s \n " , desc , buf ) ;
write + + ;
2017-07-17 14:03:14 +02:00
}
}
}
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 ) ;
2019-10-30 01:05:27 +01:00
prefix_free ( & filter - > p ) ;
2017-07-17 14:03:14 +02:00
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 ;
2019-01-29 15:29:57 +01:00
buf [ 0 ] = ' \0 ' ;
2017-07-17 14:03:14 +02:00
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 ) ,
2018-02-09 19:22:50 +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 ] ) ) ;
}
2018-03-04 04:28:50 +01:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_PMSI_TUNNEL ) ) )
2018-03-04 07:56:19 +01:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
" , pmsi tnltype %u " , attr - > pmsi_tnl_type ) ;
2018-03-04 04:28:50 +01:00
2017-07-17 14:03:14 +02:00
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 */
2018-03-27 21:13:34 +02:00
const char * bgp_notify_admin_message ( char * buf , size_t bufsz , uint8_t * data ,
2017-07-17 14:03:14 +02:00
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
2018-03-27 21:13:34 +02:00
uint8_t len = data [ 0 ] ;
2017-07-17 14:03:14 +02:00
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 )
2020-02-06 15:37:20 +01:00
| | CHECK_FLAG ( peer - > bgp - > flags , BGP_FLAG_LOG_NEIGHBOR_CHANGES ) ) {
2017-07-17 14:03:14 +02:00
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
}
2018-07-21 20:08:51 +02:00
static int bgp_debug_print_evpn_prefix ( struct vty * vty , const char * desc ,
struct prefix * p )
{
char evpn_desc [ PREFIX2STR_BUFFER + INET_ADDRSTRLEN ] ;
char buf [ PREFIX2STR_BUFFER ] ;
char buf2 [ ETHER_ADDR_STRLEN ] ;
if ( p - > u . prefix_evpn . route_type = = BGP_EVPN_MAC_IP_ROUTE ) {
if ( is_evpn_prefix_ipaddr_none ( ( struct prefix_evpn * ) p ) ) {
sprintf ( evpn_desc , " l2vpn evpn type macip mac %s " ,
prefix_mac2str (
& p - > u . prefix_evpn . macip_addr . mac ,
buf2 , sizeof ( buf2 ) ) ) ;
} else {
uint8_t family = is_evpn_prefix_ipaddr_v4 (
( struct prefix_evpn * ) p ) ?
AF_INET : AF_INET6 ;
sprintf ( evpn_desc , " l2vpn evpn type macip mac %s ip %s " ,
prefix_mac2str (
& p - > u . prefix_evpn . macip_addr . mac ,
buf2 , sizeof ( buf2 ) ) ,
inet_ntop ( family ,
& p - > u . prefix_evpn . macip_addr . ip . ip . addr ,
buf , PREFIX2STR_BUFFER ) ) ;
}
} else if ( p - > u . prefix_evpn . route_type = = BGP_EVPN_IMET_ROUTE ) {
sprintf ( evpn_desc , " l2vpn evpn type multicast ip %s " ,
inet_ntoa ( p - > u . prefix_evpn . imet_addr . ip . ipaddr_v4 ) ) ;
} else if ( p - > u . prefix_evpn . route_type = = BGP_EVPN_IP_PREFIX_ROUTE ) {
uint8_t family = is_evpn_prefix_ipaddr_v4 (
( struct prefix_evpn * ) p ) ? AF_INET
: AF_INET6 ;
sprintf ( evpn_desc , " l2vpn evpn type prefix ip %s/%d " ,
inet_ntop ( family ,
& p - > u . prefix_evpn . prefix_addr . ip . ip . addr , buf ,
PREFIX2STR_BUFFER ) ,
p - > u . prefix_evpn . prefix_addr . ip_prefix_length ) ;
}
vty_out ( vty , " %s %s \n " , desc , evpn_desc ) ;
return 0 ;
}
static int bgp_debug_parse_evpn_prefix ( struct vty * vty , struct cmd_token * * argv ,
int argc , struct prefix * * argv_pp )
{
struct prefix * argv_p ;
struct ethaddr mac ;
struct ipaddr ip ;
int evpn_type ;
int type_idx = 0 ;
int mac_idx = 0 ;
int ip_idx = 0 ;
argv_p = * argv_pp ;
2018-07-31 23:35:54 +02:00
if ( argv_find ( argv , argc , " macip " , & type_idx ) )
2018-07-21 20:08:51 +02:00
evpn_type = BGP_EVPN_MAC_IP_ROUTE ;
2018-07-31 23:35:54 +02:00
else if ( argv_find ( argv , argc , " multicast " , & type_idx ) )
2018-07-21 20:08:51 +02:00
evpn_type = BGP_EVPN_IMET_ROUTE ;
2018-07-31 23:35:54 +02:00
else if ( argv_find ( argv , argc , " prefix " , & type_idx ) )
2018-07-21 20:08:51 +02:00
evpn_type = BGP_EVPN_IP_PREFIX_ROUTE ;
else
evpn_type = 0 ;
if ( evpn_type = = BGP_EVPN_MAC_IP_ROUTE ) {
memset ( & ip , 0 , sizeof ( struct ipaddr ) ) ;
2018-07-31 23:35:54 +02:00
2018-07-21 20:08:51 +02:00
argv_find ( argv , argc , " mac " , & mac_idx ) ;
2018-08-13 18:05:42 +02:00
( void ) prefix_str2mac ( argv [ mac_idx + 1 ] - > arg , & mac ) ;
2018-07-31 23:35:54 +02:00
argv_find ( argv , argc , " ip " , & ip_idx ) ;
str2ipaddr ( argv [ ip_idx + 1 ] - > arg , & ip ) ;
2018-07-21 20:08:51 +02:00
build_evpn_type2_prefix ( ( struct prefix_evpn * ) argv_p ,
& mac , & ip ) ;
} else if ( evpn_type = = BGP_EVPN_IMET_ROUTE ) {
memset ( & ip , 0 , sizeof ( struct ipaddr ) ) ;
2018-07-31 23:35:54 +02:00
argv_find ( argv , argc , " ip " , & ip_idx ) ;
str2ipaddr ( argv [ ip_idx + 1 ] - > arg , & ip ) ;
2018-07-21 20:08:51 +02:00
build_evpn_type3_prefix ( ( struct prefix_evpn * ) argv_p ,
ip . ipaddr_v4 ) ;
} else if ( evpn_type = = BGP_EVPN_IP_PREFIX_ROUTE ) {
struct prefix ip_prefix ;
memset ( & ip_prefix , 0 , sizeof ( struct prefix ) ) ;
if ( argv_find ( argv , argc , " ip " , & ip_idx ) ) {
( void ) str2prefix ( argv [ ip_idx + 1 ] - > arg , & ip_prefix ) ;
apply_mask ( & ip_prefix ) ;
}
build_type5_prefix_from_ip_prefix (
( struct prefix_evpn * ) argv_p ,
& ip_prefix ) ;
}
return CMD_SUCCESS ;
}
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
}
2018-07-21 20:08:51 +02:00
# ifndef VTYSH_EXTRACT_PL
# include "bgpd/bgp_debug_clippy.c"
# endif
DEFPY ( debug_bgp_update_prefix_afi_safi ,
debug_bgp_update_prefix_afi_safi_cmd ,
2018-10-19 20:36:06 +02:00
" debug bgp updates prefix l2vpn$afi evpn$safi type <macip mac <X:X:X:X:X:X|X:X:X:X:X:X/M> [ip <A.B.C.D|X:X::X:X>]|multicast ip <A.B.C.D|X:X::X:X>|prefix ip <A.B.C.D/M|X:X::X:X/M>> " ,
2018-07-21 20:08:51 +02:00
DEBUG_STR
BGP_STR
" BGP updates \n "
" Specify a prefix to debug \n "
2018-07-31 23:35:54 +02:00
L2VPN_HELP_STR
EVPN_HELP_STR
2018-07-21 20:08:51 +02:00
" Specify EVPN Route type \n "
" MAC-IP (Type-2) route \n "
2018-07-31 23:35:54 +02:00
MAC_STR MAC_STR MAC_STR
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2018-07-21 20:08:51 +02:00
" Multicast (Type-3) route \n "
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2018-07-21 20:08:51 +02:00
" Prefix (Type-5) route \n "
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 prefix \n "
" IPv6 prefix \n " )
2018-07-21 20:08:51 +02:00
{
struct prefix * argv_p ;
int ret = CMD_SUCCESS ;
2018-07-31 23:35:54 +02:00
char buf [ PREFIX2STR_BUFFER ] ;
2018-07-21 20:08:51 +02:00
argv_p = prefix_new ( ) ;
2018-07-31 23:35:54 +02:00
ret = bgp_debug_parse_evpn_prefix ( vty , argv , argc , & argv_p ) ;
if ( ret ! = CMD_SUCCESS ) {
2019-10-30 01:05:27 +01:00
prefix_free ( & argv_p ) ;
2018-07-31 23:35:54 +02:00
return ret ;
2018-07-21 20:08:51 +02:00
}
if ( ! bgp_debug_update_prefixes )
bgp_debug_update_prefixes = list_new ( ) ;
2018-07-31 23:35:54 +02:00
prefix2str ( argv_p , buf , sizeof ( buf ) ) ;
2018-07-21 20:08:51 +02:00
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 " ,
2018-07-31 23:35:54 +02:00
buf ) ;
2019-10-30 01:05:27 +01:00
prefix_free ( & argv_p ) ;
2018-07-31 23:35:54 +02:00
return CMD_SUCCESS ;
2018-07-21 20:08:51 +02:00
}
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 ) ;
2018-07-31 23:35:54 +02:00
vty_out ( vty , " BGP updates debugging is on for %s \n " , buf ) ;
2018-07-21 20:08:51 +02:00
}
2019-10-30 01:05:27 +01:00
prefix_free ( & argv_p ) ;
2018-08-03 14:55:10 +02:00
2018-07-31 23:35:54 +02:00
return CMD_SUCCESS ;
2018-07-21 20:08:51 +02:00
}
DEFPY ( no_debug_bgp_update_prefix_afi_safi ,
no_debug_bgp_update_prefix_afi_safi_cmd ,
2018-10-19 20:36:06 +02:00
" no debug bgp updates prefix l2vpn$afi evpn$safi type <macip mac <X:X:X:X:X:X|X:X:X:X:X:X/M> [ip <A.B.C.D|X:X::X:X>]|multicast ip <A.B.C.D|X:X::X:X>|prefix ip <A.B.C.D/M|X:X::X:X/M>> " ,
2018-07-21 20:08:51 +02:00
NO_STR
DEBUG_STR
BGP_STR
" BGP updates \n "
" Specify a prefix to debug \n "
2018-07-31 23:35:54 +02:00
L2VPN_HELP_STR
EVPN_HELP_STR
2018-07-21 20:08:51 +02:00
" Specify EVPN Route type \n "
" MAC-IP (Type-2) route \n "
2018-07-31 23:35:54 +02:00
MAC_STR MAC_STR MAC_STR
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2018-07-21 20:08:51 +02:00
" Multicast (Type-3) route \n "
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2018-07-21 20:08:51 +02:00
" Prefix (Type-5) route \n "
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 prefix \n "
" IPv6 prefix \n " )
2018-07-21 20:08:51 +02:00
{
struct prefix * argv_p ;
2018-07-31 23:35:54 +02:00
bool found_prefix = false ;
2018-07-21 20:08:51 +02:00
int ret = CMD_SUCCESS ;
2018-07-31 23:35:54 +02:00
char buf [ PREFIX2STR_BUFFER ] ;
2018-07-21 20:08:51 +02:00
argv_p = prefix_new ( ) ;
2018-07-31 23:35:54 +02:00
ret = bgp_debug_parse_evpn_prefix ( vty , argv , argc , & argv_p ) ;
if ( ret ! = CMD_SUCCESS ) {
2019-10-30 01:05:27 +01:00
prefix_free ( & argv_p ) ;
2018-07-31 23:35:54 +02:00
return ret ;
2018-07-21 20:08:51 +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 " ) ;
}
}
}
2018-07-31 23:35:54 +02:00
prefix2str ( argv_p , buf , sizeof ( buf ) ) ;
2018-07-21 20:08:51 +02:00
if ( found_prefix )
2018-07-31 23:35:54 +02:00
vty_out ( vty , " BGP updates debugging is off for %s \n " , buf ) ;
2018-07-21 20:08:51 +02:00
else
vty_out ( vty , " BGP updates debugging was not enabled for %s \n " ,
2018-07-31 23:35:54 +02:00
buf ) ;
2018-07-21 20:08:51 +02:00
2019-10-30 01:05:27 +01:00
prefix_free ( & argv_p ) ;
2018-08-03 14:55:10 +02:00
return ret ;
2018-07-21 20:08:51 +02:00
}
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
}
2019-10-23 07:40:22 +02:00
DEFUN ( debug_bgp_graceful_restart ,
debug_bgp_graceful_restart_cmd ,
" debug bgp graceful-restart " ,
DEBUG_STR
BGP_STR
GR_DEBUG )
{
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_ON ( graceful_restart , GRACEFUL_RESTART ) ;
} else {
TERM_DEBUG_ON ( graceful_restart , GRACEFUL_RESTART ) ;
vty_out ( vty , " BGP Graceful Restart debugging is on \n " ) ;
}
return CMD_SUCCESS ;
}
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
}
2019-10-23 07:40:22 +02:00
DEFUN ( no_debug_bgp_graceful_restart ,
no_debug_bgp_graceful_restart_cmd ,
" no debug bgp graceful-restart " ,
DEBUG_STR
BGP_STR
GR_DEBUG
NO_STR )
{
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_OFF ( graceful_restart , GRACEFUL_RESTART ) ;
} else {
TERM_DEBUG_OFF ( graceful_restart , GRACEFUL_RESTART ) ;
vty_out ( vty , " BGP Graceful Restart debugging is off \n " ) ;
}
return CMD_SUCCESS ;
}
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
}
2018-03-09 21:52:55 +01:00
DEFUN ( debug_bgp_vpn ,
debug_bgp_vpn_cmd ,
" debug bgp vpn <leak-from-vrf|leak-to-vrf|rmap-event|label> " ,
DEBUG_STR
BGP_STR
" VPN routes \n "
" leaked from vrf to vpn \n "
" leaked to vrf from vpn \n "
" route-map updates \n "
" labels \n " )
{
int idx = 3 ;
if ( argv_find ( argv , argc , " leak-from-vrf " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( vpn , VPN_LEAK_FROM_VRF ) ;
else
TERM_DEBUG_ON ( vpn , VPN_LEAK_FROM_VRF ) ;
} else if ( argv_find ( argv , argc , " leak-to-vrf " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( vpn , VPN_LEAK_TO_VRF ) ;
else
TERM_DEBUG_ON ( vpn , VPN_LEAK_TO_VRF ) ;
} else if ( argv_find ( argv , argc , " rmap-event " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( vpn , VPN_LEAK_RMAP_EVENT ) ;
else
TERM_DEBUG_ON ( vpn , VPN_LEAK_RMAP_EVENT ) ;
} else if ( argv_find ( argv , argc , " label " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( vpn , VPN_LEAK_LABEL ) ;
else
TERM_DEBUG_ON ( vpn , VPN_LEAK_LABEL ) ;
} else {
vty_out ( vty , " %% unknown debug bgp vpn keyword \n " ) ;
return CMD_WARNING_CONFIG_FAILED ;
}
if ( vty - > node ! = CONFIG_NODE )
vty_out ( vty , " enabled debug bgp vpn %s \n " , argv [ idx ] - > text ) ;
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_vpn ,
no_debug_bgp_vpn_cmd ,
" no debug bgp vpn <leak-from-vrf|leak-to-vrf|rmap-event|label> " ,
NO_STR
DEBUG_STR
BGP_STR
" VPN routes \n "
" leaked from vrf to vpn \n "
" leaked to vrf from vpn \n "
" route-map updates \n "
" labels \n " )
{
int idx = 4 ;
if ( argv_find ( argv , argc , " leak-from-vrf " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( vpn , VPN_LEAK_FROM_VRF ) ;
else
TERM_DEBUG_OFF ( vpn , VPN_LEAK_FROM_VRF ) ;
} else if ( argv_find ( argv , argc , " leak-to-vrf " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( vpn , VPN_LEAK_TO_VRF ) ;
else
TERM_DEBUG_OFF ( vpn , VPN_LEAK_TO_VRF ) ;
} else if ( argv_find ( argv , argc , " rmap-event " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( vpn , VPN_LEAK_RMAP_EVENT ) ;
else
TERM_DEBUG_OFF ( vpn , VPN_LEAK_RMAP_EVENT ) ;
} else if ( argv_find ( argv , argc , " label " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( vpn , VPN_LEAK_LABEL ) ;
else
TERM_DEBUG_OFF ( vpn , VPN_LEAK_LABEL ) ;
} else {
vty_out ( vty , " %% unknown debug bgp vpn keyword \n " ) ;
return CMD_WARNING_CONFIG_FAILED ;
}
if ( vty - > node ! = CONFIG_NODE )
vty_out ( vty , " disabled debug bgp vpn %s \n " , argv [ idx ] - > text ) ;
2018-03-09 10:02:25 +01:00
return CMD_SUCCESS ;
}
2018-03-09 21:52:55 +01:00
2018-03-09 10:02:25 +01:00
/* debug bgp pbr */
DEFUN ( debug_bgp_pbr ,
debug_bgp_pbr_cmd ,
2018-05-23 14:10:38 +02:00
" debug bgp pbr [error] " ,
2018-03-09 10:02:25 +01:00
DEBUG_STR
BGP_STR
2018-05-23 14:10:38 +02:00
" BGP policy based routing \n "
" BGP PBR error \n " )
2018-03-09 10:02:25 +01:00
{
2018-05-23 14:10:38 +02:00
int idx = 3 ;
if ( argv_find ( argv , argc , " error " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( pbr , PBR_ERROR ) ;
else {
TERM_DEBUG_ON ( pbr , PBR_ERROR ) ;
vty_out ( vty , " BGP policy based routing error is on \n " ) ;
}
return CMD_SUCCESS ;
}
2018-03-09 10:02:25 +01:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( pbr , PBR ) ;
else {
TERM_DEBUG_ON ( pbr , PBR ) ;
vty_out ( vty , " BGP policy based routing is on \n " ) ;
}
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_pbr ,
no_debug_bgp_pbr_cmd ,
2018-05-23 14:10:38 +02:00
" no debug bgp pbr [error] " ,
2018-03-09 10:02:25 +01:00
NO_STR
DEBUG_STR
BGP_STR
2018-05-23 14:10:38 +02:00
" BGP policy based routing \n "
" BGP PBR Error \n " )
2018-03-09 10:02:25 +01:00
{
2018-05-23 14:10:38 +02:00
int idx = 3 ;
if ( argv_find ( argv , argc , " error " , & idx ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( pbr , PBR_ERROR ) ;
else {
TERM_DEBUG_OFF ( pbr , PBR_ERROR ) ;
vty_out ( vty , " BGP policy based routing error is off \n " ) ;
}
return CMD_SUCCESS ;
}
2018-03-09 10:02:25 +01:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( pbr , PBR ) ;
else {
TERM_DEBUG_OFF ( pbr , PBR ) ;
vty_out ( vty , " BGP policy based routing is off \n " ) ;
}
2018-03-09 21:52:55 +01:00
return CMD_SUCCESS ;
}
2018-04-07 20:13:07 +02:00
DEFUN ( debug_bgp_labelpool ,
debug_bgp_labelpool_cmd ,
" debug bgp labelpool " ,
DEBUG_STR
BGP_STR
" label pool \n " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( labelpool , LABELPOOL ) ;
else
TERM_DEBUG_ON ( labelpool , LABELPOOL ) ;
if ( vty - > node ! = CONFIG_NODE )
vty_out ( vty , " enabled debug bgp labelpool \n " ) ;
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_labelpool ,
no_debug_bgp_labelpool_cmd ,
" no debug bgp labelpool " ,
NO_STR
DEBUG_STR
BGP_STR
" label pool \n " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( labelpool , LABELPOOL ) ;
else
TERM_DEBUG_OFF ( labelpool , LABELPOOL ) ;
if ( vty - > node ! = CONFIG_NODE )
vty_out ( vty , " disabled debug bgp labelpool \n " ) ;
return CMD_SUCCESS ;
}
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 ) ;
2018-03-09 21:52:55 +01:00
TERM_DEBUG_OFF ( vpn , VPN_LEAK_FROM_VRF ) ;
TERM_DEBUG_OFF ( vpn , VPN_LEAK_TO_VRF ) ;
TERM_DEBUG_OFF ( vpn , VPN_LEAK_RMAP_EVENT ) ;
TERM_DEBUG_OFF ( vpn , VPN_LEAK_LABEL ) ;
2018-02-20 10:58:42 +01:00
TERM_DEBUG_OFF ( flowspec , FLOWSPEC ) ;
2018-04-07 20:13:07 +02:00
TERM_DEBUG_OFF ( labelpool , LABELPOOL ) ;
2018-03-09 10:02:25 +01:00
TERM_DEBUG_OFF ( pbr , PBR ) ;
2018-05-23 14:10:38 +02:00
TERM_DEBUG_OFF ( pbr , PBR_ERROR ) ;
2019-10-23 07:40:22 +02:00
TERM_DEBUG_OFF ( graceful_restart , GRACEFUL_RESTART ) ;
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 " ,
2018-07-31 22:44:45 +02:00
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 " ,
2018-07-31 22:44:45 +02:00
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 " ,
2018-07-31 22:44:45 +02:00
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 " ,
2018-07-31 22:44:45 +02:00
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) " ,
2018-07-31 22:44:45 +02:00
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) " ,
2018-07-31 22:44:45 +02:00
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 " ,
2020-01-31 19:04:00 +01:00
bgp_debug_zebra_prefixes ) ;
2019-10-23 07:40:22 +02:00
if ( BGP_DEBUG ( graceful_restart , GRACEFUL_RESTART ) )
2020-01-31 19:04:00 +01:00
vty_out ( vty , " BGP graceful-restart debugging is on " ) ;
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 " ) ;
2018-03-09 21:52:55 +01:00
if ( BGP_DEBUG ( vpn , VPN_LEAK_FROM_VRF ) )
vty_out ( vty ,
" BGP route leak from vrf to vpn debugging is on \n " ) ;
if ( BGP_DEBUG ( vpn , VPN_LEAK_TO_VRF ) )
vty_out ( vty ,
" BGP route leak to vrf from vpn debugging is on \n " ) ;
if ( BGP_DEBUG ( vpn , VPN_LEAK_RMAP_EVENT ) )
vty_out ( vty , " BGP vpn route-map event debugging is on \n " ) ;
if ( BGP_DEBUG ( vpn , VPN_LEAK_LABEL ) )
vty_out ( vty , " BGP vpn label event debugging is on \n " ) ;
2018-02-20 10:58:42 +01:00
if ( BGP_DEBUG ( flowspec , FLOWSPEC ) )
vty_out ( vty , " BGP flowspec debugging is on \n " ) ;
2018-04-07 20:13:07 +02:00
if ( BGP_DEBUG ( labelpool , LABELPOOL ) )
vty_out ( vty , " BGP labelpool debugging is on \n " ) ;
2018-03-09 21:52:55 +01:00
2018-03-09 10:02:25 +01:00
if ( BGP_DEBUG ( pbr , PBR ) )
vty_out ( vty , " BGP policy based routing debugging is on \n " ) ;
2018-05-23 14:10:38 +02:00
if ( BGP_DEBUG ( pbr , PBR_ERROR ) )
vty_out ( vty , " BGP policy based routing error debugging is on \n " ) ;
2018-03-09 10:02:25 +01:00
2017-07-17 14:03:14 +02:00
vty_out ( vty , " \n " ) ;
return CMD_SUCCESS ;
2002-12-13 21:15:29 +01: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 " ,
2018-07-31 22:44:45 +02:00
bgp_debug_bestpath_prefixes ) ;
2017-07-17 14:03:14 +02:00
}
if ( CONF_BGP_DEBUG ( keepalive , KEEPALIVE ) ) {
write + = bgp_debug_list_conf_print ( vty , " debug bgp keepalives " ,
2018-07-31 22:44:45 +02:00
bgp_debug_keepalive_peers ) ;
2017-07-17 14:03:14 +02:00
}
if ( CONF_BGP_DEBUG ( neighbor_events , NEIGHBOR_EVENTS ) ) {
write + = bgp_debug_list_conf_print (
vty , " debug bgp neighbor-events " ,
2018-07-31 22:44:45 +02:00
bgp_debug_neighbor_events_peers ) ;
2017-07-17 14:03:14 +02:00
}
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 " ,
2018-07-31 22:44:45 +02:00
bgp_debug_update_prefixes ) ;
2017-07-17 14:03:14 +02:00
}
if ( CONF_BGP_DEBUG ( update , UPDATE_IN ) ) {
write + = bgp_debug_list_conf_print ( vty , " debug bgp updates in " ,
2018-07-31 22:44:45 +02:00
bgp_debug_update_in_peers ) ;
2017-07-17 14:03:14 +02:00
}
if ( CONF_BGP_DEBUG ( update , UPDATE_OUT ) ) {
write + = bgp_debug_list_conf_print ( vty , " debug bgp updates out " ,
2018-07-31 22:44:45 +02:00
bgp_debug_update_out_peers ) ;
2017-07-17 14:03:14 +02:00
}
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 " ,
2018-07-31 22:44:45 +02:00
bgp_debug_zebra_prefixes ) ;
2017-07-17 14:03:14 +02:00
}
}
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
2018-03-09 21:52:55 +01:00
if ( CONF_BGP_DEBUG ( vpn , VPN_LEAK_FROM_VRF ) ) {
vty_out ( vty , " debug bgp vpn leak-from-vrf \n " ) ;
write + + ;
}
if ( CONF_BGP_DEBUG ( vpn , VPN_LEAK_TO_VRF ) ) {
vty_out ( vty , " debug bgp vpn leak-to-vrf \n " ) ;
write + + ;
}
if ( CONF_BGP_DEBUG ( vpn , VPN_LEAK_RMAP_EVENT ) ) {
vty_out ( vty , " debug bgp vpn rmap-event \n " ) ;
write + + ;
}
if ( CONF_BGP_DEBUG ( vpn , VPN_LEAK_LABEL ) ) {
vty_out ( vty , " debug bgp vpn label \n " ) ;
write + + ;
}
2018-02-20 10:58:42 +01:00
if ( CONF_BGP_DEBUG ( flowspec , FLOWSPEC ) ) {
vty_out ( vty , " debug bgp flowspec \n " ) ;
write + + ;
}
2018-04-07 20:13:07 +02:00
if ( CONF_BGP_DEBUG ( labelpool , LABELPOOL ) ) {
vty_out ( vty , " debug bgp labelpool \n " ) ;
write + + ;
}
2018-03-09 21:52:55 +01:00
2018-03-09 10:02:25 +01:00
if ( CONF_BGP_DEBUG ( pbr , PBR ) ) {
vty_out ( vty , " debug bgp pbr \n " ) ;
write + + ;
2018-05-23 14:10:38 +02:00
}
if ( CONF_BGP_DEBUG ( pbr , PBR_ERROR ) ) {
vty_out ( vty , " debug bgp pbr error \n " ) ;
write + + ;
2018-03-09 10:02:25 +01:00
}
2019-10-23 07:40:22 +02:00
if ( CONF_BGP_DEBUG ( graceful_restart , GRACEFUL_RESTART ) ) {
vty_out ( vty , " debug bgp graceful-restart \n " ) ;
write + + ;
}
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 ) ;
2019-10-23 07:40:22 +02:00
install_element ( ENABLE_NODE , & debug_bgp_graceful_restart_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_graceful_restart_cmd ) ;
2017-07-17 14:03:14 +02:00
/* 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 ) ;
2018-07-21 20:08:51 +02:00
install_element ( ENABLE_NODE , & debug_bgp_update_prefix_afi_safi_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_update_prefix_afi_safi_cmd ) ;
install_element ( ENABLE_NODE , & no_debug_bgp_update_prefix_afi_safi_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_update_prefix_afi_safi_cmd ) ;
2017-07-17 14:03:14 +02:00
/* 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 ) ;
2018-03-09 21:52:55 +01:00
2019-10-23 07:40:22 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_graceful_restart_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_graceful_restart_cmd ) ;
2018-03-09 21:52:55 +01:00
install_element ( ENABLE_NODE , & debug_bgp_vpn_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_vpn_cmd ) ;
install_element ( ENABLE_NODE , & no_debug_bgp_vpn_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_vpn_cmd ) ;
2018-04-07 20:13:07 +02:00
install_element ( ENABLE_NODE , & debug_bgp_labelpool_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_labelpool_cmd ) ;
install_element ( ENABLE_NODE , & no_debug_bgp_labelpool_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_labelpool_cmd ) ;
2018-03-09 10:02:25 +01:00
/* debug bgp pbr */
install_element ( ENABLE_NODE , & debug_bgp_pbr_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_pbr_cmd ) ;
install_element ( ENABLE_NODE , & no_debug_bgp_pbr_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_pbr_cmd ) ;
2017-07-17 14:03:14 +02:00
}
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 ,
2018-03-27 21:13:34 +02:00
mpls_label_t * label , uint32_t num_labels ,
int addpath_valid , uint32_t addpath_id ,
2017-11-21 11:42:05 +01:00
char * str , int size )
2017-07-17 14:03:14 +02:00
{
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 ' ;
2017-11-21 11:42:05 +01:00
if ( bgp_labeled_safi ( safi ) & & num_labels ) {
2017-07-17 14:03:14 +02:00
2017-11-21 11:42:05 +01:00
if ( safi = = SAFI_EVPN ) {
char tag_buf2 [ 20 ] ;
bgp_evpn_label2str ( label , num_labels , tag_buf2 , 20 ) ;
sprintf ( tag_buf , " label %s " , tag_buf2 ) ;
} else {
2018-03-27 21:13:34 +02:00
uint32_t label_value ;
2017-11-21 11:42:05 +01:00
label_value = decode_label ( label ) ;
sprintf ( tag_buf , " label %u " , label_value ) ;
}
2017-07-17 14:03:14 +02:00
}
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 ) ) ;
2018-02-20 10:58:42 +01:00
else if ( safi = = SAFI_FLOWSPEC ) {
char return_string [ BGP_FLOWSPEC_NLRI_STRING_MAX ] ;
const struct prefix_fs * fs = pu . fs ;
bgp_fs_nlri_get_string ( ( unsigned char * ) fs - > prefix . ptr ,
fs - > prefix . prefixlen ,
return_string ,
2018-03-07 18:54:09 +01:00
NLRI_STRING_FORMAT_DEBUG , NULL ) ;
2018-02-20 10:58:42 +01:00
snprintf ( str , size , " FS %s Match{%s} " , afi2str ( afi ) ,
return_string ) ;
} 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
}