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>
2021-03-01 20:07:28 +01:00
# include "lib/bfd.h"
2020-10-15 21:33:09 +02:00
# include "lib/printfrr.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"
2021-01-08 15:09:34 +01:00
# include "bgpd/bgp_lcommunity.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"
2022-04-30 22:04:58 +02:00
# include "bgpd/bgp_packet.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 ;
2020-03-27 15:55:59 +01:00
unsigned long conf_bgp_debug_evpn_mh ;
2021-03-01 20:07:28 +01:00
unsigned long conf_bgp_debug_bfd ;
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 ;
2020-03-27 15:55:59 +01:00
unsigned long term_bgp_debug_evpn_mh ;
2021-03-01 20:07:28 +01:00
unsigned long term_bgp_debug_bfd ;
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 */
2009-05-15 19:48:03 +02:00
const struct message bgp_status_msg [ ] = { { Idle , " Idle " } ,
2002-12-13 21:15:29 +01:00
{ Connect , " Connect " } ,
{ Active , " Active " } ,
{ OpenSent , " OpenSent " } ,
{ OpenConfirm , " OpenConfirm " } ,
{ Established , " Established " } ,
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
{ Clearing , " Clearing " } ,
{ Deleted , " Deleted " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
/* BGP message type string. */
2019-11-20 17:26:59 +01:00
const char * const bgp_type_str [ ] = { NULL , " OPEN " , " UPDATE " ,
2002-12-13 21:15:29 +01:00
" NOTIFICATION " , " KEEPALIVE " , " ROUTE-REFRESH " ,
" CAPABILITY " } ;
/* message for BGP-4 Notify */
2009-05-15 19:48:03 +02:00
static const struct message bgp_notify_msg [ ] = {
2002-12-13 21:15:29 +01:00
{ 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 " } ,
2015-05-20 02:58:12 +02:00
{ BGP_NOTIFY_FSM_ERR , " Neighbor Events Error " } ,
2002-12-13 21:15:29 +01:00
{ BGP_NOTIFY_CEASE , " Cease " } ,
2020-10-01 22:08:06 +02:00
{ BGP_NOTIFY_ROUTE_REFRESH_ERR , " ROUTE-REFRESH Message Error " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2017-07-17 14:03:14 +02:00
2009-05-15 19:48:03 +02:00
static const struct message bgp_notify_head_msg [ ] = {
2004-05-20 12:22:49 +02:00
{ BGP_NOTIFY_HEADER_NOT_SYNC , " /Connection Not Synchronized " } ,
{ BGP_NOTIFY_HEADER_BAD_MESLEN , " /Bad Message Length " } ,
2017-06-21 01:56:50 +02:00
{ BGP_NOTIFY_HEADER_BAD_MESTYPE , " /Bad Message Type " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2017-07-17 14:03:14 +02:00
2009-05-15 19:48:03 +02:00
static const struct message bgp_notify_open_msg [ ] = {
2011-09-21 21:13:22 +02:00
{ BGP_NOTIFY_SUBCODE_UNSPECIFIC , " /Unspecific " } ,
2004-05-20 12:22:49 +02:00
{ 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 " } ,
2022-06-17 12:14:46 +02:00
{ BGP_NOTIFY_OPEN_ROLE_MISMATCH , " /Role Mismatch " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2017-07-17 14:03:14 +02:00
2009-05-15 19:48:03 +02:00
static const struct message bgp_notify_update_msg [ ] = {
2011-09-21 21:13:22 +02:00
{ BGP_NOTIFY_SUBCODE_UNSPECIFIC , " /Unspecific " } ,
2004-05-20 12:22:49 +02:00
{ 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 " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2017-07-17 14:03:14 +02:00
2009-05-15 19:48:03 +02:00
static const struct message bgp_notify_cease_msg [ ] = {
2011-09-21 21:13:22 +02:00
{ BGP_NOTIFY_SUBCODE_UNSPECIFIC , " /Unspecific " } ,
2004-05-20 12:22:49 +02:00
{ BGP_NOTIFY_CEASE_MAX_PREFIX , " /Maximum Number of Prefixes Reached " } ,
2022-01-05 08:39:44 +01:00
{ BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN , " /Administrative Shutdown " } ,
{ BGP_NOTIFY_CEASE_PEER_UNCONFIG , " /Peer De-configured " } ,
{ BGP_NOTIFY_CEASE_ADMIN_RESET , " /Administrative Reset " } ,
2004-05-20 12:22:49 +02:00
{ BGP_NOTIFY_CEASE_CONNECT_REJECT , " /Connection Rejected " } ,
{ BGP_NOTIFY_CEASE_CONFIG_CHANGE , " /Other Configuration Change " } ,
{ BGP_NOTIFY_CEASE_COLLISION_RESOLUTION ,
2022-01-05 08:39:44 +01:00
" /Connection Collision Resolution " } ,
{ BGP_NOTIFY_CEASE_OUT_OF_RESOURCE , " /Out of Resources " } ,
2022-04-30 22:04:58 +02:00
{ BGP_NOTIFY_CEASE_HARD_RESET , " /Hard Reset " } ,
2022-05-30 16:40:15 +02:00
{ BGP_NOTIFY_CEASE_BFD_DOWN , " /BFD Down " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2017-07-17 14:03:14 +02:00
2020-10-01 22:08:06 +02:00
static const struct message bgp_notify_route_refresh_msg [ ] = {
2011-09-21 21:13:22 +02:00
{ BGP_NOTIFY_SUBCODE_UNSPECIFIC , " /Unspecific " } ,
2020-10-01 22:08:06 +02:00
{ BGP_NOTIFY_ROUTE_REFRESH_INVALID_MSG_LEN , " /Invalid Message Length " } ,
2002-12-13 21:15:29 +01:00
{ 0 } } ;
2020-03-15 13:19:11 +01:00
static const struct message bgp_notify_fsm_msg [ ] = {
{ BGP_NOTIFY_FSM_ERR_SUBCODE_UNSPECIFIC , " /Unspecific " } ,
{ BGP_NOTIFY_FSM_ERR_SUBCODE_OPENSENT ,
" /Receive Unexpected Message in OpenSent State " } ,
{ BGP_NOTIFY_FSM_ERR_SUBCODE_OPENCONFIRM ,
" /Receive Unexpected Message in OpenConfirm State " } ,
{ BGP_NOTIFY_FSM_ERR_SUBCODE_ESTABLISHED ,
" /Receive Unexpected Message in Established State " } ,
{ 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
2020-03-20 10:57:54 +01:00
static void 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 */
static struct peer * bgp_find_peer ( struct vty * vty , const char * peer_str )
{
2016-12-07 17:15:32 +01:00
struct bgp * bgp = VTY_GET_CONTEXT ( bgp ) ;
2015-05-20 02:58:12 +02:00
int ret ;
union sockunion su ;
2015-09-11 05:10:16 +02:00
struct peer * peer ;
2017-07-17 14:03:14 +02:00
2016-12-07 17:15:32 +01:00
if ( ! bgp ) {
return NULL ;
}
2015-05-20 02:58:12 +02:00
ret = str2sockunion ( peer_str , & su ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
/* 'swpX' string */
if ( ret < 0 ) {
2015-09-11 05:10:16 +02:00
peer = peer_lookup_by_conf_if ( bgp , peer_str ) ;
2017-07-17 14:03:14 +02:00
2015-09-11 05:10:16 +02:00
if ( ! peer )
peer = peer_lookup_by_hostname ( bgp , peer_str ) ;
2017-07-17 14:03:14 +02:00
2015-09-11 05:10:16 +02:00
return peer ;
2015-05-20 02:58:12 +02:00
} else
return peer_lookup ( bgp , & su ) ;
}
static void bgp_debug_list_free ( struct list * list )
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
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 ) ;
2015-05-20 02:58:12 +02:00
XFREE ( MTYPE_BGP_DEBUG_FILTER , filter ) ;
}
}
2018-07-31 22:44:45 +02:00
/*
* Print the desc along with a list of peers / prefixes this debug is
* enabled for
*/
2015-05-20 02:58:12 +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 )
2015-05-20 02:58:12 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
vty_out ( vty , " %s " , desc ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( list & & ! list_isempty ( list ) ) {
vty_out ( vty , " for " ) ;
for ( ALL_LIST_ELEMENTS ( list , node , nnode , filter ) ) {
2015-05-20 03:04:21 +02:00
if ( filter - > host )
vty_out ( vty , " %s " , filter - > host ) ;
2017-07-17 14:03:14 +02:00
2018-07-31 22:44:45 +02:00
if ( filter - > p & & filter - > p - > family = = AF_EVPN )
bgp_debug_print_evpn_prefix ( vty , " " , filter - > p ) ;
2020-10-18 13:33:54 +02:00
else if ( filter - > p )
vty_out ( vty , " %pFX " , filter - > p ) ;
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2017-07-13 19:04:25 +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
*/
static int bgp_debug_list_conf_print ( struct vty * vty , const char * desc ,
2018-07-31 22:44:45 +02:00
struct list * list )
2015-05-20 03:04:06 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
int write = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
if ( list & & ! list_isempty ( list ) ) {
for ( ALL_LIST_ELEMENTS ( list , node , nnode , filter ) ) {
2015-05-20 03:04:21 +02:00
if ( filter - > host ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " %s %s \n " , desc , filter - > host ) ;
2015-05-20 03:04:06 +02:00
write + + ;
}
2017-07-17 14:03:14 +02:00
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 ) {
2020-10-18 13:33:54 +02:00
vty_out ( vty , " %s %pFX \n " , desc , filter - > p ) ;
2018-07-31 22:44:45 +02:00
write + + ;
2015-05-20 03:04:06 +02:00
}
}
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
if ( ! write ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " %s \n " , desc ) ;
2015-05-20 03:04:06 +02:00
write + + ;
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
return write ;
}
2016-11-18 14:05:49 +01: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
{
struct bgp_debug_filter * filter ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
filter = XCALLOC ( MTYPE_BGP_DEBUG_FILTER ,
sizeof ( struct bgp_debug_filter ) ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( host ) {
2015-08-26 16:44:57 +02:00
filter - > host = XSTRDUP ( MTYPE_BGP_DEBUG_STR , host ) ;
2015-05-20 02:58:12 +02:00
filter - > p = NULL ;
} else if ( p ) {
2015-05-20 03:04:21 +02:00
filter - > host = NULL ;
2016-11-18 14:05:49 +01:00
filter - > p = prefix_new ( ) ;
prefix_copy ( filter - > p , p ) ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
listnode_add ( list , filter ) ;
}
2020-03-20 10:57:54 +01:00
static bool bgp_debug_list_remove_entry ( struct list * list , const char * host ,
struct prefix * p )
2015-05-20 02:58:12 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
for ( ALL_LIST_ELEMENTS ( list , node , nnode , filter ) ) {
2015-05-20 03:04:21 +02:00
if ( host & & strcmp ( filter - > host , host ) = = 0 ) {
2015-05-20 02:58:12 +02:00
listnode_delete ( list , filter ) ;
2015-08-26 16:44:57 +02:00
XFREE ( MTYPE_BGP_DEBUG_STR , filter - > host ) ;
2015-05-20 02:58:12 +02:00
XFREE ( MTYPE_BGP_DEBUG_FILTER , filter ) ;
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
} 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 ) ;
2015-05-20 02:58:12 +02:00
XFREE ( MTYPE_BGP_DEBUG_FILTER , filter ) ;
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2020-03-20 10:57:54 +01:00
return false ;
2015-05-20 02:58:12 +02:00
}
2020-03-20 10:57:54 +01:00
static bool bgp_debug_list_has_entry ( struct list * list , const char * host ,
const struct prefix * p )
2015-05-20 02:58:12 +02:00
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
for ( ALL_LIST_ELEMENTS ( list , node , nnode , filter ) ) {
2015-05-20 03:04:21 +02:00
if ( host ) {
if ( strcmp ( filter - > host , host ) = = 0 ) {
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
} else if ( p ) {
if ( filter - > p - > prefixlen = = p - > prefixlen
& & prefix_match ( filter - > p , p ) ) {
2020-03-20 10:57:54 +01:00
return true ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2020-03-20 10:57:54 +01:00
return false ;
2015-05-20 02:58:12 +02:00
}
2020-03-20 10:57:54 +01:00
bool bgp_debug_peer_updout_enabled ( char * host )
2015-05-20 03:03:47 +02:00
{
2015-05-20 03:04:21 +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. */
2020-03-20 10:57:54 +01:00
bool bgp_dump_attr ( struct attr * attr , char * buf , size_t size )
2002-12-13 21:15:29 +01:00
{
char addrbuf [ BUFSIZ ] ;
if ( ! attr )
2020-03-20 10:57:54 +01:00
return false ;
2017-07-17 14:03:14 +02:00
2019-01-29 15:29:57 +01:00
buf [ 0 ] = ' \0 ' ;
2015-09-16 04:14:06 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_NEXT_HOP ) ) )
2020-10-15 21:33:09 +02:00
snprintfrr ( buf , size , " nexthop %pI4 " , & attr - > nexthop ) ;
2017-07-17 14:03:14 +02:00
2004-07-09 19:48:53 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_ORIGIN ) ) )
2015-09-16 04:14:06 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) , " , origin %s " ,
2004-07-09 19:48:53 +02:00
bgp_origin_str [ attr - > origin ] ) ;
2017-07-17 14:03:14 +02:00
2015-09-16 04:14:06 +02:00
/* Add MP case. */
2017-06-06 19:20:38 +02:00
if ( attr - > mp_nexthop_len = = BGP_ATTR_NHLEN_IPV6_GLOBAL
| | attr - > mp_nexthop_len = = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL )
2015-09-16 04:14:06 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2017-06-06 19:20:38 +02:00
" , mp_nexthop %s " ,
inet_ntop ( AF_INET6 , & attr - > mp_nexthop_global , addrbuf ,
BUFSIZ ) ) ;
2017-07-17 14:03:14 +02:00
2017-06-06 19:20:38 +02:00
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 ) ) ;
2017-07-17 14:03:14 +02:00
2015-09-16 04:14:06 +02:00
if ( attr - > mp_nexthop_len = = BGP_ATTR_NHLEN_IPV4 )
2020-10-15 21:33:09 +02:00
snprintfrr ( buf , size , " nexthop %pI4 " , & attr - > nexthop ) ;
2017-07-17 14:03:14 +02:00
2004-07-09 19:48:53 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_LOCAL_PREF ) ) )
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2012-04-13 13:46:07 +02:00
" , localpref %u " , attr - > local_pref ) ;
2017-07-17 14:03:14 +02:00
2017-06-06 19:20:38 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_MULTI_EXIT_DISC ) ) )
2012-04-13 13:46:07 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) , " , metric %u " ,
2002-12-13 21:15:29 +01:00
attr - > med ) ;
2017-07-17 14:03:14 +02:00
2015-09-16 04:14:06 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_COMMUNITIES ) ) )
2004-07-09 19:48:53 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2018-02-09 19:22:50 +01:00
" , community %s " ,
2022-04-08 21:57:47 +02:00
community_str ( bgp_attr_get_community ( attr ) , false ,
true ) ) ;
2017-07-17 14:03:14 +02:00
2021-01-08 15:09:34 +01:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_LARGE_COMMUNITIES ) ) )
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
" , large-community %s " ,
2022-04-08 21:57:47 +02:00
lcommunity_str ( bgp_attr_get_lcommunity ( attr ) , false ,
true ) ) ;
2021-01-08 15:09:34 +01:00
2017-06-21 01:56:50 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_EXT_COMMUNITIES ) ) )
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2022-02-04 14:56:20 +01:00
" , extcommunity %s " ,
ecommunity_str ( bgp_attr_get_ecommunity ( attr ) ) ) ;
2017-07-17 14:03:14 +02:00
2017-06-21 01:56:50 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_ATOMIC_AGGREGATE ) ) )
2004-07-09 19:48:53 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2017-06-21 01:56:50 +02:00
" , atomic-aggregate " ) ;
2017-07-17 14:03:14 +02:00
2004-07-09 19:48:53 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_AGGREGATOR ) ) )
2020-10-15 21:33:09 +02:00
snprintfrr ( buf + strlen ( buf ) , size - strlen ( buf ) ,
" , aggregated by %u %pI4 " , attr - > aggregator_as ,
& attr - > aggregator_addr ) ;
2017-07-17 14:03:14 +02:00
2004-07-09 19:48:53 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_ORIGINATOR_ID ) ) )
2020-10-15 21:33:09 +02:00
snprintfrr ( buf + strlen ( buf ) , size - strlen ( buf ) ,
" , originator %pI4 " , & attr - > originator_id ) ;
2017-07-17 14:03:14 +02:00
2004-07-09 19:48:53 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_CLUSTER_LIST ) ) ) {
2020-11-02 18:35:20 +01:00
struct cluster_list * cluster ;
2017-07-17 14:03:14 +02:00
int i ;
2017-06-06 19:20:38 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2017-06-21 01:56:50 +02:00
" , clusterlist " ) ;
2020-11-02 18:35:20 +01:00
cluster = bgp_attr_get_cluster ( attr ) ;
for ( i = 0 ; i < cluster - > length / 4 ; i + + )
2020-10-15 21:33:09 +02:00
snprintfrr ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2020-11-02 18:35:20 +01:00
" %pI4 " , & cluster - > list [ i ] ) ;
2017-07-17 14:03:14 +02:00
}
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 ) ,
2020-11-02 16:52:40 +01:00
" , pmsi tnltype %u " , bgp_attr_get_pmsi_tnl_type ( attr ) ) ;
2018-03-04 04:28:50 +01:00
2017-06-06 19:20:38 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_AS_PATH ) ) )
2002-12-13 21:15:29 +01:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) , " , path %s " ,
aspath_print ( attr - > aspath ) ) ;
2017-07-17 14:03:14 +02:00
2017-04-26 23:45:32 +02:00
if ( CHECK_FLAG ( attr - > flag , ATTR_FLAG_BIT ( BGP_ATTR_PREFIX_SID ) ) ) {
2017-06-06 19:20:38 +02:00
if ( attr - > label_index ! = BGP_INVALID_LABEL_INDEX )
2012-04-13 13:46:07 +02:00
snprintf ( buf + strlen ( buf ) , size - strlen ( buf ) ,
2017-06-21 01:56:50 +02:00
" , label-index %u " , attr - > label_index ) ;
2017-07-17 14:03:14 +02:00
}
2004-07-09 19:48:53 +02:00
if ( strlen ( buf ) > 1 )
2020-03-20 10:57:54 +01:00
return true ;
2017-07-17 14:03:14 +02:00
else
2020-03-20 10:57:54 +01:00
return false ;
2015-09-16 04:14:06 +02:00
}
2002-12-13 21:15:29 +01:00
2015-09-16 04:14:06 +02:00
const char * bgp_notify_code_str ( char code )
{
2017-06-21 01:56:50 +02:00
return lookup_msg ( bgp_notify_msg , code , " Unrecognized Error Code " ) ;
2017-07-17 14:03:14 +02:00
}
2002-12-13 21:15:29 +01:00
2015-09-16 04:14:06 +02:00
const char * bgp_notify_subcode_str ( char code , char subcode )
2017-07-17 14:03:14 +02:00
{
2015-09-16 04:14:06 +02:00
switch ( code ) {
2002-12-13 21:15:29 +01:00
case BGP_NOTIFY_HEADER_ERR :
2017-06-21 01:56:50 +02:00
return lookup_msg ( bgp_notify_head_msg , subcode ,
2015-09-16 04:14:06 +02:00
" Unrecognized Error Subcode " ) ;
2002-12-13 21:15:29 +01:00
case BGP_NOTIFY_OPEN_ERR :
2017-06-21 01:56:50 +02:00
return lookup_msg ( bgp_notify_open_msg , subcode ,
2015-09-16 04:14:06 +02:00
" Unrecognized Error Subcode " ) ;
2002-12-13 21:15:29 +01:00
case BGP_NOTIFY_UPDATE_ERR :
2017-06-21 01:56:50 +02:00
return lookup_msg ( bgp_notify_update_msg , subcode ,
2015-09-16 04:14:06 +02:00
" Unrecognized Error Subcode " ) ;
2002-12-13 21:15:29 +01:00
case BGP_NOTIFY_HOLD_ERR :
break ;
case BGP_NOTIFY_FSM_ERR :
2020-03-15 13:19:11 +01:00
return lookup_msg ( bgp_notify_fsm_msg , subcode ,
" Unrecognized Error Subcode " ) ;
2002-12-13 21:15:29 +01:00
case BGP_NOTIFY_CEASE :
2017-06-21 01:56:50 +02:00
return lookup_msg ( bgp_notify_cease_msg , subcode ,
2015-09-16 04:14:06 +02:00
" Unrecognized Error Subcode " ) ;
2020-10-01 22:08:06 +02:00
case BGP_NOTIFY_ROUTE_REFRESH_ERR :
return lookup_msg ( bgp_notify_route_refresh_msg , subcode ,
2015-09-16 04:14:06 +02:00
" Unrecognized Error Subcode " ) ;
2002-12-13 21:15:29 +01:00
}
2015-09-16 04:14:06 +02:00
return " " ;
}
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-01-25 04:03:38 +01:00
size_t datalen )
{
if ( ! data | | datalen < 1 )
return NULL ;
2018-03-27 21:13:34 +02:00
uint8_t len = data [ 0 ] ;
2022-01-05 11:11:27 +01:00
if ( ! len | | len > datalen - 1 )
2017-01-25 04:03:38 +01:00
return NULL ;
return zlog_sanitize ( buf , bufsz , data + 1 , len ) ;
}
2015-09-16 04:14:06 +02:00
/* dump notify packet */
void bgp_notify_print ( struct peer * peer , struct bgp_notify * bgp_notify ,
2022-04-30 22:04:58 +02:00
const char * direct , bool hard_reset )
2015-09-16 04:14:06 +02:00
{
const char * subcode_str ;
const char * code_str ;
2017-01-25 04:03:38 +01:00
const char * msg_str = NULL ;
char msg_buf [ 1024 ] ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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 ) ) {
2015-09-16 04:14:06 +02:00
code_str = bgp_notify_code_str ( bgp_notify - > code ) ;
subcode_str = bgp_notify_subcode_str ( bgp_notify - > code ,
bgp_notify - > subcode ) ;
2017-07-17 14:03:14 +02:00
2017-01-25 04:03:38 +01:00
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 ) ;
}
2017-07-17 14:03:14 +02:00
2017-01-25 04:03:38 +01:00
if ( msg_str ) {
zlog_info (
2022-04-30 22:04:58 +02:00
" %%NOTIFICATION%s: %s neighbor %s %d/%d (%s%s) \" %s \" " ,
hard_reset ? " (Hard Reset) " : " " ,
2017-01-25 04:03:38 +01:00
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 (
2022-04-30 22:04:58 +02:00
" %%NOTIFICATION%s: %s neighbor %s %d/%d (%s%s) %d bytes %s " ,
hard_reset ? " (Hard Reset) " : " " ,
2017-01-25 04:03:38 +01:00
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 ) ;
}
2015-09-16 04:14:06 +02:00
}
2002-12-13 21:15:29 +01:00
}
2014-06-04 06:53:35 +02:00
2015-05-20 03:03:47 +02:00
static void bgp_debug_clear_updgrp_update_dbg ( struct bgp * bgp )
{
if ( ! bgp )
bgp = bgp_get_default ( ) ;
update_group_walk ( bgp , update_group_clear_update_dbg , NULL ) ;
}
2020-03-20 10:57:54 +01:00
static void bgp_debug_print_evpn_prefix ( struct vty * vty , const char * desc ,
struct prefix * p )
2018-07-21 20:08:51 +02:00
{
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 ) ) {
2020-04-20 20:12:38 +02:00
snprintf (
evpn_desc , sizeof ( evpn_desc ) ,
" l2vpn evpn type macip mac %s " ,
prefix_mac2str ( & p - > u . prefix_evpn . macip_addr . mac ,
buf2 , sizeof ( buf2 ) ) ) ;
2018-07-21 20:08:51 +02:00
} else {
uint8_t family = is_evpn_prefix_ipaddr_v4 (
( struct prefix_evpn * ) p ) ?
AF_INET : AF_INET6 ;
2020-04-20 20:12:38 +02:00
snprintf (
evpn_desc , sizeof ( 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 ,
2018-07-21 20:08:51 +02:00
& p - > u . prefix_evpn . macip_addr . ip . ip . addr ,
buf , PREFIX2STR_BUFFER ) ) ;
}
} else if ( p - > u . prefix_evpn . route_type = = BGP_EVPN_IMET_ROUTE ) {
2020-10-15 21:33:09 +02:00
snprintfrr ( evpn_desc , sizeof ( evpn_desc ) ,
" l2vpn evpn type multicast ip %pI4 " ,
& p - > u . prefix_evpn . imet_addr . ip . ipaddr_v4 ) ;
2018-07-21 20:08:51 +02:00
} 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 ;
2020-04-20 20:12:38 +02:00
snprintf ( evpn_desc , sizeof ( 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 ) ;
2018-07-21 20:08:51 +02:00
}
vty_out ( vty , " %s %s \n " , desc , evpn_desc ) ;
}
static int bgp_debug_parse_evpn_prefix ( struct vty * vty , struct cmd_token * * argv ,
int argc , struct prefix * * argv_pp )
{
struct prefix * argv_p ;
2022-05-12 09:23:28 +02:00
struct ethaddr mac = { } ;
struct ipaddr ip = { } ;
2020-10-13 22:09:48 +02:00
int evpn_type = 0 ;
2018-07-21 20:08:51 +02:00
int mac_idx = 0 ;
int ip_idx = 0 ;
argv_p = * argv_pp ;
2020-10-13 22:09:48 +02:00
if ( bgp_evpn_cli_parse_type ( & evpn_type , argv , argc ) < 0 )
return CMD_WARNING ;
2018-07-21 20:08:51 +02:00
if ( evpn_type = = BGP_EVPN_MAC_IP_ROUTE ) {
2022-05-11 12:16:44 +02:00
memset ( & ip , 0 , sizeof ( ip ) ) ;
2018-07-31 23:35:54 +02:00
2022-05-12 09:23:28 +02:00
if ( argv_find ( argv , argc , " mac " , & mac_idx ) )
2022-05-12 09:28:06 +02:00
if ( ! prefix_str2mac ( argv [ mac_idx + 1 ] - > arg , & mac ) ) {
vty_out ( vty , " %% Malformed MAC address \n " ) ;
return CMD_WARNING ;
}
2018-07-31 23:35:54 +02:00
2022-05-12 09:23:28 +02:00
if ( argv_find ( argv , argc , " ip " , & ip_idx ) )
2022-05-12 09:28:06 +02:00
if ( str2ipaddr ( argv [ ip_idx + 1 ] - > arg , & ip ) ! = 0 ) {
vty_out ( vty , " %% Malformed IP address \n " ) ;
return CMD_WARNING ;
}
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 ) {
2022-05-11 12:16:44 +02:00
memset ( & ip , 0 , sizeof ( ip ) ) ;
2018-07-31 23:35:54 +02:00
2022-05-12 09:23:28 +02:00
if ( argv_find ( argv , argc , " ip " , & ip_idx ) )
2022-05-12 09:28:06 +02:00
if ( str2ipaddr ( argv [ ip_idx + 1 ] - > arg , & ip ) ! = 0 ) {
vty_out ( vty , " %% Malformed IP address \n " ) ;
return CMD_WARNING ;
}
2018-07-31 23:35:54 +02:00
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 ;
2022-05-11 12:16:44 +02:00
memset ( & ip_prefix , 0 , sizeof ( ip_prefix ) ) ;
2018-07-21 20:08:51 +02:00
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 ;
int debug ( unsigned int option )
{
return bgp_debug_option & option ;
}
[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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( as4 , AS4 ) ;
else {
TERM_DEBUG_ON ( as4 , AS4 ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 debugging is on \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
}
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_as4 ,
no_debug_bgp_as4_cmd ,
" no debug bgp as4 " ,
NO_STR
DEBUG_STR
BGP_STR
" BGP AS4 actions \n " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( as4 , AS4 ) ;
else {
TERM_DEBUG_OFF ( as4 , AS4 ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 debugging is off \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
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( as4 , AS4_SEGMENT ) ;
else {
TERM_DEBUG_ON ( as4 , AS4_SEGMENT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 segment debugging is on \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
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( as4 , AS4_SEGMENT ) ;
else {
TERM_DEBUG_OFF ( as4 , AS4_SEGMENT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 segment debugging is off \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
}
return CMD_SUCCESS ;
}
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
{
2015-05-20 03:04:06 +02:00
bgp_debug_list_free ( bgp_debug_neighbor_events_peers ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
2015-05-20 02:58:12 +02:00
DEBUG_ON ( neighbor_events , NEIGHBOR_EVENTS ) ;
2002-12-13 21:15:29 +01:00
else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_ON ( neighbor_events , NEIGHBOR_EVENTS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP neighbor-events debugging is on \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_peer = 3 ;
const char * host = argv [ idx_peer ] - > arg ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_neighbor_events_peers )
bgp_debug_neighbor_events_peers = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_neighbor_events_peers , host ,
NULL ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP neighbor-events debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
bgp_debug_list_add_entry ( bgp_debug_neighbor_events_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
2015-05-20 02:58:12 +02:00
DEBUG_ON ( neighbor_events , NEIGHBOR_EVENTS ) ;
2002-12-13 21:15:29 +01:00
else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_ON ( neighbor_events , NEIGHBOR_EVENTS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP neighbor-events debugging is on for %s \n " ,
host ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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
{
2015-05-20 02:58:12 +02:00
bgp_debug_list_free ( bgp_debug_neighbor_events_peers ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
2015-05-20 02:58:12 +02:00
DEBUG_OFF ( neighbor_events , NEIGHBOR_EVENTS ) ;
2002-12-13 21:15:29 +01:00
else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_OFF ( neighbor_events , NEIGHBOR_EVENTS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP neighbor-events debugging is off \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_peer = 4 ;
2015-05-20 02:58:12 +02:00
int found_peer = 0 ;
2016-09-23 21:45:50 +02:00
const char * host = argv [ idx_peer ] - > arg ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( bgp_debug_neighbor_events_peers
& & ! list_isempty ( bgp_debug_neighbor_events_peers ) ) {
2015-05-20 03:04:21 +02:00
found_peer = bgp_debug_list_remove_entry (
bgp_debug_neighbor_events_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( found_peer )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP neighbor-events debugging is off for %s \n " ,
host ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP neighbor-events debugging was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( nht , NHT ) ;
else {
TERM_DEBUG_ON ( nht , NHT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP nexthop tracking debugging is on \n " ) ;
2015-05-20 02:40:34 +02:00
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( nht , NHT ) ;
else {
TERM_DEBUG_OFF ( nht , NHT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP nexthop tracking debugging is off \n " ) ;
2015-05-20 02:40:34 +02:00
}
return CMD_SUCCESS ;
}
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
{
2015-05-20 03:04:06 +02:00
bgp_debug_list_free ( bgp_debug_keepalive_peers ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
2015-05-20 02:58:12 +02:00
DEBUG_ON ( keepalive , KEEPALIVE ) ;
2002-12-13 21:15:29 +01:00
else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_ON ( keepalive , KEEPALIVE ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP keepalives debugging is on \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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
2020-11-07 16:22:34 +01:00
" BGP keepalives \n "
" BGP IPv4 neighbor to debug \n "
2015-05-20 02:58:12 +02:00
" BGP IPv6 neighbor to debug \n "
" BGP neighbor on interface to debug \n " )
2002-12-13 21:15:29 +01:00
{
2016-09-23 21:45:50 +02:00
int idx_peer = 3 ;
const char * host = argv [ idx_peer ] - > arg ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_keepalive_peers )
bgp_debug_keepalive_peers = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_keepalive_peers , host , NULL ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP keepalive debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
bgp_debug_list_add_entry ( bgp_debug_keepalive_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( keepalive , KEEPALIVE ) ;
else {
TERM_DEBUG_ON ( keepalive , KEEPALIVE ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP keepalives debugging is on for %s \n " , host ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_keepalive ,
no_debug_bgp_keepalive_cmd ,
" no debug bgp keepalives " ,
NO_STR
DEBUG_STR
BGP_STR
" BGP keepalives \n " )
{
2015-05-20 02:58:12 +02:00
bgp_debug_list_free ( bgp_debug_keepalive_peers ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( keepalive , KEEPALIVE ) ;
else {
TERM_DEBUG_OFF ( keepalive , KEEPALIVE ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP keepalives debugging is off \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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 " )
{
2016-09-23 21:45:50 +02:00
int idx_peer = 4 ;
2015-05-20 02:58:12 +02:00
int found_peer = 0 ;
2016-09-23 21:45:50 +02:00
const char * host = argv [ idx_peer ] - > arg ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( bgp_debug_keepalive_peers
& & ! list_isempty ( bgp_debug_keepalive_peers ) ) {
2015-05-20 03:04:21 +02:00
found_peer = bgp_debug_list_remove_entry (
bgp_debug_keepalive_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( list_isempty ( bgp_debug_keepalive_peers ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( keepalive , KEEPALIVE ) ;
else
TERM_DEBUG_OFF ( keepalive , KEEPALIVE ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( found_peer )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP keepalives debugging is off for %s \n " , host ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP keepalives debugging was not enabled for %s \n " ,
host ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
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 ) ;
2015-05-20 03:04:02 +02:00
if ( ! bgp_debug_bestpath_prefixes )
bgp_debug_bestpath_prefixes = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2016-11-18 14:05:49 +01:00
if ( bgp_debug_list_has_entry ( bgp_debug_bestpath_prefixes , NULL ,
2017-09-20 17:12:17 +02:00
argv_p ) ) {
2017-07-13 17:49:13 +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 ) ;
2015-05-20 03:04:02 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
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
2015-05-20 03:04:02 +02:00
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_ON ( bestpath , BESTPATH ) ;
} else {
TERM_DEBUG_ON ( bestpath , BESTPATH ) ;
2017-07-13 17:49:13 +02:00
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 ) ;
2015-05-20 03:04:02 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_ipv4_ipv6_prefixlen = 4 ;
2015-05-20 03:04:02 +02:00
struct prefix * argv_p ;
int found_prefix = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
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
2015-05-20 03:04:02 +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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
if ( list_isempty ( bgp_debug_bestpath_prefixes ) ) {
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_OFF ( bestpath , BESTPATH ) ;
} else {
TERM_DEBUG_OFF ( bestpath , BESTPATH ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP bestpath debugging (per prefix) is off \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 03:04:02 +02:00
}
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
if ( found_prefix )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP bestpath debugging is off for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 03:04:02 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP bestpath debugging was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
return CMD_SUCCESS ;
}
DEFUN ( no_debug_bgp_bestpath ,
no_debug_bgp_bestpath_cmd ,
" no debug bgp bestpath " ,
NO_STR
DEBUG_STR
BGP_STR
" BGP bestpath \n " )
{
bgp_debug_list_free ( bgp_debug_bestpath_prefixes ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:02 +02:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( bestpath , BESTPATH ) ;
else {
TERM_DEBUG_OFF ( bestpath , BESTPATH ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP bestpath debugging is off \n " ) ;
2015-05-20 03:04:02 +02:00
}
return CMD_SUCCESS ;
}
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 " )
{
2015-05-20 03:04:06 +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-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
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 ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging is on \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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 " )
{
2016-09-23 21:45:50 +02:00
int idx_in_out = 3 ;
2017-07-17 14:03:14 +02:00
2016-09-23 21:45:50 +02:00
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 )
2015-05-20 03:04:06 +02:00
bgp_debug_list_free ( bgp_debug_update_in_peers ) ;
else
bgp_debug_list_free ( bgp_debug_update_out_peers ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE ) {
2016-09-23 21:45:50 +02:00
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 )
2015-05-20 03:04:06 +02:00
DEBUG_ON ( update , UPDATE_IN ) ;
2002-12-13 21:15:29 +01:00
else
2015-05-20 03:04:06 +02:00
DEBUG_ON ( update , UPDATE_OUT ) ;
2002-12-13 21:15:29 +01:00
} else {
2016-09-23 21:45:50 +02:00
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 ) {
2002-12-13 21:15:29 +01:00
TERM_DEBUG_ON ( update , UPDATE_IN ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging is on (inbound) \n " ) ;
2002-12-13 21:15:29 +01:00
} else {
TERM_DEBUG_ON ( update , UPDATE_OUT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is on (outbound) \n " ) ;
2002-12-13 21:15:29 +01:00
}
}
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_in_out = 3 ;
int idx_peer = 4 ;
const char * host = argv [ idx_peer ] - > arg ;
2015-05-20 02:58:12 +02:00
int inbound ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_update_in_peers )
bgp_debug_update_in_peers = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_update_out_peers )
bgp_debug_update_out_peers = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2016-09-23 21:45:50 +02:00
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 )
2015-05-20 02:58:12 +02:00
inbound = 1 ;
else
inbound = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( inbound ) {
2015-05-20 03:04:21 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_update_in_peers , host ,
NULL ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP inbound update debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
else {
2015-05-20 03:04:21 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_update_out_peers , host ,
NULL ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP outbound update debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
if ( inbound )
2015-05-20 03:04:21 +02:00
bgp_debug_list_add_entry ( bgp_debug_update_in_peers , host , NULL ) ;
2015-05-20 02:58:12 +02:00
else {
2015-05-20 03:04:21 +02:00
struct peer * peer ;
2015-05-20 03:03:47 +02:00
struct peer_af * paf ;
2016-01-22 19:56:48 +01:00
int afidx ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
bgp_debug_list_add_entry ( bgp_debug_update_out_peers , host ,
NULL ) ;
peer = bgp_find_peer ( vty , host ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( peer ) {
2016-01-22 19:56:48 +01:00
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 ) ;
2015-05-20 03:03:47 +02:00
}
}
2017-07-17 14:03:14 +02:00
}
}
}
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE ) {
2015-05-20 02:58:12 +02:00
if ( inbound )
2015-05-20 03:04:06 +02:00
DEBUG_ON ( update , UPDATE_IN ) ;
2015-05-20 02:58:12 +02:00
else
2015-05-20 03:04:06 +02:00
DEBUG_ON ( update , UPDATE_OUT ) ;
2002-12-13 21:15:29 +01:00
} else {
2015-05-20 02:58:12 +02:00
if ( inbound ) {
TERM_DEBUG_ON ( update , UPDATE_IN ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is on (inbound) for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_peer ] - > arg ) ;
2015-05-20 02:58:12 +02:00
} else {
TERM_DEBUG_ON ( update , UPDATE_OUT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is on (outbound) for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_peer ] - > arg ) ;
2015-05-20 02:58:12 +02:00
}
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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 " )
{
2016-09-23 21:45:50 +02:00
int idx_in_out = 4 ;
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 ) {
2015-05-20 03:04:06 +02:00
bgp_debug_list_free ( bgp_debug_update_in_peers ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_OFF ( update , UPDATE_IN ) ;
} else {
TERM_DEBUG_OFF ( update , UPDATE_IN ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is off (inbound) \n " ) ;
2015-05-20 03:04:06 +02:00
}
} else {
bgp_debug_list_free ( bgp_debug_update_out_peers ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_OFF ( update , UPDATE_OUT ) ;
} else {
TERM_DEBUG_OFF ( update , UPDATE_OUT ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is off (outbound) \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 03:04:06 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
return CMD_SUCCESS ;
}
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 " )
{
2016-09-23 21:45:50 +02:00
int idx_in_out = 4 ;
int idx_peer = 5 ;
2015-05-20 02:58:12 +02:00
int inbound ;
int found_peer = 0 ;
2016-09-23 21:45:50 +02:00
const char * host = argv [ idx_peer ] - > arg ;
2017-07-17 14:03:14 +02:00
2016-09-23 21:45:50 +02:00
if ( strncmp ( " i " , argv [ idx_in_out ] - > arg , 1 ) = = 0 )
2015-05-20 02:58:12 +02:00
inbound = 1 ;
else
inbound = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( inbound & & bgp_debug_update_in_peers
& & ! list_isempty ( bgp_debug_update_in_peers ) ) {
2015-05-20 03:04:21 +02:00
found_peer = bgp_debug_list_remove_entry (
bgp_debug_update_in_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (inbound) is off \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( ! inbound & & bgp_debug_update_out_peers
& & ! list_isempty ( bgp_debug_update_out_peers ) ) {
2015-05-20 03:04:21 +02:00
found_peer = bgp_debug_list_remove_entry (
bgp_debug_update_out_peers , host , NULL ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (outbound) is off \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
struct peer * peer ;
struct peer_af * paf ;
2016-01-22 19:56:48 +01:00
int afidx ;
2015-05-20 03:04:21 +02:00
peer = bgp_find_peer ( vty , host ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( peer ) {
2016-01-22 19:56:48 +01:00
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 ) ;
2017-07-17 14:03:14 +02:00
}
}
}
}
2016-01-22 19:56:48 +01:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( found_peer )
if ( inbound )
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (inbound) is off for %s \n " ,
host ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (outbound) is off for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
else if ( inbound )
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (inbound) was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (outbound) was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
host ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
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 ,
2020-10-13 22:09:48 +02:00
" debug bgp updates prefix l2vpn$afi evpn$safi type <<macip|2> mac <X:X:X:X:X:X|X:X:X:X:X:X/M> [ip <A.B.C.D|X:X::X:X>]|<multicast|3> ip <A.B.C.D|X:X::X:X>|<prefix|5> 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
2020-10-07 22:34:27 +02:00
EVPN_TYPE_HELP_STR
EVPN_TYPE_2_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_2_HELP_STR
2018-07-31 23:35:54 +02:00
MAC_STR MAC_STR MAC_STR
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2020-10-07 22:34:27 +02:00
EVPN_TYPE_3_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_3_HELP_STR
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2020-10-07 22:34:27 +02:00
EVPN_TYPE_5_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_5_HELP_STR
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 ;
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 ( ) ;
if ( bgp_debug_list_has_entry ( bgp_debug_update_prefixes , NULL , argv_p ) ) {
vty_out ( vty ,
2020-10-18 13:33:54 +02:00
" BGP updates debugging is already enabled for %pFX \n " ,
argv_p ) ;
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 ) ;
2020-10-18 13:33:54 +02:00
vty_out ( vty , " BGP updates debugging is on for %pFX \n " , argv_p ) ;
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 ,
2020-10-13 22:09:48 +02:00
" no debug bgp updates prefix l2vpn$afi evpn$safi type <<macip|2> mac <X:X:X:X:X:X|X:X:X:X:X:X/M> [ip <A.B.C.D|X:X::X:X>]|<multicast|3> ip <A.B.C.D|X:X::X:X>|<prefix|5> 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
2020-10-07 22:34:27 +02:00
EVPN_TYPE_HELP_STR
EVPN_TYPE_2_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_2_HELP_STR
2018-07-31 23:35:54 +02:00
MAC_STR MAC_STR MAC_STR
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2020-10-07 22:34:27 +02:00
EVPN_TYPE_3_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_3_HELP_STR
2018-07-31 23:35:54 +02:00
IP_STR
" IPv4 address \n "
" IPv6 address \n "
2020-10-07 22:34:27 +02:00
EVPN_TYPE_5_HELP_STR
2020-10-13 22:09:48 +02:00
EVPN_TYPE_5_HELP_STR
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 ;
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 " ) ;
}
}
}
if ( found_prefix )
2020-10-18 13:33:54 +02:00
vty_out ( vty , " BGP updates debugging is off for %pFX \n " , argv_p ) ;
2018-07-21 20:08:51 +02:00
else
2020-10-18 13:33:54 +02:00
vty_out ( vty , " BGP updates debugging was not enabled for %pFX \n " ,
argv_p ) ;
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
{
2016-09-23 21:45:50 +02:00
int idx_ipv4_ipv6_prefixlen = 4 ;
2015-05-20 02:58:12 +02:00
struct prefix * argv_p ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_update_prefixes )
bgp_debug_update_prefixes = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_update_prefixes , NULL , argv_p ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
bgp_debug_list_add_entry ( bgp_debug_update_prefixes , NULL , argv_p ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE ) {
2015-05-20 02:58:12 +02:00
DEBUG_ON ( update , UPDATE_PREFIX ) ;
2002-12-13 21:15:29 +01:00
} else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_ON ( update , UPDATE_PREFIX ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging is on for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2002-12-13 21:15:29 +01:00
}
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_ipv4_ipv6_prefixlen = 5 ;
2015-05-20 02:58:12 +02:00
struct prefix * argv_p ;
int found_prefix = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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
2015-05-20 02:58:12 +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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( list_isempty ( bgp_debug_update_prefixes ) ) {
if ( vty - > node = = CONFIG_NODE ) {
DEBUG_OFF ( update , UPDATE_PREFIX ) ;
} else {
TERM_DEBUG_OFF ( update , UPDATE_PREFIX ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty ,
" BGP updates debugging (per prefix) is off \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( found_prefix )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging is off for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
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 ;
2015-05-20 02:58:12 +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-07-17 14:03:14 +02:00
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
2002-12-13 21:15:29 +01:00
if ( vty - > node = = CONFIG_NODE ) {
2015-05-20 02:58:12 +02:00
DEBUG_OFF ( update , UPDATE_IN ) ;
DEBUG_OFF ( update , UPDATE_OUT ) ;
DEBUG_OFF ( update , UPDATE_PREFIX ) ;
2002-12-13 21:15:29 +01:00
} else {
2015-05-20 02:58:12 +02:00
TERM_DEBUG_OFF ( update , UPDATE_IN ) ;
TERM_DEBUG_OFF ( update , UPDATE_OUT ) ;
TERM_DEBUG_OFF ( update , UPDATE_PREFIX ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP updates debugging is off \n " ) ;
2002-12-13 21:15:29 +01:00
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( zebra , ZEBRA ) ;
else {
TERM_DEBUG_ON ( zebra , ZEBRA ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is on \n " ) ;
[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
}
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_ipv4_ipv6_prefixlen = 4 ;
2015-05-20 02:58:12 +02:00
struct prefix * argv_p ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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
2015-05-20 02:58:12 +02:00
if ( ! bgp_debug_zebra_prefixes )
bgp_debug_zebra_prefixes = list_new ( ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( bgp_debug_list_has_entry ( bgp_debug_zebra_prefixes , NULL , argv_p ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is already enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
bgp_debug_list_add_entry ( bgp_debug_zebra_prefixes , NULL , argv_p ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( zebra , ZEBRA ) ;
else {
TERM_DEBUG_ON ( zebra , ZEBRA ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is on for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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
DEFUN ( no_debug_bgp_zebra ,
no_debug_bgp_zebra_cmd ,
" no debug bgp zebra " ,
NO_STR
DEBUG_STR
BGP_STR
" BGP Zebra messages \n " )
{
2015-05-20 02:58:12 +02:00
bgp_debug_list_free ( bgp_debug_zebra_prefixes ) ;
2017-07-17 14:03:14 +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
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( zebra , ZEBRA ) ;
else {
TERM_DEBUG_OFF ( zebra , ZEBRA ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is off \n " ) ;
[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
}
return CMD_SUCCESS ;
}
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
{
2016-09-23 21:45:50 +02:00
int idx_ipv4_ipv6_prefixlen = 5 ;
2015-05-20 02:58:12 +02:00
struct prefix * argv_p ;
int found_prefix = 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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
2015-05-20 02:58:12 +02:00
if ( bgp_debug_zebra_prefixes
& & ! list_isempty ( bgp_debug_zebra_prefixes ) ) {
2015-05-20 03:04:06 +02:00
found_prefix = bgp_debug_list_remove_entry (
bgp_debug_zebra_prefixes , NULL , argv_p ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( list_isempty ( bgp_debug_zebra_prefixes ) ) {
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( zebra , ZEBRA ) ;
else {
TERM_DEBUG_OFF ( zebra , ZEBRA ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is off \n " ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
}
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( found_prefix )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging is off for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2015-05-20 02:58:12 +02:00
else
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP zebra debugging was not enabled for %s \n " ,
2017-06-21 05:10:57 +02:00
argv [ idx_ipv4_ipv6_prefixlen ] - > arg ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( allow_martians , ALLOW_MARTIANS ) ;
else {
TERM_DEBUG_ON ( allow_martians , ALLOW_MARTIANS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP allow_martian next hop debugging is on \n " ) ;
2016-05-07 16:35:21 +02:00
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( allow_martians , ALLOW_MARTIANS ) ;
else {
TERM_DEBUG_OFF ( allow_martians , ALLOW_MARTIANS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP allow martian next hop debugging is off \n " ) ;
2016-05-07 16:35:21 +02:00
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_ON ( update_groups , UPDATE_GROUPS ) ;
else {
TERM_DEBUG_ON ( update_groups , UPDATE_GROUPS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP update-groups debugging is on \n " ) ;
2015-05-20 03:03:47 +02:00
}
return CMD_SUCCESS ;
}
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 " )
{
if ( vty - > node = = CONFIG_NODE )
DEBUG_OFF ( update_groups , UPDATE_GROUPS ) ;
else {
TERM_DEBUG_OFF ( update_groups , UPDATE_GROUPS ) ;
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP update-groups debugging is off \n " ) ;
2015-05-20 03:03:47 +02:00
}
return CMD_SUCCESS ;
}
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 ;
}
2020-03-27 15:55:59 +01:00
DEFPY ( debug_bgp_evpn_mh ,
debug_bgp_evpn_mh_cmd ,
" [no$no] debug bgp evpn mh <es$es|route$rt> " ,
NO_STR
DEBUG_STR
BGP_STR
" EVPN \n "
" Multihoming \n "
" Ethernet Segment debugging \n "
" Route debugging \n " )
{
if ( es ) {
if ( vty - > node = = CONFIG_NODE ) {
if ( no )
DEBUG_OFF ( evpn_mh , EVPN_MH_ES ) ;
else
DEBUG_ON ( evpn_mh , EVPN_MH_ES ) ;
} else {
if ( no ) {
TERM_DEBUG_OFF ( evpn_mh , EVPN_MH_ES ) ;
vty_out ( vty ,
" BGP EVPN-MH ES debugging is off \n " ) ;
} else {
TERM_DEBUG_ON ( evpn_mh , EVPN_MH_ES ) ;
vty_out ( vty ,
" BGP EVPN-MH ES debugging is on \n " ) ;
}
}
}
if ( rt ) {
if ( vty - > node = = CONFIG_NODE ) {
if ( no )
DEBUG_OFF ( evpn_mh , EVPN_MH_RT ) ;
else
DEBUG_ON ( evpn_mh , EVPN_MH_RT ) ;
} else {
if ( no ) {
TERM_DEBUG_OFF ( evpn_mh , EVPN_MH_RT ) ;
vty_out ( vty ,
" BGP EVPN-MH route debugging is off \n " ) ;
} else {
TERM_DEBUG_ON ( evpn_mh , EVPN_MH_RT ) ;
vty_out ( vty ,
" BGP EVPN-MH route debugging is on \n " ) ;
}
}
}
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 ;
}
2021-03-01 20:07:28 +01:00
DEFPY ( debug_bgp_bfd , debug_bgp_bfd_cmd ,
" [no] debug bgp bfd " ,
NO_STR
DEBUG_STR
BGP_STR
" Bidirection Forwarding Detection \n " )
{
if ( vty - > node = = CONFIG_NODE ) {
if ( no ) {
DEBUG_OFF ( bfd , BFD_LIB ) ;
bfd_protocol_integration_set_debug ( false ) ;
} else {
DEBUG_ON ( bfd , BFD_LIB ) ;
bfd_protocol_integration_set_debug ( true ) ;
}
} else {
2021-05-28 10:55:27 +02:00
if ( no ) {
2021-03-01 20:07:28 +01:00
TERM_DEBUG_OFF ( bfd , BFD_LIB ) ;
2021-05-28 10:55:27 +02:00
bfd_protocol_integration_set_debug ( false ) ;
} else {
2021-03-01 20:07:28 +01:00
TERM_DEBUG_ON ( bfd , BFD_LIB ) ;
2021-05-28 10:55:27 +02:00
bfd_protocol_integration_set_debug ( true ) ;
}
2021-03-01 20:07:28 +01:00
}
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 ;
2015-05-20 02:58:12 +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 ) ;
2015-05-20 03:04:02 +02:00
bgp_debug_list_free ( bgp_debug_bestpath_prefixes ) ;
2015-05-20 02:58:12 +02:00
bgp_debug_list_free ( bgp_debug_zebra_prefixes ) ;
2017-07-17 14:03:14 +02:00
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
2002-12-13 21:15:29 +01:00
TERM_DEBUG_OFF ( keepalive , KEEPALIVE ) ;
TERM_DEBUG_OFF ( update , UPDATE_IN ) ;
TERM_DEBUG_OFF ( update , UPDATE_OUT ) ;
2015-05-20 02:58:12 +02:00
TERM_DEBUG_OFF ( update , UPDATE_PREFIX ) ;
2015-05-20 03:04:02 +02:00
TERM_DEBUG_OFF ( bestpath , BESTPATH ) ;
[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
TERM_DEBUG_OFF ( as4 , AS4 ) ;
TERM_DEBUG_OFF ( as4 , AS4_SEGMENT ) ;
2015-05-20 02:58:12 +02:00
TERM_DEBUG_OFF ( neighbor_events , NEIGHBOR_EVENTS ) ;
[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
TERM_DEBUG_OFF ( zebra , ZEBRA ) ;
2016-05-07 16:35:21 +02:00
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 ) ;
2020-03-27 15:55:59 +01:00
TERM_DEBUG_OFF ( evpn_mh , EVPN_MH_ES ) ;
TERM_DEBUG_OFF ( evpn_mh , EVPN_MH_RT ) ;
2021-03-01 20:07:28 +01:00
TERM_DEBUG_OFF ( bfd , BFD_LIB ) ;
2019-10-23 07:40:22 +02:00
2017-07-13 17:49:13 +02:00
vty_out ( vty , " All possible debugging has been turned off \n " ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS ;
}
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-13 17:49:13 +02:00
vty_out ( vty , " BGP debugging status: \n " ) ;
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
if ( BGP_DEBUG ( as4 , AS4 ) )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 debugging is on \n " ) ;
2015-05-20 02:58:12 +02: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
if ( BGP_DEBUG ( as4 , AS4_SEGMENT ) )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP as4 aspath segment debugging is on \n " ) ;
2015-05-20 02:58:12 +02:00
2015-05-20 03:04:06 +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
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
2015-05-20 03:04:06 +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
2015-05-20 02:40:34 +02:00
if ( BGP_DEBUG ( nht , NHT ) )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP next-hop tracking debugging is on \n " ) ;
2015-05-20 02:58:12 +02:00
2015-05-20 03:04:06 +02:00
if ( BGP_DEBUG ( update_groups , UPDATE_GROUPS ) )
2017-07-13 17:49:13 +02:00
vty_out ( vty , " BGP update-groups debugging is on \n " ) ;
2015-05-20 03:04:06 +02:00
2015-05-20 02:58:12 +02:00
if ( BGP_DEBUG ( update , UPDATE_PREFIX ) )
2015-05-20 03:04:06 +02:00
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
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
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
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-07-24 02:26:54 +02:00
vty_out ( vty , " BGP graceful-restart debugging is on \n " ) ;
2015-05-20 02:58:12 +02:00
2016-05-07 16:35:21 +02:00
if ( BGP_DEBUG ( allow_martians , ALLOW_MARTIANS ) )
2017-07-13 17:49:13 +02:00
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 " ) ;
2020-07-14 21:37:14 +02:00
2020-03-27 15:55:59 +01:00
if ( BGP_DEBUG ( evpn_mh , EVPN_MH_ES ) )
vty_out ( vty , " BGP EVPN-MH ES debugging is on \n " ) ;
if ( BGP_DEBUG ( evpn_mh , EVPN_MH_RT ) )
vty_out ( vty , " BGP EVPN-MH route debugging is on \n " ) ;
2021-03-01 20:07:28 +01:00
if ( BGP_DEBUG ( bfd , BFD_LIB ) )
vty_out ( vty , " BGP BFD library debugging is on \n " ) ;
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS ;
}
static int bgp_config_write_debug ( struct vty * vty )
{
2015-05-20 03:04:06 +02:00
int write = 0 ;
2002-12-13 21:15:29 +01:00
2008-12-01 20:10:34 +01:00
if ( CONF_BGP_DEBUG ( as4 , AS4 ) ) {
2002-12-13 21:15:29 +01:00
vty_out ( vty , " debug bgp as4 \n " ) ;
write + + ;
}
[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
if ( CONF_BGP_DEBUG ( as4 , AS4_SEGMENT ) ) {
2015-05-20 03:03:47 +02:00
vty_out ( vty , " debug bgp as4 segment \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
write + + ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +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
}
2015-05-20 03:04:06 +02:00
if ( CONF_BGP_DEBUG ( keepalive , KEEPALIVE ) ) {
2015-05-20 02:58:12 +02:00
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
}
2015-05-20 03:04:06 +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
}
2015-05-20 03:04:06 +02:00
if ( CONF_BGP_DEBUG ( nht , NHT ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " debug bgp nht \n " ) ;
2017-07-17 14:03:14 +02:00
write + + ;
}
2015-05-20 03:04:06 +02:00
if ( CONF_BGP_DEBUG ( update_groups , UPDATE_GROUPS ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " debug bgp update-groups \n " ) ;
2017-07-17 14:03:14 +02:00
write + + ;
}
2015-05-20 02:58:12 +02:00
if ( CONF_BGP_DEBUG ( update , UPDATE_PREFIX ) ) {
2015-05-20 03:04:06 +02:00
write + = bgp_debug_list_conf_print ( vty ,
2015-05-20 02:58:12 +02:00
" debug bgp updates prefix " ,
2018-07-31 22:44:45 +02:00
bgp_debug_update_prefixes ) ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 03:04:06 +02:00
if ( CONF_BGP_DEBUG ( update , UPDATE_IN ) ) {
2015-05-20 02:58:12 +02:00
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
}
2015-05-20 02:58:12 +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
if ( CONF_BGP_DEBUG ( zebra , ZEBRA ) ) {
if ( ! bgp_debug_zebra_prefixes
| | list_isempty ( bgp_debug_zebra_prefixes ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " debug bgp zebra \n " ) ;
2017-07-17 14:03:14 +02:00
write + + ;
} else {
2015-05-20 02:58:12 +02:00
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
if ( CONF_BGP_DEBUG ( allow_martians , ALLOW_MARTIANS ) ) {
2017-07-13 17:49:13 +02:00
vty_out ( vty , " debug bgp allow-martians \n " ) ;
2015-05-20 02:58:12 +02:00
write + + ;
2017-07-17 14:03:14 +02:00
}
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 + + ;
}
2020-03-27 15:55:59 +01:00
if ( CONF_BGP_DEBUG ( evpn_mh , EVPN_MH_ES ) ) {
vty_out ( vty , " debug bgp evpn mh es \n " ) ;
write + + ;
}
if ( CONF_BGP_DEBUG ( evpn_mh , EVPN_MH_RT ) ) {
vty_out ( vty , " debug bgp evpn mh route \n " ) ;
write + + ;
}
2021-03-01 20:07:28 +01:00
if ( CONF_BGP_DEBUG ( bfd , BFD_LIB ) ) {
vty_out ( vty , " debug bgp bfd \n " ) ;
write + + ;
}
2015-05-20 02:58:12 +02:00
return write ;
2017-07-17 14:03:14 +02:00
}
2015-05-20 02:58:12 +02:00
2018-09-08 22:31:43 +02:00
static int bgp_config_write_debug ( struct vty * vty ) ;
2018-09-08 21:46:23 +02:00
static struct cmd_node debug_node = {
2018-09-09 00:15:50 +02:00
. name = " debug " ,
2018-09-08 21:46:23 +02:00
. node = DEBUG_NODE ,
. prompt = " " ,
2018-09-08 22:31:43 +02:00
. config_write = bgp_config_write_debug ,
2018-09-08 21:46:23 +02:00
} ;
2017-07-17 14:03:14 +02:00
2005-06-28 14:44:16 +02:00
void bgp_debug_init ( void )
2017-07-17 14:03:14 +02:00
{
2018-09-08 22:31:43 +02:00
install_node ( & debug_node ) ;
2017-07-17 14:03:14 +02:00
2002-12-13 21:15:29 +01:00
install_element ( ENABLE_NODE , & show_debugging_bgp_cmd ) ;
2017-07-17 14:03:14 +02: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
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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
install_element ( ENABLE_NODE , & debug_bgp_neighbor_events_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_neighbor_events_cmd ) ;
2015-05-20 02:40:34 +02:00
install_element ( ENABLE_NODE , & debug_bgp_nht_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_nht_cmd ) ;
2002-12-13 21:15:29 +01:00
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 ) ;
[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
install_element ( ENABLE_NODE , & debug_bgp_zebra_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_zebra_cmd ) ;
2016-05-07 16:35:21 +02:00
install_element ( ENABLE_NODE , & debug_bgp_allow_martians_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_allow_martians_cmd ) ;
2015-05-20 03:03:47 +02:00
install_element ( ENABLE_NODE , & debug_bgp_update_groups_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_update_groups_cmd ) ;
2015-05-20 02:58:12 +02:00
install_element ( ENABLE_NODE , & debug_bgp_bestpath_prefix_cmd ) ;
2015-05-20 03:04:02 +02:00
install_element ( CONFIG_NODE , & debug_bgp_bestpath_prefix_cmd ) ;
2017-07-17 14:03:14 +02:00
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 ) ;
2015-05-20 03:04:06 +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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
/* debug bgp updates (in|out) A.B.C.D */
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
/* debug bgp updates prefix A.B.C.D/M */
2015-05-20 02:58:12 +02:00
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
2015-05-20 03:04:06 +02:00
/* debug bgp zebra prefix A.B.C.D/M */
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-17 14:03:14 +02: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
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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
/* debug bgp neighbor-events A.B.C.D */
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:06 +02:00
/* debug bgp keepalive A.B.C.D */
2015-05-20 02:58:12 +02:00
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 ) ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_neighbor_events_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_neighbor_events_cmd ) ;
2015-05-20 02:40:34 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_nht_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_nht_cmd ) ;
2015-05-20 02:58:12 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_keepalive_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_keepalive_cmd ) ;
2015-05-20 03:04:06 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_update_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_update_cmd ) ;
2015-05-20 02:58:12 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_zebra_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_zebra_cmd ) ;
2016-05-07 16:35:21 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_allow_martians_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_allow_martians_cmd ) ;
2015-05-20 03:03:47 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_update_groups_cmd ) ;
install_element ( CONFIG_NODE , & no_debug_bgp_update_groups_cmd ) ;
2015-05-20 03:04:06 +02:00
install_element ( ENABLE_NODE , & no_debug_bgp_cmd ) ;
2015-05-20 03:04:02 +02:00
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 ) ;
2020-03-27 15:55:59 +01:00
install_element ( ENABLE_NODE , & debug_bgp_evpn_mh_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_evpn_mh_cmd ) ;
2021-03-01 20:07:28 +01:00
/* debug bgp bfd */
install_element ( ENABLE_NODE , & debug_bgp_bfd_cmd ) ;
install_element ( CONFIG_NODE , & debug_bgp_bfd_cmd ) ;
2015-05-20 02:58:12 +02:00
}
/* Return true if this prefix is on the per_prefix_list of prefixes to debug
* for BGP_DEBUG_TYPE
2017-07-17 14:03:14 +02:00
*/
2020-03-23 00:54:38 +01:00
static int bgp_debug_per_prefix ( const struct prefix * p ,
2015-05-20 03:04:21 +02:00
unsigned long term_bgp_debug_type ,
2015-05-20 02:58:12 +02:00
unsigned int BGP_DEBUG_TYPE ,
struct list * per_prefix_list )
2017-07-17 14:03:14 +02:00
{
2015-05-20 02:58:12 +02:00
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
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 ;
2017-07-17 14:03:14 +02:00
else {
if ( ! p )
2015-05-20 02:58:12 +02:00
return 0 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
for ( ALL_LIST_ELEMENTS ( per_prefix_list , node , nnode ,
2017-07-17 14:03:14 +02:00
filter ) )
2015-05-20 02:58:12 +02:00
if ( filter - > p - > prefixlen = = p - > prefixlen
& & prefix_match ( filter - > p , p ) )
return 1 ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
return 0 ;
2017-07-17 14:03:14 +02:00
}
}
2015-05-20 02:58:12 +02:00
return 0 ;
}
/* Return true if this peer is on the per_peer_list of peers to debug
* for BGP_DEBUG_TYPE
*/
2022-05-05 17:31:33 +02:00
static bool 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
{
struct bgp_debug_filter * filter ;
struct listnode * node , * nnode ;
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 ) )
2022-05-05 17:31:33 +02:00
return true ;
2015-05-20 02:58:12 +02:00
else {
2015-05-20 03:04:21 +02:00
if ( ! host )
2022-05-05 17:31:33 +02:00
return false ;
2015-05-20 02:58:12 +02:00
for ( ALL_LIST_ELEMENTS ( per_peer_list , node , nnode ,
filter ) )
2015-05-20 03:04:21 +02:00
if ( strcmp ( filter - > host , host ) = = 0 )
2022-05-05 17:31:33 +02:00
return true ;
2015-05-20 02:58:12 +02:00
2022-05-05 17:31:33 +02:00
return false ;
2015-05-20 02:58:12 +02:00
}
}
2022-05-05 17:31:33 +02:00
return false ;
2015-05-20 02:58:12 +02:00
}
2022-05-05 17:31:33 +02:00
bool bgp_debug_neighbor_events ( const struct peer * peer )
2015-05-20 02:58:12 +02:00
{
2015-05-20 03:04:21 +02:00
char * host = NULL ;
if ( peer )
host = peer - > host ;
2015-05-20 02:58:12 +02:00
return bgp_debug_per_peer ( host , term_bgp_debug_neighbor_events ,
BGP_DEBUG_NEIGHBOR_EVENTS ,
bgp_debug_neighbor_events_peers ) ;
}
2022-05-05 17:31:33 +02:00
bool bgp_debug_keepalive ( const struct peer * peer )
2015-05-20 02:58:12 +02:00
{
2015-05-20 03:04:21 +02:00
char * host = NULL ;
if ( peer )
host = peer - > host ;
return bgp_debug_per_peer ( host , term_bgp_debug_keepalive ,
2015-05-20 02:58:12 +02:00
BGP_DEBUG_KEEPALIVE ,
bgp_debug_keepalive_peers ) ;
}
2022-05-05 17:31:33 +02:00
bool bgp_debug_update ( const struct peer * peer , const struct prefix * p ,
2020-03-20 10:57:54 +01:00
struct update_group * updgrp , unsigned int inbound )
2015-05-20 02:58:12 +02:00
{
2015-05-20 03:04:21 +02:00
char * host = NULL ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:04:21 +02:00
if ( peer )
host = peer - > host ;
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( inbound ) {
2015-05-20 03:04:21 +02:00
if ( bgp_debug_per_peer ( host , term_bgp_debug_update ,
BGP_DEBUG_UPDATE_IN ,
2015-05-20 02:58:12 +02:00
bgp_debug_update_in_peers ) )
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
/* outbound */
else {
2015-05-20 03:04:21 +02:00
if ( bgp_debug_per_peer ( host , term_bgp_debug_update ,
2015-05-20 02:58:12 +02:00
BGP_DEBUG_UPDATE_OUT ,
bgp_debug_update_out_peers ) )
2020-03-20 10:57:54 +01:00
return true ;
2017-07-17 14:03:14 +02:00
2015-05-20 03:03:47 +02:00
/* Check if update debugging implicitly enabled for the group.
*/
if ( updgrp & & UPDGRP_DBG_ON ( updgrp ) )
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2015-05-20 02:58:12 +02:00
if ( BGP_DEBUG ( update , UPDATE_PREFIX ) ) {
if ( bgp_debug_per_prefix ( p , term_bgp_debug_update ,
BGP_DEBUG_UPDATE_PREFIX ,
bgp_debug_update_prefixes ) )
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2020-03-20 10:57:54 +01:00
return false ;
2015-05-20 02:58:12 +02:00
}
2020-03-27 00:11:58 +01:00
bool bgp_debug_bestpath ( struct bgp_dest * dest )
2015-05-20 03:04:02 +02:00
{
if ( BGP_DEBUG ( bestpath , BESTPATH ) ) {
2020-03-21 22:36:48 +01:00
if ( bgp_debug_per_prefix (
2020-03-27 00:11:58 +01:00
bgp_dest_get_prefix ( dest ) , term_bgp_debug_bestpath ,
2020-03-21 22:36:48 +01:00
BGP_DEBUG_BESTPATH , bgp_debug_bestpath_prefixes ) )
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 03:04:02 +02:00
}
2017-07-17 14:03:14 +02:00
2020-03-20 10:57:54 +01:00
return false ;
2015-05-20 03:04:02 +02:00
}
2020-03-23 00:54:38 +01:00
bool bgp_debug_zebra ( const struct prefix * p )
2015-05-20 02:58:12 +02:00
{
if ( BGP_DEBUG ( zebra , ZEBRA ) ) {
if ( bgp_debug_per_prefix ( p , term_bgp_debug_zebra ,
BGP_DEBUG_ZEBRA ,
bgp_debug_zebra_prefixes ) )
2020-03-20 10:57:54 +01:00
return true ;
2015-05-20 02:58:12 +02:00
}
2017-07-17 14:03:14 +02:00
2020-03-20 10:57:54 +01:00
return false ;
2002-12-13 21:15:29 +01:00
}
2016-08-10 01:02:03 +02:00
2017-05-15 23:52:17 +02:00
const char * bgp_debug_rdpfxpath2str ( afi_t afi , safi_t safi ,
2020-03-24 12:58:08 +01:00
const struct prefix_rd * prd ,
2017-05-15 23:52:17 +02:00
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 ,
2021-01-11 03:32:34 +01:00
struct bgp_route_evpn * overlay_index ,
2017-11-21 11:42:05 +01:00
char * str , int size )
2016-08-10 01:02:03 +02:00
{
char rd_buf [ RD_ADDRSTRLEN ] ;
2017-05-15 23:52:17 +02:00
char tag_buf [ 30 ] ;
2021-01-11 03:32:34 +01:00
char overlay_index_buf [ INET6_ADDRSTRLEN + 14 ] ;
const struct prefix_evpn * evp ;
2017-06-02 22:53:37 +02:00
/* ' with addpath ID ' 17
* max strlen of uint32 + 10
* + / - ( just in case ) + 1
* null terminator + 1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = 29 */
char pathid_buf [ 30 ] ;
2017-07-17 14:03:14 +02:00
2016-08-10 01:02:03 +02:00
if ( size < BGP_PRD_PATH_STRLEN )
return NULL ;
2017-07-17 14:03:14 +02:00
2016-08-10 01:02:03 +02:00
/* Note: Path-id is created by default, but only included in update
* sometimes . */
pathid_buf [ 0 ] = ' \0 ' ;
if ( addpath_valid )
2017-06-02 22:53:37 +02:00
snprintf ( pathid_buf , sizeof ( pathid_buf ) , " with addpath ID %u " ,
addpath_id ) ;
2017-07-17 14:03:14 +02:00
2021-01-11 03:32:34 +01:00
overlay_index_buf [ 0 ] = ' \0 ' ;
if ( overlay_index & & overlay_index - > type = = OVERLAY_INDEX_GATEWAY_IP ) {
char obuf [ INET6_ADDRSTRLEN ] ;
obuf [ 0 ] = ' \0 ' ;
evp = pu . evp ;
if ( is_evpn_prefix_ipaddr_v4 ( evp ) )
inet_ntop ( AF_INET , & overlay_index - > gw_ip , obuf ,
sizeof ( obuf ) ) ;
else if ( is_evpn_prefix_ipaddr_v6 ( evp ) )
inet_ntop ( AF_INET6 , & overlay_index - > gw_ip , obuf ,
sizeof ( obuf ) ) ;
snprintf ( overlay_index_buf , sizeof ( overlay_index_buf ) ,
" gateway IP %s " , obuf ) ;
}
2017-05-15 23:52:17 +02:00
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 ) ;
2020-04-20 20:12:38 +02:00
snprintf ( tag_buf , sizeof ( tag_buf ) , " label %s " ,
tag_buf2 ) ;
2017-11-21 11:42:05 +01:00
} 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 ) ;
2020-04-20 20:12:38 +02:00
snprintf ( tag_buf , sizeof ( tag_buf ) , " label %u " ,
label_value ) ;
2017-11-21 11:42:05 +01:00
}
2017-05-15 23:52:17 +02:00
}
2017-07-17 14:03:14 +02:00
2016-08-10 01:02:03 +02:00
if ( prd )
2021-01-11 03:32:34 +01:00
snprintfrr ( str , size , " RD %s %pFX%s%s%s %s %s " ,
2020-10-18 13:33:54 +02:00
prefix_rd2str ( prd , rd_buf , sizeof ( rd_buf ) ) , pu . p ,
2021-01-11 03:32:34 +01:00
overlay_index_buf , tag_buf , 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 ,
2019-10-14 18:02:22 +02:00
NLRI_STRING_FORMAT_DEBUG , NULL ,
family2afi ( fs - > prefix . family ) ) ;
2018-02-20 10:58:42 +01:00
snprintf ( str , size , " FS %s Match{%s} " , afi2str ( afi ) ,
return_string ) ;
} else
2020-10-18 13:33:54 +02:00
snprintfrr ( str , size , " %pFX%s%s %s %s " , pu . p , tag_buf ,
pathid_buf , afi2str ( afi ) , safi2str ( safi ) ) ;
2017-07-17 14:03:14 +02:00
2016-08-10 01:02:03 +02:00
return str ;
}