diff options
104 files changed, 11707 insertions, 1034 deletions
diff --git a/bfdd/bfd.c b/bfdd/bfd.c index fade89d04f..8d5306aaaf 100644 --- a/bfdd/bfd.c +++ b/bfdd/bfd.c @@ -79,6 +79,7 @@ static void bfd_profile_set_default(struct bfd_profile *bp) bp->detection_multiplier = BFD_DEFDETECTMULT; bp->echo_mode = false; bp->passive = false; + bp->log_session_changes = false; bp->minimum_ttl = BFD_DEF_MHOP_TTL; bp->min_echo_rx = BFD_DEF_REQ_MIN_ECHO_RX; bp->min_echo_tx = BFD_DEF_DES_MIN_ECHO_TX; @@ -210,6 +211,12 @@ void bfd_session_apply(struct bfd_session *bs) else bfd_set_shutdown(bs, bs->peer_profile.admin_shutdown); + /* Toggle 'no log-session-changes' if default value. */ + if (bs->peer_profile.log_session_changes == false) + bfd_set_log_session_changes(bs, bp->log_session_changes); + else + bfd_set_log_session_changes(bs, bs->peer_profile.log_session_changes); + /* If session interval changed negotiate new timers. */ if (bs->ses_state == PTM_BFD_UP && (bs->timers.desired_min_tx != min_tx @@ -574,6 +581,9 @@ void ptm_bfd_sess_up(struct bfd_session *bfd) zlog_debug("state-change: [%s] %s -> %s", bs_to_string(bfd), state_list[old_state].str, state_list[bfd->ses_state].str); + if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES)) + zlog_notice("Session-Change: [%s] %s -> %s", bs_to_string(bfd), + state_list[old_state].str, state_list[bfd->ses_state].str); } } @@ -621,6 +631,11 @@ void ptm_bfd_sess_dn(struct bfd_session *bfd, uint8_t diag) bs_to_string(bfd), state_list[old_state].str, state_list[bfd->ses_state].str, get_diag_str(bfd->local_diag)); + if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) && + old_state == PTM_BFD_UP) + zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd), + state_list[old_state].str, state_list[bfd->ses_state].str, + get_diag_str(bfd->local_diag)); } /* clear peer's mac address */ @@ -651,6 +666,9 @@ void ptm_sbfd_sess_up(struct bfd_session *bfd) if (bglobal.debug_peer_event) zlog_info("state-change: [%s] %s -> %s", bs_to_string(bfd), state_list[old_state].str, state_list[bfd->ses_state].str); + if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES)) + zlog_notice("Session-Change: [%s] %s -> %s", bs_to_string(bfd), + state_list[old_state].str, state_list[bfd->ses_state].str); } } @@ -693,6 +711,11 @@ void ptm_sbfd_init_sess_dn(struct bfd_session *bfd, uint8_t diag) zlog_debug("state-change: [%s] %s -> %s reason:%s", bs_to_string(bfd), state_list[old_state].str, state_list[bfd->ses_state].str, get_diag_str(bfd->local_diag)); + if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) && + old_state == PTM_BFD_UP) + zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd), + state_list[old_state].str, state_list[bfd->ses_state].str, + get_diag_str(bfd->local_diag)); } /* reset local address ,it might has been be changed after bfd is up*/ //memset(&bfd->local_address, 0, sizeof(bfd->local_address)); @@ -721,6 +744,11 @@ void ptm_sbfd_echo_sess_dn(struct bfd_session *bfd, uint8_t diag) zlog_warn("state-change: [%s] %s -> %s reason:%s", bs_to_string(bfd), state_list[old_state].str, state_list[bfd->ses_state].str, get_diag_str(bfd->local_diag)); + if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) && + old_state == PTM_BFD_UP) + zlog_notice("Session-Change: [%s] %s -> %s reason:%s", bs_to_string(bfd), + state_list[old_state].str, state_list[bfd->ses_state].str, + get_diag_str(bfd->local_diag)); } } @@ -944,6 +972,11 @@ static void _bfd_session_update(struct bfd_session *bs, bs->peer_profile.echo_mode = bpc->bpc_echo; bfd_set_echo(bs, bpc->bpc_echo); + if (bpc->bpc_log_session_changes) + SET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES); + else + UNSET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES); + /* * Shutdown needs to be the last in order to avoid timers enable when * the session is disabled. @@ -1608,6 +1641,14 @@ void bfd_set_passive_mode(struct bfd_session *bs, bool passive) } } +void bfd_set_log_session_changes(struct bfd_session *bs, bool log_session_changes) +{ + if (log_session_changes) + SET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES); + else + UNSET_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES); +} + /* * Helper functions. */ diff --git a/bfdd/bfd.h b/bfdd/bfd.h index 645a76596f..75efb483fe 100644 --- a/bfdd/bfd.h +++ b/bfdd/bfd.h @@ -84,6 +84,7 @@ struct bfd_peer_cfg { bool bpc_cbit; bool bpc_passive; + bool bpc_log_session_changes; bool bpc_has_profile; char bpc_profile[64]; @@ -224,21 +225,22 @@ enum bfd_diagnosticis { /* BFD session flags */ enum bfd_session_flags { BFD_SESS_FLAG_NONE = 0, - BFD_SESS_FLAG_ECHO = 1 << 0, /* BFD Echo functionality */ - BFD_SESS_FLAG_ECHO_ACTIVE = 1 << 1, /* BFD Echo Packets are being sent + BFD_SESS_FLAG_ECHO = 1 << 0, /* BFD Echo functionality */ + BFD_SESS_FLAG_ECHO_ACTIVE = 1 << 1, /* BFD Echo Packets are being sent * actively */ - BFD_SESS_FLAG_MH = 1 << 2, /* BFD Multi-hop session */ - BFD_SESS_FLAG_IPV6 = 1 << 4, /* BFD IPv6 session */ - BFD_SESS_FLAG_SEND_EVT_ACTIVE = 1 << 5, /* send event timer active */ - BFD_SESS_FLAG_SEND_EVT_IGNORE = 1 << 6, /* ignore send event when timer + BFD_SESS_FLAG_MH = 1 << 2, /* BFD Multi-hop session */ + BFD_SESS_FLAG_IPV6 = 1 << 4, /* BFD IPv6 session */ + BFD_SESS_FLAG_SEND_EVT_ACTIVE = 1 << 5, /* send event timer active */ + BFD_SESS_FLAG_SEND_EVT_IGNORE = 1 << 6, /* ignore send event when timer * expires */ - BFD_SESS_FLAG_SHUTDOWN = 1 << 7, /* disable BGP peer function */ - BFD_SESS_FLAG_CONFIG = 1 << 8, /* Session configured with bfd NB API */ - BFD_SESS_FLAG_CBIT = 1 << 9, /* CBIT is set */ - BFD_SESS_FLAG_PASSIVE = 1 << 10, /* Passive mode */ - BFD_SESS_FLAG_MAC_SET = 1 << 11, /* MAC of peer known */ + BFD_SESS_FLAG_SHUTDOWN = 1 << 7, /* disable BGP peer function */ + BFD_SESS_FLAG_CONFIG = 1 << 8, /* Session configured with bfd NB API */ + BFD_SESS_FLAG_CBIT = 1 << 9, /* CBIT is set */ + BFD_SESS_FLAG_PASSIVE = 1 << 10, /* Passive mode */ + BFD_SESS_FLAG_MAC_SET = 1 << 11, /* MAC of peer known */ + BFD_SESS_FLAG_LOG_SESSION_CHANGES = 1 << 12, /* Log session changes */ }; enum bfd_mode_type { @@ -297,6 +299,8 @@ struct bfd_profile { bool admin_shutdown; /** Passive mode. */ bool passive; + /** Log session changes. */ + bool log_session_changes; /** Minimum expected TTL value. */ uint8_t minimum_ttl; @@ -683,6 +687,14 @@ void bfd_set_shutdown(struct bfd_session *bs, bool shutdown); void bfd_set_passive_mode(struct bfd_session *bs, bool passive); /** + * Set the BFD session to log or not log session changes. + * + * \param bs the BFD session. + * \param log_session indicates whether or not to log session changes. + */ +void bfd_set_log_session_changes(struct bfd_session *bs, bool log_session); + +/** * Picks the BFD session configuration from the appropriated source: * if using the default peer configuration prefer profile (if it exists), * otherwise use session. diff --git a/bfdd/bfdd_cli.c b/bfdd/bfdd_cli.c index a1710ec127..016e63b192 100644 --- a/bfdd/bfdd_cli.c +++ b/bfdd/bfdd_cli.c @@ -754,6 +754,21 @@ void bfd_cli_show_passive(struct vty *vty, const struct lyd_node *dnode, yang_dnode_get_bool(dnode, NULL) ? "" : "no "); } +DEFPY_YANG(bfd_peer_log_session_changes, bfd_peer_log_session_changes_cmd, + "[no] log-session-changes", + NO_STR + "Log Up/Down changes for the session\n") +{ + nb_cli_enqueue_change(vty, "./log-session-changes", NB_OP_MODIFY, no ? "false" : "true"); + return nb_cli_apply_changes(vty, NULL); +} + +void bfd_cli_show_log_session_changes(struct vty *vty, const struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " %slog-session-changes\n", yang_dnode_get_bool(dnode, NULL) ? "" : "no "); +} + DEFPY_YANG( bfd_peer_minimum_ttl, bfd_peer_minimum_ttl_cmd, "[no] minimum-ttl (1-254)$ttl", @@ -1063,6 +1078,9 @@ ALIAS_YANG(bfd_peer_passive, bfd_profile_passive_cmd, NO_STR "Don't attempt to start sessions\n") +ALIAS_YANG(bfd_peer_log_session_changes, bfd_profile_log_session_changes_cmd, + "[no] log-session-changes", NO_STR "Log Up/Down session changes in the profile\n") + ALIAS_YANG(bfd_peer_minimum_ttl, bfd_profile_minimum_ttl_cmd, "[no] minimum-ttl (1-254)$ttl", NO_STR @@ -1329,6 +1347,7 @@ bfdd_cli_init(void) install_element(BFD_PEER_NODE, &bfd_peer_echo_receive_interval_cmd); install_element(BFD_PEER_NODE, &bfd_peer_profile_cmd); install_element(BFD_PEER_NODE, &bfd_peer_passive_cmd); + install_element(BFD_PEER_NODE, &bfd_peer_log_session_changes_cmd); install_element(BFD_PEER_NODE, &bfd_peer_minimum_ttl_cmd); install_element(BFD_PEER_NODE, &no_bfd_peer_minimum_ttl_cmd); @@ -1350,6 +1369,7 @@ bfdd_cli_init(void) install_element(BFD_PROFILE_NODE, &bfd_profile_echo_transmit_interval_cmd); install_element(BFD_PROFILE_NODE, &bfd_profile_echo_receive_interval_cmd); install_element(BFD_PROFILE_NODE, &bfd_profile_passive_cmd); + install_element(BFD_PROFILE_NODE, &bfd_profile_log_session_changes_cmd); install_element(BFD_PROFILE_NODE, &bfd_profile_minimum_ttl_cmd); install_element(BFD_PROFILE_NODE, &no_bfd_profile_minimum_ttl_cmd); } diff --git a/bfdd/bfdd_nb.c b/bfdd/bfdd_nb.c index f60d8397bb..7595d8d05e 100644 --- a/bfdd/bfdd_nb.c +++ b/bfdd/bfdd_nb.c @@ -70,6 +70,13 @@ const struct frr_yang_module_info frr_bfdd_info = { .cli_show = bfd_cli_show_passive, } }, + { + .xpath = "/frr-bfdd:bfdd/bfd/profile/log-session-changes", + .cbs = { + .modify = bfdd_bfd_profile_log_session_changes_modify, + .cli_show = bfd_cli_show_log_session_changes, + } + }, { .xpath = "/frr-bfdd:bfdd/bfd/profile/minimum-ttl", .cbs = { @@ -161,6 +168,13 @@ const struct frr_yang_module_info frr_bfdd_info = { } }, { + .xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/log-session-changes", + .cbs = { + .modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify, + .cli_show = bfd_cli_show_log_session_changes, + } + }, + { .xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/echo-mode", .cbs = { .modify = bfdd_bfd_sessions_single_hop_echo_mode_modify, @@ -357,6 +371,13 @@ const struct frr_yang_module_info frr_bfdd_info = { } }, { + .xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/log-session-changes", + .cbs = { + .modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify, + .cli_show = bfd_cli_show_log_session_changes, + } + }, + { .xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/minimum-ttl", .cbs = { .modify = bfdd_bfd_sessions_multi_hop_minimum_ttl_modify, @@ -573,6 +594,13 @@ const struct frr_yang_module_info frr_bfdd_info = { } }, { + .xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-echo/log-session-changes", + .cbs = { + .modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify, + .cli_show = bfd_cli_show_log_session_changes, + } + }, + { .xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-echo/bfd-mode", .cbs = { .modify = bfdd_bfd_sessions_bfd_mode_modify, @@ -789,6 +817,13 @@ const struct frr_yang_module_info frr_bfdd_info = { } }, { + .xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-init/log-session-changes", + .cbs = { + .modify = bfdd_bfd_sessions_single_hop_log_session_changes_modify, + .cli_show = bfd_cli_show_log_session_changes, + } + }, + { .xpath = "/frr-bfdd:bfdd/bfd/sessions/sbfd-init/bfd-mode", .cbs = { .modify = bfdd_bfd_sessions_bfd_mode_modify, diff --git a/bfdd/bfdd_nb.h b/bfdd/bfdd_nb.h index 6621973ae3..ce6ee0d002 100644 --- a/bfdd/bfdd_nb.h +++ b/bfdd/bfdd_nb.h @@ -24,6 +24,7 @@ int bfdd_bfd_profile_required_receive_interval_modify( struct nb_cb_modify_args *args); int bfdd_bfd_profile_administrative_down_modify(struct nb_cb_modify_args *args); int bfdd_bfd_profile_passive_mode_modify(struct nb_cb_modify_args *args); +int bfdd_bfd_profile_log_session_changes_modify(struct nb_cb_modify_args *args); int bfdd_bfd_profile_minimum_ttl_modify(struct nb_cb_modify_args *args); int bfdd_bfd_profile_echo_mode_modify(struct nb_cb_modify_args *args); int bfdd_bfd_profile_desired_echo_transmission_interval_modify( @@ -54,6 +55,7 @@ int bfdd_bfd_sessions_single_hop_administrative_down_modify( struct nb_cb_modify_args *args); int bfdd_bfd_sessions_single_hop_passive_mode_modify( struct nb_cb_modify_args *args); +int bfdd_bfd_sessions_single_hop_log_session_changes_modify(struct nb_cb_modify_args *args); int bfdd_bfd_sessions_single_hop_echo_mode_modify( struct nb_cb_modify_args *args); int bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify( @@ -229,6 +231,8 @@ void bfd_cli_peer_profile_show(struct vty *vty, const struct lyd_node *dnode, bool show_defaults); void bfd_cli_show_passive(struct vty *vty, const struct lyd_node *dnode, bool show_defaults); +void bfd_cli_show_log_session_changes(struct vty *vty, const struct lyd_node *dnode, + bool show_defaults); void bfd_cli_show_minimum_ttl(struct vty *vty, const struct lyd_node *dnode, bool show_defaults); diff --git a/bfdd/bfdd_nb_config.c b/bfdd/bfdd_nb_config.c index f553d56652..e2d7f5061d 100644 --- a/bfdd/bfdd_nb_config.c +++ b/bfdd/bfdd_nb_config.c @@ -596,6 +596,23 @@ int bfdd_bfd_profile_passive_mode_modify(struct nb_cb_modify_args *args) } /* + * XPath: /frr-bfdd:bfdd/bfd/profile/log-session-changes + */ +int bfdd_bfd_profile_log_session_changes_modify(struct nb_cb_modify_args *args) +{ + struct bfd_profile *bp; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + bp = nb_running_get_entry(args->dnode, NULL, true); + bp->log_session_changes = yang_dnode_get_bool(args->dnode, NULL); + bfd_profile_update(bp); + + return NB_OK; +} + +/* * XPath: /frr-bfdd:bfdd/bfd/profile/minimum-ttl */ int bfdd_bfd_profile_minimum_ttl_modify(struct nb_cb_modify_args *args) @@ -904,6 +921,38 @@ int bfdd_bfd_sessions_single_hop_passive_mode_modify( } /* + * XPath: /frr-bfdd:bfdd/bfd/sessions/single-hop/log-session-changes + * /frr-bfdd:bfdd/bfd/sessions/multi-hop/log-session-changes + * /frr-bfdd:bfdd/bfd/sessions/sbfd_echo/log-session-changes + * /frr-bfdd:bfdd/bfd/sessions/sbfd_init/log-session-changes + */ +int bfdd_bfd_sessions_single_hop_log_session_changes_modify(struct nb_cb_modify_args *args) +{ + struct bfd_session *bs; + bool log_session_changes; + + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + return NB_OK; + + case NB_EV_APPLY: + break; + + case NB_EV_ABORT: + return NB_OK; + } + + log_session_changes = yang_dnode_get_bool(args->dnode, NULL); + + bs = nb_running_get_entry(args->dnode, NULL, true); + bs->peer_profile.log_session_changes = log_session_changes; + bfd_session_apply(bs); + + return NB_OK; +} + +/* * XPath: /frr-bfdd:bfdd/bfd/sessions/sbfd-init/bfd-mode * /frr-bfdd:bfdd/bfd/sessions/sbfd-echo/bfd-mode */ diff --git a/bfdd/bfdd_vty.c b/bfdd/bfdd_vty.c index c281197849..32e3bc27c0 100644 --- a/bfdd/bfdd_vty.c +++ b/bfdd/bfdd_vty.c @@ -164,9 +164,10 @@ static void _display_peer(struct vty *vty, struct bfd_session *bs) vty_out(vty, "\t\tPassive mode\n"); else vty_out(vty, "\t\tActive mode\n"); + if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES)) + vty_out(vty, "\t\tLog session changes\n"); if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)) vty_out(vty, "\t\tMinimum TTL: %d\n", bs->mh_ttl); - vty_out(vty, "\t\tStatus: "); switch (bs->ses_state) { case PTM_BFD_ADM_DOWN: @@ -289,6 +290,8 @@ static struct json_object *__display_peer_json(struct bfd_session *bs) json_object_int_add(jo, "remote-id", bs->discrs.remote_discr); json_object_boolean_add(jo, "passive-mode", CHECK_FLAG(bs->flags, BFD_SESS_FLAG_PASSIVE)); + json_object_boolean_add(jo, "log-session-changes", + CHECK_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES)); if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)) json_object_int_add(jo, "minimum-ttl", bs->mh_ttl); @@ -1194,6 +1197,7 @@ static int bfd_configure_peer(struct bfd_peer_cfg *bpc, bool mhop, /* Defaults */ bpc->bpc_shutdown = false; + bpc->bpc_log_session_changes = false; bpc->bpc_detectmultiplier = BPC_DEF_DETECTMULTIPLIER; bpc->bpc_recvinterval = BPC_DEF_RECEIVEINTERVAL; bpc->bpc_txinterval = BPC_DEF_TRANSMITINTERVAL; diff --git a/bfdd/dplane.c b/bfdd/dplane.c index b1a32fb150..7269b319a3 100644 --- a/bfdd/dplane.c +++ b/bfdd/dplane.c @@ -384,10 +384,15 @@ bfd_dplane_session_state_change(struct bfd_dplane_ctx *bdc, break; } - if (bglobal.debug_peer_event) + if (bglobal.debug_peer_event) { zlog_debug("state-change: [data plane: %s] %s -> %s", bs_to_string(bs), state_list[old_state].str, state_list[bs->ses_state].str); + if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_LOG_SESSION_CHANGES) && + old_state != bs->ses_state) + zlog_notice("Session-Change: [data plane: %s] %s -> %s", bs_to_string(bs), + state_list[old_state].str, state_list[bs->ses_state].str); + } } /** diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c index a86b42e250..d626e3badf 100644 --- a/bgpd/bgp_aspath.c +++ b/bgpd/bgp_aspath.c @@ -424,8 +424,12 @@ static unsigned int aspath_count_hops_internal(const struct aspath *aspath) /* Check if aspath has AS_SET or AS_CONFED_SET */ bool aspath_check_as_sets(struct aspath *aspath) { - struct assegment *seg = aspath->segments; + struct assegment *seg; + if (!aspath || !aspath->segments) + return false; + + seg = aspath->segments; while (seg) { if (seg->type == AS_SET || seg->type == AS_CONFED_SET) return true; @@ -2512,3 +2516,39 @@ void bgp_remove_aspath_from_aggregate_hash(struct bgp_aggregate *aggregate, } } +struct aspath *aspath_delete_as_set_seq(struct aspath *aspath) +{ + struct assegment *seg, *prev, *next; + bool removed = false; + + if (!(aspath && aspath->segments)) + return aspath; + + seg = aspath->segments; + next = NULL; + prev = NULL; + + while (seg) { + next = seg->next; + + if (seg->type == AS_SET || seg->type == AS_CONFED_SET) { + if (aspath->segments == seg) + aspath->segments = seg->next; + else + prev->next = seg->next; + + assegment_free(seg); + removed = true; + } else + prev = seg; + + seg = next; + } + + if (removed) { + aspath_str_update(aspath, false); + aspath->count = aspath_count_hops_internal(aspath); + } + + return aspath; +} diff --git a/bgpd/bgp_aspath.h b/bgpd/bgp_aspath.h index 46202fd34a..295837b137 100644 --- a/bgpd/bgp_aspath.h +++ b/bgpd/bgp_aspath.h @@ -168,5 +168,6 @@ extern void bgp_remove_aspath_from_aggregate_hash( struct aspath *aspath); extern void bgp_aggr_aspath_remove(void *arg); +extern struct aspath *aspath_delete_as_set_seq(struct aspath *aspath); #endif /* _QUAGGA_BGP_ASPATH_H */ diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index c7a4c6928a..764b6b8716 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -472,7 +472,8 @@ static void bgp_start_timer(struct event *thread) struct peer *peer = connection->peer; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Timer (start timer expire).", peer->host); + zlog_debug("%s [FSM] Timer (start timer expire for %s).", peer->host, + bgp_peer_get_connection_direction(connection)); EVENT_VAL(thread) = BGP_Start; bgp_event(thread); /* bgp_event unlocks peer */ @@ -491,8 +492,8 @@ static void bgp_connect_timer(struct event *thread) assert(!connection->t_read); if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Timer (connect timer (%us) expire)", peer->host, - peer->v_connect); + zlog_debug("%s [FSM] Timer (connect timer (%us) expire for %s)", peer->host, + peer->v_connect, bgp_peer_get_connection_direction(connection)); if (CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) bgp_stop(connection); @@ -512,8 +513,8 @@ static void bgp_holdtime_timer(struct event *thread) struct peer *peer = connection->peer; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Timer (holdtime timer expire)", - peer->host); + zlog_debug("%s [FSM] Timer (holdtime timer expire for %s)", peer->host, + bgp_peer_get_connection_direction(connection)); /* * Given that we do not have any expectation of ordering @@ -542,7 +543,8 @@ void bgp_routeadv_timer(struct event *thread) struct peer *peer = connection->peer; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Timer (routeadv timer expire)", peer->host); + zlog_debug("%s [FSM] Timer (routeadv timer expire for %s)", peer->host, + bgp_peer_get_connection_direction(connection)); peer->synctime = monotime(NULL); @@ -561,8 +563,8 @@ void bgp_delayopen_timer(struct event *thread) struct peer *peer = connection->peer; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Timer (DelayOpentimer expire)", - peer->host); + zlog_debug("%s [FSM] Timer (DelayOpentimer expire for %s)", peer->host, + bgp_peer_get_connection_direction(connection)); EVENT_VAL(thread) = DelayOpen_timer_expired; bgp_event(thread); /* bgp_event unlocks peer */ @@ -628,8 +630,8 @@ static void bgp_graceful_restart_timer_off(struct peer_connection *connection, if (peer_dynamic_neighbor(peer) && !(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE))) { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s (dynamic neighbor) deleted (%s)", - peer->host, __func__); + zlog_debug("%s (dynamic neighbor) deleted (%s) for %s", __func__, + peer->host, bgp_peer_get_connection_direction(connection)); peer_delete(peer); } @@ -654,8 +656,9 @@ static void bgp_llgr_stale_timer_expire(struct event *thread) * stale routes from the neighbor that it is retaining. */ if (bgp_debug_neighbor_events(peer)) - zlog_debug("%pBP Long-lived stale timer (%s) expired", peer, - get_afi_safi_str(afi, safi, false)); + zlog_debug("%pBP Long-lived stale timer (%s) expired for %s", peer, + get_afi_safi_str(afi, safi, false), + bgp_peer_get_connection_direction(peer->connection)); UNSET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_LLGR_WAIT); @@ -753,11 +756,9 @@ static void bgp_graceful_restart_timer_expire(struct event *thread) afi_t afi; safi_t safi; - if (bgp_debug_neighbor_events(peer)) { - zlog_debug("%pBP graceful restart timer expired", peer); - zlog_debug("%pBP graceful restart stalepath timer stopped", - peer); - } + if (bgp_debug_neighbor_events(peer)) + zlog_debug("%pBP graceful restart timer expired and graceful restart stalepath timer stopped for %s", + peer, bgp_peer_get_connection_direction(connection)); FOREACH_AFI_SAFI (afi, safi) { if (!peer->nsf[afi][safi]) @@ -781,11 +782,10 @@ static void bgp_graceful_restart_timer_expire(struct event *thread) continue; if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%pBP Long-lived stale timer (%s) started for %d sec", - peer, - get_afi_safi_str(afi, safi, false), - peer->llgr[afi][safi].stale_time); + zlog_debug("%pBP Long-lived stale timer (%s) started for %d sec for %s", + peer, get_afi_safi_str(afi, safi, false), + peer->llgr[afi][safi].stale_time, + bgp_peer_get_connection_direction(connection)); SET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_LLGR_WAIT); @@ -816,8 +816,8 @@ static void bgp_graceful_stale_timer_expire(struct event *thread) safi_t safi; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%pBP graceful restart stalepath timer expired", - peer); + zlog_debug("%pBP graceful restart stalepath timer expired for %s", peer, + bgp_peer_get_connection_direction(connection)); /* NSF delete stale route */ FOREACH_AFI_SAFI_NSF (afi, safi) @@ -1242,10 +1242,10 @@ void bgp_fsm_change_status(struct peer_connection *connection, if (bgp_debug_neighbor_events(peer)) { struct vrf *vrf = vrf_lookup_by_id(bgp->vrf_id); - zlog_debug("%s : vrf %s(%u), Status: %s established_peers %u", __func__, + zlog_debug("%s : vrf %s(%u), Status: %s established_peers %u for %s", __func__, vrf ? vrf->name : "Unknown", bgp->vrf_id, - lookup_msg(bgp_status_msg, status, NULL), - bgp->established_peers); + lookup_msg(bgp_status_msg, status, NULL), bgp->established_peers, + bgp_peer_get_connection_direction(connection)); } /* Set to router ID to the value provided by RIB if there are no peers @@ -1322,10 +1322,10 @@ void bgp_fsm_change_status(struct peer_connection *connection, bgp_update_delay_process_status_change(peer); if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s fd %d went from %s to %s", peer->host, - connection->fd, + zlog_debug("%s fd %d went from %s to %s for %s", peer->host, connection->fd, lookup_msg(bgp_status_msg, connection->ostatus, NULL), - lookup_msg(bgp_status_msg, connection->status, NULL)); + lookup_msg(bgp_status_msg, connection->status, NULL), + bgp_peer_get_connection_direction(connection)); } /* Flush the event queue and ensure the peer is shut down */ @@ -1357,8 +1357,8 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) if (peer_dynamic_neighbor_no_nsf(peer) && !(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE))) { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s (dynamic neighbor) deleted (%s)", - peer->host, __func__); + zlog_debug("%s (dynamic neighbor) deleted (%s) for %s", __func__, + peer->host, bgp_peer_get_connection_direction(connection)); peer_delete(peer); return BGP_FSM_FAILURE_AND_DELETE; } @@ -1399,18 +1399,17 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) if (connection->t_gr_stale) { EVENT_OFF(connection->t_gr_stale); if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%pBP graceful restart stalepath timer stopped", - peer); + zlog_debug("%pBP graceful restart stalepath timer stopped for %s", + peer, bgp_peer_get_connection_direction(connection)); } if (CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) { if (bgp_debug_neighbor_events(peer)) { - zlog_debug( - "%pBP graceful restart timer started for %d sec", - peer, peer->v_gr_restart); - zlog_debug( - "%pBP graceful restart stalepath timer started for %d sec", - peer, peer->bgp->stalepath_time); + zlog_debug("%pBP graceful restart timer started for %d sec for %s", + peer, peer->v_gr_restart, + bgp_peer_get_connection_direction(connection)); + zlog_debug("%pBP graceful restart stalepath timer started for %d sec for %s", + peer, peer->bgp->stalepath_time, + bgp_peer_get_connection_direction(connection)); } BGP_TIMER_ON(connection->t_gr_restart, bgp_graceful_restart_timer_expire, @@ -1430,9 +1429,8 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) EVENT_OFF(peer->t_refresh_stalepath); if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%pBP route-refresh restart stalepath timer stopped", - peer); + zlog_debug("%pBP route-refresh restart stalepath timer stopped for %s", + peer, bgp_peer_get_connection_direction(connection)); } /* If peer reset before receiving EOR, decrement EOR count and @@ -1454,9 +1452,9 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) gr_info->eor_required--; if (BGP_DEBUG(update, UPDATE_OUT)) - zlog_debug("peer %s, EOR_required %d", - peer->host, - gr_info->eor_required); + zlog_debug("peer %s, EOR_required %d for %s", peer->host, + gr_info->eor_required, + bgp_peer_get_connection_direction(connection)); /* There is no pending EOR message */ if (gr_info->eor_required == 0) { @@ -1475,8 +1473,8 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) peer->resettime = peer->uptime = monotime(NULL); if (BGP_DEBUG(update_groups, UPDATE_GROUPS)) - zlog_debug("%s remove from all update group", - peer->host); + zlog_debug("%s remove from all update group for %s", peer->host, + bgp_peer_get_connection_direction(connection)); update_group_remove_peer_afs(peer); /* Reset peer synctime */ @@ -1522,6 +1520,7 @@ enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection) if (connection->fd >= 0) { close(connection->fd); connection->fd = -1; + connection->dir = UNKNOWN; } /* Reset capabilities. */ @@ -1596,8 +1595,8 @@ bgp_stop_with_error(struct peer_connection *connection) if (peer_dynamic_neighbor_no_nsf(peer)) { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s (dynamic neighbor) deleted (%s)", - peer->host, __func__); + zlog_debug("%s (dynamic neighbor) deleted (%s) for %s", __func__, + peer->host, bgp_peer_get_connection_direction(connection)); peer_delete(peer); return BGP_FSM_FAILURE; } @@ -1618,8 +1617,8 @@ bgp_stop_with_notify(struct peer_connection *connection, uint8_t code, if (peer_dynamic_neighbor_no_nsf(peer)) { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s (dynamic neighbor) deleted (%s)", - peer->host, __func__); + zlog_debug("%s (dynamic neighbor) deleted (%s) for %s", __func__, + peer->host, bgp_peer_get_connection_direction(connection)); peer_delete(peer); return BGP_FSM_FAILURE; } @@ -1684,8 +1683,9 @@ static void bgp_connect_check(struct event *thread) return; } else { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [Event] Connect failed %d(%s)", - peer->host, status, safe_strerror(status)); + zlog_debug("%s [Event] Connect failed %d(%s) for connection %s", peer->host, + status, safe_strerror(status), + bgp_peer_get_connection_direction(connection)); BGP_EVENT_ADD(connection, TCP_connection_open_failed); return; } @@ -1724,10 +1724,12 @@ bgp_connect_success(struct peer_connection *connection) if (bgp_debug_neighbor_events(peer)) { if (!CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) - zlog_debug("%s open active, local address %pSU", peer->host, - connection->su_local); + zlog_debug("%s open active, local address %pSU for %s", peer->host, + connection->su_local, + bgp_peer_get_connection_direction(connection)); else - zlog_debug("%s passive open", peer->host); + zlog_debug("%s passive open for %s", peer->host, + bgp_peer_get_connection_direction(connection)); } /* Send an open message */ @@ -1770,10 +1772,12 @@ bgp_connect_success_w_delayopen(struct peer_connection *connection) if (bgp_debug_neighbor_events(peer)) { if (!CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) - zlog_debug("%s open active, local address %pSU", peer->host, - connection->su_local); + zlog_debug("%s open active, local address %pSU for %s", peer->host, + connection->su_local, + bgp_peer_get_connection_direction(connection)); else - zlog_debug("%s passive open", peer->host); + zlog_debug("%s passive open for %s", peer->host, + bgp_peer_get_connection_direction(connection)); } /* set the DelayOpenTime to the inital value */ @@ -1785,8 +1789,9 @@ bgp_connect_success_w_delayopen(struct peer_connection *connection) peer->v_delayopen); if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] BGP OPEN message delayed for %d seconds", - peer->host, peer->delayopen); + zlog_debug("%s [FSM] BGP OPEN message delayed for %d seconds for connection %s", + peer->host, peer->delayopen, + bgp_peer_get_connection_direction(connection)); return BGP_FSM_SUCCESS; } @@ -1799,8 +1804,8 @@ bgp_connect_fail(struct peer_connection *connection) if (peer_dynamic_neighbor_no_nsf(peer)) { if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s (dynamic neighbor) deleted (%s)", - peer->host, __func__); + zlog_debug("%s (dynamic neighbor) deleted (%s) for %s", __func__, + peer->host, bgp_peer_get_connection_direction(connection)); peer_delete(peer); return BGP_FSM_FAILURE_AND_DELETE; } @@ -1843,9 +1848,8 @@ static enum bgp_fsm_state_progress bgp_start(struct peer_connection *connection) if (connection->su.sa.sa_family == AF_UNSPEC) { if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%s [FSM] Unable to get neighbor's IP address, waiting...", - peer->host); + zlog_debug("%s [FSM] Unable to get neighbor's IP address, waiting... for %s", + peer->host, bgp_peer_get_connection_direction(connection)); peer->last_reset = PEER_DOWN_NBR_ADDR; return BGP_FSM_FAILURE; } @@ -1888,9 +1892,9 @@ static enum bgp_fsm_state_progress bgp_start(struct peer_connection *connection) if (!bgp_peer_reg_with_nht(peer)) { if (bgp_zebra_num_connects()) { if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%s [FSM] Waiting for NHT, no path to neighbor present", - peer->host); + zlog_debug("%s [FSM] Waiting for NHT, no path to neighbor present for %s", + peer->host, + bgp_peer_get_connection_direction(connection)); peer->last_reset = PEER_DOWN_WAITING_NHT; BGP_EVENT_ADD(connection, TCP_connection_open_failed); return BGP_FSM_SUCCESS; @@ -1906,13 +1910,14 @@ static enum bgp_fsm_state_progress bgp_start(struct peer_connection *connection) switch (status) { case connect_error: if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Connect error", peer->host); + zlog_debug("%s [FSM] Connect error for %s", peer->host, + bgp_peer_get_connection_direction(connection)); BGP_EVENT_ADD(connection, TCP_connection_open_failed); break; case connect_success: if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Connect immediately success, fd %d", - peer->host, connection->fd); + zlog_debug("%s [FSM] Connect immediately success, fd %d for %s", peer->host, + connection->fd, bgp_peer_get_connection_direction(connection)); BGP_EVENT_ADD(connection, TCP_connection_open); break; @@ -1920,8 +1925,9 @@ static enum bgp_fsm_state_progress bgp_start(struct peer_connection *connection) /* To check nonblocking connect, we wait until socket is readable or writable. */ if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Non blocking connect waiting result, fd %d", - peer->host, connection->fd); + zlog_debug("%s [FSM] Non blocking connect waiting result, fd %d for %s", + peer->host, connection->fd, + bgp_peer_get_connection_direction(connection)); if (connection->fd < 0) { flog_err(EC_BGP_FSM, "%s peer's fd is negative value %d", __func__, peer->connection->fd); @@ -1968,14 +1974,12 @@ bgp_reconnect(struct peer_connection *connection) static enum bgp_fsm_state_progress bgp_fsm_open(struct peer_connection *connection) { - struct peer *peer = connection->peer; - /* If DelayOpen is active, we may still need to send an open message */ if ((connection->status == Connect) || (connection->status == Active)) bgp_open_send(connection); /* Send keepalive and make keepalive timer */ - bgp_keepalive_send(peer); + bgp_keepalive_send(connection); return BGP_FSM_SUCCESS; } @@ -2003,7 +2007,8 @@ bgp_fsm_holdtime_expire(struct peer_connection *connection) struct peer *peer = connection->peer; if (bgp_debug_neighbor_events(peer)) - zlog_debug("%s [FSM] Hold timer expire", peer->host); + zlog_debug("%s [FSM] Hold timer expire for %s", peer->host, + bgp_peer_get_connection_direction(connection)); /* RFC8538 updates RFC 4724 by defining an extension that permits * the Graceful Restart procedures to be performed when the BGP @@ -2184,9 +2189,11 @@ bgp_establish(struct peer_connection *connection) UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT); if (bgp_debug_neighbor_events(peer)) { if (BGP_PEER_RESTARTING_MODE(peer)) - zlog_debug("%pBP BGP_RESTARTING_MODE", peer); + zlog_debug("%pBP BGP_RESTARTING_MODE %s", peer, + bgp_peer_get_connection_direction(connection)); else if (BGP_PEER_HELPER_MODE(peer)) - zlog_debug("%pBP BGP_HELPER_MODE", peer); + zlog_debug("%pBP BGP_HELPER_MODE %s", peer, + bgp_peer_get_connection_direction(connection)); } FOREACH_AFI_SAFI_NSF (afi, safi) { @@ -2259,16 +2266,16 @@ bgp_establish(struct peer_connection *connection) if (connection->t_gr_stale) { EVENT_OFF(connection->t_gr_stale); if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%pBP graceful restart stalepath timer stopped", - peer); + zlog_debug("%pBP graceful restart stalepath timer stopped for %s", + peer, bgp_peer_get_connection_direction(connection)); } } if (connection->t_gr_restart) { EVENT_OFF(connection->t_gr_restart); if (bgp_debug_neighbor_events(peer)) - zlog_debug("%pBP graceful restart timer stopped", peer); + zlog_debug("%pBP graceful restart timer stopped for %s", peer, + bgp_peer_get_connection_direction(connection)); } /* Reset uptime, turn on keepalives, send current table. */ @@ -2284,9 +2291,9 @@ bgp_establish(struct peer_connection *connection) if (peer->t_llgr_stale[afi][safi]) { EVENT_OFF(peer->t_llgr_stale[afi][safi]); if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "%pBP Long-lived stale timer stopped for afi/safi: %d/%d", - peer, afi, safi); + zlog_debug("%pBP Long-lived stale timer stopped for afi/safi: %d/%d for %s", + peer, afi, safi, + bgp_peer_get_connection_direction(connection)); } if (CHECK_FLAG(peer->af_cap[afi][safi], @@ -2327,9 +2334,8 @@ bgp_establish(struct peer_connection *connection) if (peer->doppelganger && (peer->doppelganger->connection->status != Deleted)) { if (bgp_debug_neighbor_events(peer)) - zlog_debug( - "[Event] Deleting stub connection for peer %s", - peer->host); + zlog_debug("[Event] Deleting stub connection for peer %s for %s", peer->host, + bgp_peer_get_connection_direction(peer->doppelganger->connection)); if (peer->doppelganger->connection->status > Active) bgp_notify_send(peer->doppelganger->connection, @@ -2636,11 +2642,10 @@ int bgp_event_update(struct peer_connection *connection, next = FSM[connection->status - 1][event - 1].next_state; if (bgp_debug_neighbor_events(peer) && connection->status != next) - zlog_debug("%s [FSM] %s (%s->%s), fd %d", peer->host, - bgp_event_str[event], + zlog_debug("%s [FSM] %s (%s->%s), fd %d for %s", peer->host, bgp_event_str[event], lookup_msg(bgp_status_msg, connection->status, NULL), - lookup_msg(bgp_status_msg, next, NULL), - connection->fd); + lookup_msg(bgp_status_msg, next, NULL), connection->fd, + bgp_peer_get_connection_direction(connection)); peer->last_event = peer->cur_event; peer->cur_event = event; diff --git a/bgpd/bgp_keepalives.c b/bgpd/bgp_keepalives.c index 92123c2cd9..eda563fe60 100644 --- a/bgpd/bgp_keepalives.c +++ b/bgpd/bgp_keepalives.c @@ -108,7 +108,7 @@ static void peer_process(struct hash_bucket *hb, void *arg) zlog_debug("%s [FSM] Timer (keepalive timer expire)", pkat->peer->host); - bgp_keepalive_send(pkat->peer); + bgp_keepalive_send(pkat->peer->connection); monotime(&pkat->last); memset(&elapsed, 0, sizeof(elapsed)); diff = ka; diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index ac2f90e867..d1d4c5af68 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -1097,6 +1097,9 @@ static bool leak_update_nexthop_valid(struct bgp *to_bgp, struct bgp_dest *bn, * then mark the nexthop as valid. */ nh_valid = true; + } else if (bpi_ultimate->type == ZEBRA_ROUTE_BGP && + bpi_ultimate->sub_type == BGP_ROUTE_AGGREGATE) { + nh_valid = true; } else /* * TBD do we need to do anything about the @@ -1693,6 +1696,14 @@ void vpn_leak_from_vrf_update(struct bgp *to_bgp, /* to */ return; } + /* Aggregate-address suppress check. */ + if (bgp_path_suppressed(path_vrf)) { + if (debug) + zlog_debug("%s: %s skipping: suppressed path will not be exported", + __func__, from_bgp->name); + return; + } + /* shallow copy */ static_attr = *path_vrf->attr; diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 3df4aa286e..4bcb41b8dc 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -396,8 +396,8 @@ static void bgp_accept(struct event *thread) int accept_sock; union sockunion su; struct bgp_listener *listener = EVENT_ARG(thread); - struct peer *peer, *peer1; - struct peer_connection *connection, *connection1; + struct peer *doppelganger, *peer; + struct peer_connection *connection, *incoming; char buf[SU_ADDRSTRLEN]; struct bgp *bgp = NULL; @@ -475,53 +475,51 @@ static void bgp_accept(struct event *thread) bgp_update_setsockopt_tcp_keepalive(bgp, bgp_sock); /* Check remote IP address */ - peer1 = peer_lookup(bgp, &su); + peer = peer_lookup(bgp, &su); - if (!peer1) { - peer1 = peer_lookup_dynamic_neighbor(bgp, &su); - if (peer1) { - connection1 = peer1->connection; + if (!peer) { + struct peer *dynamic_peer = peer_lookup_dynamic_neighbor(bgp, &su); + + if (dynamic_peer) { + incoming = dynamic_peer->connection; /* Dynamic neighbor has been created, let it proceed */ - connection1->fd = bgp_sock; + incoming->fd = bgp_sock; + incoming->dir = CONNECTION_INCOMING; - connection1->su_local = sockunion_getsockname(connection1->fd); - connection1->su_remote = sockunion_dup(&su); + incoming->su_local = sockunion_getsockname(incoming->fd); + incoming->su_remote = sockunion_dup(&su); - if (bgp_set_socket_ttl(connection1) < 0) { - peer1->last_reset = PEER_DOWN_SOCKET_ERROR; + if (bgp_set_socket_ttl(incoming) < 0) { + dynamic_peer->last_reset = PEER_DOWN_SOCKET_ERROR; zlog_err("%s: Unable to set min/max TTL on peer %s (dynamic), error received: %s(%d)", - __func__, peer1->host, - safe_strerror(errno), errno); + __func__, dynamic_peer->host, safe_strerror(errno), errno); return; } /* Set the user configured MSS to TCP socket */ - if (CHECK_FLAG(peer1->flags, PEER_FLAG_TCP_MSS)) - sockopt_tcp_mss_set(bgp_sock, peer1->tcp_mss); + if (CHECK_FLAG(dynamic_peer->flags, PEER_FLAG_TCP_MSS)) + sockopt_tcp_mss_set(bgp_sock, dynamic_peer->tcp_mss); frr_with_privs (&bgpd_privs) { - vrf_bind(peer1->bgp->vrf_id, bgp_sock, - bgp_get_bound_name(connection1)); + vrf_bind(dynamic_peer->bgp->vrf_id, bgp_sock, + bgp_get_bound_name(incoming)); } - bgp_peer_reg_with_nht(peer1); - bgp_fsm_change_status(connection1, Active); - EVENT_OFF(connection1->t_start); - - if (peer_active(peer1->connection)) { - if (CHECK_FLAG(peer1->flags, - PEER_FLAG_TIMER_DELAYOPEN)) - BGP_EVENT_ADD(connection1, - TCP_connection_open_w_delay); + bgp_peer_reg_with_nht(dynamic_peer); + bgp_fsm_change_status(incoming, Active); + EVENT_OFF(incoming->t_start); + + if (peer_active(incoming)) { + if (CHECK_FLAG(dynamic_peer->flags, PEER_FLAG_TIMER_DELAYOPEN)) + BGP_EVENT_ADD(incoming, TCP_connection_open_w_delay); else - BGP_EVENT_ADD(connection1, - TCP_connection_open); + BGP_EVENT_ADD(incoming, TCP_connection_open); } return; } } - if (!peer1) { + if (!peer) { if (bgp_debug_neighbor_events(NULL)) { zlog_debug( "[Event] %s connection rejected(%s:%u:%s) - not configured and not valid for dynamic", @@ -532,10 +530,12 @@ static void bgp_accept(struct event *thread) return; } - connection1 = peer1->connection; - if (CHECK_FLAG(peer1->flags, PEER_FLAG_SHUTDOWN) - || CHECK_FLAG(peer1->bgp->flags, BGP_FLAG_SHUTDOWN)) { - if (bgp_debug_neighbor_events(peer1)) + /* bgp pointer may be null, but since we have a peer data structure we know we have it */ + bgp = peer->bgp; + connection = peer->connection; + if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN) || + CHECK_FLAG(peer->bgp->flags, BGP_FLAG_SHUTDOWN)) { + if (bgp_debug_neighbor_events(peer)) zlog_debug( "[Event] connection from %s rejected(%s:%u:%s) due to admin shutdown", inet_sutop(&su, buf), bgp->name_pretty, bgp->as, @@ -550,21 +550,19 @@ static void bgp_accept(struct event *thread) * Established and then the Clearing_Completed event is generated. Also, * block incoming connection in Deleted state. */ - if (connection1->status == Clearing || connection1->status == Deleted) { - if (bgp_debug_neighbor_events(peer1)) - zlog_debug("[Event] Closing incoming conn for %s (%p) state %d", - peer1->host, peer1, - peer1->connection->status); + if (connection->status == Clearing || connection->status == Deleted) { + if (bgp_debug_neighbor_events(peer)) + zlog_debug("[Event] Closing incoming conn for %s (%p) state %d", peer->host, + peer, connection->status); close(bgp_sock); return; } /* Check that at least one AF is activated for the peer. */ - if (!peer_active(connection1)) { - if (bgp_debug_neighbor_events(peer1)) - zlog_debug( - "%s - incoming conn rejected - no AF activated for peer", - peer1->host); + if (!peer_active(connection)) { + if (bgp_debug_neighbor_events(peer)) + zlog_debug("%s - incoming conn rejected - no AF activated for peer", + peer->host); close(bgp_sock); return; } @@ -573,117 +571,109 @@ static void bgp_accept(struct event *thread) * prefixes, restart timer is still running or the peer * is shutdown, or BGP identifier is not set (0.0.0.0). */ - if (BGP_PEER_START_SUPPRESSED(peer1)) { - if (bgp_debug_neighbor_events(peer1)) { - if (peer1->shut_during_cfg) - zlog_debug( - "[Event] Incoming BGP connection rejected from %s due to configuration being currently read in", - peer1->host); + if (BGP_PEER_START_SUPPRESSED(peer)) { + if (bgp_debug_neighbor_events(peer)) { + if (peer->shut_during_cfg) + zlog_debug("[Event] Incoming BGP connection rejected from %s due to configuration being currently read in", + peer->host); else - zlog_debug( - "[Event] Incoming BGP connection rejected from %s due to maximum-prefix or shutdown", - peer1->host); + zlog_debug("[Event] Incoming BGP connection rejected from %s due to maximum-prefix or shutdown", + peer->host); } close(bgp_sock); return; } - if (peer1->bgp->router_id.s_addr == INADDR_ANY) { + if (peer->bgp->router_id.s_addr == INADDR_ANY) { zlog_warn("[Event] Incoming BGP connection rejected from %s due missing BGP identifier, set it with `bgp router-id`", - peer1->host); - peer1->last_reset = PEER_DOWN_ROUTER_ID_ZERO; + peer->host); + peer->last_reset = PEER_DOWN_ROUTER_ID_ZERO; close(bgp_sock); return; } - if (bgp_debug_neighbor_events(peer1)) + if (bgp_debug_neighbor_events(peer)) zlog_debug("[Event] connection from %s fd %d, active peer status %d fd %d", - inet_sutop(&su, buf), bgp_sock, connection1->status, - connection1->fd); + inet_sutop(&su, buf), bgp_sock, connection->status, connection->fd); - if (peer1->doppelganger) { + if (peer->doppelganger) { /* We have an existing connection. Kill the existing one and run with this one. */ - if (bgp_debug_neighbor_events(peer1)) - zlog_debug( - "[Event] New active connection from peer %s, Killing previous active connection", - peer1->host); - peer_delete(peer1->doppelganger); + if (bgp_debug_neighbor_events(peer)) + zlog_debug("[Event] New active connection from peer %s, Killing previous active connection", + peer->host); + peer_delete(peer->doppelganger); } - peer = peer_create(&su, peer1->conf_if, peer1->bgp, peer1->local_as, - peer1->as, peer1->as_type, NULL, false, NULL); + doppelganger = peer_create(&su, peer->conf_if, bgp, peer->local_as, peer->as, peer->as_type, + NULL, false, NULL); - connection = peer->connection; + incoming = doppelganger->connection; - peer_xfer_config(peer, peer1); - bgp_peer_gr_flags_update(peer); + peer_xfer_config(doppelganger, peer); + bgp_peer_gr_flags_update(doppelganger); - BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(peer->bgp, - peer->bgp->peer); + BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer); - if (bgp_peer_gr_mode_get(peer) == PEER_DISABLE) { + if (bgp_peer_gr_mode_get(doppelganger) == PEER_DISABLE) { + UNSET_FLAG(doppelganger->sflags, PEER_STATUS_NSF_MODE); - UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_MODE); - - if (CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) { - peer_nsf_stop(peer); + if (CHECK_FLAG(doppelganger->sflags, PEER_STATUS_NSF_WAIT)) { + peer_nsf_stop(doppelganger); } } - peer->doppelganger = peer1; - peer1->doppelganger = peer; + doppelganger->doppelganger = peer; + peer->doppelganger = doppelganger; - connection->fd = bgp_sock; - connection->su_local = sockunion_getsockname(connection->fd); - connection->su_remote = sockunion_dup(&su); + incoming->fd = bgp_sock; + incoming->dir = CONNECTION_INCOMING; + incoming->su_local = sockunion_getsockname(incoming->fd); + incoming->su_remote = sockunion_dup(&su); - if (bgp_set_socket_ttl(connection) < 0) - if (bgp_debug_neighbor_events(peer)) + if (bgp_set_socket_ttl(incoming) < 0) + if (bgp_debug_neighbor_events(doppelganger)) zlog_debug("[Event] Unable to set min/max TTL on peer %s, Continuing", - peer->host); + doppelganger->host); frr_with_privs(&bgpd_privs) { - vrf_bind(peer->bgp->vrf_id, bgp_sock, - bgp_get_bound_name(peer->connection)); + vrf_bind(bgp->vrf_id, bgp_sock, bgp_get_bound_name(incoming)); } - bgp_peer_reg_with_nht(peer); - bgp_fsm_change_status(connection, Active); - EVENT_OFF(connection->t_start); /* created in peer_create() */ + bgp_peer_reg_with_nht(doppelganger); + bgp_fsm_change_status(incoming, Active); + EVENT_OFF(incoming->t_start); /* created in peer_create() */ - SET_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER); + SET_FLAG(doppelganger->sflags, PEER_STATUS_ACCEPT_PEER); /* Make dummy peer until read Open packet. */ - if (peer_established(connection1) && - CHECK_FLAG(peer1->sflags, PEER_STATUS_NSF_MODE)) { + if (peer_established(connection) && CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_MODE)) { /* If we have an existing established connection with graceful * restart * capability announced with one or more address families, then * drop * existing established connection and move state to connect. */ - peer1->last_reset = PEER_DOWN_NSF_CLOSE_SESSION; + peer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION; - if (CHECK_FLAG(peer1->flags, PEER_FLAG_GRACEFUL_RESTART) - || CHECK_FLAG(peer1->flags, - PEER_FLAG_GRACEFUL_RESTART_HELPER)) - SET_FLAG(peer1->sflags, PEER_STATUS_NSF_WAIT); + if (CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART) || + CHECK_FLAG(peer->flags, PEER_FLAG_GRACEFUL_RESTART_HELPER)) + SET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT); - bgp_event_update(connection1, TCP_connection_closed); + bgp_event_update(connection, TCP_connection_closed); } - if (peer_active(peer->connection)) { - if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN)) - BGP_EVENT_ADD(connection, TCP_connection_open_w_delay); + if (peer_active(incoming)) { + if (CHECK_FLAG(doppelganger->flags, PEER_FLAG_TIMER_DELAYOPEN)) + BGP_EVENT_ADD(incoming, TCP_connection_open_w_delay); else - BGP_EVENT_ADD(connection, TCP_connection_open); + BGP_EVENT_ADD(incoming, TCP_connection_open); } /* * If we are doing nht for a peer that is v6 LL based * massage the event system to make things happy */ - bgp_nht_interface_events(peer); + bgp_nht_interface_events(doppelganger); } /* BGP socket bind. */ @@ -801,6 +791,7 @@ enum connect_result bgp_connect(struct peer_connection *connection) connection->fd = vrf_sockunion_socket(&connection->su, peer->bgp->vrf_id, bgp_get_bound_name(connection)); + connection->dir = CONNECTION_OUTGOING; } if (connection->fd < 0) { peer->last_reset = PEER_DOWN_SOCKET_ERROR; diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 3be6ee48b8..268d804699 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -763,10 +763,6 @@ static void bgp_nht_ifp_table_handle(struct bgp *bgp, struct interface *ifp, bool up) { struct bgp_nexthop_cache *bnc; - struct nexthop *nhop; - uint16_t other_nh_count; - bool nhop_ll_found = false; - bool nhop_found = false; if (ifp->ifindex == IFINDEX_INTERNAL) { zlog_warn("%s: The interface %s ignored", __func__, ifp->name); @@ -774,42 +770,9 @@ static void bgp_nht_ifp_table_handle(struct bgp *bgp, } frr_each (bgp_nexthop_cache, table, bnc) { - other_nh_count = 0; - nhop_ll_found = bnc->ifindex_ipv6_ll == ifp->ifindex; - for (nhop = bnc->nexthop; nhop; nhop = nhop->next) { - if (nhop->ifindex == bnc->ifindex_ipv6_ll) - continue; - - if (nhop->ifindex != ifp->ifindex) { - other_nh_count++; - continue; - } - if (nhop->vrf_id != ifp->vrf->vrf_id) { - other_nh_count++; - continue; - } - nhop_found = true; - } - - if (!nhop_found && !nhop_ll_found) - /* The event interface does not match the nexthop cache - * entry */ - continue; - - if (!up && other_nh_count > 0) - /* Down event ignored in case of multiple next-hop - * interfaces. The other might interfaces might be still - * up. The cases where all interfaces are down or a bnc - * is invalid are processed by a separate zebra rnh - * messages. - */ + if (bnc->ifindex_ipv6_ll != ifp->ifindex) continue; - if (!nhop_ll_found) { - evaluate_paths(bnc); - continue; - } - bnc->last_update = monotime(NULL); bnc->change_flags = 0; @@ -822,7 +785,6 @@ static void bgp_nht_ifp_table_handle(struct bgp *bgp, if (up) { SET_FLAG(bnc->flags, BGP_NEXTHOP_VALID); SET_FLAG(bnc->change_flags, BGP_NEXTHOP_CHANGED); - /* change nexthop number only for ll */ bnc->nexthop_num = 1; } else { UNSET_FLAG(bnc->flags, BGP_NEXTHOP_PEER_NOTIFIED); diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 54cd1250cb..ec8cc0465b 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -613,7 +613,7 @@ void bgp_generate_updgrp_packets(struct event *thread) /* * Creates a BGP Keepalive packet and appends it to the peer's output queue. */ -void bgp_keepalive_send(struct peer *peer) +void bgp_keepalive_send(struct peer_connection *connection) { struct stream *s; @@ -628,13 +628,13 @@ void bgp_keepalive_send(struct peer *peer) /* Dump packet if debug option is set. */ /* bgp_packet_dump (s); */ - if (bgp_debug_keepalive(peer)) - zlog_debug("%s sending KEEPALIVE", peer->host); + if (bgp_debug_keepalive(connection->peer)) + zlog_debug("%s sending KEEPALIVE", connection->peer->host); /* Add packet to the peer. */ - bgp_packet_add(peer->connection, peer, s); + bgp_packet_add(connection, connection->peer, s); - bgp_writes_on(peer->connection); + bgp_writes_on(connection); } struct stream *bgp_open_make(struct peer *peer, uint16_t send_holdtime, as_t local_as, diff --git a/bgpd/bgp_packet.h b/bgpd/bgp_packet.h index ae81aade70..9ecbdc8b87 100644 --- a/bgpd/bgp_packet.h +++ b/bgpd/bgp_packet.h @@ -48,7 +48,7 @@ DECLARE_HOOK(bgp_packet_send, } while (0) /* Packet send and receive function prototypes. */ -extern void bgp_keepalive_send(struct peer *peer); +extern void bgp_keepalive_send(struct peer_connection *connection); extern struct stream *bgp_open_make(struct peer *peer, uint16_t send_holdtime, as_t local_as, struct in_addr *id); extern void bgp_open_send(struct peer_connection *connection); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 3bbbdee161..eba3a628f2 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2621,15 +2621,32 @@ bool subgroup_announce_check(struct bgp_dest *dest, struct bgp_path_info *pi, bgp_peer_remove_private_as(bgp, afi, safi, peer, attr); bgp_peer_as_override(bgp, afi, safi, peer, attr); - /* draft-ietf-idr-deprecate-as-set-confed-set - * Filter routes having AS_SET or AS_CONFED_SET in the path. - * Eventually, This document (if approved) updates RFC 4271 - * and RFC 5065 by eliminating AS_SET and AS_CONFED_SET types, - * and obsoletes RFC 6472. - */ - if (peer->bgp->reject_as_sets) - if (aspath_check_as_sets(attr->aspath)) + /* draft-ietf-idr-deprecate-as-set-confed-set-16 */ + if (peer->bgp->reject_as_sets && aspath_check_as_sets(attr->aspath)) { + struct aspath *aspath_new; + + /* An aggregate prefix MUST NOT be announced to the contributing ASes */ + if (pi->sub_type == BGP_ROUTE_AGGREGATE && + aspath_loop_check(attr->aspath, peer->as)) { + zlog_warn("%pBP [Update:SEND] %pFX is filtered by `bgp reject-as-sets`", + peer, p); return false; + } + + /* When aggregating prefixes, network operators MUST use consistent brief + * aggregation as described in Section 5.2. In consistent brief aggregation, + * the AGGREGATOR and ATOMIC_AGGREGATE Path Attributes are included, but the + * AS_PATH does not have AS_SET or AS_CONFED_SET path segment types. + * The ATOMIC_AGGREGATE Path Attribute is subsequently attached to the BGP + * route, if AS_SETs are dropped. + */ + if (attr->aspath->refcnt) + aspath_new = aspath_dup(attr->aspath); + else + aspath_new = attr->aspath; + + attr->aspath = aspath_delete_as_set_seq(aspath_new); + } /* If neighbor soo is configured, then check if the route has * SoO extended community and validate against the configured @@ -3264,11 +3281,8 @@ void bgp_best_selection(struct bgp *bgp, struct bgp_dest *dest, if (worse->prev) worse->prev->next = first; first->next = worse; - if (worse) { - first->prev = worse->prev; - worse->prev = first; - } else - first->prev = NULL; + first->prev = worse->prev; + worse->prev = first; if (dest->info == worse) { bgp_dest_set_bgp_path_info(dest, first); @@ -8015,6 +8029,9 @@ static void bgp_aggregate_install( bgp_process(bgp, dest, new, afi, safi); if (debug) zlog_debug(" aggregate %pFX: installed", p); + if (SAFI_UNICAST == safi && (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_update(bgp_get_default(), bgp, new); } else { uninstall_aggregate_route: /* Withdraw the aggregate route from routing table. */ @@ -8023,6 +8040,11 @@ static void bgp_aggregate_install( bgp_process(bgp, dest, pi, afi, safi); if (debug) zlog_debug(" aggregate %pFX: uninstall", p); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) { + vpn_leak_from_vrf_withdraw(bgp_get_default(), bgp, pi); + } } } @@ -8127,14 +8149,25 @@ void bgp_aggregate_toggle_suppressed(struct bgp_aggregate *aggregate, /* We are toggling suppression back. */ if (suppress) { /* Suppress route if not suppressed already. */ - if (aggr_suppress_path(aggregate, pi)) + if (aggr_suppress_path(aggregate, pi)) { bgp_process(bgp, dest, pi, afi, safi); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_withdraw(bgp_get_default(), bgp, + pi); + } continue; } /* Install route if there is no more suppression. */ - if (aggr_unsuppress_path(aggregate, pi)) + if (aggr_unsuppress_path(aggregate, pi)) { bgp_process(bgp, dest, pi, afi, safi); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_update(bgp_get_default(), bgp, pi); + } } } bgp_dest_unlock_node(top); @@ -8265,8 +8298,14 @@ bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi, */ if (aggregate->summary_only && AGGREGATE_MED_VALID(aggregate)) { - if (aggr_suppress_path(aggregate, pi)) + if (aggr_suppress_path(aggregate, pi)) { bgp_process(bgp, dest, pi, afi, safi); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_withdraw(bgp_get_default(), bgp, + pi); + } } /* @@ -8281,8 +8320,14 @@ bool bgp_aggregate_route(struct bgp *bgp, const struct prefix *p, afi_t afi, if (aggregate->suppress_map_name && AGGREGATE_MED_VALID(aggregate) && aggr_suppress_map_test(bgp, aggregate, pi)) { - if (aggr_suppress_path(aggregate, pi)) + if (aggr_suppress_path(aggregate, pi)) { bgp_process(bgp, dest, pi, afi, safi); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_withdraw(bgp_get_default(), bgp, + pi); + } } aggregate->count++; @@ -8430,8 +8475,13 @@ void bgp_aggregate_delete(struct bgp *bgp, const struct prefix *p, afi_t afi, */ if (pi->extra && pi->extra->aggr_suppressors && listcount(pi->extra->aggr_suppressors)) { - if (aggr_unsuppress_path(aggregate, pi)) + if (aggr_unsuppress_path(aggregate, pi)) { bgp_process(bgp, dest, pi, afi, safi); + if (SAFI_UNICAST == safi && + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_update(bgp_get_default(), bgp, pi); + } } if (aggregate->count > 0) @@ -8637,13 +8687,21 @@ static void bgp_remove_route_from_aggregate(struct bgp *bgp, afi_t afi, return; if (aggregate->summary_only && AGGREGATE_MED_VALID(aggregate)) - if (aggr_unsuppress_path(aggregate, pi)) + if (aggr_unsuppress_path(aggregate, pi)) { bgp_process(bgp, pi->net, pi, afi, safi); + if (SAFI_UNICAST == safi && (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_update(bgp_get_default(), bgp, pi); + } if (aggregate->suppress_map_name && AGGREGATE_MED_VALID(aggregate) && aggr_suppress_map_test(bgp, aggregate, pi)) - if (aggr_unsuppress_path(aggregate, pi)) + if (aggr_unsuppress_path(aggregate, pi)) { bgp_process(bgp, pi->net, pi, afi, safi); + if (SAFI_UNICAST == safi && (bgp->inst_type == BGP_INSTANCE_TYPE_VRF || + bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)) + vpn_leak_from_vrf_update(bgp_get_default(), bgp, pi); + } /* * This must be called after `summary`, `suppress-map` check to avoid @@ -8902,7 +8960,6 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, struct prefix p; struct bgp_dest *dest; struct bgp_aggregate *aggregate; - uint8_t as_set_new = as_set; if (suppress_map && summary_only) { vty_out(vty, @@ -8960,7 +9017,6 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, */ if (bgp->reject_as_sets) { if (as_set == AGGREGATE_AS_SET) { - as_set_new = AGGREGATE_AS_UNSET; zlog_warn( "%s: Ignoring as-set because `bgp reject-as-sets` is enabled.", __func__); @@ -8969,7 +9025,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi, } } - aggregate->as_set = as_set_new; + aggregate->as_set = as_set; /* Override ORIGIN attribute if defined. * E.g.: Cisco and Juniper set ORIGIN for aggregated address @@ -12712,6 +12768,9 @@ void route_vty_out_detail_header(struct vty *vty, struct bgp *bgp, * though then we must display Advertised to on a path-by-path basis. */ if (!bgp_addpath_is_addpath_used(&bgp->tx_addpath, afi, safi)) { for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) { + if (peer->group) + continue; + if (bgp_adj_out_lookup(peer, dest, 0)) { if (json && !json_adv_to) json_adv_to = json_object_new_object(); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index cf1ea78acf..6a56eb4598 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -1180,6 +1180,22 @@ void bgp_peer_connection_free(struct peer_connection **connection) connection = NULL; } +const char *bgp_peer_get_connection_direction(struct peer_connection *connection) +{ + switch (connection->dir) { + case UNKNOWN: + return "Unknown"; + case CONNECTION_INCOMING: + return "Incoming"; + case CONNECTION_OUTGOING: + return "Outgoing"; + case ESTABLISHED: + return "Established"; + } + + assert(!"DEV Escape: Expected switch to take care of this state"); +} + struct peer_connection *bgp_peer_connection_new(struct peer *peer) { struct peer_connection *connection; @@ -1527,6 +1543,7 @@ struct peer *peer_new(struct bgp *bgp) /* Create buffers. */ peer->connection = bgp_peer_connection_new(peer); + peer->connection->dir = CONNECTION_OUTGOING; /* Set default value. */ peer->v_start = BGP_INIT_START_TIMER; diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index d331adff88..9b13270ca7 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1213,8 +1213,28 @@ struct addpath_paths_limit { uint16_t receive; }; +/* + * The peer data structure has a incoming and outgoing peer connection + * variables. In the early stage of the FSM, it is possible to have + * both a incoming and outgoing connection at the same time. These + * connections both have events scheduled to happen that both produce + * logs. It is very hard to tell these debugs apart when looking at + * the log files so the debugs are now adding direction strings to + * help figure out what is going on. At a later stage in the FSM + * one of the connections will be closed and the other one kept. + * The one being kept is moved to the ESTABLISHED connection direction + * so that debugs can be figured out. + */ +enum connection_direction { + UNKNOWN, + CONNECTION_INCOMING, + CONNECTION_OUTGOING, + ESTABLISHED, +}; + struct peer_connection { struct peer *peer; + enum connection_direction dir; /* Status of the peer connection. */ enum bgp_fsm_status status; @@ -1263,6 +1283,7 @@ struct peer_connection { union sockunion *su_local; /* Sockunion of local address. */ union sockunion *su_remote; /* Sockunion of remote address. */ }; +const char *bgp_peer_get_connection_direction(struct peer_connection *connection); extern struct peer_connection *bgp_peer_connection_new(struct peer *peer); extern void bgp_peer_connection_free(struct peer_connection **connection); extern void bgp_peer_connection_buffers_free(struct peer_connection *connection); diff --git a/configure.ac b/configure.ac index 09e2d20c3a..163772904d 100644 --- a/configure.ac +++ b/configure.ac @@ -2046,7 +2046,7 @@ if test "$enable_snmp" != "" -a "$enable_snmp" != "no"; then # net-snmp lists all of its own dependencies. we absolutely do not want that # among other things we avoid a GPL vs. OpenSSL license conflict here for removelib in crypto ssl sensors pci wrap; do - SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`" + SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/-l'$removelib'/ /g'`" done AC_MSG_CHECKING([whether we can link to Net-SNMP]) AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([ diff --git a/doc/developer/building.rst b/doc/developer/building.rst index 6762604f32..6c9f7be7f7 100644 --- a/doc/developer/building.rst +++ b/doc/developer/building.rst @@ -32,5 +32,7 @@ Building FRR building-frr-for-ubuntu1804 building-frr-for-ubuntu2004 building-frr-for-ubuntu2204 + building-frr-for-ubuntu2404 building-docker cross-compiling + building-doc diff --git a/doc/developer/index.rst b/doc/developer/index.rst index bd794b11a8..528d520ba9 100644 --- a/doc/developer/index.rst +++ b/doc/developer/index.rst @@ -24,3 +24,4 @@ FRRouting Developer's Guide pceplib link-state northbound/northbound + sbfd diff --git a/doc/developer/lists.rst b/doc/developer/lists.rst index ccac10aab9..b761cc3671 100644 --- a/doc/developer/lists.rst +++ b/doc/developer/lists.rst @@ -187,6 +187,17 @@ To switch between compatible data structures, only these two lines need to be changes. To switch to a data structure with a different API, some source changes are necessary. +As a example to the developer here are some example commits that convert +over to usage of the typesafe data structures: + ++------------------------------------------------------+------------------------------------+ +| Commit Message | SHA | ++======================================================+====================================+ +| bgpd: Convert the bgp_advertise_attr->adv to a fifo | b2e0c12d723a6464f67491ceb9 | ++------------------------------------------------------+------------------------------------+ +| zebra: convert LSP nhlfe lists to use typesafe lists | ee70f629792b90f92ea7e6bece | ++------------------------------------------------------+------------------------------------+ + Common iteration macros ----------------------- diff --git a/doc/user/bfd.rst b/doc/user/bfd.rst index 5f698a1cd0..dcc7287fff 100644 --- a/doc/user/bfd.rst +++ b/doc/user/bfd.rst @@ -215,6 +215,11 @@ BFD peers and profiles share the same BFD session configuration commands. The default value is 254 (which means we only expect one hop between this system and the peer). +.. clicmd:: log-session-changes + + Enables or disables logging of session state transitions into Up + state or when the session transitions from Up state to Down state. + BFD Peer Specific Commands -------------------------- diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst index ca676cd7ba..915c7a8adb 100644 --- a/doc/user/bgp.rst +++ b/doc/user/bgp.rst @@ -537,6 +537,13 @@ Reject routes with AS_SET or AS_CONFED_SET types This command enables rejection of incoming and outgoing routes having AS_SET or AS_CONFED_SET type. + The aggregated routes are not sent to the contributing neighbors. + +.. seealso:: + https://datatracker.ietf.org/doc/html/draft-ietf-idr-deprecate-as-set-confed-set + + Default: disabled. + Enforce first AS ---------------- diff --git a/doc/user/protocols.rst b/doc/user/protocols.rst index e571cd66fc..fcddf1990c 100644 --- a/doc/user/protocols.rst +++ b/doc/user/protocols.rst @@ -9,6 +9,7 @@ Protocols zebra bfd + sbfd bgp babeld fabricd diff --git a/doc/user/subdir.am b/doc/user/subdir.am index e4e12788e7..3561917558 100644 --- a/doc/user/subdir.am +++ b/doc/user/subdir.am @@ -84,9 +84,9 @@ endif # .PHONY: info html pdf -info: $(USERBUILD)/texinfo/frr.info -html: $(USERBUILD)/html/.buildinfo -pdf: $(USERBUILD)/latexpdf +info-local: $(USERBUILD)/texinfo/frr.info +html-local: $(USERBUILD)/html/.buildinfo +pdf-local: $(USERBUILD)/latexpdf # # hook-ins for clean / install / doc @@ -100,7 +100,7 @@ clean-userdocs: # INSTALL_INFO=install-info .PHONY: install-info uninstall-info install-html uninstall-html -install-info: $(USERBUILD)/texinfo/frr.info +install-info-local: $(USERBUILD)/texinfo/frr.info $(MKDIR_P) "$(DESTDIR)$(infodir)" $(INSTALL_DATA) "$<" "$(DESTDIR)$(infodir)" [ -z "${DESTDIR}" ] && $(INSTALL_INFO) --info-dir="$(DESTDIR)$(infodir)" "$<" || true @@ -108,7 +108,7 @@ uninstall-info: $(USERBUILD)/texinfo/frr.info -rm -f "$(DESTDIR)$(infodir)/$<" [ -z "${DESTDIR}" ] && $(INSTALL_INFO) --delete --info-dir="$(DESTDIR)$(infodir)" "$<" || true -install-html: $(USERBUILD)/html/.buildinfo +install-html-local: $(USERBUILD)/html/.buildinfo $(MKDIR_P) "$(DESTDIR)$(htmldir)" cp -r "$(USERBUILD)/html" "$(DESTDIR)$(htmldir)" uninstall-html: diff --git a/isisd/isisd.h b/isisd/isisd.h index ae39502023..48f6a5832d 100644 --- a/isisd/isisd.h +++ b/isisd/isisd.h @@ -76,9 +76,9 @@ struct isis_master { struct event_loop *master; /* Various global options */ uint8_t options; -#define ISIS_OPT_DUMMY_AS_LOOPBACK (1 << 0) +#define F_ISIS_UNIT_TEST (1 << 0) +#define ISIS_OPT_DUMMY_AS_LOOPBACK (1 << 1) }; -#define F_ISIS_UNIT_TEST 0x01 #define ISIS_DEFAULT_MAX_AREA_ADDRESSES 3 diff --git a/lib/bitfield.h b/lib/bitfield.h index 3fda627b74..6ed223390f 100644 --- a/lib/bitfield.h +++ b/lib/bitfield.h @@ -263,8 +263,7 @@ static inline bitfield_t bf_copy(bitfield_t src) assert(bf_is_inited(src)); bf_init(dst, WORD_SIZE * (src.m - 1)); - for (size_t i = 0; i < src.m; i++) - dst.data[i] = src.data[i]; + memcpy(dst.data, src.data, src.m * sizeof(word_t)); dst.n = src.n; return dst; } diff --git a/lib/command.h b/lib/command.h index dfd732893b..36ea73811d 100644 --- a/lib/command.h +++ b/lib/command.h @@ -485,7 +485,6 @@ struct cmd_node { /* Graceful Restart cli help strings */ #define GR_CMD "Global Graceful Restart command\n" #define NO_GR_CMD "Undo Global Graceful Restart command\n" -#define GR "Global Graceful Restart - GR Mode\n" #define GR_DISABLE "Global Graceful Restart - Disable Mode\n" #define NO_GR_DISABLE "Undo Global Graceful Restart - Disable Mode\n" #define GR_DEBUG "Graceful Restart - Enable Debug Logs\n" diff --git a/lib/darr.h b/lib/darr.h index 084c2a103a..4638b904d1 100644 --- a/lib/darr.h +++ b/lib/darr.h @@ -62,6 +62,7 @@ * - darr_strdup * - darr_strdup_cap * - darr_strlen + * - darr_strlen_fixup * - darr_strnul * - darr_sprintf, darr_vsprintf */ @@ -753,6 +754,22 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt); }) /** + * Fixup darr_len (and thus darr_strlen) for `S` based on its strlen(S) + * (i.e., scan for NUL byte). The dynamic array length will be set to strlen(S) + 1. + * + * Args: + * S: The dynamic array with a NUL terminated string, cannot be NULL. + * + * Return: + * The calculated strlen() value. + */ +#define darr_strlen_fixup(S) \ + ({ \ + _darr_len(S) = strlen(S) + 1; \ + darr_strlen(S); \ + }) + +/** * darr_vsprintf() - vsprintf into a new dynamic array. * * Args: diff --git a/lib/libfrr.c b/lib/libfrr.c index 261d3aa87e..8a37b51c47 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -143,6 +143,7 @@ static const struct optspec os_always = { " --scriptdir Override scripts directory\n" " --log Set Logging to stdout, syslog, or file:<name>\n" " --log-level Set Logging Level to use, debug, info, warn, etc\n" + " --command-log-always Always log every command, cannot be turned off\n" " --limit-fds Limit number of fds supported\n", lo_always }; diff --git a/lib/northbound_oper.c b/lib/northbound_oper.c index ad495b6f9c..c27fe3c019 100644 --- a/lib/northbound_oper.c +++ b/lib/northbound_oper.c @@ -407,6 +407,7 @@ static enum nb_error nb_op_xpath_to_trunk(const char *xpath_in, char **xpath_out ret = yang_xpath_pop_node(xpath); if (ret != NB_OK) break; + darr_strlen_fixup(xpath); } if (ret == NB_OK) *xpath_out = xpath; @@ -1044,7 +1044,7 @@ static const void *lib_vrf_lookup_next(struct nb_cb_lookup_entry_args *args) } /* - * XPath: /frr-vrf:lib/vrf/id + * XPath: /frr-vrf:lib/vrf/state/id */ static struct yang_data * lib_vrf_state_id_get_elem(struct nb_cb_get_elem_args *args) @@ -1055,17 +1055,14 @@ lib_vrf_state_id_get_elem(struct nb_cb_get_elem_args *args) } /* - * XPath: /frr-vrf:lib/vrf/active + * XPath: /frr-vrf:lib/vrf/state/active */ static struct yang_data * lib_vrf_state_active_get_elem(struct nb_cb_get_elem_args *args) { struct vrf *vrfp = (struct vrf *)args->list_entry; - if (vrfp->status == VRF_ACTIVE) - return yang_data_new_bool(args->xpath, true); - - return NULL; + return yang_data_new_bool(args->xpath, vrfp->status == VRF_ACTIVE ? true : false); } /* clang-format off */ diff --git a/lib/zclient.c b/lib/zclient.c index f0476867be..bdb62befb9 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1362,6 +1362,8 @@ int zapi_route_encode(uint8_t cmd, struct stream *s, struct zapi_route *api) stream_putc(s, api->type); stream_putw(s, api->instance); + if (CHECK_FLAG(api->message, ZAPI_MESSAGE_TABLEID)) + SET_FLAG(api->flags, ZEBRA_FLAG_TABLEID); stream_putl(s, api->flags); stream_putl(s, api->message); @@ -1421,6 +1423,8 @@ int zapi_route_encode(uint8_t cmd, struct stream *s, struct zapi_route *api) return -1; } + if (CHECK_FLAG(api->message, ZAPI_MESSAGE_TABLEID)) + SET_FLAG(api->flags, ZEBRA_FLAG_TABLEID); if (zapi_nexthop_encode(s, api_nh, api->flags, api->message) != 0) @@ -1460,6 +1464,9 @@ int zapi_route_encode(uint8_t cmd, struct stream *s, struct zapi_route *api) return -1; } + if (CHECK_FLAG(api->message, ZAPI_MESSAGE_TABLEID)) + SET_FLAG(api->flags, ZEBRA_FLAG_TABLEID); + if (zapi_nexthop_encode(s, api_nh, api->flags, api->message) != 0) diff --git a/lib/zclient.h b/lib/zclient.h index 43521d6e2e..8719af1d03 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -578,6 +578,12 @@ struct zapi_route { * kernel (NLM_F_APPEND at the very least ) */ #define ZEBRA_FLAG_OUTOFSYNC 0x400 +/* + * This flag lets us know that the route entry is + * associated to the table ID and must remain when the + * table ID is de-associated from a VRF. + */ +#define ZEBRA_FLAG_TABLEID 0x800 /* The older XXX_MESSAGE flags live here */ uint32_t message; diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c index 124b38219d..c143173155 100644 --- a/ospfd/ospf_dump.c +++ b/ospfd/ospf_dump.c @@ -1509,16 +1509,16 @@ DEFPY (debug_ospf_gr, if (vty->node == CONFIG_NODE) { if (no) - CONF_DEBUG_OFF(gr, GR); + DEBUG_OFF(gr, GR); else - CONF_DEBUG_ON(gr, GR); + DEBUG_ON(gr, GR); + } else { + if (no) + TERM_DEBUG_OFF(gr, GR); + else + TERM_DEBUG_ON(gr, GR); } - if (no) - TERM_DEBUG_OFF(gr, GR); - else - TERM_DEBUG_ON(gr, GR); - return CMD_SUCCESS; } diff --git a/pimd/pim6_mld.c b/pimd/pim6_mld.c index 2546166d0a..fed75a0a0c 100644 --- a/pimd/pim6_mld.c +++ b/pimd/pim6_mld.c @@ -1770,18 +1770,6 @@ static void gm_t_recv(struct event *t) goto out_free; } - struct interface *ifp; - - ifp = if_lookup_by_index(pkt_src->sin6_scope_id, pim->vrf->vrf_id); - if (!ifp || !ifp->info) - goto out_free; - - struct pim_interface *pim_ifp = ifp->info; - struct gm_if *gm_ifp = pim_ifp->mld; - - if (!gm_ifp) - goto out_free; - for (cmsg = CMSG_FIRSTHDR(mh); cmsg; cmsg = CMSG_NXTHDR(mh, cmsg)) { if (cmsg->cmsg_level != SOL_IPV6) continue; @@ -1800,6 +1788,21 @@ static void gm_t_recv(struct event *t) } } + /* Prefer pktinfo as that also works in case of VRF */ + ifindex_t ifindex = pktinfo ? pktinfo->ipi6_ifindex + : pkt_src->sin6_scope_id; + struct interface *ifp; + + ifp = if_lookup_by_index(ifindex, pim->vrf->vrf_id); + if (!ifp || !ifp->info) + goto out_free; + + struct pim_interface *pim_ifp = ifp->info; + struct gm_if *gm_ifp = pim_ifp->mld; + + if (!gm_ifp) + goto out_free; + if (!pktinfo || !hoplimit) { zlog_err(log_ifp( "BUG: packet without IPV6_PKTINFO or IPV6_HOPLIMIT")); diff --git a/staticd/static_routes.c b/staticd/static_routes.c index 82eabd8d56..d549df70fe 100644 --- a/staticd/static_routes.c +++ b/staticd/static_routes.c @@ -368,6 +368,36 @@ static void static_ifindex_update_nh(struct interface *ifp, bool up, static_install_path(pn); } +void static_install_nexthops_on_startup(void) +{ + struct route_table *stable; + struct route_node *rn; + struct static_nexthop *nh; + struct static_path *pn; + struct static_vrf *svrf; + struct static_route_info *si; + afi_t afi; + safi_t safi; + + RB_FOREACH (svrf, svrf_name_head, &svrfs) { + FOREACH_AFI_SAFI (afi, safi) { + stable = static_vrf_static_table(afi, safi, svrf); + if (!stable) + continue; + for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) { + si = static_route_info_from_rnode(rn); + if (!si) + continue; + frr_each (static_path_list, &si->path_list, pn) { + frr_each (static_nexthop_list, &pn->nexthop_list, nh) { + static_zebra_nht_register(nh, true); + } + } + } + } + } +} + static void static_ifindex_update_af(struct interface *ifp, bool up, afi_t afi, safi_t safi) { diff --git a/staticd/static_routes.h b/staticd/static_routes.h index 2e2e4986c3..7f4936e0b9 100644 --- a/staticd/static_routes.h +++ b/staticd/static_routes.h @@ -264,6 +264,7 @@ extern void static_bfd_initialize(struct zclient *zc, struct event_loop *tm); extern void static_bfd_show(struct vty *vty, bool isjson); +extern void static_install_nexthops_on_startup(void); #ifdef __cplusplus } #endif diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c index a6521cccc6..3ed525f386 100644 --- a/staticd/static_zebra.c +++ b/staticd/static_zebra.c @@ -181,6 +181,12 @@ static void zebra_connected(struct zclient *zclient) vrf = vrf_lookup_by_id(VRF_DEFAULT); assert(vrf); static_fixup_vrf_ids(vrf); + + /* + * It's possible that staticd connected after config was read + * in. + */ + static_install_nexthops_on_startup(); } /* API to check whether the configured nexthop address is diff --git a/tests/lib/test_darr.c b/tests/lib/test_darr.c index 87f9e3e564..be319db1c1 100644 --- a/tests/lib/test_darr.c +++ b/tests/lib/test_darr.c @@ -48,6 +48,7 @@ * [x] - darr_strdup * [x] - darr_strdup_cap * [x] - darr_strlen + * [x] - darr_strlen_fixup * [x] - darr_strnul * [ ] - darr_vsprintf */ @@ -406,6 +407,9 @@ static void test_string(void) assert(!strcmp(da1, "0123456789: DEADBEEF")); assert(darr_strlen(da1) == 20); assert(darr_cap(da1) == 128); + + da1[5] = 0; + assert(darr_strlen_fixup(da1) == 5); darr_free(da1); da1 = darr_sprintf("0123456789: %08x", 0xDEADBEEF); diff --git a/tests/topotests/bfd_topo1/r1/bfdd.conf b/tests/topotests/bfd_topo1/r1/bfdd.conf index b9efbafbc5..1e2b0df7a2 100644 --- a/tests/topotests/bfd_topo1/r1/bfdd.conf +++ b/tests/topotests/bfd_topo1/r1/bfdd.conf @@ -5,6 +5,7 @@ ! bfd peer 192.168.0.2 + log-session-changes echo-mode no shutdown ! diff --git a/tests/topotests/bfd_topo1/r2/bfdd.conf b/tests/topotests/bfd_topo1/r2/bfdd.conf index 0d1e17e3ff..1f4f59c019 100644 --- a/tests/topotests/bfd_topo1/r2/bfdd.conf +++ b/tests/topotests/bfd_topo1/r2/bfdd.conf @@ -4,11 +4,14 @@ ! debug bfd zebra ! bfd - peer 192.168.0.1 + profile bfd-profile receive-interval 1000 transmit-interval 500 echo-mode no shutdown + log-session-changes + peer 192.168.0.1 + profile bfd-profile ! peer 192.168.1.1 echo-mode diff --git a/tests/topotests/bgp_comm_list_match/test_bgp_comm_list_match.py b/tests/topotests/bgp_comm_list_match/test_bgp_comm_list_match.py index c14ef6b8c3..0d4c8c8564 100644 --- a/tests/topotests/bgp_comm_list_match/test_bgp_comm_list_match.py +++ b/tests/topotests/bgp_comm_list_match/test_bgp_comm_list_match.py @@ -154,6 +154,11 @@ def test_bgp_comm_list_limit_match(): "vrfName": "default", "routerId": "192.168.1.3", "localAS": 65003, + "routes": { + "172.16.255.2/32": [{"prefix": "172.16.255.2", "prefixLen": 32}], + "172.16.255.5/32": [{"prefix": "172.16.255.5", "prefixLen": 32}], + "192.168.0.0/24": [{"prefix": "192.168.0.0", "prefixLen": 24}], + }, "totalRoutes": 3, "totalPaths": 3, } @@ -165,6 +170,42 @@ def test_bgp_comm_list_limit_match(): assert result is None, "Failed to check that 3 routes have been received on R3" +def test_bgp_comm_list_limit_match_no_community(): + tgen = get_topogen() + + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + router = tgen.gears["r3"] + router.vtysh_cmd( + """ + configure terminal + route-map r1 permit 20 + match community-limit 0 + """ + ) + + def _bgp_count(): + output = json.loads(router.vtysh_cmd("show bgp ipv4 json")) + expected = { + "vrfName": "default", + "routerId": "192.168.1.3", + "localAS": 65003, + "routes": { + "172.16.255.2/32": [{"prefix": "172.16.255.2", "prefixLen": 32}], + "192.168.0.0/24": [{"prefix": "192.168.0.0", "prefixLen": 24}], + }, + "totalRoutes": 2, + "totalPaths": 2, + } + return topotest.json_cmp(output, expected) + + step("Check that 2 routes have been received on R3") + test_func = functools.partial(_bgp_count) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, "Failed to check that 2 routes have been received on R3" + + def test_bgp_comm_list_reset_limit_match(): tgen = get_topogen() diff --git a/tests/topotests/bgp_ecomm_list_match/test_bgp_ecomm_list_match.py b/tests/topotests/bgp_ecomm_list_match/test_bgp_ecomm_list_match.py index 670a600a8c..c3277c5d40 100644 --- a/tests/topotests/bgp_ecomm_list_match/test_bgp_ecomm_list_match.py +++ b/tests/topotests/bgp_ecomm_list_match/test_bgp_ecomm_list_match.py @@ -150,6 +150,11 @@ def test_bgp_extcomm_list_limit_match(): "vrfName": "default", "routerId": "192.168.1.3", "localAS": 65003, + "routes": { + "172.16.255.2/32": [{"prefix": "172.16.255.2", "prefixLen": 32}], + "172.16.255.5/32": [{"prefix": "172.16.255.5", "prefixLen": 32}], + "192.168.0.0/24": [{"prefix": "192.168.0.0", "prefixLen": 24}], + }, "totalRoutes": 3, "totalPaths": 3, } @@ -161,7 +166,43 @@ def test_bgp_extcomm_list_limit_match(): assert result is None, "Failed to check that 3 routes have been received on R3" -def test_bgp_comm_list_reset_limit_match(): +def test_bgp_extcomm_list_limit_match_no_community(): + tgen = get_topogen() + + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + router = tgen.gears["r3"] + router.vtysh_cmd( + """ + configure terminal + route-map r1 permit 20 + match extcommunity-limit 0 + """ + ) + + def _bgp_count(): + output = json.loads(router.vtysh_cmd("show bgp ipv4 json")) + expected = { + "vrfName": "default", + "routerId": "192.168.1.3", + "localAS": 65003, + "routes": { + "172.16.255.2/32": [{"prefix": "172.16.255.2", "prefixLen": 32}], + "192.168.0.0/24": [{"prefix": "192.168.0.0", "prefixLen": 24}], + }, + "totalRoutes": 2, + "totalPaths": 2, + } + return topotest.json_cmp(output, expected) + + step("Check that 2 routes have been received on R3") + test_func = functools.partial(_bgp_count) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, "Failed to check that 2 routes have been received on R3" + + +def test_bgp_extcomm_list_reset_limit_match(): tgen = get_topogen() if tgen.routers_have_failure(): diff --git a/tests/topotests/bgp_evpn_route_map_match/test_bgp_evpn_route_map_match.py b/tests/topotests/bgp_evpn_route_map_match/test_bgp_evpn_route_map_match.py index 925ae1fce8..d80c9071ce 100644 --- a/tests/topotests/bgp_evpn_route_map_match/test_bgp_evpn_route_map_match.py +++ b/tests/topotests/bgp_evpn_route_map_match/test_bgp_evpn_route_map_match.py @@ -119,7 +119,7 @@ def test_bgp_evpn_route_map_match_route_type2(): c2_mac = ( tgen.gears["c2"] - .cmd("ip link show c2-eth0 | awk '/link\/ether/ {print $2}'") + .cmd(r"ip link show c2-eth0 | awk '/link\/ether/ {print $2}'") .rstrip() ) tgen.gears["r1"].vtysh_cmd( diff --git a/tests/topotests/bgp_reject_as_sets/r2/bgpd.conf b/tests/topotests/bgp_reject_as_sets/r2/bgpd.conf index 453961762a..f51634d7f2 100644 --- a/tests/topotests/bgp_reject_as_sets/r2/bgpd.conf +++ b/tests/topotests/bgp_reject_as_sets/r2/bgpd.conf @@ -6,6 +6,9 @@ router bgp 65002 neighbor 192.168.255.2 timers 3 10 neighbor 192.168.254.2 remote-as 65003 neighbor 192.168.254.2 timers 3 10 + neighbor 192.168.253.2 remote-as 65004 + neighbor 192.168.253.2 timers 3 10 + neighbor 192.168.253.2 solo address-family ipv4 unicast aggregate-address 172.16.0.0/16 as-set summary-only exit-address-family diff --git a/tests/topotests/bgp_reject_as_sets/r2/zebra.conf b/tests/topotests/bgp_reject_as_sets/r2/zebra.conf index f0d357c5ff..6112ca545e 100644 --- a/tests/topotests/bgp_reject_as_sets/r2/zebra.conf +++ b/tests/topotests/bgp_reject_as_sets/r2/zebra.conf @@ -5,5 +5,8 @@ interface r2-eth0 interface r2-eth1 ip address 192.168.254.1/30 ! +interface r2-eth2 + ip address 192.168.253.1/30 +! ip forwarding ! diff --git a/tests/topotests/bgp_reject_as_sets/r4/bgpd.conf b/tests/topotests/bgp_reject_as_sets/r4/bgpd.conf new file mode 100644 index 0000000000..957b5ba568 --- /dev/null +++ b/tests/topotests/bgp_reject_as_sets/r4/bgpd.conf @@ -0,0 +1,6 @@ +! +router bgp 65004 + no bgp ebgp-requires-policy + neighbor 192.168.253.1 remote-as 65002 + neighbor 192.168.253.1 timers 3 10 +! diff --git a/tests/topotests/bgp_reject_as_sets/r4/zebra.conf b/tests/topotests/bgp_reject_as_sets/r4/zebra.conf new file mode 100644 index 0000000000..a8c386f39a --- /dev/null +++ b/tests/topotests/bgp_reject_as_sets/r4/zebra.conf @@ -0,0 +1,6 @@ +! +interface r4-eth0 + ip address 192.168.253.2/30 +! +ip forwarding +! diff --git a/tests/topotests/bgp_reject_as_sets/test_bgp_reject_as_sets.py b/tests/topotests/bgp_reject_as_sets/test_bgp_reject_as_sets.py index b9d8ce6819..141f353bd7 100644 --- a/tests/topotests/bgp_reject_as_sets/test_bgp_reject_as_sets.py +++ b/tests/topotests/bgp_reject_as_sets/test_bgp_reject_as_sets.py @@ -38,7 +38,7 @@ pytestmark = [pytest.mark.bgpd] def build_topo(tgen): - for routern in range(1, 4): + for routern in range(1, 5): tgen.add_router("r{}".format(routern)) switch = tgen.add_switch("s1") @@ -49,6 +49,10 @@ def build_topo(tgen): switch.add_link(tgen.gears["r2"]) switch.add_link(tgen.gears["r3"]) + switch = tgen.add_switch("s3") + switch.add_link(tgen.gears["r2"]) + switch.add_link(tgen.gears["r4"]) + def setup_module(mod): tgen = Topogen(build_topo, mod.__name__) @@ -78,10 +82,12 @@ def test_bgp_reject_as_sets(): if tgen.routers_have_failure(): pytest.skip(tgen.errors) - router = tgen.gears["r2"] + r2 = tgen.gears["r2"] + r3 = tgen.gears["r3"] + r4 = tgen.gears["r4"] - def _bgp_converge(router): - output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json")) + def _bgp_converge(): + output = json.loads(r2.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json")) expected = { "192.168.255.2": { "bgpState": "Established", @@ -90,47 +96,88 @@ def test_bgp_reject_as_sets(): } return topotest.json_cmp(output, expected) - def _bgp_has_aggregated_route_with_stripped_as_set(router): - output = json.loads(router.vtysh_cmd("show ip bgp 172.16.0.0/16 json")) - expected = { - "paths": [{"aspath": {"string": "Local", "segments": [], "length": 0}}] - } - return topotest.json_cmp(output, expected) + test_func = functools.partial(_bgp_converge) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, "Failed bgp convergence at r2" - def _bgp_announce_route_without_as_sets(router): - output = json.loads( - router.vtysh_cmd( - "show ip bgp neighbor 192.168.254.2 advertised-routes json" - ) - ) + def _bgp_has_aggregated_route(): + output = json.loads(r2.vtysh_cmd("show ip bgp 172.16.0.0/16 json")) expected = { - "advertisedRoutes": { - "172.16.0.0/16": {"path": ""}, - "192.168.254.0/30": {"path": "65003"}, - "192.168.255.0/30": {"path": "65001"}, - }, - "totalPrefixCounter": 3, + "paths": [ + { + "aspath": { + "string": "{65001,65003}", + "segments": [{"type": "as-set", "list": [65001, 65003]}], + "length": 1, + }, + "aggregatorAs": 65002, + "aggregatorId": "192.168.255.1", + } + ] } return topotest.json_cmp(output, expected) - test_func = functools.partial(_bgp_converge, router) + test_func = functools.partial(_bgp_has_aggregated_route) _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, "Failed to see an aggregated route at r2" - assert result is None, 'Failed bgp convergence in "{}"'.format(router) + def _bgp_announce_route_without_as_sets(): + output = json.loads(r4.vtysh_cmd("show ip bgp 172.16.0.0/16 json")) + expected = { + "paths": [ + { + "aspath": { + "string": "65002", + "segments": [{"type": "as-sequence", "list": [65002]}], + "length": 1, + }, + "aggregatorAs": 65002, + "aggregatorId": "192.168.255.1", + } + ] + } + return topotest.json_cmp(output, expected) - test_func = functools.partial( - _bgp_has_aggregated_route_with_stripped_as_set, router - ) + test_func = functools.partial(_bgp_announce_route_without_as_sets) _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, "Route 172.16.0.0/16 should be sent without AS_SET to r4" - assert result is None, 'Failed to see an aggregated route in "{}"'.format(router) + def _bgp_filter_aggregated_route_to_contributing_as(): + output = json.loads(r3.vtysh_cmd("show ip bgp json")) + expected = { + "routes": { + "172.16.254.254/32": [ + { + "valid": True, + "bestpath": True, + } + ], + "192.168.254.0/30": [ + { + "valid": True, + "bestpath": True, + }, + { + "valid": True, + }, + ], + "192.168.255.0/30": [ + { + "valid": True, + "bestpath": True, + } + ], + }, + "totalRoutes": 3, + "totalPaths": 4, + } + return topotest.json_cmp(output, expected) - test_func = functools.partial(_bgp_announce_route_without_as_sets, router) + test_func = functools.partial(_bgp_filter_aggregated_route_to_contributing_as) _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) - assert ( result is None - ), 'Route 172.16.0.0/16 should be sent without AS_SET to r3 "{}"'.format(router) + ), "Route 172.16.0.0/16 should NOT be sent to contributing AS (r3)" if __name__ == "__main__": diff --git a/tests/topotests/bgp_vpnv4_ebgp/r1/bgpd.conf b/tests/topotests/bgp_vpnv4_ebgp/r1/bgpd.conf index d8a45ce274..65ae4b5c3d 100644 --- a/tests/topotests/bgp_vpnv4_ebgp/r1/bgpd.conf +++ b/tests/topotests/bgp_vpnv4_ebgp/r1/bgpd.conf @@ -15,8 +15,10 @@ router bgp 65500 ! router bgp 65500 vrf vrf1 bgp router-id 192.0.2.1 + neighbor 172.31.2.100 remote-as 65500 address-family ipv4 unicast redistribute connected + aggregate-address 172.31.1.0/24 label vpn export 101 rd vpn export 444:1 rt vpn both 52:100 diff --git a/tests/topotests/bgp_vpnv4_ebgp/r1/show_bgp_ipv4_172_31_1_0.json b/tests/topotests/bgp_vpnv4_ebgp/r1/show_bgp_ipv4_172_31_1_0.json new file mode 100644 index 0000000000..5947893a82 --- /dev/null +++ b/tests/topotests/bgp_vpnv4_ebgp/r1/show_bgp_ipv4_172_31_1_0.json @@ -0,0 +1,52 @@ +{ + "444:1":{ + "prefix":"172.31.1.0/24", + "advertisedTo":{ + "192.168.0.2":{ + "hostname":"r2" + }, + "192.168.0.3":{ + "hostname":"r3" + } + }, + "paths":[ + { + "aspath":{ + "string":"Local", + "segments":[ + ], + "length":0 + }, + "aggregatorAs":65500, + "aggregatorId":"192.0.2.1", + "nhVrfName":"vrf1", + "announceNexthopSelf":true, + "origin":"incomplete", + "metric":0, + "weight":32768, + "valid":true, + "sourced":true, + "local":true, + "atomicAggregate":true, + "bestpath":{ + "overall":true, + "selectionReason":"First path received" + }, + "originatorId":"192.0.2.1", + "nexthops":[ + { + "ip":"0.0.0.0", + "afi":"ipv4", + "metric":0, + "accessible":true, + "used":true + } + ], + "peer":{ + "peerId":"0.0.0.0", + "routerId":"192.0.2.1" + } + } + ] + } +} diff --git a/tests/topotests/bgp_vpnv4_ebgp/r1/zebra.conf b/tests/topotests/bgp_vpnv4_ebgp/r1/zebra.conf index f626e448a7..17766d1840 100644 --- a/tests/topotests/bgp_vpnv4_ebgp/r1/zebra.conf +++ b/tests/topotests/bgp_vpnv4_ebgp/r1/zebra.conf @@ -1,6 +1,10 @@ log stdout interface r1-eth1 vrf vrf1 ip address 172.31.0.1/32 + ip address 172.31.1.1/32 + ip address 172.31.1.2/32 + ip address 172.31.1.3/32 + ip address 172.31.2.1/24 ! interface r1-eth0 ip address 192.168.0.1/24 diff --git a/tests/topotests/bgp_vpnv4_ebgp/r100/bgpd.conf b/tests/topotests/bgp_vpnv4_ebgp/r100/bgpd.conf new file mode 100644 index 0000000000..9f6e0d2376 --- /dev/null +++ b/tests/topotests/bgp_vpnv4_ebgp/r100/bgpd.conf @@ -0,0 +1,6 @@ +router bgp 65500 + bgp router-id 192.0.2.100 + neighbor 172.31.2.1 remote-as 65500 + address-family ipv4 unicast + exit-address-family +exit diff --git a/tests/topotests/bgp_vpnv4_ebgp/r100/show_bgp_ipv4.json b/tests/topotests/bgp_vpnv4_ebgp/r100/show_bgp_ipv4.json new file mode 100644 index 0000000000..5bf2627243 --- /dev/null +++ b/tests/topotests/bgp_vpnv4_ebgp/r100/show_bgp_ipv4.json @@ -0,0 +1,147 @@ +{ + "vrfId": 0, + "vrfName": "default", + "routerId": "192.0.2.100", + "defaultLocPrf": 100, + "localAS": 65500, + "routes": { + "172.31.0.1/32": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.0.1", + "prefixLen":32, + "network":"172.31.0.1/32", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true + }] + }], + "172.31.0.10/32": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.0.10", + "prefixLen":32, + "network":"172.31.0.10/32", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"65501", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true + }] + }], + "172.31.1.0/24": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.1.0", + "prefixLen":24, + "network":"172.31.1.0/24", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true + }] + }], + "172.31.1.1/32": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.1.1", + "prefixLen":32, + "network":"172.31.1.1/32", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true}] + }], + "172.31.1.2/32": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.1.2", + "prefixLen":32, + "network":"172.31.1.2/32", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true}] + }], + "172.31.1.3/32": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.1.3", + "prefixLen":32, + "network":"172.31.1.3/32", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true + }] + }], + "172.31.2.0/24": [{ + "valid":true, + "bestpath":true, + "selectionReason":"First path received", + "pathFrom":"internal", + "prefix":"172.31.2.0", + "prefixLen":24, + "network":"172.31.2.0/24", + "metric":0, + "locPrf":100, + "weight":0, + "peerId":"172.31.2.1", + "path":"", + "origin":"incomplete", + "nexthops":[{ + "ip":"172.31.2.1", + "afi":"ipv4", + "used":true}] + }] + } , + "totalRoutes": 7, + "totalPaths": 7 +} diff --git a/tests/topotests/bgp_vpnv4_ebgp/r100/zebra.conf b/tests/topotests/bgp_vpnv4_ebgp/r100/zebra.conf new file mode 100644 index 0000000000..f4154b644b --- /dev/null +++ b/tests/topotests/bgp_vpnv4_ebgp/r100/zebra.conf @@ -0,0 +1,4 @@ +log stdout +interface r100-eth0 + ip address 172.31.2.100/24 +! diff --git a/tests/topotests/bgp_vpnv4_ebgp/test_bgp_vpnv4_ebgp.py b/tests/topotests/bgp_vpnv4_ebgp/test_bgp_vpnv4_ebgp.py index dd9d54742b..694364b17c 100644 --- a/tests/topotests/bgp_vpnv4_ebgp/test_bgp_vpnv4_ebgp.py +++ b/tests/topotests/bgp_vpnv4_ebgp/test_bgp_vpnv4_ebgp.py @@ -45,6 +45,7 @@ def build_topo(tgen): tgen.add_router("r1") tgen.add_router("r2") tgen.add_router("r3") + tgen.add_router("r100") switch = tgen.add_switch("s1") switch.add_link(tgen.gears["r1"]) @@ -53,6 +54,7 @@ def build_topo(tgen): switch = tgen.add_switch("s2") switch.add_link(tgen.gears["r1"]) + switch.add_link(tgen.gears["r100"]) switch = tgen.add_switch("s3") switch.add_link(tgen.gears["r2"]) @@ -524,6 +526,122 @@ router bgp 65501 assert result is None, assertmsg +def test_aggregated_route_on_r100(): + """ + Check that only aggregated route on r100 is received + """ + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + r100 = tgen.gears["r100"] + logger.info("Checking prefixes list on R100") + json_file = "{}/{}/show_bgp_ipv4.json".format(CWD, r100.name) + + expected = json.loads(open(json_file).read()) + test_func = partial( + topotest.router_json_cmp, + r100, + "show bgp ipv4 json", + expected, + ) + _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5) + assertmsg = '"{}" JSON output mismatches'.format(r100.name) + assert result is None, assertmsg + + +def test_aggregated_exported_route_on_r1(): + """ + Check that the aggregated route 172.31.1.0/24 is exported + """ + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + r1 = tgen.gears["r1"] + logger.info("Checking 172.31.1.0/24 VPN prefix on R1") + json_file = "{}/{}/show_bgp_ipv4_172_31_1_0.json".format(CWD, r1.name) + + expected = json.loads(open(json_file).read()) + test_func = partial( + topotest.router_json_cmp, + r1, + "show bgp ipv4 vpn 172.31.1.0/24 json", + expected, + ) + _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5) + assertmsg = '"{}" JSON output mismatches'.format(r1.name) + assert result is None, assertmsg + + +def test_aggregated_suppress_aggregate_r1(): + """ + Check that only the suppressed networks are exported + """ + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + r1 = tgen.gears["r1"] + r1.vtysh_cmd( + """ + configure terminal + router bgp 65500 vrf vrf1 + address-family ipv4 unicast + no aggregate-address 172.31.1.0/24 + """ + ) + + r1 = tgen.gears["r1"] + logger.info("Checking 172.31.1.0/24 VPN prefix is hot present on R1") + + expected = {} + test_func = partial( + topotest.router_json_cmp, + r1, + "show bgp ipv4 vpn 172.31.1.0/24 json", + expected, + exact=True, + ) + _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5) + assertmsg = '"{}" JSON output mismatches'.format(r1.name) + assert result is None, assertmsg + + +def test_aggregated_suppressed_networks_not_exported_on_r1(): + """ + Check that the suppressed networks are not exported + """ + tgen = get_topogen() + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + r1 = tgen.gears["r1"] + r1.vtysh_cmd( + """ + configure terminal + router bgp 65500 vrf vrf1 + address-family ipv4 unicast + aggregate-address 172.31.1.0/24 summary-only + """ + ) + + for prefix in ("172.31.1.1/32", "172.31.1.2/32", "172.31.1.3/32"): + logger.info(f"Checking {prefix} VPN prefix is not on R1") + + expected = {} + test_func = partial( + topotest.router_json_cmp, + r1, + f"show bgp ipv4 vpn {prefix} json", + expected, + exact=True, + ) + _, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5) + assertmsg = '"{}" JSON output mismatches'.format(r1.name) + assert result is None, assertmsg + + def test_memory_leak(): "Run the memory leak test and report results." tgen = get_topogen() diff --git a/tests/topotests/high_ecmp/r1/frr.conf b/tests/topotests/high_ecmp/r1/frr.conf index 4382f94cf1..d50ca846d4 100644 --- a/tests/topotests/high_ecmp/r1/frr.conf +++ b/tests/topotests/high_ecmp/r1/frr.conf @@ -1,267 +1,2574 @@ int lo ip addr 192.168.1.1/32 -router bgp 1001 - timers bgp 5 20 - no bgp ebgp-requires-policy - neighbor r1-eth0 interface remote-as external - neighbor r1-eth1 interface remote-as external - neighbor r1-eth2 interface remote-as external - neighbor r1-eth3 interface remote-as external - neighbor r1-eth4 interface remote-as external - neighbor r1-eth5 interface remote-as external - neighbor r1-eth6 interface remote-as external - neighbor r1-eth7 interface remote-as external - neighbor r1-eth8 interface remote-as external - neighbor r1-eth9 interface remote-as external - neighbor r1-eth10 interface remote-as external - neighbor r1-eth11 interface remote-as external - neighbor r1-eth12 interface remote-as external - neighbor r1-eth13 interface remote-as external - neighbor r1-eth14 interface remote-as external - neighbor r1-eth15 interface remote-as external - neighbor r1-eth16 interface remote-as external - neighbor r1-eth17 interface remote-as external - neighbor r1-eth18 interface remote-as external - neighbor r1-eth19 interface remote-as external - neighbor r1-eth20 interface remote-as external - neighbor r1-eth21 interface remote-as external - neighbor r1-eth22 interface remote-as external - neighbor r1-eth23 interface remote-as external - neighbor r1-eth24 interface remote-as external - neighbor r1-eth25 interface remote-as external - neighbor r1-eth26 interface remote-as external - neighbor r1-eth27 interface remote-as external - neighbor r1-eth28 interface remote-as external - neighbor r1-eth29 interface remote-as external - neighbor r1-eth30 interface remote-as external - neighbor r1-eth31 interface remote-as external - neighbor r1-eth32 interface remote-as external - neighbor r1-eth33 interface remote-as external - neighbor r1-eth34 interface remote-as external - neighbor r1-eth35 interface remote-as external - neighbor r1-eth36 interface remote-as external - neighbor r1-eth37 interface remote-as external - neighbor r1-eth38 interface remote-as external - neighbor r1-eth39 interface remote-as external - neighbor r1-eth40 interface remote-as external - neighbor r1-eth41 interface remote-as external - neighbor r1-eth42 interface remote-as external - neighbor r1-eth43 interface remote-as external - neighbor r1-eth44 interface remote-as external - neighbor r1-eth45 interface remote-as external - neighbor r1-eth46 interface remote-as external - neighbor r1-eth47 interface remote-as external - neighbor r1-eth48 interface remote-as external - neighbor r1-eth49 interface remote-as external - neighbor r1-eth50 interface remote-as external - neighbor r1-eth51 interface remote-as external - neighbor r1-eth52 interface remote-as external - neighbor r1-eth53 interface remote-as external - neighbor r1-eth54 interface remote-as external - neighbor r1-eth55 interface remote-as external - neighbor r1-eth56 interface remote-as external - neighbor r1-eth57 interface remote-as external - neighbor r1-eth58 interface remote-as external - neighbor r1-eth59 interface remote-as external - neighbor r1-eth60 interface remote-as external - neighbor r1-eth61 interface remote-as external - neighbor r1-eth62 interface remote-as external - neighbor r1-eth63 interface remote-as external - neighbor r1-eth64 interface remote-as external - neighbor r1-eth65 interface remote-as external - neighbor r1-eth66 interface remote-as external - neighbor r1-eth67 interface remote-as external - neighbor r1-eth68 interface remote-as external - neighbor r1-eth69 interface remote-as external - neighbor r1-eth70 interface remote-as external - neighbor r1-eth71 interface remote-as external - neighbor r1-eth72 interface remote-as external - neighbor r1-eth73 interface remote-as external - neighbor r1-eth74 interface remote-as external - neighbor r1-eth75 interface remote-as external - neighbor r1-eth76 interface remote-as external - neighbor r1-eth77 interface remote-as external - neighbor r1-eth78 interface remote-as external - neighbor r1-eth79 interface remote-as external - neighbor r1-eth80 interface remote-as external - neighbor r1-eth81 interface remote-as external - neighbor r1-eth82 interface remote-as external - neighbor r1-eth83 interface remote-as external - neighbor r1-eth84 interface remote-as external - neighbor r1-eth85 interface remote-as external - neighbor r1-eth86 interface remote-as external - neighbor r1-eth87 interface remote-as external - neighbor r1-eth88 interface remote-as external - neighbor r1-eth89 interface remote-as external - neighbor r1-eth90 interface remote-as external - neighbor r1-eth91 interface remote-as external - neighbor r1-eth92 interface remote-as external - neighbor r1-eth93 interface remote-as external - neighbor r1-eth94 interface remote-as external - neighbor r1-eth95 interface remote-as external - neighbor r1-eth96 interface remote-as external - neighbor r1-eth97 interface remote-as external - neighbor r1-eth98 interface remote-as external - neighbor r1-eth99 interface remote-as external - neighbor r1-eth100 interface remote-as external - neighbor r1-eth101 interface remote-as external - neighbor r1-eth102 interface remote-as external - neighbor r1-eth103 interface remote-as external - neighbor r1-eth104 interface remote-as external - neighbor r1-eth105 interface remote-as external - neighbor r1-eth106 interface remote-as external - neighbor r1-eth107 interface remote-as external - neighbor r1-eth108 interface remote-as external - neighbor r1-eth109 interface remote-as external - neighbor r1-eth110 interface remote-as external - neighbor r1-eth111 interface remote-as external - neighbor r1-eth112 interface remote-as external - neighbor r1-eth113 interface remote-as external - neighbor r1-eth114 interface remote-as external - neighbor r1-eth115 interface remote-as external - neighbor r1-eth116 interface remote-as external - neighbor r1-eth117 interface remote-as external - neighbor r1-eth118 interface remote-as external - neighbor r1-eth119 interface remote-as external - neighbor r1-eth120 interface remote-as external - neighbor r1-eth121 interface remote-as external - neighbor r1-eth122 interface remote-as external - neighbor r1-eth123 interface remote-as external - neighbor r1-eth124 interface remote-as external - neighbor r1-eth125 interface remote-as external - neighbor r1-eth126 interface remote-as external - neighbor r1-eth127 interface remote-as external - neighbor r1-eth128 interface remote-as external - neighbor r1-eth129 interface remote-as external - neighbor r1-eth130 interface remote-as external - neighbor r1-eth131 interface remote-as external - neighbor r1-eth132 interface remote-as external - neighbor r1-eth133 interface remote-as external - neighbor r1-eth134 interface remote-as external - neighbor r1-eth135 interface remote-as external - neighbor r1-eth136 interface remote-as external - neighbor r1-eth137 interface remote-as external - neighbor r1-eth138 interface remote-as external - neighbor r1-eth139 interface remote-as external - neighbor r1-eth140 interface remote-as external - neighbor r1-eth141 interface remote-as external - neighbor r1-eth142 interface remote-as external - neighbor r1-eth143 interface remote-as external - neighbor r1-eth144 interface remote-as external - neighbor r1-eth145 interface remote-as external - neighbor r1-eth146 interface remote-as external - neighbor r1-eth147 interface remote-as external - neighbor r1-eth148 interface remote-as external - neighbor r1-eth149 interface remote-as external - neighbor r1-eth150 interface remote-as external - neighbor r1-eth151 interface remote-as external - neighbor r1-eth152 interface remote-as external - neighbor r1-eth153 interface remote-as external - neighbor r1-eth154 interface remote-as external - neighbor r1-eth155 interface remote-as external - neighbor r1-eth156 interface remote-as external - neighbor r1-eth157 interface remote-as external - neighbor r1-eth158 interface remote-as external - neighbor r1-eth159 interface remote-as external - neighbor r1-eth160 interface remote-as external - neighbor r1-eth161 interface remote-as external - neighbor r1-eth162 interface remote-as external - neighbor r1-eth163 interface remote-as external - neighbor r1-eth164 interface remote-as external - neighbor r1-eth165 interface remote-as external - neighbor r1-eth166 interface remote-as external - neighbor r1-eth167 interface remote-as external - neighbor r1-eth168 interface remote-as external - neighbor r1-eth169 interface remote-as external - neighbor r1-eth170 interface remote-as external - neighbor r1-eth171 interface remote-as external - neighbor r1-eth172 interface remote-as external - neighbor r1-eth173 interface remote-as external - neighbor r1-eth174 interface remote-as external - neighbor r1-eth175 interface remote-as external - neighbor r1-eth176 interface remote-as external - neighbor r1-eth177 interface remote-as external - neighbor r1-eth178 interface remote-as external - neighbor r1-eth179 interface remote-as external - neighbor r1-eth180 interface remote-as external - neighbor r1-eth181 interface remote-as external - neighbor r1-eth182 interface remote-as external - neighbor r1-eth183 interface remote-as external - neighbor r1-eth184 interface remote-as external - neighbor r1-eth185 interface remote-as external - neighbor r1-eth186 interface remote-as external - neighbor r1-eth187 interface remote-as external - neighbor r1-eth188 interface remote-as external - neighbor r1-eth189 interface remote-as external - neighbor r1-eth190 interface remote-as external - neighbor r1-eth191 interface remote-as external - neighbor r1-eth192 interface remote-as external - neighbor r1-eth193 interface remote-as external - neighbor r1-eth194 interface remote-as external - neighbor r1-eth195 interface remote-as external - neighbor r1-eth196 interface remote-as external - neighbor r1-eth197 interface remote-as external - neighbor r1-eth198 interface remote-as external - neighbor r1-eth199 interface remote-as external - neighbor r1-eth200 interface remote-as external - neighbor r1-eth201 interface remote-as external - neighbor r1-eth202 interface remote-as external - neighbor r1-eth203 interface remote-as external - neighbor r1-eth204 interface remote-as external - neighbor r1-eth205 interface remote-as external - neighbor r1-eth206 interface remote-as external - neighbor r1-eth207 interface remote-as external - neighbor r1-eth208 interface remote-as external - neighbor r1-eth209 interface remote-as external - neighbor r1-eth210 interface remote-as external - neighbor r1-eth211 interface remote-as external - neighbor r1-eth212 interface remote-as external - neighbor r1-eth213 interface remote-as external - neighbor r1-eth214 interface remote-as external - neighbor r1-eth215 interface remote-as external - neighbor r1-eth216 interface remote-as external - neighbor r1-eth217 interface remote-as external - neighbor r1-eth218 interface remote-as external - neighbor r1-eth219 interface remote-as external - neighbor r1-eth220 interface remote-as external - neighbor r1-eth221 interface remote-as external - neighbor r1-eth222 interface remote-as external - neighbor r1-eth223 interface remote-as external - neighbor r1-eth224 interface remote-as external - neighbor r1-eth225 interface remote-as external - neighbor r1-eth226 interface remote-as external - neighbor r1-eth227 interface remote-as external - neighbor r1-eth228 interface remote-as external - neighbor r1-eth229 interface remote-as external - neighbor r1-eth230 interface remote-as external - neighbor r1-eth231 interface remote-as external - neighbor r1-eth232 interface remote-as external - neighbor r1-eth233 interface remote-as external - neighbor r1-eth234 interface remote-as external - neighbor r1-eth235 interface remote-as external - neighbor r1-eth236 interface remote-as external - neighbor r1-eth237 interface remote-as external - neighbor r1-eth238 interface remote-as external - neighbor r1-eth239 interface remote-as external - neighbor r1-eth240 interface remote-as external - neighbor r1-eth241 interface remote-as external - neighbor r1-eth242 interface remote-as external - neighbor r1-eth243 interface remote-as external - neighbor r1-eth244 interface remote-as external - neighbor r1-eth245 interface remote-as external - neighbor r1-eth246 interface remote-as external - neighbor r1-eth247 interface remote-as external - neighbor r1-eth248 interface remote-as external - neighbor r1-eth249 interface remote-as external - neighbor r1-eth250 interface remote-as external - neighbor r1-eth251 interface remote-as external - neighbor r1-eth252 interface remote-as external - neighbor r1-eth253 interface remote-as external - neighbor r1-eth254 interface remote-as external - neighbor r1-eth255 interface remote-as external - neighbor r1-eth256 interface remote-as external - neighbor r1-eth257 interface remote-as external - neighbor r1-eth258 interface remote-as external - neighbor r1-eth259 interface remote-as external - address-family ipv4 uni - redistribute sharp + ipv6 address 2001:db8::1/128 +! +interface r1-eth0 + ip address 10.1.1.1/30 + ipv6 address 2001:db8:1:1::1/64 + no shutdown +! +interface r1-eth1 + ip address 10.1.2.1/30 + ipv6 address 2001:db8:1:2::1/64 + no shutdown +! +interface r1-eth2 + ip address 10.1.3.1/30 + ipv6 address 2001:db8:1:3::1/64 + no shutdown +! +interface r1-eth3 + ip address 10.1.4.1/30 + ipv6 address 2001:db8:1:4::1/64 + no shutdown +! +interface r1-eth4 + ip address 10.1.5.1/30 + ipv6 address 2001:db8:1:5::1/64 + no shutdown +! +interface r1-eth5 + ip address 10.1.6.1/30 + ipv6 address 2001:db8:1:6::1/64 + no shutdown +! +interface r1-eth6 + ip address 10.1.7.1/30 + ipv6 address 2001:db8:1:7::1/64 + no shutdown +! +interface r1-eth7 + ip address 10.1.8.1/30 + ipv6 address 2001:db8:1:8::1/64 + no shutdown +! +interface r1-eth8 + ip address 10.1.9.1/30 + ipv6 address 2001:db8:1:9::1/64 + no shutdown +! +interface r1-eth9 + ip address 10.1.10.1/30 + ipv6 address 2001:db8:1:10::1/64 + no shutdown +! +interface r1-eth10 + ip address 10.1.11.1/30 + ipv6 address 2001:db8:1:11::1/64 + no shutdown +! +interface r1-eth11 + ip address 10.1.12.1/30 + ipv6 address 2001:db8:1:12::1/64 + no shutdown +! +interface r1-eth12 + ip address 10.1.13.1/30 + ipv6 address 2001:db8:1:13::1/64 + no shutdown +! +interface r1-eth13 + ip address 10.1.14.1/30 + ipv6 address 2001:db8:1:14::1/64 + no shutdown +! +interface r1-eth14 + ip address 10.1.15.1/30 + ipv6 address 2001:db8:1:15::1/64 + no shutdown +! +interface r1-eth15 + ip address 10.1.16.1/30 + ipv6 address 2001:db8:1:16::1/64 + no shutdown +! +interface r1-eth16 + ip address 10.1.17.1/30 + ipv6 address 2001:db8:1:17::1/64 + no shutdown +! +interface r1-eth17 + ip address 10.1.18.1/30 + ipv6 address 2001:db8:1:18::1/64 + no shutdown +! +interface r1-eth18 + ip address 10.1.19.1/30 + ipv6 address 2001:db8:1:19::1/64 + no shutdown +! +interface r1-eth19 + ip address 10.1.20.1/30 + ipv6 address 2001:db8:1:20::1/64 + no shutdown +! +interface r1-eth20 + ip address 10.1.21.1/30 + ipv6 address 2001:db8:1:21::1/64 + no shutdown +! +interface r1-eth21 + ip address 10.1.22.1/30 + ipv6 address 2001:db8:1:22::1/64 + no shutdown +! +interface r1-eth22 + ip address 10.1.23.1/30 + ipv6 address 2001:db8:1:23::1/64 + no shutdown +! +interface r1-eth23 + ip address 10.1.24.1/30 + ipv6 address 2001:db8:1:24::1/64 + no shutdown +! +interface r1-eth24 + ip address 10.1.25.1/30 + ipv6 address 2001:db8:1:25::1/64 + no shutdown +! +interface r1-eth25 + ip address 10.1.26.1/30 + ipv6 address 2001:db8:1:26::1/64 + no shutdown +! +interface r1-eth26 + ip address 10.1.27.1/30 + ipv6 address 2001:db8:1:27::1/64 + no shutdown +! +interface r1-eth27 + ip address 10.1.28.1/30 + ipv6 address 2001:db8:1:28::1/64 + no shutdown +! +interface r1-eth28 + ip address 10.1.29.1/30 + ipv6 address 2001:db8:1:29::1/64 + no shutdown +! +interface r1-eth29 + ip address 10.1.30.1/30 + ipv6 address 2001:db8:1:30::1/64 + no shutdown +! +interface r1-eth30 + ip address 10.1.31.1/30 + ipv6 address 2001:db8:1:31::1/64 + no shutdown +! +interface r1-eth31 + ip address 10.1.32.1/30 + ipv6 address 2001:db8:1:32::1/64 + no shutdown +! +interface r1-eth32 + ip address 10.1.33.1/30 + ipv6 address 2001:db8:1:33::1/64 + no shutdown +! +interface r1-eth33 + ip address 10.1.34.1/30 + ipv6 address 2001:db8:1:34::1/64 + no shutdown +! +interface r1-eth34 + ip address 10.1.35.1/30 + ipv6 address 2001:db8:1:35::1/64 + no shutdown +! +interface r1-eth35 + ip address 10.1.36.1/30 + ipv6 address 2001:db8:1:36::1/64 + no shutdown +! +interface r1-eth36 + ip address 10.1.37.1/30 + ipv6 address 2001:db8:1:37::1/64 + no shutdown +! +interface r1-eth37 + ip address 10.1.38.1/30 + ipv6 address 2001:db8:1:38::1/64 + no shutdown +! +interface r1-eth38 + ip address 10.1.39.1/30 + ipv6 address 2001:db8:1:39::1/64 + no shutdown +! +interface r1-eth39 + ip address 10.1.40.1/30 + ipv6 address 2001:db8:1:40::1/64 + no shutdown +! +interface r1-eth40 + ip address 10.1.41.1/30 + ipv6 address 2001:db8:1:41::1/64 + no shutdown +! +interface r1-eth41 + ip address 10.1.42.1/30 + ipv6 address 2001:db8:1:42::1/64 + no shutdown +! +interface r1-eth42 + ip address 10.1.43.1/30 + ipv6 address 2001:db8:1:43::1/64 + no shutdown +! +interface r1-eth43 + ip address 10.1.44.1/30 + ipv6 address 2001:db8:1:44::1/64 + no shutdown +! +interface r1-eth44 + ip address 10.1.45.1/30 + ipv6 address 2001:db8:1:45::1/64 + no shutdown +! +interface r1-eth45 + ip address 10.1.46.1/30 + ipv6 address 2001:db8:1:46::1/64 + no shutdown +! +interface r1-eth46 + ip address 10.1.47.1/30 + ipv6 address 2001:db8:1:47::1/64 + no shutdown +! +interface r1-eth47 + ip address 10.1.48.1/30 + ipv6 address 2001:db8:1:48::1/64 + no shutdown +! +interface r1-eth48 + ip address 10.1.49.1/30 + ipv6 address 2001:db8:1:49::1/64 + no shutdown +! +interface r1-eth49 + ip address 10.1.50.1/30 + ipv6 address 2001:db8:1:50::1/64 + no shutdown +! +interface r1-eth50 + ip address 10.1.51.1/30 + ipv6 address 2001:db8:1:51::1/64 + no shutdown +! +interface r1-eth51 + ip address 10.1.52.1/30 + ipv6 address 2001:db8:1:52::1/64 + no shutdown +! +interface r1-eth52 + ip address 10.1.53.1/30 + ipv6 address 2001:db8:1:53::1/64 + no shutdown +! +interface r1-eth53 + ip address 10.1.54.1/30 + ipv6 address 2001:db8:1:54::1/64 + no shutdown +! +interface r1-eth54 + ip address 10.1.55.1/30 + ipv6 address 2001:db8:1:55::1/64 + no shutdown +! +interface r1-eth55 + ip address 10.1.56.1/30 + ipv6 address 2001:db8:1:56::1/64 + no shutdown +! +interface r1-eth56 + ip address 10.1.57.1/30 + ipv6 address 2001:db8:1:57::1/64 + no shutdown +! +interface r1-eth57 + ip address 10.1.58.1/30 + ipv6 address 2001:db8:1:58::1/64 + no shutdown +! +interface r1-eth58 + ip address 10.1.59.1/30 + ipv6 address 2001:db8:1:59::1/64 + no shutdown +! +interface r1-eth59 + ip address 10.1.60.1/30 + ipv6 address 2001:db8:1:60::1/64 + no shutdown +! +interface r1-eth60 + ip address 10.1.61.1/30 + ipv6 address 2001:db8:1:61::1/64 + no shutdown +! +interface r1-eth61 + ip address 10.1.62.1/30 + ipv6 address 2001:db8:1:62::1/64 + no shutdown +! +interface r1-eth62 + ip address 10.1.63.1/30 + ipv6 address 2001:db8:1:63::1/64 + no shutdown +! +interface r1-eth63 + ip address 10.1.64.1/30 + ipv6 address 2001:db8:1:64::1/64 + no shutdown +! +interface r1-eth64 + ip address 10.1.65.1/30 + ipv6 address 2001:db8:1:65::1/64 + no shutdown +! +interface r1-eth65 + ip address 10.1.66.1/30 + ipv6 address 2001:db8:1:66::1/64 + no shutdown +! +interface r1-eth66 + ip address 10.1.67.1/30 + ipv6 address 2001:db8:1:67::1/64 + no shutdown +! +interface r1-eth67 + ip address 10.1.68.1/30 + ipv6 address 2001:db8:1:68::1/64 + no shutdown +! +interface r1-eth68 + ip address 10.1.69.1/30 + ipv6 address 2001:db8:1:69::1/64 + no shutdown +! +interface r1-eth69 + ip address 10.1.70.1/30 + ipv6 address 2001:db8:1:70::1/64 + no shutdown +! +interface r1-eth70 + ip address 10.1.71.1/30 + ipv6 address 2001:db8:1:71::1/64 + no shutdown +! +interface r1-eth71 + ip address 10.1.72.1/30 + ipv6 address 2001:db8:1:72::1/64 + no shutdown +! +interface r1-eth72 + ip address 10.1.73.1/30 + ipv6 address 2001:db8:1:73::1/64 + no shutdown +! +interface r1-eth73 + ip address 10.1.74.1/30 + ipv6 address 2001:db8:1:74::1/64 + no shutdown +! +interface r1-eth74 + ip address 10.1.75.1/30 + ipv6 address 2001:db8:1:75::1/64 + no shutdown +! +interface r1-eth75 + ip address 10.1.76.1/30 + ipv6 address 2001:db8:1:76::1/64 + no shutdown +! +interface r1-eth76 + ip address 10.1.77.1/30 + ipv6 address 2001:db8:1:77::1/64 + no shutdown +! +interface r1-eth77 + ip address 10.1.78.1/30 + ipv6 address 2001:db8:1:78::1/64 + no shutdown +! +interface r1-eth78 + ip address 10.1.79.1/30 + ipv6 address 2001:db8:1:79::1/64 + no shutdown +! +interface r1-eth79 + ip address 10.1.80.1/30 + ipv6 address 2001:db8:1:80::1/64 + no shutdown +! +interface r1-eth80 + ip address 10.1.81.1/30 + ipv6 address 2001:db8:1:81::1/64 + no shutdown +! +interface r1-eth81 + ip address 10.1.82.1/30 + ipv6 address 2001:db8:1:82::1/64 + no shutdown +! +interface r1-eth82 + ip address 10.1.83.1/30 + ipv6 address 2001:db8:1:83::1/64 + no shutdown +! +interface r1-eth83 + ip address 10.1.84.1/30 + ipv6 address 2001:db8:1:84::1/64 + no shutdown +! +interface r1-eth84 + ip address 10.1.85.1/30 + ipv6 address 2001:db8:1:85::1/64 + no shutdown +! +interface r1-eth85 + ip address 10.1.86.1/30 + ipv6 address 2001:db8:1:86::1/64 + no shutdown +! +interface r1-eth86 + ip address 10.1.87.1/30 + ipv6 address 2001:db8:1:87::1/64 + no shutdown +! +interface r1-eth87 + ip address 10.1.88.1/30 + ipv6 address 2001:db8:1:88::1/64 + no shutdown +! +interface r1-eth88 + ip address 10.1.89.1/30 + ipv6 address 2001:db8:1:89::1/64 + no shutdown +! +interface r1-eth89 + ip address 10.1.90.1/30 + ipv6 address 2001:db8:1:90::1/64 + no shutdown +! +interface r1-eth90 + ip address 10.1.91.1/30 + ipv6 address 2001:db8:1:91::1/64 + no shutdown +! +interface r1-eth91 + ip address 10.1.92.1/30 + ipv6 address 2001:db8:1:92::1/64 + no shutdown +! +interface r1-eth92 + ip address 10.1.93.1/30 + ipv6 address 2001:db8:1:93::1/64 + no shutdown +! +interface r1-eth93 + ip address 10.1.94.1/30 + ipv6 address 2001:db8:1:94::1/64 + no shutdown +! +interface r1-eth94 + ip address 10.1.95.1/30 + ipv6 address 2001:db8:1:95::1/64 + no shutdown +! +interface r1-eth95 + ip address 10.1.96.1/30 + ipv6 address 2001:db8:1:96::1/64 + no shutdown +! +interface r1-eth96 + ip address 10.1.97.1/30 + ipv6 address 2001:db8:1:97::1/64 + no shutdown +! +interface r1-eth97 + ip address 10.1.98.1/30 + ipv6 address 2001:db8:1:98::1/64 + no shutdown +! +interface r1-eth98 + ip address 10.1.99.1/30 + ipv6 address 2001:db8:1:99::1/64 + no shutdown +! +interface r1-eth99 + ip address 10.1.100.1/30 + ipv6 address 2001:db8:1:100::1/64 + no shutdown +! +interface r1-eth100 + ip address 10.1.101.1/30 + ipv6 address 2001:db8:1:101::1/64 + no shutdown +! +interface r1-eth101 + ip address 10.1.102.1/30 + ipv6 address 2001:db8:1:102::1/64 + no shutdown +! +interface r1-eth102 + ip address 10.1.103.1/30 + ipv6 address 2001:db8:1:103::1/64 + no shutdown +! +interface r1-eth103 + ip address 10.1.104.1/30 + ipv6 address 2001:db8:1:104::1/64 + no shutdown +! +interface r1-eth104 + ip address 10.1.105.1/30 + ipv6 address 2001:db8:1:105::1/64 + no shutdown +! +interface r1-eth105 + ip address 10.1.106.1/30 + ipv6 address 2001:db8:1:106::1/64 + no shutdown +! +interface r1-eth106 + ip address 10.1.107.1/30 + ipv6 address 2001:db8:1:107::1/64 + no shutdown +! +interface r1-eth107 + ip address 10.1.108.1/30 + ipv6 address 2001:db8:1:108::1/64 + no shutdown +! +interface r1-eth108 + ip address 10.1.109.1/30 + ipv6 address 2001:db8:1:109::1/64 + no shutdown +! +interface r1-eth109 + ip address 10.1.110.1/30 + ipv6 address 2001:db8:1:110::1/64 + no shutdown +! +interface r1-eth110 + ip address 10.1.111.1/30 + ipv6 address 2001:db8:1:111::1/64 + no shutdown +! +interface r1-eth111 + ip address 10.1.112.1/30 + ipv6 address 2001:db8:1:112::1/64 + no shutdown +! +interface r1-eth112 + ip address 10.1.113.1/30 + ipv6 address 2001:db8:1:113::1/64 + no shutdown +! +interface r1-eth113 + ip address 10.1.114.1/30 + ipv6 address 2001:db8:1:114::1/64 + no shutdown +! +interface r1-eth114 + ip address 10.1.115.1/30 + ipv6 address 2001:db8:1:115::1/64 + no shutdown +! +interface r1-eth115 + ip address 10.1.116.1/30 + ipv6 address 2001:db8:1:116::1/64 + no shutdown +! +interface r1-eth116 + ip address 10.1.117.1/30 + ipv6 address 2001:db8:1:117::1/64 + no shutdown +! +interface r1-eth117 + ip address 10.1.118.1/30 + ipv6 address 2001:db8:1:118::1/64 + no shutdown +! +interface r1-eth118 + ip address 10.1.119.1/30 + ipv6 address 2001:db8:1:119::1/64 + no shutdown +! +interface r1-eth119 + ip address 10.1.120.1/30 + ipv6 address 2001:db8:1:120::1/64 + no shutdown +! +interface r1-eth120 + ip address 10.1.121.1/30 + ipv6 address 2001:db8:1:121::1/64 + no shutdown +! +interface r1-eth121 + ip address 10.1.122.1/30 + ipv6 address 2001:db8:1:122::1/64 + no shutdown +! +interface r1-eth122 + ip address 10.1.123.1/30 + ipv6 address 2001:db8:1:123::1/64 + no shutdown +! +interface r1-eth123 + ip address 10.1.124.1/30 + ipv6 address 2001:db8:1:124::1/64 + no shutdown +! +interface r1-eth124 + ip address 10.1.125.1/30 + ipv6 address 2001:db8:1:125::1/64 + no shutdown +! +interface r1-eth125 + ip address 10.1.126.1/30 + ipv6 address 2001:db8:1:126::1/64 + no shutdown +! +interface r1-eth126 + ip address 10.1.127.1/30 + ipv6 address 2001:db8:1:127::1/64 + no shutdown +! +interface r1-eth127 + ip address 10.1.128.1/30 + ipv6 address 2001:db8:1:128::1/64 + no shutdown +! +interface r1-eth128 + ip address 10.1.129.1/30 + ipv6 address 2001:db8:1:129::1/64 + no shutdown +! +interface r1-eth129 + ip address 10.1.130.1/30 + ipv6 address 2001:db8:1:130::1/64 + no shutdown +! +interface r1-eth130 + ip address 10.1.131.1/30 + ipv6 address 2001:db8:1:131::1/64 + no shutdown +! +interface r1-eth131 + ip address 10.1.132.1/30 + ipv6 address 2001:db8:1:132::1/64 + no shutdown +! +interface r1-eth132 + ip address 10.1.133.1/30 + ipv6 address 2001:db8:1:133::1/64 + no shutdown +! +interface r1-eth133 + ip address 10.1.134.1/30 + ipv6 address 2001:db8:1:134::1/64 + no shutdown +! +interface r1-eth134 + ip address 10.1.135.1/30 + ipv6 address 2001:db8:1:135::1/64 + no shutdown +! +interface r1-eth135 + ip address 10.1.136.1/30 + ipv6 address 2001:db8:1:136::1/64 + no shutdown +! +interface r1-eth136 + ip address 10.1.137.1/30 + ipv6 address 2001:db8:1:137::1/64 + no shutdown +! +interface r1-eth137 + ip address 10.1.138.1/30 + ipv6 address 2001:db8:1:138::1/64 + no shutdown +! +interface r1-eth138 + ip address 10.1.139.1/30 + ipv6 address 2001:db8:1:139::1/64 + no shutdown +! +interface r1-eth139 + ip address 10.1.140.1/30 + ipv6 address 2001:db8:1:140::1/64 + no shutdown +! +interface r1-eth140 + ip address 10.1.141.1/30 + ipv6 address 2001:db8:1:141::1/64 + no shutdown +! +interface r1-eth141 + ip address 10.1.142.1/30 + ipv6 address 2001:db8:1:142::1/64 + no shutdown +! +interface r1-eth142 + ip address 10.1.143.1/30 + ipv6 address 2001:db8:1:143::1/64 + no shutdown +! +interface r1-eth143 + ip address 10.1.144.1/30 + ipv6 address 2001:db8:1:144::1/64 + no shutdown +! +interface r1-eth144 + ip address 10.1.145.1/30 + ipv6 address 2001:db8:1:145::1/64 + no shutdown +! +interface r1-eth145 + ip address 10.1.146.1/30 + ipv6 address 2001:db8:1:146::1/64 + no shutdown +! +interface r1-eth146 + ip address 10.1.147.1/30 + ipv6 address 2001:db8:1:147::1/64 + no shutdown +! +interface r1-eth147 + ip address 10.1.148.1/30 + ipv6 address 2001:db8:1:148::1/64 + no shutdown +! +interface r1-eth148 + ip address 10.1.149.1/30 + ipv6 address 2001:db8:1:149::1/64 + no shutdown +! +interface r1-eth149 + ip address 10.1.150.1/30 + ipv6 address 2001:db8:1:150::1/64 + no shutdown +! +interface r1-eth150 + ip address 10.1.151.1/30 + ipv6 address 2001:db8:1:151::1/64 + no shutdown +! +interface r1-eth151 + ip address 10.1.152.1/30 + ipv6 address 2001:db8:1:152::1/64 + no shutdown +! +interface r1-eth152 + ip address 10.1.153.1/30 + ipv6 address 2001:db8:1:153::1/64 + no shutdown +! +interface r1-eth153 + ip address 10.1.154.1/30 + ipv6 address 2001:db8:1:154::1/64 + no shutdown +! +interface r1-eth154 + ip address 10.1.155.1/30 + ipv6 address 2001:db8:1:155::1/64 + no shutdown +! +interface r1-eth155 + ip address 10.1.156.1/30 + ipv6 address 2001:db8:1:156::1/64 + no shutdown +! +interface r1-eth156 + ip address 10.1.157.1/30 + ipv6 address 2001:db8:1:157::1/64 + no shutdown +! +interface r1-eth157 + ip address 10.1.158.1/30 + ipv6 address 2001:db8:1:158::1/64 + no shutdown +! +interface r1-eth158 + ip address 10.1.159.1/30 + ipv6 address 2001:db8:1:159::1/64 + no shutdown +! +interface r1-eth159 + ip address 10.1.160.1/30 + ipv6 address 2001:db8:1:160::1/64 + no shutdown +! +interface r1-eth160 + ip address 10.1.161.1/30 + ipv6 address 2001:db8:1:161::1/64 + no shutdown +! +interface r1-eth161 + ip address 10.1.162.1/30 + ipv6 address 2001:db8:1:162::1/64 + no shutdown +! +interface r1-eth162 + ip address 10.1.163.1/30 + ipv6 address 2001:db8:1:163::1/64 + no shutdown +! +interface r1-eth163 + ip address 10.1.164.1/30 + ipv6 address 2001:db8:1:164::1/64 + no shutdown +! +interface r1-eth164 + ip address 10.1.165.1/30 + ipv6 address 2001:db8:1:165::1/64 + no shutdown +! +interface r1-eth165 + ip address 10.1.166.1/30 + ipv6 address 2001:db8:1:166::1/64 + no shutdown +! +interface r1-eth166 + ip address 10.1.167.1/30 + ipv6 address 2001:db8:1:167::1/64 + no shutdown +! +interface r1-eth167 + ip address 10.1.168.1/30 + ipv6 address 2001:db8:1:168::1/64 + no shutdown +! +interface r1-eth168 + ip address 10.1.169.1/30 + ipv6 address 2001:db8:1:169::1/64 + no shutdown +! +interface r1-eth169 + ip address 10.1.170.1/30 + ipv6 address 2001:db8:1:170::1/64 + no shutdown +! +interface r1-eth170 + ip address 10.1.171.1/30 + ipv6 address 2001:db8:1:171::1/64 + no shutdown +! +interface r1-eth171 + ip address 10.1.172.1/30 + ipv6 address 2001:db8:1:172::1/64 + no shutdown +! +interface r1-eth172 + ip address 10.1.173.1/30 + ipv6 address 2001:db8:1:173::1/64 + no shutdown +! +interface r1-eth173 + ip address 10.1.174.1/30 + ipv6 address 2001:db8:1:174::1/64 + no shutdown +! +interface r1-eth174 + ip address 10.1.175.1/30 + ipv6 address 2001:db8:1:175::1/64 + no shutdown +! +interface r1-eth175 + ip address 10.1.176.1/30 + ipv6 address 2001:db8:1:176::1/64 + no shutdown +! +interface r1-eth176 + ip address 10.1.177.1/30 + ipv6 address 2001:db8:1:177::1/64 + no shutdown +! +interface r1-eth177 + ip address 10.1.178.1/30 + ipv6 address 2001:db8:1:178::1/64 + no shutdown +! +interface r1-eth178 + ip address 10.1.179.1/30 + ipv6 address 2001:db8:1:179::1/64 + no shutdown +! +interface r1-eth179 + ip address 10.1.180.1/30 + ipv6 address 2001:db8:1:180::1/64 + no shutdown +! +interface r1-eth180 + ip address 10.1.181.1/30 + ipv6 address 2001:db8:1:181::1/64 + no shutdown +! +interface r1-eth181 + ip address 10.1.182.1/30 + ipv6 address 2001:db8:1:182::1/64 + no shutdown +! +interface r1-eth182 + ip address 10.1.183.1/30 + ipv6 address 2001:db8:1:183::1/64 + no shutdown +! +interface r1-eth183 + ip address 10.1.184.1/30 + ipv6 address 2001:db8:1:184::1/64 + no shutdown +! +interface r1-eth184 + ip address 10.1.185.1/30 + ipv6 address 2001:db8:1:185::1/64 + no shutdown +! +interface r1-eth185 + ip address 10.1.186.1/30 + ipv6 address 2001:db8:1:186::1/64 + no shutdown +! +interface r1-eth186 + ip address 10.1.187.1/30 + ipv6 address 2001:db8:1:187::1/64 + no shutdown +! +interface r1-eth187 + ip address 10.1.188.1/30 + ipv6 address 2001:db8:1:188::1/64 + no shutdown +! +interface r1-eth188 + ip address 10.1.189.1/30 + ipv6 address 2001:db8:1:189::1/64 + no shutdown +! +interface r1-eth189 + ip address 10.1.190.1/30 + ipv6 address 2001:db8:1:190::1/64 + no shutdown +! +interface r1-eth190 + ip address 10.1.191.1/30 + ipv6 address 2001:db8:1:191::1/64 + no shutdown +! +interface r1-eth191 + ip address 10.1.192.1/30 + ipv6 address 2001:db8:1:192::1/64 + no shutdown +! +interface r1-eth192 + ip address 10.1.193.1/30 + ipv6 address 2001:db8:1:193::1/64 + no shutdown +! +interface r1-eth193 + ip address 10.1.194.1/30 + ipv6 address 2001:db8:1:194::1/64 + no shutdown +! +interface r1-eth194 + ip address 10.1.195.1/30 + ipv6 address 2001:db8:1:195::1/64 + no shutdown +! +interface r1-eth195 + ip address 10.1.196.1/30 + ipv6 address 2001:db8:1:196::1/64 + no shutdown +! +interface r1-eth196 + ip address 10.1.197.1/30 + ipv6 address 2001:db8:1:197::1/64 + no shutdown +! +interface r1-eth197 + ip address 10.1.198.1/30 + ipv6 address 2001:db8:1:198::1/64 + no shutdown +! +interface r1-eth198 + ip address 10.1.199.1/30 + ipv6 address 2001:db8:1:199::1/64 + no shutdown +! +interface r1-eth199 + ip address 10.1.200.1/30 + ipv6 address 2001:db8:1:200::1/64 + no shutdown +! +interface r1-eth200 + ip address 10.1.201.1/30 + ipv6 address 2001:db8:1:201::1/64 + no shutdown +! +interface r1-eth201 + ip address 10.1.202.1/30 + ipv6 address 2001:db8:1:202::1/64 + no shutdown +! +interface r1-eth202 + ip address 10.1.203.1/30 + ipv6 address 2001:db8:1:203::1/64 + no shutdown +! +interface r1-eth203 + ip address 10.1.204.1/30 + ipv6 address 2001:db8:1:204::1/64 + no shutdown +! +interface r1-eth204 + ip address 10.1.205.1/30 + ipv6 address 2001:db8:1:205::1/64 + no shutdown +! +interface r1-eth205 + ip address 10.1.206.1/30 + ipv6 address 2001:db8:1:206::1/64 + no shutdown +! +interface r1-eth206 + ip address 10.1.207.1/30 + ipv6 address 2001:db8:1:207::1/64 + no shutdown +! +interface r1-eth207 + ip address 10.1.208.1/30 + ipv6 address 2001:db8:1:208::1/64 + no shutdown +! +interface r1-eth208 + ip address 10.1.209.1/30 + ipv6 address 2001:db8:1:209::1/64 + no shutdown +! +interface r1-eth209 + ip address 10.1.210.1/30 + ipv6 address 2001:db8:1:210::1/64 + no shutdown +! +interface r1-eth210 + ip address 10.1.211.1/30 + ipv6 address 2001:db8:1:211::1/64 + no shutdown +! +interface r1-eth211 + ip address 10.1.212.1/30 + ipv6 address 2001:db8:1:212::1/64 + no shutdown +! +interface r1-eth212 + ip address 10.1.213.1/30 + ipv6 address 2001:db8:1:213::1/64 + no shutdown +! +interface r1-eth213 + ip address 10.1.214.1/30 + ipv6 address 2001:db8:1:214::1/64 + no shutdown +! +interface r1-eth214 + ip address 10.1.215.1/30 + ipv6 address 2001:db8:1:215::1/64 + no shutdown +! +interface r1-eth215 + ip address 10.1.216.1/30 + ipv6 address 2001:db8:1:216::1/64 + no shutdown +! +interface r1-eth216 + ip address 10.1.217.1/30 + ipv6 address 2001:db8:1:217::1/64 + no shutdown +! +interface r1-eth217 + ip address 10.1.218.1/30 + ipv6 address 2001:db8:1:218::1/64 + no shutdown +! +interface r1-eth218 + ip address 10.1.219.1/30 + ipv6 address 2001:db8:1:219::1/64 + no shutdown +! +interface r1-eth219 + ip address 10.1.220.1/30 + ipv6 address 2001:db8:1:220::1/64 + no shutdown +! +interface r1-eth220 + ip address 10.1.221.1/30 + ipv6 address 2001:db8:1:221::1/64 + no shutdown +! +interface r1-eth221 + ip address 10.1.222.1/30 + ipv6 address 2001:db8:1:222::1/64 + no shutdown +! +interface r1-eth222 + ip address 10.1.223.1/30 + ipv6 address 2001:db8:1:223::1/64 + no shutdown +! +interface r1-eth223 + ip address 10.1.224.1/30 + ipv6 address 2001:db8:1:224::1/64 + no shutdown +! +interface r1-eth224 + ip address 10.1.225.1/30 + ipv6 address 2001:db8:1:225::1/64 + no shutdown +! +interface r1-eth225 + ip address 10.1.226.1/30 + ipv6 address 2001:db8:1:226::1/64 + no shutdown +! +interface r1-eth226 + ip address 10.1.227.1/30 + ipv6 address 2001:db8:1:227::1/64 + no shutdown +! +interface r1-eth227 + ip address 10.1.228.1/30 + ipv6 address 2001:db8:1:228::1/64 + no shutdown +! +interface r1-eth228 + ip address 10.1.229.1/30 + ipv6 address 2001:db8:1:229::1/64 + no shutdown +! +interface r1-eth229 + ip address 10.1.230.1/30 + ipv6 address 2001:db8:1:230::1/64 + no shutdown +! +interface r1-eth230 + ip address 10.1.231.1/30 + ipv6 address 2001:db8:1:231::1/64 + no shutdown +! +interface r1-eth231 + ip address 10.1.232.1/30 + ipv6 address 2001:db8:1:232::1/64 + no shutdown +! +interface r1-eth232 + ip address 10.1.233.1/30 + ipv6 address 2001:db8:1:233::1/64 + no shutdown +! +interface r1-eth233 + ip address 10.1.234.1/30 + ipv6 address 2001:db8:1:234::1/64 + no shutdown +! +interface r1-eth234 + ip address 10.1.235.1/30 + ipv6 address 2001:db8:1:235::1/64 + no shutdown +! +interface r1-eth235 + ip address 10.1.236.1/30 + ipv6 address 2001:db8:1:236::1/64 + no shutdown +! +interface r1-eth236 + ip address 10.1.237.1/30 + ipv6 address 2001:db8:1:237::1/64 + no shutdown +! +interface r1-eth237 + ip address 10.1.238.1/30 + ipv6 address 2001:db8:1:238::1/64 + no shutdown +! +interface r1-eth238 + ip address 10.1.239.1/30 + ipv6 address 2001:db8:1:239::1/64 + no shutdown +! +interface r1-eth239 + ip address 10.1.240.1/30 + ipv6 address 2001:db8:1:240::1/64 + no shutdown +! +interface r1-eth240 + ip address 10.1.241.1/30 + ipv6 address 2001:db8:1:241::1/64 + no shutdown +! +interface r1-eth241 + ip address 10.1.242.1/30 + ipv6 address 2001:db8:1:242::1/64 + no shutdown +! +interface r1-eth242 + ip address 10.1.243.1/30 + ipv6 address 2001:db8:1:243::1/64 + no shutdown +! +interface r1-eth243 + ip address 10.1.244.1/30 + ipv6 address 2001:db8:1:244::1/64 + no shutdown +! +interface r1-eth244 + ip address 10.1.245.1/30 + ipv6 address 2001:db8:1:245::1/64 + no shutdown +! +interface r1-eth245 + ip address 10.1.246.1/30 + ipv6 address 2001:db8:1:246::1/64 + no shutdown +! +interface r1-eth246 + ip address 10.1.247.1/30 + ipv6 address 2001:db8:1:247::1/64 + no shutdown +! +interface r1-eth247 + ip address 10.1.248.1/30 + ipv6 address 2001:db8:1:248::1/64 + no shutdown +! +interface r1-eth248 + ip address 10.1.249.1/30 + ipv6 address 2001:db8:1:249::1/64 + no shutdown +! +interface r1-eth249 + ip address 10.1.250.1/30 + ipv6 address 2001:db8:1:250::1/64 + no shutdown +! +interface r1-eth250 + ip address 10.1.251.1/30 + ipv6 address 2001:db8:1:251::1/64 + no shutdown +! +interface r1-eth251 + ip address 10.1.252.1/30 + ipv6 address 2001:db8:1:252::1/64 + no shutdown +! +interface r1-eth252 + ip address 10.1.253.1/30 + ipv6 address 2001:db8:1:253::1/64 + no shutdown +! +interface r1-eth253 + ip address 10.1.254.1/30 + ipv6 address 2001:db8:1:254::1/64 + no shutdown +! +interface r1-eth254 + ip address 10.1.255.1/30 + ipv6 address 2001:db8:1:255::1/64 + no shutdown +! +interface r1-eth255 + ip address 10.2.1.1/30 + ipv6 address 2001:db8:2:1::1/64 + no shutdown +! +interface r1-eth256 + ip address 10.2.2.1/30 + ipv6 address 2001:db8:2:2::1/64 + no shutdown +! +interface r1-eth257 + ip address 10.2.3.1/30 + ipv6 address 2001:db8:2:3::1/64 + no shutdown +! +interface r1-eth258 + ip address 10.2.4.1/30 + ipv6 address 2001:db8:2:4::1/64 + no shutdown +! +interface r1-eth259 + ip address 10.2.5.1/30 + ipv6 address 2001:db8:2:5::1/64 + no shutdown +! +interface r1-eth260 + ip address 10.2.6.1/30 + ipv6 address 2001:db8:2:6::1/64 + no shutdown +! +interface r1-eth261 + ip address 10.2.7.1/30 + ipv6 address 2001:db8:2:7::1/64 + no shutdown +! +interface r1-eth262 + ip address 10.2.8.1/30 + ipv6 address 2001:db8:2:8::1/64 + no shutdown +! +interface r1-eth263 + ip address 10.2.9.1/30 + ipv6 address 2001:db8:2:9::1/64 + no shutdown +! +interface r1-eth264 + ip address 10.2.10.1/30 + ipv6 address 2001:db8:2:10::1/64 + no shutdown +! +interface r1-eth265 + ip address 10.2.11.1/30 + ipv6 address 2001:db8:2:11::1/64 + no shutdown +! +interface r1-eth266 + ip address 10.2.12.1/30 + ipv6 address 2001:db8:2:12::1/64 + no shutdown +! +interface r1-eth267 + ip address 10.2.13.1/30 + ipv6 address 2001:db8:2:13::1/64 + no shutdown +! +interface r1-eth268 + ip address 10.2.14.1/30 + ipv6 address 2001:db8:2:14::1/64 + no shutdown +! +interface r1-eth269 + ip address 10.2.15.1/30 + ipv6 address 2001:db8:2:15::1/64 + no shutdown +! +interface r1-eth270 + ip address 10.2.16.1/30 + ipv6 address 2001:db8:2:16::1/64 + no shutdown +! +interface r1-eth271 + ip address 10.2.17.1/30 + ipv6 address 2001:db8:2:17::1/64 + no shutdown +! +interface r1-eth272 + ip address 10.2.18.1/30 + ipv6 address 2001:db8:2:18::1/64 + no shutdown +! +interface r1-eth273 + ip address 10.2.19.1/30 + ipv6 address 2001:db8:2:19::1/64 + no shutdown +! +interface r1-eth274 + ip address 10.2.20.1/30 + ipv6 address 2001:db8:2:20::1/64 + no shutdown +! +interface r1-eth275 + ip address 10.2.21.1/30 + ipv6 address 2001:db8:2:21::1/64 + no shutdown +! +interface r1-eth276 + ip address 10.2.22.1/30 + ipv6 address 2001:db8:2:22::1/64 + no shutdown +! +interface r1-eth277 + ip address 10.2.23.1/30 + ipv6 address 2001:db8:2:23::1/64 + no shutdown +! +interface r1-eth278 + ip address 10.2.24.1/30 + ipv6 address 2001:db8:2:24::1/64 + no shutdown +! +interface r1-eth279 + ip address 10.2.25.1/30 + ipv6 address 2001:db8:2:25::1/64 + no shutdown +! +interface r1-eth280 + ip address 10.2.26.1/30 + ipv6 address 2001:db8:2:26::1/64 + no shutdown +! +interface r1-eth281 + ip address 10.2.27.1/30 + ipv6 address 2001:db8:2:27::1/64 + no shutdown +! +interface r1-eth282 + ip address 10.2.28.1/30 + ipv6 address 2001:db8:2:28::1/64 + no shutdown +! +interface r1-eth283 + ip address 10.2.29.1/30 + ipv6 address 2001:db8:2:29::1/64 + no shutdown +! +interface r1-eth284 + ip address 10.2.30.1/30 + ipv6 address 2001:db8:2:30::1/64 + no shutdown +! +interface r1-eth285 + ip address 10.2.31.1/30 + ipv6 address 2001:db8:2:31::1/64 + no shutdown +! +interface r1-eth286 + ip address 10.2.32.1/30 + ipv6 address 2001:db8:2:32::1/64 + no shutdown +! +interface r1-eth287 + ip address 10.2.33.1/30 + ipv6 address 2001:db8:2:33::1/64 + no shutdown +! +interface r1-eth288 + ip address 10.2.34.1/30 + ipv6 address 2001:db8:2:34::1/64 + no shutdown +! +interface r1-eth289 + ip address 10.2.35.1/30 + ipv6 address 2001:db8:2:35::1/64 + no shutdown +! +interface r1-eth290 + ip address 10.2.36.1/30 + ipv6 address 2001:db8:2:36::1/64 + no shutdown +! +interface r1-eth291 + ip address 10.2.37.1/30 + ipv6 address 2001:db8:2:37::1/64 + no shutdown +! +interface r1-eth292 + ip address 10.2.38.1/30 + ipv6 address 2001:db8:2:38::1/64 + no shutdown +! +interface r1-eth293 + ip address 10.2.39.1/30 + ipv6 address 2001:db8:2:39::1/64 + no shutdown +! +interface r1-eth294 + ip address 10.2.40.1/30 + ipv6 address 2001:db8:2:40::1/64 + no shutdown +! +interface r1-eth295 + ip address 10.2.41.1/30 + ipv6 address 2001:db8:2:41::1/64 + no shutdown +! +interface r1-eth296 + ip address 10.2.42.1/30 + ipv6 address 2001:db8:2:42::1/64 + no shutdown +! +interface r1-eth297 + ip address 10.2.43.1/30 + ipv6 address 2001:db8:2:43::1/64 + no shutdown +! +interface r1-eth298 + ip address 10.2.44.1/30 + ipv6 address 2001:db8:2:44::1/64 + no shutdown +! +interface r1-eth299 + ip address 10.2.45.1/30 + ipv6 address 2001:db8:2:45::1/64 + no shutdown +! +interface r1-eth300 + ip address 10.2.46.1/30 + ipv6 address 2001:db8:2:46::1/64 + no shutdown +! +interface r1-eth301 + ip address 10.2.47.1/30 + ipv6 address 2001:db8:2:47::1/64 + no shutdown +! +interface r1-eth302 + ip address 10.2.48.1/30 + ipv6 address 2001:db8:2:48::1/64 + no shutdown +! +interface r1-eth303 + ip address 10.2.49.1/30 + ipv6 address 2001:db8:2:49::1/64 + no shutdown +! +interface r1-eth304 + ip address 10.2.50.1/30 + ipv6 address 2001:db8:2:50::1/64 + no shutdown +! +interface r1-eth305 + ip address 10.2.51.1/30 + ipv6 address 2001:db8:2:51::1/64 + no shutdown +! +interface r1-eth306 + ip address 10.2.52.1/30 + ipv6 address 2001:db8:2:52::1/64 + no shutdown +! +interface r1-eth307 + ip address 10.2.53.1/30 + ipv6 address 2001:db8:2:53::1/64 + no shutdown +! +interface r1-eth308 + ip address 10.2.54.1/30 + ipv6 address 2001:db8:2:54::1/64 + no shutdown +! +interface r1-eth309 + ip address 10.2.55.1/30 + ipv6 address 2001:db8:2:55::1/64 + no shutdown +! +interface r1-eth310 + ip address 10.2.56.1/30 + ipv6 address 2001:db8:2:56::1/64 + no shutdown +! +interface r1-eth311 + ip address 10.2.57.1/30 + ipv6 address 2001:db8:2:57::1/64 + no shutdown +! +interface r1-eth312 + ip address 10.2.58.1/30 + ipv6 address 2001:db8:2:58::1/64 + no shutdown +! +interface r1-eth313 + ip address 10.2.59.1/30 + ipv6 address 2001:db8:2:59::1/64 + no shutdown +! +interface r1-eth314 + ip address 10.2.60.1/30 + ipv6 address 2001:db8:2:60::1/64 + no shutdown +! +interface r1-eth315 + ip address 10.2.61.1/30 + ipv6 address 2001:db8:2:61::1/64 + no shutdown +! +interface r1-eth316 + ip address 10.2.62.1/30 + ipv6 address 2001:db8:2:62::1/64 + no shutdown +! +interface r1-eth317 + ip address 10.2.63.1/30 + ipv6 address 2001:db8:2:63::1/64 + no shutdown +! +interface r1-eth318 + ip address 10.2.64.1/30 + ipv6 address 2001:db8:2:64::1/64 + no shutdown +! +interface r1-eth319 + ip address 10.2.65.1/30 + ipv6 address 2001:db8:2:65::1/64 + no shutdown +! +interface r1-eth320 + ip address 10.2.66.1/30 + ipv6 address 2001:db8:2:66::1/64 + no shutdown +! +interface r1-eth321 + ip address 10.2.67.1/30 + ipv6 address 2001:db8:2:67::1/64 + no shutdown +! +interface r1-eth322 + ip address 10.2.68.1/30 + ipv6 address 2001:db8:2:68::1/64 + no shutdown +! +interface r1-eth323 + ip address 10.2.69.1/30 + ipv6 address 2001:db8:2:69::1/64 + no shutdown +! +interface r1-eth324 + ip address 10.2.70.1/30 + ipv6 address 2001:db8:2:70::1/64 + no shutdown +! +interface r1-eth325 + ip address 10.2.71.1/30 + ipv6 address 2001:db8:2:71::1/64 + no shutdown +! +interface r1-eth326 + ip address 10.2.72.1/30 + ipv6 address 2001:db8:2:72::1/64 + no shutdown +! +interface r1-eth327 + ip address 10.2.73.1/30 + ipv6 address 2001:db8:2:73::1/64 + no shutdown +! +interface r1-eth328 + ip address 10.2.74.1/30 + ipv6 address 2001:db8:2:74::1/64 + no shutdown +! +interface r1-eth329 + ip address 10.2.75.1/30 + ipv6 address 2001:db8:2:75::1/64 + no shutdown +! +interface r1-eth330 + ip address 10.2.76.1/30 + ipv6 address 2001:db8:2:76::1/64 + no shutdown +! +interface r1-eth331 + ip address 10.2.77.1/30 + ipv6 address 2001:db8:2:77::1/64 + no shutdown +! +interface r1-eth332 + ip address 10.2.78.1/30 + ipv6 address 2001:db8:2:78::1/64 + no shutdown +! +interface r1-eth333 + ip address 10.2.79.1/30 + ipv6 address 2001:db8:2:79::1/64 + no shutdown +! +interface r1-eth334 + ip address 10.2.80.1/30 + ipv6 address 2001:db8:2:80::1/64 + no shutdown +! +interface r1-eth335 + ip address 10.2.81.1/30 + ipv6 address 2001:db8:2:81::1/64 + no shutdown +! +interface r1-eth336 + ip address 10.2.82.1/30 + ipv6 address 2001:db8:2:82::1/64 + no shutdown +! +interface r1-eth337 + ip address 10.2.83.1/30 + ipv6 address 2001:db8:2:83::1/64 + no shutdown +! +interface r1-eth338 + ip address 10.2.84.1/30 + ipv6 address 2001:db8:2:84::1/64 + no shutdown +! +interface r1-eth339 + ip address 10.2.85.1/30 + ipv6 address 2001:db8:2:85::1/64 + no shutdown +! +interface r1-eth340 + ip address 10.2.86.1/30 + ipv6 address 2001:db8:2:86::1/64 + no shutdown +! +interface r1-eth341 + ip address 10.2.87.1/30 + ipv6 address 2001:db8:2:87::1/64 + no shutdown +! +interface r1-eth342 + ip address 10.2.88.1/30 + ipv6 address 2001:db8:2:88::1/64 + no shutdown +! +interface r1-eth343 + ip address 10.2.89.1/30 + ipv6 address 2001:db8:2:89::1/64 + no shutdown +! +interface r1-eth344 + ip address 10.2.90.1/30 + ipv6 address 2001:db8:2:90::1/64 + no shutdown +! +interface r1-eth345 + ip address 10.2.91.1/30 + ipv6 address 2001:db8:2:91::1/64 + no shutdown +! +interface r1-eth346 + ip address 10.2.92.1/30 + ipv6 address 2001:db8:2:92::1/64 + no shutdown +! +interface r1-eth347 + ip address 10.2.93.1/30 + ipv6 address 2001:db8:2:93::1/64 + no shutdown +! +interface r1-eth348 + ip address 10.2.94.1/30 + ipv6 address 2001:db8:2:94::1/64 + no shutdown +! +interface r1-eth349 + ip address 10.2.95.1/30 + ipv6 address 2001:db8:2:95::1/64 + no shutdown +! +interface r1-eth350 + ip address 10.2.96.1/30 + ipv6 address 2001:db8:2:96::1/64 + no shutdown +! +interface r1-eth351 + ip address 10.2.97.1/30 + ipv6 address 2001:db8:2:97::1/64 + no shutdown +! +interface r1-eth352 + ip address 10.2.98.1/30 + ipv6 address 2001:db8:2:98::1/64 + no shutdown +! +interface r1-eth353 + ip address 10.2.99.1/30 + ipv6 address 2001:db8:2:99::1/64 + no shutdown +! +interface r1-eth354 + ip address 10.2.100.1/30 + ipv6 address 2001:db8:2:100::1/64 + no shutdown +! +interface r1-eth355 + ip address 10.2.101.1/30 + ipv6 address 2001:db8:2:101::1/64 + no shutdown +! +interface r1-eth356 + ip address 10.2.102.1/30 + ipv6 address 2001:db8:2:102::1/64 + no shutdown +! +interface r1-eth357 + ip address 10.2.103.1/30 + ipv6 address 2001:db8:2:103::1/64 + no shutdown +! +interface r1-eth358 + ip address 10.2.104.1/30 + ipv6 address 2001:db8:2:104::1/64 + no shutdown +! +interface r1-eth359 + ip address 10.2.105.1/30 + ipv6 address 2001:db8:2:105::1/64 + no shutdown +! +interface r1-eth360 + ip address 10.2.106.1/30 + ipv6 address 2001:db8:2:106::1/64 + no shutdown +! +interface r1-eth361 + ip address 10.2.107.1/30 + ipv6 address 2001:db8:2:107::1/64 + no shutdown +! +interface r1-eth362 + ip address 10.2.108.1/30 + ipv6 address 2001:db8:2:108::1/64 + no shutdown +! +interface r1-eth363 + ip address 10.2.109.1/30 + ipv6 address 2001:db8:2:109::1/64 + no shutdown +! +interface r1-eth364 + ip address 10.2.110.1/30 + ipv6 address 2001:db8:2:110::1/64 + no shutdown +! +interface r1-eth365 + ip address 10.2.111.1/30 + ipv6 address 2001:db8:2:111::1/64 + no shutdown +! +interface r1-eth366 + ip address 10.2.112.1/30 + ipv6 address 2001:db8:2:112::1/64 + no shutdown +! +interface r1-eth367 + ip address 10.2.113.1/30 + ipv6 address 2001:db8:2:113::1/64 + no shutdown +! +interface r1-eth368 + ip address 10.2.114.1/30 + ipv6 address 2001:db8:2:114::1/64 + no shutdown +! +interface r1-eth369 + ip address 10.2.115.1/30 + ipv6 address 2001:db8:2:115::1/64 + no shutdown +! +interface r1-eth370 + ip address 10.2.116.1/30 + ipv6 address 2001:db8:2:116::1/64 + no shutdown +! +interface r1-eth371 + ip address 10.2.117.1/30 + ipv6 address 2001:db8:2:117::1/64 + no shutdown +! +interface r1-eth372 + ip address 10.2.118.1/30 + ipv6 address 2001:db8:2:118::1/64 + no shutdown +! +interface r1-eth373 + ip address 10.2.119.1/30 + ipv6 address 2001:db8:2:119::1/64 + no shutdown +! +interface r1-eth374 + ip address 10.2.120.1/30 + ipv6 address 2001:db8:2:120::1/64 + no shutdown +! +interface r1-eth375 + ip address 10.2.121.1/30 + ipv6 address 2001:db8:2:121::1/64 + no shutdown +! +interface r1-eth376 + ip address 10.2.122.1/30 + ipv6 address 2001:db8:2:122::1/64 + no shutdown +! +interface r1-eth377 + ip address 10.2.123.1/30 + ipv6 address 2001:db8:2:123::1/64 + no shutdown +! +interface r1-eth378 + ip address 10.2.124.1/30 + ipv6 address 2001:db8:2:124::1/64 + no shutdown +! +interface r1-eth379 + ip address 10.2.125.1/30 + ipv6 address 2001:db8:2:125::1/64 + no shutdown +! +interface r1-eth380 + ip address 10.2.126.1/30 + ipv6 address 2001:db8:2:126::1/64 + no shutdown +! +interface r1-eth381 + ip address 10.2.127.1/30 + ipv6 address 2001:db8:2:127::1/64 + no shutdown +! +interface r1-eth382 + ip address 10.2.128.1/30 + ipv6 address 2001:db8:2:128::1/64 + no shutdown +! +interface r1-eth383 + ip address 10.2.129.1/30 + ipv6 address 2001:db8:2:129::1/64 + no shutdown +! +interface r1-eth384 + ip address 10.2.130.1/30 + ipv6 address 2001:db8:2:130::1/64 + no shutdown +! +interface r1-eth385 + ip address 10.2.131.1/30 + ipv6 address 2001:db8:2:131::1/64 + no shutdown +! +interface r1-eth386 + ip address 10.2.132.1/30 + ipv6 address 2001:db8:2:132::1/64 + no shutdown +! +interface r1-eth387 + ip address 10.2.133.1/30 + ipv6 address 2001:db8:2:133::1/64 + no shutdown +! +interface r1-eth388 + ip address 10.2.134.1/30 + ipv6 address 2001:db8:2:134::1/64 + no shutdown +! +interface r1-eth389 + ip address 10.2.135.1/30 + ipv6 address 2001:db8:2:135::1/64 + no shutdown +! +interface r1-eth390 + ip address 10.2.136.1/30 + ipv6 address 2001:db8:2:136::1/64 + no shutdown +! +interface r1-eth391 + ip address 10.2.137.1/30 + ipv6 address 2001:db8:2:137::1/64 + no shutdown +! +interface r1-eth392 + ip address 10.2.138.1/30 + ipv6 address 2001:db8:2:138::1/64 + no shutdown +! +interface r1-eth393 + ip address 10.2.139.1/30 + ipv6 address 2001:db8:2:139::1/64 + no shutdown +! +interface r1-eth394 + ip address 10.2.140.1/30 + ipv6 address 2001:db8:2:140::1/64 + no shutdown +! +interface r1-eth395 + ip address 10.2.141.1/30 + ipv6 address 2001:db8:2:141::1/64 + no shutdown +! +interface r1-eth396 + ip address 10.2.142.1/30 + ipv6 address 2001:db8:2:142::1/64 + no shutdown +! +interface r1-eth397 + ip address 10.2.143.1/30 + ipv6 address 2001:db8:2:143::1/64 + no shutdown +! +interface r1-eth398 + ip address 10.2.144.1/30 + ipv6 address 2001:db8:2:144::1/64 + no shutdown +! +interface r1-eth399 + ip address 10.2.145.1/30 + ipv6 address 2001:db8:2:145::1/64 + no shutdown +! +interface r1-eth400 + ip address 10.2.146.1/30 + ipv6 address 2001:db8:2:146::1/64 + no shutdown +! +interface r1-eth401 + ip address 10.2.147.1/30 + ipv6 address 2001:db8:2:147::1/64 + no shutdown +! +interface r1-eth402 + ip address 10.2.148.1/30 + ipv6 address 2001:db8:2:148::1/64 + no shutdown +! +interface r1-eth403 + ip address 10.2.149.1/30 + ipv6 address 2001:db8:2:149::1/64 + no shutdown +! +interface r1-eth404 + ip address 10.2.150.1/30 + ipv6 address 2001:db8:2:150::1/64 + no shutdown +! +interface r1-eth405 + ip address 10.2.151.1/30 + ipv6 address 2001:db8:2:151::1/64 + no shutdown +! +interface r1-eth406 + ip address 10.2.152.1/30 + ipv6 address 2001:db8:2:152::1/64 + no shutdown +! +interface r1-eth407 + ip address 10.2.153.1/30 + ipv6 address 2001:db8:2:153::1/64 + no shutdown +! +interface r1-eth408 + ip address 10.2.154.1/30 + ipv6 address 2001:db8:2:154::1/64 + no shutdown +! +interface r1-eth409 + ip address 10.2.155.1/30 + ipv6 address 2001:db8:2:155::1/64 + no shutdown +! +interface r1-eth410 + ip address 10.2.156.1/30 + ipv6 address 2001:db8:2:156::1/64 + no shutdown +! +interface r1-eth411 + ip address 10.2.157.1/30 + ipv6 address 2001:db8:2:157::1/64 + no shutdown +! +interface r1-eth412 + ip address 10.2.158.1/30 + ipv6 address 2001:db8:2:158::1/64 + no shutdown +! +interface r1-eth413 + ip address 10.2.159.1/30 + ipv6 address 2001:db8:2:159::1/64 + no shutdown +! +interface r1-eth414 + ip address 10.2.160.1/30 + ipv6 address 2001:db8:2:160::1/64 + no shutdown +! +interface r1-eth415 + ip address 10.2.161.1/30 + ipv6 address 2001:db8:2:161::1/64 + no shutdown +! +interface r1-eth416 + ip address 10.2.162.1/30 + ipv6 address 2001:db8:2:162::1/64 + no shutdown +! +interface r1-eth417 + ip address 10.2.163.1/30 + ipv6 address 2001:db8:2:163::1/64 + no shutdown +! +interface r1-eth418 + ip address 10.2.164.1/30 + ipv6 address 2001:db8:2:164::1/64 + no shutdown +! +interface r1-eth419 + ip address 10.2.165.1/30 + ipv6 address 2001:db8:2:165::1/64 + no shutdown +! +interface r1-eth420 + ip address 10.2.166.1/30 + ipv6 address 2001:db8:2:166::1/64 + no shutdown +! +interface r1-eth421 + ip address 10.2.167.1/30 + ipv6 address 2001:db8:2:167::1/64 + no shutdown +! +interface r1-eth422 + ip address 10.2.168.1/30 + ipv6 address 2001:db8:2:168::1/64 + no shutdown +! +interface r1-eth423 + ip address 10.2.169.1/30 + ipv6 address 2001:db8:2:169::1/64 + no shutdown +! +interface r1-eth424 + ip address 10.2.170.1/30 + ipv6 address 2001:db8:2:170::1/64 + no shutdown +! +interface r1-eth425 + ip address 10.2.171.1/30 + ipv6 address 2001:db8:2:171::1/64 + no shutdown +! +interface r1-eth426 + ip address 10.2.172.1/30 + ipv6 address 2001:db8:2:172::1/64 + no shutdown +! +interface r1-eth427 + ip address 10.2.173.1/30 + ipv6 address 2001:db8:2:173::1/64 + no shutdown +! +interface r1-eth428 + ip address 10.2.174.1/30 + ipv6 address 2001:db8:2:174::1/64 + no shutdown +! +interface r1-eth429 + ip address 10.2.175.1/30 + ipv6 address 2001:db8:2:175::1/64 + no shutdown +! +interface r1-eth430 + ip address 10.2.176.1/30 + ipv6 address 2001:db8:2:176::1/64 + no shutdown +! +interface r1-eth431 + ip address 10.2.177.1/30 + ipv6 address 2001:db8:2:177::1/64 + no shutdown +! +interface r1-eth432 + ip address 10.2.178.1/30 + ipv6 address 2001:db8:2:178::1/64 + no shutdown +! +interface r1-eth433 + ip address 10.2.179.1/30 + ipv6 address 2001:db8:2:179::1/64 + no shutdown +! +interface r1-eth434 + ip address 10.2.180.1/30 + ipv6 address 2001:db8:2:180::1/64 + no shutdown +! +interface r1-eth435 + ip address 10.2.181.1/30 + ipv6 address 2001:db8:2:181::1/64 + no shutdown +! +interface r1-eth436 + ip address 10.2.182.1/30 + ipv6 address 2001:db8:2:182::1/64 + no shutdown +! +interface r1-eth437 + ip address 10.2.183.1/30 + ipv6 address 2001:db8:2:183::1/64 + no shutdown +! +interface r1-eth438 + ip address 10.2.184.1/30 + ipv6 address 2001:db8:2:184::1/64 + no shutdown +! +interface r1-eth439 + ip address 10.2.185.1/30 + ipv6 address 2001:db8:2:185::1/64 + no shutdown +! +interface r1-eth440 + ip address 10.2.186.1/30 + ipv6 address 2001:db8:2:186::1/64 + no shutdown +! +interface r1-eth441 + ip address 10.2.187.1/30 + ipv6 address 2001:db8:2:187::1/64 + no shutdown +! +interface r1-eth442 + ip address 10.2.188.1/30 + ipv6 address 2001:db8:2:188::1/64 + no shutdown +! +interface r1-eth443 + ip address 10.2.189.1/30 + ipv6 address 2001:db8:2:189::1/64 + no shutdown +! +interface r1-eth444 + ip address 10.2.190.1/30 + ipv6 address 2001:db8:2:190::1/64 + no shutdown +! +interface r1-eth445 + ip address 10.2.191.1/30 + ipv6 address 2001:db8:2:191::1/64 + no shutdown +! +interface r1-eth446 + ip address 10.2.192.1/30 + ipv6 address 2001:db8:2:192::1/64 + no shutdown +! +interface r1-eth447 + ip address 10.2.193.1/30 + ipv6 address 2001:db8:2:193::1/64 + no shutdown +! +interface r1-eth448 + ip address 10.2.194.1/30 + ipv6 address 2001:db8:2:194::1/64 + no shutdown +! +interface r1-eth449 + ip address 10.2.195.1/30 + ipv6 address 2001:db8:2:195::1/64 + no shutdown +! +interface r1-eth450 + ip address 10.2.196.1/30 + ipv6 address 2001:db8:2:196::1/64 + no shutdown +! +interface r1-eth451 + ip address 10.2.197.1/30 + ipv6 address 2001:db8:2:197::1/64 + no shutdown +! +interface r1-eth452 + ip address 10.2.198.1/30 + ipv6 address 2001:db8:2:198::1/64 + no shutdown +! +interface r1-eth453 + ip address 10.2.199.1/30 + ipv6 address 2001:db8:2:199::1/64 + no shutdown +! +interface r1-eth454 + ip address 10.2.200.1/30 + ipv6 address 2001:db8:2:200::1/64 + no shutdown +! +interface r1-eth455 + ip address 10.2.201.1/30 + ipv6 address 2001:db8:2:201::1/64 + no shutdown +! +interface r1-eth456 + ip address 10.2.202.1/30 + ipv6 address 2001:db8:2:202::1/64 + no shutdown +! +interface r1-eth457 + ip address 10.2.203.1/30 + ipv6 address 2001:db8:2:203::1/64 + no shutdown +! +interface r1-eth458 + ip address 10.2.204.1/30 + ipv6 address 2001:db8:2:204::1/64 + no shutdown +! +interface r1-eth459 + ip address 10.2.205.1/30 + ipv6 address 2001:db8:2:205::1/64 + no shutdown +! +interface r1-eth460 + ip address 10.2.206.1/30 + ipv6 address 2001:db8:2:206::1/64 + no shutdown +! +interface r1-eth461 + ip address 10.2.207.1/30 + ipv6 address 2001:db8:2:207::1/64 + no shutdown +! +interface r1-eth462 + ip address 10.2.208.1/30 + ipv6 address 2001:db8:2:208::1/64 + no shutdown +! +interface r1-eth463 + ip address 10.2.209.1/30 + ipv6 address 2001:db8:2:209::1/64 + no shutdown +! +interface r1-eth464 + ip address 10.2.210.1/30 + ipv6 address 2001:db8:2:210::1/64 + no shutdown +! +interface r1-eth465 + ip address 10.2.211.1/30 + ipv6 address 2001:db8:2:211::1/64 + no shutdown +! +interface r1-eth466 + ip address 10.2.212.1/30 + ipv6 address 2001:db8:2:212::1/64 + no shutdown +! +interface r1-eth467 + ip address 10.2.213.1/30 + ipv6 address 2001:db8:2:213::1/64 + no shutdown +! +interface r1-eth468 + ip address 10.2.214.1/30 + ipv6 address 2001:db8:2:214::1/64 + no shutdown +! +interface r1-eth469 + ip address 10.2.215.1/30 + ipv6 address 2001:db8:2:215::1/64 + no shutdown +! +interface r1-eth470 + ip address 10.2.216.1/30 + ipv6 address 2001:db8:2:216::1/64 + no shutdown +! +interface r1-eth471 + ip address 10.2.217.1/30 + ipv6 address 2001:db8:2:217::1/64 + no shutdown +! +interface r1-eth472 + ip address 10.2.218.1/30 + ipv6 address 2001:db8:2:218::1/64 + no shutdown +! +interface r1-eth473 + ip address 10.2.219.1/30 + ipv6 address 2001:db8:2:219::1/64 + no shutdown +! +interface r1-eth474 + ip address 10.2.220.1/30 + ipv6 address 2001:db8:2:220::1/64 + no shutdown +! +interface r1-eth475 + ip address 10.2.221.1/30 + ipv6 address 2001:db8:2:221::1/64 + no shutdown +! +interface r1-eth476 + ip address 10.2.222.1/30 + ipv6 address 2001:db8:2:222::1/64 + no shutdown +! +interface r1-eth477 + ip address 10.2.223.1/30 + ipv6 address 2001:db8:2:223::1/64 + no shutdown +! +interface r1-eth478 + ip address 10.2.224.1/30 + ipv6 address 2001:db8:2:224::1/64 + no shutdown +! +interface r1-eth479 + ip address 10.2.225.1/30 + ipv6 address 2001:db8:2:225::1/64 + no shutdown +! +interface r1-eth480 + ip address 10.2.226.1/30 + ipv6 address 2001:db8:2:226::1/64 + no shutdown +! +interface r1-eth481 + ip address 10.2.227.1/30 + ipv6 address 2001:db8:2:227::1/64 + no shutdown +! +interface r1-eth482 + ip address 10.2.228.1/30 + ipv6 address 2001:db8:2:228::1/64 + no shutdown +! +interface r1-eth483 + ip address 10.2.229.1/30 + ipv6 address 2001:db8:2:229::1/64 + no shutdown +! +interface r1-eth484 + ip address 10.2.230.1/30 + ipv6 address 2001:db8:2:230::1/64 + no shutdown +! +interface r1-eth485 + ip address 10.2.231.1/30 + ipv6 address 2001:db8:2:231::1/64 + no shutdown +! +interface r1-eth486 + ip address 10.2.232.1/30 + ipv6 address 2001:db8:2:232::1/64 + no shutdown +! +interface r1-eth487 + ip address 10.2.233.1/30 + ipv6 address 2001:db8:2:233::1/64 + no shutdown +! +interface r1-eth488 + ip address 10.2.234.1/30 + ipv6 address 2001:db8:2:234::1/64 + no shutdown +! +interface r1-eth489 + ip address 10.2.235.1/30 + ipv6 address 2001:db8:2:235::1/64 + no shutdown +! +interface r1-eth490 + ip address 10.2.236.1/30 + ipv6 address 2001:db8:2:236::1/64 + no shutdown +! +interface r1-eth491 + ip address 10.2.237.1/30 + ipv6 address 2001:db8:2:237::1/64 + no shutdown +! +interface r1-eth492 + ip address 10.2.238.1/30 + ipv6 address 2001:db8:2:238::1/64 + no shutdown +! +interface r1-eth493 + ip address 10.2.239.1/30 + ipv6 address 2001:db8:2:239::1/64 + no shutdown +! +interface r1-eth494 + ip address 10.2.240.1/30 + ipv6 address 2001:db8:2:240::1/64 + no shutdown +! +interface r1-eth495 + ip address 10.2.241.1/30 + ipv6 address 2001:db8:2:241::1/64 + no shutdown +! +interface r1-eth496 + ip address 10.2.242.1/30 + ipv6 address 2001:db8:2:242::1/64 + no shutdown +! +interface r1-eth497 + ip address 10.2.243.1/30 + ipv6 address 2001:db8:2:243::1/64 + no shutdown +! +interface r1-eth498 + ip address 10.2.244.1/30 + ipv6 address 2001:db8:2:244::1/64 + no shutdown +! +interface r1-eth499 + ip address 10.2.245.1/30 + ipv6 address 2001:db8:2:245::1/64 + no shutdown +! +interface r1-eth500 + ip address 10.2.246.1/30 + ipv6 address 2001:db8:2:246::1/64 + no shutdown +! +interface r1-eth501 + ip address 10.2.247.1/30 + ipv6 address 2001:db8:2:247::1/64 + no shutdown +! +interface r1-eth502 + ip address 10.2.248.1/30 + ipv6 address 2001:db8:2:248::1/64 + no shutdown +! +interface r1-eth503 + ip address 10.2.249.1/30 + ipv6 address 2001:db8:2:249::1/64 + no shutdown +! +interface r1-eth504 + ip address 10.2.250.1/30 + ipv6 address 2001:db8:2:250::1/64 + no shutdown +! +interface r1-eth505 + ip address 10.2.251.1/30 + ipv6 address 2001:db8:2:251::1/64 + no shutdown +! +interface r1-eth506 + ip address 10.2.252.1/30 + ipv6 address 2001:db8:2:252::1/64 + no shutdown +! +interface r1-eth507 + ip address 10.2.253.1/30 + ipv6 address 2001:db8:2:253::1/64 + no shutdown +! +interface r1-eth508 + ip address 10.2.254.1/30 + ipv6 address 2001:db8:2:254::1/64 + no shutdown +! +interface r1-eth509 + ip address 10.2.255.1/30 + ipv6 address 2001:db8:2:255::1/64 + no shutdown +! +interface r1-eth510 + ip address 10.3.1.1/30 + ipv6 address 2001:db8:3:1::1/64 + no shutdown +! +interface r1-eth511 + ip address 10.3.2.1/30 + ipv6 address 2001:db8:3:2::1/64 + no shutdown +! +interface r1-eth512 + ip address 10.3.3.1/30 + ipv6 address 2001:db8:3:3::1/64 + no shutdown +! +interface r1-eth513 + ip address 10.3.4.1/30 + ipv6 address 2001:db8:3:4::1/64 + no shutdown +! diff --git a/tests/topotests/high_ecmp/r1/frr_ipv4_bgp.conf b/tests/topotests/high_ecmp/r1/frr_ipv4_bgp.conf new file mode 100644 index 0000000000..df64a146bc --- /dev/null +++ b/tests/topotests/high_ecmp/r1/frr_ipv4_bgp.conf @@ -0,0 +1,520 @@ +router bgp 1001 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor 10.1.1.2 remote-as external + neighbor 10.1.2.2 remote-as external + neighbor 10.1.3.2 remote-as external + neighbor 10.1.4.2 remote-as external + neighbor 10.1.5.2 remote-as external + neighbor 10.1.6.2 remote-as external + neighbor 10.1.7.2 remote-as external + neighbor 10.1.8.2 remote-as external + neighbor 10.1.9.2 remote-as external + neighbor 10.1.10.2 remote-as external + neighbor 10.1.11.2 remote-as external + neighbor 10.1.12.2 remote-as external + neighbor 10.1.13.2 remote-as external + neighbor 10.1.14.2 remote-as external + neighbor 10.1.15.2 remote-as external + neighbor 10.1.16.2 remote-as external + neighbor 10.1.17.2 remote-as external + neighbor 10.1.18.2 remote-as external + neighbor 10.1.19.2 remote-as external + neighbor 10.1.20.2 remote-as external + neighbor 10.1.21.2 remote-as external + neighbor 10.1.22.2 remote-as external + neighbor 10.1.23.2 remote-as external + neighbor 10.1.24.2 remote-as external + neighbor 10.1.25.2 remote-as external + neighbor 10.1.26.2 remote-as external + neighbor 10.1.27.2 remote-as external + neighbor 10.1.28.2 remote-as external + neighbor 10.1.29.2 remote-as external + neighbor 10.1.30.2 remote-as external + neighbor 10.1.31.2 remote-as external + neighbor 10.1.32.2 remote-as external + neighbor 10.1.33.2 remote-as external + neighbor 10.1.34.2 remote-as external + neighbor 10.1.35.2 remote-as external + neighbor 10.1.36.2 remote-as external + neighbor 10.1.37.2 remote-as external + neighbor 10.1.38.2 remote-as external + neighbor 10.1.39.2 remote-as external + neighbor 10.1.40.2 remote-as external + neighbor 10.1.41.2 remote-as external + neighbor 10.1.42.2 remote-as external + neighbor 10.1.43.2 remote-as external + neighbor 10.1.44.2 remote-as external + neighbor 10.1.45.2 remote-as external + neighbor 10.1.46.2 remote-as external + neighbor 10.1.47.2 remote-as external + neighbor 10.1.48.2 remote-as external + neighbor 10.1.49.2 remote-as external + neighbor 10.1.50.2 remote-as external + neighbor 10.1.51.2 remote-as external + neighbor 10.1.52.2 remote-as external + neighbor 10.1.53.2 remote-as external + neighbor 10.1.54.2 remote-as external + neighbor 10.1.55.2 remote-as external + neighbor 10.1.56.2 remote-as external + neighbor 10.1.57.2 remote-as external + neighbor 10.1.58.2 remote-as external + neighbor 10.1.59.2 remote-as external + neighbor 10.1.60.2 remote-as external + neighbor 10.1.61.2 remote-as external + neighbor 10.1.62.2 remote-as external + neighbor 10.1.63.2 remote-as external + neighbor 10.1.64.2 remote-as external + neighbor 10.1.65.2 remote-as external + neighbor 10.1.66.2 remote-as external + neighbor 10.1.67.2 remote-as external + neighbor 10.1.68.2 remote-as external + neighbor 10.1.69.2 remote-as external + neighbor 10.1.70.2 remote-as external + neighbor 10.1.71.2 remote-as external + neighbor 10.1.72.2 remote-as external + neighbor 10.1.73.2 remote-as external + neighbor 10.1.74.2 remote-as external + neighbor 10.1.75.2 remote-as external + neighbor 10.1.76.2 remote-as external + neighbor 10.1.77.2 remote-as external + neighbor 10.1.78.2 remote-as external + neighbor 10.1.79.2 remote-as external + neighbor 10.1.80.2 remote-as external + neighbor 10.1.81.2 remote-as external + neighbor 10.1.82.2 remote-as external + neighbor 10.1.83.2 remote-as external + neighbor 10.1.84.2 remote-as external + neighbor 10.1.85.2 remote-as external + neighbor 10.1.86.2 remote-as external + neighbor 10.1.87.2 remote-as external + neighbor 10.1.88.2 remote-as external + neighbor 10.1.89.2 remote-as external + neighbor 10.1.90.2 remote-as external + neighbor 10.1.91.2 remote-as external + neighbor 10.1.92.2 remote-as external + neighbor 10.1.93.2 remote-as external + neighbor 10.1.94.2 remote-as external + neighbor 10.1.95.2 remote-as external + neighbor 10.1.96.2 remote-as external + neighbor 10.1.97.2 remote-as external + neighbor 10.1.98.2 remote-as external + neighbor 10.1.99.2 remote-as external + neighbor 10.1.100.2 remote-as external + neighbor 10.1.101.2 remote-as external + neighbor 10.1.102.2 remote-as external + neighbor 10.1.103.2 remote-as external + neighbor 10.1.104.2 remote-as external + neighbor 10.1.105.2 remote-as external + neighbor 10.1.106.2 remote-as external + neighbor 10.1.107.2 remote-as external + neighbor 10.1.108.2 remote-as external + neighbor 10.1.109.2 remote-as external + neighbor 10.1.110.2 remote-as external + neighbor 10.1.111.2 remote-as external + neighbor 10.1.112.2 remote-as external + neighbor 10.1.113.2 remote-as external + neighbor 10.1.114.2 remote-as external + neighbor 10.1.115.2 remote-as external + neighbor 10.1.116.2 remote-as external + neighbor 10.1.117.2 remote-as external + neighbor 10.1.118.2 remote-as external + neighbor 10.1.119.2 remote-as external + neighbor 10.1.120.2 remote-as external + neighbor 10.1.121.2 remote-as external + neighbor 10.1.122.2 remote-as external + neighbor 10.1.123.2 remote-as external + neighbor 10.1.124.2 remote-as external + neighbor 10.1.125.2 remote-as external + neighbor 10.1.126.2 remote-as external + neighbor 10.1.127.2 remote-as external + neighbor 10.1.128.2 remote-as external + neighbor 10.1.129.2 remote-as external + neighbor 10.1.130.2 remote-as external + neighbor 10.1.131.2 remote-as external + neighbor 10.1.132.2 remote-as external + neighbor 10.1.133.2 remote-as external + neighbor 10.1.134.2 remote-as external + neighbor 10.1.135.2 remote-as external + neighbor 10.1.136.2 remote-as external + neighbor 10.1.137.2 remote-as external + neighbor 10.1.138.2 remote-as external + neighbor 10.1.139.2 remote-as external + neighbor 10.1.140.2 remote-as external + neighbor 10.1.141.2 remote-as external + neighbor 10.1.142.2 remote-as external + neighbor 10.1.143.2 remote-as external + neighbor 10.1.144.2 remote-as external + neighbor 10.1.145.2 remote-as external + neighbor 10.1.146.2 remote-as external + neighbor 10.1.147.2 remote-as external + neighbor 10.1.148.2 remote-as external + neighbor 10.1.149.2 remote-as external + neighbor 10.1.150.2 remote-as external + neighbor 10.1.151.2 remote-as external + neighbor 10.1.152.2 remote-as external + neighbor 10.1.153.2 remote-as external + neighbor 10.1.154.2 remote-as external + neighbor 10.1.155.2 remote-as external + neighbor 10.1.156.2 remote-as external + neighbor 10.1.157.2 remote-as external + neighbor 10.1.158.2 remote-as external + neighbor 10.1.159.2 remote-as external + neighbor 10.1.160.2 remote-as external + neighbor 10.1.161.2 remote-as external + neighbor 10.1.162.2 remote-as external + neighbor 10.1.163.2 remote-as external + neighbor 10.1.164.2 remote-as external + neighbor 10.1.165.2 remote-as external + neighbor 10.1.166.2 remote-as external + neighbor 10.1.167.2 remote-as external + neighbor 10.1.168.2 remote-as external + neighbor 10.1.169.2 remote-as external + neighbor 10.1.170.2 remote-as external + neighbor 10.1.171.2 remote-as external + neighbor 10.1.172.2 remote-as external + neighbor 10.1.173.2 remote-as external + neighbor 10.1.174.2 remote-as external + neighbor 10.1.175.2 remote-as external + neighbor 10.1.176.2 remote-as external + neighbor 10.1.177.2 remote-as external + neighbor 10.1.178.2 remote-as external + neighbor 10.1.179.2 remote-as external + neighbor 10.1.180.2 remote-as external + neighbor 10.1.181.2 remote-as external + neighbor 10.1.182.2 remote-as external + neighbor 10.1.183.2 remote-as external + neighbor 10.1.184.2 remote-as external + neighbor 10.1.185.2 remote-as external + neighbor 10.1.186.2 remote-as external + neighbor 10.1.187.2 remote-as external + neighbor 10.1.188.2 remote-as external + neighbor 10.1.189.2 remote-as external + neighbor 10.1.190.2 remote-as external + neighbor 10.1.191.2 remote-as external + neighbor 10.1.192.2 remote-as external + neighbor 10.1.193.2 remote-as external + neighbor 10.1.194.2 remote-as external + neighbor 10.1.195.2 remote-as external + neighbor 10.1.196.2 remote-as external + neighbor 10.1.197.2 remote-as external + neighbor 10.1.198.2 remote-as external + neighbor 10.1.199.2 remote-as external + neighbor 10.1.200.2 remote-as external + neighbor 10.1.201.2 remote-as external + neighbor 10.1.202.2 remote-as external + neighbor 10.1.203.2 remote-as external + neighbor 10.1.204.2 remote-as external + neighbor 10.1.205.2 remote-as external + neighbor 10.1.206.2 remote-as external + neighbor 10.1.207.2 remote-as external + neighbor 10.1.208.2 remote-as external + neighbor 10.1.209.2 remote-as external + neighbor 10.1.210.2 remote-as external + neighbor 10.1.211.2 remote-as external + neighbor 10.1.212.2 remote-as external + neighbor 10.1.213.2 remote-as external + neighbor 10.1.214.2 remote-as external + neighbor 10.1.215.2 remote-as external + neighbor 10.1.216.2 remote-as external + neighbor 10.1.217.2 remote-as external + neighbor 10.1.218.2 remote-as external + neighbor 10.1.219.2 remote-as external + neighbor 10.1.220.2 remote-as external + neighbor 10.1.221.2 remote-as external + neighbor 10.1.222.2 remote-as external + neighbor 10.1.223.2 remote-as external + neighbor 10.1.224.2 remote-as external + neighbor 10.1.225.2 remote-as external + neighbor 10.1.226.2 remote-as external + neighbor 10.1.227.2 remote-as external + neighbor 10.1.228.2 remote-as external + neighbor 10.1.229.2 remote-as external + neighbor 10.1.230.2 remote-as external + neighbor 10.1.231.2 remote-as external + neighbor 10.1.232.2 remote-as external + neighbor 10.1.233.2 remote-as external + neighbor 10.1.234.2 remote-as external + neighbor 10.1.235.2 remote-as external + neighbor 10.1.236.2 remote-as external + neighbor 10.1.237.2 remote-as external + neighbor 10.1.238.2 remote-as external + neighbor 10.1.239.2 remote-as external + neighbor 10.1.240.2 remote-as external + neighbor 10.1.241.2 remote-as external + neighbor 10.1.242.2 remote-as external + neighbor 10.1.243.2 remote-as external + neighbor 10.1.244.2 remote-as external + neighbor 10.1.245.2 remote-as external + neighbor 10.1.246.2 remote-as external + neighbor 10.1.247.2 remote-as external + neighbor 10.1.248.2 remote-as external + neighbor 10.1.249.2 remote-as external + neighbor 10.1.250.2 remote-as external + neighbor 10.1.251.2 remote-as external + neighbor 10.1.252.2 remote-as external + neighbor 10.1.253.2 remote-as external + neighbor 10.1.254.2 remote-as external + neighbor 10.1.255.2 remote-as external + neighbor 10.2.1.2 remote-as external + neighbor 10.2.2.2 remote-as external + neighbor 10.2.3.2 remote-as external + neighbor 10.2.4.2 remote-as external + neighbor 10.2.5.2 remote-as external + neighbor 10.2.6.2 remote-as external + neighbor 10.2.7.2 remote-as external + neighbor 10.2.8.2 remote-as external + neighbor 10.2.9.2 remote-as external + neighbor 10.2.10.2 remote-as external + neighbor 10.2.11.2 remote-as external + neighbor 10.2.12.2 remote-as external + neighbor 10.2.13.2 remote-as external + neighbor 10.2.14.2 remote-as external + neighbor 10.2.15.2 remote-as external + neighbor 10.2.16.2 remote-as external + neighbor 10.2.17.2 remote-as external + neighbor 10.2.18.2 remote-as external + neighbor 10.2.19.2 remote-as external + neighbor 10.2.20.2 remote-as external + neighbor 10.2.21.2 remote-as external + neighbor 10.2.22.2 remote-as external + neighbor 10.2.23.2 remote-as external + neighbor 10.2.24.2 remote-as external + neighbor 10.2.25.2 remote-as external + neighbor 10.2.26.2 remote-as external + neighbor 10.2.27.2 remote-as external + neighbor 10.2.28.2 remote-as external + neighbor 10.2.29.2 remote-as external + neighbor 10.2.30.2 remote-as external + neighbor 10.2.31.2 remote-as external + neighbor 10.2.32.2 remote-as external + neighbor 10.2.33.2 remote-as external + neighbor 10.2.34.2 remote-as external + neighbor 10.2.35.2 remote-as external + neighbor 10.2.36.2 remote-as external + neighbor 10.2.37.2 remote-as external + neighbor 10.2.38.2 remote-as external + neighbor 10.2.39.2 remote-as external + neighbor 10.2.40.2 remote-as external + neighbor 10.2.41.2 remote-as external + neighbor 10.2.42.2 remote-as external + neighbor 10.2.43.2 remote-as external + neighbor 10.2.44.2 remote-as external + neighbor 10.2.45.2 remote-as external + neighbor 10.2.46.2 remote-as external + neighbor 10.2.47.2 remote-as external + neighbor 10.2.48.2 remote-as external + neighbor 10.2.49.2 remote-as external + neighbor 10.2.50.2 remote-as external + neighbor 10.2.51.2 remote-as external + neighbor 10.2.52.2 remote-as external + neighbor 10.2.53.2 remote-as external + neighbor 10.2.54.2 remote-as external + neighbor 10.2.55.2 remote-as external + neighbor 10.2.56.2 remote-as external + neighbor 10.2.57.2 remote-as external + neighbor 10.2.58.2 remote-as external + neighbor 10.2.59.2 remote-as external + neighbor 10.2.60.2 remote-as external + neighbor 10.2.61.2 remote-as external + neighbor 10.2.62.2 remote-as external + neighbor 10.2.63.2 remote-as external + neighbor 10.2.64.2 remote-as external + neighbor 10.2.65.2 remote-as external + neighbor 10.2.66.2 remote-as external + neighbor 10.2.67.2 remote-as external + neighbor 10.2.68.2 remote-as external + neighbor 10.2.69.2 remote-as external + neighbor 10.2.70.2 remote-as external + neighbor 10.2.71.2 remote-as external + neighbor 10.2.72.2 remote-as external + neighbor 10.2.73.2 remote-as external + neighbor 10.2.74.2 remote-as external + neighbor 10.2.75.2 remote-as external + neighbor 10.2.76.2 remote-as external + neighbor 10.2.77.2 remote-as external + neighbor 10.2.78.2 remote-as external + neighbor 10.2.79.2 remote-as external + neighbor 10.2.80.2 remote-as external + neighbor 10.2.81.2 remote-as external + neighbor 10.2.82.2 remote-as external + neighbor 10.2.83.2 remote-as external + neighbor 10.2.84.2 remote-as external + neighbor 10.2.85.2 remote-as external + neighbor 10.2.86.2 remote-as external + neighbor 10.2.87.2 remote-as external + neighbor 10.2.88.2 remote-as external + neighbor 10.2.89.2 remote-as external + neighbor 10.2.90.2 remote-as external + neighbor 10.2.91.2 remote-as external + neighbor 10.2.92.2 remote-as external + neighbor 10.2.93.2 remote-as external + neighbor 10.2.94.2 remote-as external + neighbor 10.2.95.2 remote-as external + neighbor 10.2.96.2 remote-as external + neighbor 10.2.97.2 remote-as external + neighbor 10.2.98.2 remote-as external + neighbor 10.2.99.2 remote-as external + neighbor 10.2.100.2 remote-as external + neighbor 10.2.101.2 remote-as external + neighbor 10.2.102.2 remote-as external + neighbor 10.2.103.2 remote-as external + neighbor 10.2.104.2 remote-as external + neighbor 10.2.105.2 remote-as external + neighbor 10.2.106.2 remote-as external + neighbor 10.2.107.2 remote-as external + neighbor 10.2.108.2 remote-as external + neighbor 10.2.109.2 remote-as external + neighbor 10.2.110.2 remote-as external + neighbor 10.2.111.2 remote-as external + neighbor 10.2.112.2 remote-as external + neighbor 10.2.113.2 remote-as external + neighbor 10.2.114.2 remote-as external + neighbor 10.2.115.2 remote-as external + neighbor 10.2.116.2 remote-as external + neighbor 10.2.117.2 remote-as external + neighbor 10.2.118.2 remote-as external + neighbor 10.2.119.2 remote-as external + neighbor 10.2.120.2 remote-as external + neighbor 10.2.121.2 remote-as external + neighbor 10.2.122.2 remote-as external + neighbor 10.2.123.2 remote-as external + neighbor 10.2.124.2 remote-as external + neighbor 10.2.125.2 remote-as external + neighbor 10.2.126.2 remote-as external + neighbor 10.2.127.2 remote-as external + neighbor 10.2.128.2 remote-as external + neighbor 10.2.129.2 remote-as external + neighbor 10.2.130.2 remote-as external + neighbor 10.2.131.2 remote-as external + neighbor 10.2.132.2 remote-as external + neighbor 10.2.133.2 remote-as external + neighbor 10.2.134.2 remote-as external + neighbor 10.2.135.2 remote-as external + neighbor 10.2.136.2 remote-as external + neighbor 10.2.137.2 remote-as external + neighbor 10.2.138.2 remote-as external + neighbor 10.2.139.2 remote-as external + neighbor 10.2.140.2 remote-as external + neighbor 10.2.141.2 remote-as external + neighbor 10.2.142.2 remote-as external + neighbor 10.2.143.2 remote-as external + neighbor 10.2.144.2 remote-as external + neighbor 10.2.145.2 remote-as external + neighbor 10.2.146.2 remote-as external + neighbor 10.2.147.2 remote-as external + neighbor 10.2.148.2 remote-as external + neighbor 10.2.149.2 remote-as external + neighbor 10.2.150.2 remote-as external + neighbor 10.2.151.2 remote-as external + neighbor 10.2.152.2 remote-as external + neighbor 10.2.153.2 remote-as external + neighbor 10.2.154.2 remote-as external + neighbor 10.2.155.2 remote-as external + neighbor 10.2.156.2 remote-as external + neighbor 10.2.157.2 remote-as external + neighbor 10.2.158.2 remote-as external + neighbor 10.2.159.2 remote-as external + neighbor 10.2.160.2 remote-as external + neighbor 10.2.161.2 remote-as external + neighbor 10.2.162.2 remote-as external + neighbor 10.2.163.2 remote-as external + neighbor 10.2.164.2 remote-as external + neighbor 10.2.165.2 remote-as external + neighbor 10.2.166.2 remote-as external + neighbor 10.2.167.2 remote-as external + neighbor 10.2.168.2 remote-as external + neighbor 10.2.169.2 remote-as external + neighbor 10.2.170.2 remote-as external + neighbor 10.2.171.2 remote-as external + neighbor 10.2.172.2 remote-as external + neighbor 10.2.173.2 remote-as external + neighbor 10.2.174.2 remote-as external + neighbor 10.2.175.2 remote-as external + neighbor 10.2.176.2 remote-as external + neighbor 10.2.177.2 remote-as external + neighbor 10.2.178.2 remote-as external + neighbor 10.2.179.2 remote-as external + neighbor 10.2.180.2 remote-as external + neighbor 10.2.181.2 remote-as external + neighbor 10.2.182.2 remote-as external + neighbor 10.2.183.2 remote-as external + neighbor 10.2.184.2 remote-as external + neighbor 10.2.185.2 remote-as external + neighbor 10.2.186.2 remote-as external + neighbor 10.2.187.2 remote-as external + neighbor 10.2.188.2 remote-as external + neighbor 10.2.189.2 remote-as external + neighbor 10.2.190.2 remote-as external + neighbor 10.2.191.2 remote-as external + neighbor 10.2.192.2 remote-as external + neighbor 10.2.193.2 remote-as external + neighbor 10.2.194.2 remote-as external + neighbor 10.2.195.2 remote-as external + neighbor 10.2.196.2 remote-as external + neighbor 10.2.197.2 remote-as external + neighbor 10.2.198.2 remote-as external + neighbor 10.2.199.2 remote-as external + neighbor 10.2.200.2 remote-as external + neighbor 10.2.201.2 remote-as external + neighbor 10.2.202.2 remote-as external + neighbor 10.2.203.2 remote-as external + neighbor 10.2.204.2 remote-as external + neighbor 10.2.205.2 remote-as external + neighbor 10.2.206.2 remote-as external + neighbor 10.2.207.2 remote-as external + neighbor 10.2.208.2 remote-as external + neighbor 10.2.209.2 remote-as external + neighbor 10.2.210.2 remote-as external + neighbor 10.2.211.2 remote-as external + neighbor 10.2.212.2 remote-as external + neighbor 10.2.213.2 remote-as external + neighbor 10.2.214.2 remote-as external + neighbor 10.2.215.2 remote-as external + neighbor 10.2.216.2 remote-as external + neighbor 10.2.217.2 remote-as external + neighbor 10.2.218.2 remote-as external + neighbor 10.2.219.2 remote-as external + neighbor 10.2.220.2 remote-as external + neighbor 10.2.221.2 remote-as external + neighbor 10.2.222.2 remote-as external + neighbor 10.2.223.2 remote-as external + neighbor 10.2.224.2 remote-as external + neighbor 10.2.225.2 remote-as external + neighbor 10.2.226.2 remote-as external + neighbor 10.2.227.2 remote-as external + neighbor 10.2.228.2 remote-as external + neighbor 10.2.229.2 remote-as external + neighbor 10.2.230.2 remote-as external + neighbor 10.2.231.2 remote-as external + neighbor 10.2.232.2 remote-as external + neighbor 10.2.233.2 remote-as external + neighbor 10.2.234.2 remote-as external + neighbor 10.2.235.2 remote-as external + neighbor 10.2.236.2 remote-as external + neighbor 10.2.237.2 remote-as external + neighbor 10.2.238.2 remote-as external + neighbor 10.2.239.2 remote-as external + neighbor 10.2.240.2 remote-as external + neighbor 10.2.241.2 remote-as external + neighbor 10.2.242.2 remote-as external + neighbor 10.2.243.2 remote-as external + neighbor 10.2.244.2 remote-as external + neighbor 10.2.245.2 remote-as external + neighbor 10.2.246.2 remote-as external + neighbor 10.2.247.2 remote-as external + neighbor 10.2.248.2 remote-as external + neighbor 10.2.249.2 remote-as external + neighbor 10.2.250.2 remote-as external + neighbor 10.2.251.2 remote-as external + neighbor 10.2.252.2 remote-as external + neighbor 10.2.253.2 remote-as external + neighbor 10.2.254.2 remote-as external + neighbor 10.2.255.2 remote-as external + neighbor 10.3.1.2 remote-as external + neighbor 10.3.2.2 remote-as external + neighbor 10.3.3.2 remote-as external + neighbor 10.3.4.2 remote-as external + address-family ipv4 uni + redistribute sharp diff --git a/tests/topotests/high_ecmp/r1/frr_ipv6_bgp.conf b/tests/topotests/high_ecmp/r1/frr_ipv6_bgp.conf new file mode 100644 index 0000000000..15137a8715 --- /dev/null +++ b/tests/topotests/high_ecmp/r1/frr_ipv6_bgp.conf @@ -0,0 +1,1037 @@ +router bgp 1001 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor 2001:db8:1:1::2 remote-as external + neighbor 2001:db8:1:2::2 remote-as external + neighbor 2001:db8:1:3::2 remote-as external + neighbor 2001:db8:1:4::2 remote-as external + neighbor 2001:db8:1:5::2 remote-as external + neighbor 2001:db8:1:6::2 remote-as external + neighbor 2001:db8:1:7::2 remote-as external + neighbor 2001:db8:1:8::2 remote-as external + neighbor 2001:db8:1:9::2 remote-as external + neighbor 2001:db8:1:10::2 remote-as external + neighbor 2001:db8:1:11::2 remote-as external + neighbor 2001:db8:1:12::2 remote-as external + neighbor 2001:db8:1:13::2 remote-as external + neighbor 2001:db8:1:14::2 remote-as external + neighbor 2001:db8:1:15::2 remote-as external + neighbor 2001:db8:1:16::2 remote-as external + neighbor 2001:db8:1:17::2 remote-as external + neighbor 2001:db8:1:18::2 remote-as external + neighbor 2001:db8:1:19::2 remote-as external + neighbor 2001:db8:1:20::2 remote-as external + neighbor 2001:db8:1:21::2 remote-as external + neighbor 2001:db8:1:22::2 remote-as external + neighbor 2001:db8:1:23::2 remote-as external + neighbor 2001:db8:1:24::2 remote-as external + neighbor 2001:db8:1:25::2 remote-as external + neighbor 2001:db8:1:26::2 remote-as external + neighbor 2001:db8:1:27::2 remote-as external + neighbor 2001:db8:1:28::2 remote-as external + neighbor 2001:db8:1:29::2 remote-as external + neighbor 2001:db8:1:30::2 remote-as external + neighbor 2001:db8:1:31::2 remote-as external + neighbor 2001:db8:1:32::2 remote-as external + neighbor 2001:db8:1:33::2 remote-as external + neighbor 2001:db8:1:34::2 remote-as external + neighbor 2001:db8:1:35::2 remote-as external + neighbor 2001:db8:1:36::2 remote-as external + neighbor 2001:db8:1:37::2 remote-as external + neighbor 2001:db8:1:38::2 remote-as external + neighbor 2001:db8:1:39::2 remote-as external + neighbor 2001:db8:1:40::2 remote-as external + neighbor 2001:db8:1:41::2 remote-as external + neighbor 2001:db8:1:42::2 remote-as external + neighbor 2001:db8:1:43::2 remote-as external + neighbor 2001:db8:1:44::2 remote-as external + neighbor 2001:db8:1:45::2 remote-as external + neighbor 2001:db8:1:46::2 remote-as external + neighbor 2001:db8:1:47::2 remote-as external + neighbor 2001:db8:1:48::2 remote-as external + neighbor 2001:db8:1:49::2 remote-as external + neighbor 2001:db8:1:50::2 remote-as external + neighbor 2001:db8:1:51::2 remote-as external + neighbor 2001:db8:1:52::2 remote-as external + neighbor 2001:db8:1:53::2 remote-as external + neighbor 2001:db8:1:54::2 remote-as external + neighbor 2001:db8:1:55::2 remote-as external + neighbor 2001:db8:1:56::2 remote-as external + neighbor 2001:db8:1:57::2 remote-as external + neighbor 2001:db8:1:58::2 remote-as external + neighbor 2001:db8:1:59::2 remote-as external + neighbor 2001:db8:1:60::2 remote-as external + neighbor 2001:db8:1:61::2 remote-as external + neighbor 2001:db8:1:62::2 remote-as external + neighbor 2001:db8:1:63::2 remote-as external + neighbor 2001:db8:1:64::2 remote-as external + neighbor 2001:db8:1:65::2 remote-as external + neighbor 2001:db8:1:66::2 remote-as external + neighbor 2001:db8:1:67::2 remote-as external + neighbor 2001:db8:1:68::2 remote-as external + neighbor 2001:db8:1:69::2 remote-as external + neighbor 2001:db8:1:70::2 remote-as external + neighbor 2001:db8:1:71::2 remote-as external + neighbor 2001:db8:1:72::2 remote-as external + neighbor 2001:db8:1:73::2 remote-as external + neighbor 2001:db8:1:74::2 remote-as external + neighbor 2001:db8:1:75::2 remote-as external + neighbor 2001:db8:1:76::2 remote-as external + neighbor 2001:db8:1:77::2 remote-as external + neighbor 2001:db8:1:78::2 remote-as external + neighbor 2001:db8:1:79::2 remote-as external + neighbor 2001:db8:1:80::2 remote-as external + neighbor 2001:db8:1:81::2 remote-as external + neighbor 2001:db8:1:82::2 remote-as external + neighbor 2001:db8:1:83::2 remote-as external + neighbor 2001:db8:1:84::2 remote-as external + neighbor 2001:db8:1:85::2 remote-as external + neighbor 2001:db8:1:86::2 remote-as external + neighbor 2001:db8:1:87::2 remote-as external + neighbor 2001:db8:1:88::2 remote-as external + neighbor 2001:db8:1:89::2 remote-as external + neighbor 2001:db8:1:90::2 remote-as external + neighbor 2001:db8:1:91::2 remote-as external + neighbor 2001:db8:1:92::2 remote-as external + neighbor 2001:db8:1:93::2 remote-as external + neighbor 2001:db8:1:94::2 remote-as external + neighbor 2001:db8:1:95::2 remote-as external + neighbor 2001:db8:1:96::2 remote-as external + neighbor 2001:db8:1:97::2 remote-as external + neighbor 2001:db8:1:98::2 remote-as external + neighbor 2001:db8:1:99::2 remote-as external + neighbor 2001:db8:1:100::2 remote-as external + neighbor 2001:db8:1:101::2 remote-as external + neighbor 2001:db8:1:102::2 remote-as external + neighbor 2001:db8:1:103::2 remote-as external + neighbor 2001:db8:1:104::2 remote-as external + neighbor 2001:db8:1:105::2 remote-as external + neighbor 2001:db8:1:106::2 remote-as external + neighbor 2001:db8:1:107::2 remote-as external + neighbor 2001:db8:1:108::2 remote-as external + neighbor 2001:db8:1:109::2 remote-as external + neighbor 2001:db8:1:110::2 remote-as external + neighbor 2001:db8:1:111::2 remote-as external + neighbor 2001:db8:1:112::2 remote-as external + neighbor 2001:db8:1:113::2 remote-as external + neighbor 2001:db8:1:114::2 remote-as external + neighbor 2001:db8:1:115::2 remote-as external + neighbor 2001:db8:1:116::2 remote-as external + neighbor 2001:db8:1:117::2 remote-as external + neighbor 2001:db8:1:118::2 remote-as external + neighbor 2001:db8:1:119::2 remote-as external + neighbor 2001:db8:1:120::2 remote-as external + neighbor 2001:db8:1:121::2 remote-as external + neighbor 2001:db8:1:122::2 remote-as external + neighbor 2001:db8:1:123::2 remote-as external + neighbor 2001:db8:1:124::2 remote-as external + neighbor 2001:db8:1:125::2 remote-as external + neighbor 2001:db8:1:126::2 remote-as external + neighbor 2001:db8:1:127::2 remote-as external + neighbor 2001:db8:1:128::2 remote-as external + neighbor 2001:db8:1:129::2 remote-as external + neighbor 2001:db8:1:130::2 remote-as external + neighbor 2001:db8:1:131::2 remote-as external + neighbor 2001:db8:1:132::2 remote-as external + neighbor 2001:db8:1:133::2 remote-as external + neighbor 2001:db8:1:134::2 remote-as external + neighbor 2001:db8:1:135::2 remote-as external + neighbor 2001:db8:1:136::2 remote-as external + neighbor 2001:db8:1:137::2 remote-as external + neighbor 2001:db8:1:138::2 remote-as external + neighbor 2001:db8:1:139::2 remote-as external + neighbor 2001:db8:1:140::2 remote-as external + neighbor 2001:db8:1:141::2 remote-as external + neighbor 2001:db8:1:142::2 remote-as external + neighbor 2001:db8:1:143::2 remote-as external + neighbor 2001:db8:1:144::2 remote-as external + neighbor 2001:db8:1:145::2 remote-as external + neighbor 2001:db8:1:146::2 remote-as external + neighbor 2001:db8:1:147::2 remote-as external + neighbor 2001:db8:1:148::2 remote-as external + neighbor 2001:db8:1:149::2 remote-as external + neighbor 2001:db8:1:150::2 remote-as external + neighbor 2001:db8:1:151::2 remote-as external + neighbor 2001:db8:1:152::2 remote-as external + neighbor 2001:db8:1:153::2 remote-as external + neighbor 2001:db8:1:154::2 remote-as external + neighbor 2001:db8:1:155::2 remote-as external + neighbor 2001:db8:1:156::2 remote-as external + neighbor 2001:db8:1:157::2 remote-as external + neighbor 2001:db8:1:158::2 remote-as external + neighbor 2001:db8:1:159::2 remote-as external + neighbor 2001:db8:1:160::2 remote-as external + neighbor 2001:db8:1:161::2 remote-as external + neighbor 2001:db8:1:162::2 remote-as external + neighbor 2001:db8:1:163::2 remote-as external + neighbor 2001:db8:1:164::2 remote-as external + neighbor 2001:db8:1:165::2 remote-as external + neighbor 2001:db8:1:166::2 remote-as external + neighbor 2001:db8:1:167::2 remote-as external + neighbor 2001:db8:1:168::2 remote-as external + neighbor 2001:db8:1:169::2 remote-as external + neighbor 2001:db8:1:170::2 remote-as external + neighbor 2001:db8:1:171::2 remote-as external + neighbor 2001:db8:1:172::2 remote-as external + neighbor 2001:db8:1:173::2 remote-as external + neighbor 2001:db8:1:174::2 remote-as external + neighbor 2001:db8:1:175::2 remote-as external + neighbor 2001:db8:1:176::2 remote-as external + neighbor 2001:db8:1:177::2 remote-as external + neighbor 2001:db8:1:178::2 remote-as external + neighbor 2001:db8:1:179::2 remote-as external + neighbor 2001:db8:1:180::2 remote-as external + neighbor 2001:db8:1:181::2 remote-as external + neighbor 2001:db8:1:182::2 remote-as external + neighbor 2001:db8:1:183::2 remote-as external + neighbor 2001:db8:1:184::2 remote-as external + neighbor 2001:db8:1:185::2 remote-as external + neighbor 2001:db8:1:186::2 remote-as external + neighbor 2001:db8:1:187::2 remote-as external + neighbor 2001:db8:1:188::2 remote-as external + neighbor 2001:db8:1:189::2 remote-as external + neighbor 2001:db8:1:190::2 remote-as external + neighbor 2001:db8:1:191::2 remote-as external + neighbor 2001:db8:1:192::2 remote-as external + neighbor 2001:db8:1:193::2 remote-as external + neighbor 2001:db8:1:194::2 remote-as external + neighbor 2001:db8:1:195::2 remote-as external + neighbor 2001:db8:1:196::2 remote-as external + neighbor 2001:db8:1:197::2 remote-as external + neighbor 2001:db8:1:198::2 remote-as external + neighbor 2001:db8:1:199::2 remote-as external + neighbor 2001:db8:1:200::2 remote-as external + neighbor 2001:db8:1:201::2 remote-as external + neighbor 2001:db8:1:202::2 remote-as external + neighbor 2001:db8:1:203::2 remote-as external + neighbor 2001:db8:1:204::2 remote-as external + neighbor 2001:db8:1:205::2 remote-as external + neighbor 2001:db8:1:206::2 remote-as external + neighbor 2001:db8:1:207::2 remote-as external + neighbor 2001:db8:1:208::2 remote-as external + neighbor 2001:db8:1:209::2 remote-as external + neighbor 2001:db8:1:210::2 remote-as external + neighbor 2001:db8:1:211::2 remote-as external + neighbor 2001:db8:1:212::2 remote-as external + neighbor 2001:db8:1:213::2 remote-as external + neighbor 2001:db8:1:214::2 remote-as external + neighbor 2001:db8:1:215::2 remote-as external + neighbor 2001:db8:1:216::2 remote-as external + neighbor 2001:db8:1:217::2 remote-as external + neighbor 2001:db8:1:218::2 remote-as external + neighbor 2001:db8:1:219::2 remote-as external + neighbor 2001:db8:1:220::2 remote-as external + neighbor 2001:db8:1:221::2 remote-as external + neighbor 2001:db8:1:222::2 remote-as external + neighbor 2001:db8:1:223::2 remote-as external + neighbor 2001:db8:1:224::2 remote-as external + neighbor 2001:db8:1:225::2 remote-as external + neighbor 2001:db8:1:226::2 remote-as external + neighbor 2001:db8:1:227::2 remote-as external + neighbor 2001:db8:1:228::2 remote-as external + neighbor 2001:db8:1:229::2 remote-as external + neighbor 2001:db8:1:230::2 remote-as external + neighbor 2001:db8:1:231::2 remote-as external + neighbor 2001:db8:1:232::2 remote-as external + neighbor 2001:db8:1:233::2 remote-as external + neighbor 2001:db8:1:234::2 remote-as external + neighbor 2001:db8:1:235::2 remote-as external + neighbor 2001:db8:1:236::2 remote-as external + neighbor 2001:db8:1:237::2 remote-as external + neighbor 2001:db8:1:238::2 remote-as external + neighbor 2001:db8:1:239::2 remote-as external + neighbor 2001:db8:1:240::2 remote-as external + neighbor 2001:db8:1:241::2 remote-as external + neighbor 2001:db8:1:242::2 remote-as external + neighbor 2001:db8:1:243::2 remote-as external + neighbor 2001:db8:1:244::2 remote-as external + neighbor 2001:db8:1:245::2 remote-as external + neighbor 2001:db8:1:246::2 remote-as external + neighbor 2001:db8:1:247::2 remote-as external + neighbor 2001:db8:1:248::2 remote-as external + neighbor 2001:db8:1:249::2 remote-as external + neighbor 2001:db8:1:250::2 remote-as external + neighbor 2001:db8:1:251::2 remote-as external + neighbor 2001:db8:1:252::2 remote-as external + neighbor 2001:db8:1:253::2 remote-as external + neighbor 2001:db8:1:254::2 remote-as external + neighbor 2001:db8:1:255::2 remote-as external + neighbor 2001:db8:2:1::2 remote-as external + neighbor 2001:db8:2:2::2 remote-as external + neighbor 2001:db8:2:3::2 remote-as external + neighbor 2001:db8:2:4::2 remote-as external + neighbor 2001:db8:2:5::2 remote-as external + neighbor 2001:db8:2:6::2 remote-as external + neighbor 2001:db8:2:7::2 remote-as external + neighbor 2001:db8:2:8::2 remote-as external + neighbor 2001:db8:2:9::2 remote-as external + neighbor 2001:db8:2:10::2 remote-as external + neighbor 2001:db8:2:11::2 remote-as external + neighbor 2001:db8:2:12::2 remote-as external + neighbor 2001:db8:2:13::2 remote-as external + neighbor 2001:db8:2:14::2 remote-as external + neighbor 2001:db8:2:15::2 remote-as external + neighbor 2001:db8:2:16::2 remote-as external + neighbor 2001:db8:2:17::2 remote-as external + neighbor 2001:db8:2:18::2 remote-as external + neighbor 2001:db8:2:19::2 remote-as external + neighbor 2001:db8:2:20::2 remote-as external + neighbor 2001:db8:2:21::2 remote-as external + neighbor 2001:db8:2:22::2 remote-as external + neighbor 2001:db8:2:23::2 remote-as external + neighbor 2001:db8:2:24::2 remote-as external + neighbor 2001:db8:2:25::2 remote-as external + neighbor 2001:db8:2:26::2 remote-as external + neighbor 2001:db8:2:27::2 remote-as external + neighbor 2001:db8:2:28::2 remote-as external + neighbor 2001:db8:2:29::2 remote-as external + neighbor 2001:db8:2:30::2 remote-as external + neighbor 2001:db8:2:31::2 remote-as external + neighbor 2001:db8:2:32::2 remote-as external + neighbor 2001:db8:2:33::2 remote-as external + neighbor 2001:db8:2:34::2 remote-as external + neighbor 2001:db8:2:35::2 remote-as external + neighbor 2001:db8:2:36::2 remote-as external + neighbor 2001:db8:2:37::2 remote-as external + neighbor 2001:db8:2:38::2 remote-as external + neighbor 2001:db8:2:39::2 remote-as external + neighbor 2001:db8:2:40::2 remote-as external + neighbor 2001:db8:2:41::2 remote-as external + neighbor 2001:db8:2:42::2 remote-as external + neighbor 2001:db8:2:43::2 remote-as external + neighbor 2001:db8:2:44::2 remote-as external + neighbor 2001:db8:2:45::2 remote-as external + neighbor 2001:db8:2:46::2 remote-as external + neighbor 2001:db8:2:47::2 remote-as external + neighbor 2001:db8:2:48::2 remote-as external + neighbor 2001:db8:2:49::2 remote-as external + neighbor 2001:db8:2:50::2 remote-as external + neighbor 2001:db8:2:51::2 remote-as external + neighbor 2001:db8:2:52::2 remote-as external + neighbor 2001:db8:2:53::2 remote-as external + neighbor 2001:db8:2:54::2 remote-as external + neighbor 2001:db8:2:55::2 remote-as external + neighbor 2001:db8:2:56::2 remote-as external + neighbor 2001:db8:2:57::2 remote-as external + neighbor 2001:db8:2:58::2 remote-as external + neighbor 2001:db8:2:59::2 remote-as external + neighbor 2001:db8:2:60::2 remote-as external + neighbor 2001:db8:2:61::2 remote-as external + neighbor 2001:db8:2:62::2 remote-as external + neighbor 2001:db8:2:63::2 remote-as external + neighbor 2001:db8:2:64::2 remote-as external + neighbor 2001:db8:2:65::2 remote-as external + neighbor 2001:db8:2:66::2 remote-as external + neighbor 2001:db8:2:67::2 remote-as external + neighbor 2001:db8:2:68::2 remote-as external + neighbor 2001:db8:2:69::2 remote-as external + neighbor 2001:db8:2:70::2 remote-as external + neighbor 2001:db8:2:71::2 remote-as external + neighbor 2001:db8:2:72::2 remote-as external + neighbor 2001:db8:2:73::2 remote-as external + neighbor 2001:db8:2:74::2 remote-as external + neighbor 2001:db8:2:75::2 remote-as external + neighbor 2001:db8:2:76::2 remote-as external + neighbor 2001:db8:2:77::2 remote-as external + neighbor 2001:db8:2:78::2 remote-as external + neighbor 2001:db8:2:79::2 remote-as external + neighbor 2001:db8:2:80::2 remote-as external + neighbor 2001:db8:2:81::2 remote-as external + neighbor 2001:db8:2:82::2 remote-as external + neighbor 2001:db8:2:83::2 remote-as external + neighbor 2001:db8:2:84::2 remote-as external + neighbor 2001:db8:2:85::2 remote-as external + neighbor 2001:db8:2:86::2 remote-as external + neighbor 2001:db8:2:87::2 remote-as external + neighbor 2001:db8:2:88::2 remote-as external + neighbor 2001:db8:2:89::2 remote-as external + neighbor 2001:db8:2:90::2 remote-as external + neighbor 2001:db8:2:91::2 remote-as external + neighbor 2001:db8:2:92::2 remote-as external + neighbor 2001:db8:2:93::2 remote-as external + neighbor 2001:db8:2:94::2 remote-as external + neighbor 2001:db8:2:95::2 remote-as external + neighbor 2001:db8:2:96::2 remote-as external + neighbor 2001:db8:2:97::2 remote-as external + neighbor 2001:db8:2:98::2 remote-as external + neighbor 2001:db8:2:99::2 remote-as external + neighbor 2001:db8:2:100::2 remote-as external + neighbor 2001:db8:2:101::2 remote-as external + neighbor 2001:db8:2:102::2 remote-as external + neighbor 2001:db8:2:103::2 remote-as external + neighbor 2001:db8:2:104::2 remote-as external + neighbor 2001:db8:2:105::2 remote-as external + neighbor 2001:db8:2:106::2 remote-as external + neighbor 2001:db8:2:107::2 remote-as external + neighbor 2001:db8:2:108::2 remote-as external + neighbor 2001:db8:2:109::2 remote-as external + neighbor 2001:db8:2:110::2 remote-as external + neighbor 2001:db8:2:111::2 remote-as external + neighbor 2001:db8:2:112::2 remote-as external + neighbor 2001:db8:2:113::2 remote-as external + neighbor 2001:db8:2:114::2 remote-as external + neighbor 2001:db8:2:115::2 remote-as external + neighbor 2001:db8:2:116::2 remote-as external + neighbor 2001:db8:2:117::2 remote-as external + neighbor 2001:db8:2:118::2 remote-as external + neighbor 2001:db8:2:119::2 remote-as external + neighbor 2001:db8:2:120::2 remote-as external + neighbor 2001:db8:2:121::2 remote-as external + neighbor 2001:db8:2:122::2 remote-as external + neighbor 2001:db8:2:123::2 remote-as external + neighbor 2001:db8:2:124::2 remote-as external + neighbor 2001:db8:2:125::2 remote-as external + neighbor 2001:db8:2:126::2 remote-as external + neighbor 2001:db8:2:127::2 remote-as external + neighbor 2001:db8:2:128::2 remote-as external + neighbor 2001:db8:2:129::2 remote-as external + neighbor 2001:db8:2:130::2 remote-as external + neighbor 2001:db8:2:131::2 remote-as external + neighbor 2001:db8:2:132::2 remote-as external + neighbor 2001:db8:2:133::2 remote-as external + neighbor 2001:db8:2:134::2 remote-as external + neighbor 2001:db8:2:135::2 remote-as external + neighbor 2001:db8:2:136::2 remote-as external + neighbor 2001:db8:2:137::2 remote-as external + neighbor 2001:db8:2:138::2 remote-as external + neighbor 2001:db8:2:139::2 remote-as external + neighbor 2001:db8:2:140::2 remote-as external + neighbor 2001:db8:2:141::2 remote-as external + neighbor 2001:db8:2:142::2 remote-as external + neighbor 2001:db8:2:143::2 remote-as external + neighbor 2001:db8:2:144::2 remote-as external + neighbor 2001:db8:2:145::2 remote-as external + neighbor 2001:db8:2:146::2 remote-as external + neighbor 2001:db8:2:147::2 remote-as external + neighbor 2001:db8:2:148::2 remote-as external + neighbor 2001:db8:2:149::2 remote-as external + neighbor 2001:db8:2:150::2 remote-as external + neighbor 2001:db8:2:151::2 remote-as external + neighbor 2001:db8:2:152::2 remote-as external + neighbor 2001:db8:2:153::2 remote-as external + neighbor 2001:db8:2:154::2 remote-as external + neighbor 2001:db8:2:155::2 remote-as external + neighbor 2001:db8:2:156::2 remote-as external + neighbor 2001:db8:2:157::2 remote-as external + neighbor 2001:db8:2:158::2 remote-as external + neighbor 2001:db8:2:159::2 remote-as external + neighbor 2001:db8:2:160::2 remote-as external + neighbor 2001:db8:2:161::2 remote-as external + neighbor 2001:db8:2:162::2 remote-as external + neighbor 2001:db8:2:163::2 remote-as external + neighbor 2001:db8:2:164::2 remote-as external + neighbor 2001:db8:2:165::2 remote-as external + neighbor 2001:db8:2:166::2 remote-as external + neighbor 2001:db8:2:167::2 remote-as external + neighbor 2001:db8:2:168::2 remote-as external + neighbor 2001:db8:2:169::2 remote-as external + neighbor 2001:db8:2:170::2 remote-as external + neighbor 2001:db8:2:171::2 remote-as external + neighbor 2001:db8:2:172::2 remote-as external + neighbor 2001:db8:2:173::2 remote-as external + neighbor 2001:db8:2:174::2 remote-as external + neighbor 2001:db8:2:175::2 remote-as external + neighbor 2001:db8:2:176::2 remote-as external + neighbor 2001:db8:2:177::2 remote-as external + neighbor 2001:db8:2:178::2 remote-as external + neighbor 2001:db8:2:179::2 remote-as external + neighbor 2001:db8:2:180::2 remote-as external + neighbor 2001:db8:2:181::2 remote-as external + neighbor 2001:db8:2:182::2 remote-as external + neighbor 2001:db8:2:183::2 remote-as external + neighbor 2001:db8:2:184::2 remote-as external + neighbor 2001:db8:2:185::2 remote-as external + neighbor 2001:db8:2:186::2 remote-as external + neighbor 2001:db8:2:187::2 remote-as external + neighbor 2001:db8:2:188::2 remote-as external + neighbor 2001:db8:2:189::2 remote-as external + neighbor 2001:db8:2:190::2 remote-as external + neighbor 2001:db8:2:191::2 remote-as external + neighbor 2001:db8:2:192::2 remote-as external + neighbor 2001:db8:2:193::2 remote-as external + neighbor 2001:db8:2:194::2 remote-as external + neighbor 2001:db8:2:195::2 remote-as external + neighbor 2001:db8:2:196::2 remote-as external + neighbor 2001:db8:2:197::2 remote-as external + neighbor 2001:db8:2:198::2 remote-as external + neighbor 2001:db8:2:199::2 remote-as external + neighbor 2001:db8:2:200::2 remote-as external + neighbor 2001:db8:2:201::2 remote-as external + neighbor 2001:db8:2:202::2 remote-as external + neighbor 2001:db8:2:203::2 remote-as external + neighbor 2001:db8:2:204::2 remote-as external + neighbor 2001:db8:2:205::2 remote-as external + neighbor 2001:db8:2:206::2 remote-as external + neighbor 2001:db8:2:207::2 remote-as external + neighbor 2001:db8:2:208::2 remote-as external + neighbor 2001:db8:2:209::2 remote-as external + neighbor 2001:db8:2:210::2 remote-as external + neighbor 2001:db8:2:211::2 remote-as external + neighbor 2001:db8:2:212::2 remote-as external + neighbor 2001:db8:2:213::2 remote-as external + neighbor 2001:db8:2:214::2 remote-as external + neighbor 2001:db8:2:215::2 remote-as external + neighbor 2001:db8:2:216::2 remote-as external + neighbor 2001:db8:2:217::2 remote-as external + neighbor 2001:db8:2:218::2 remote-as external + neighbor 2001:db8:2:219::2 remote-as external + neighbor 2001:db8:2:220::2 remote-as external + neighbor 2001:db8:2:221::2 remote-as external + neighbor 2001:db8:2:222::2 remote-as external + neighbor 2001:db8:2:223::2 remote-as external + neighbor 2001:db8:2:224::2 remote-as external + neighbor 2001:db8:2:225::2 remote-as external + neighbor 2001:db8:2:226::2 remote-as external + neighbor 2001:db8:2:227::2 remote-as external + neighbor 2001:db8:2:228::2 remote-as external + neighbor 2001:db8:2:229::2 remote-as external + neighbor 2001:db8:2:230::2 remote-as external + neighbor 2001:db8:2:231::2 remote-as external + neighbor 2001:db8:2:232::2 remote-as external + neighbor 2001:db8:2:233::2 remote-as external + neighbor 2001:db8:2:234::2 remote-as external + neighbor 2001:db8:2:235::2 remote-as external + neighbor 2001:db8:2:236::2 remote-as external + neighbor 2001:db8:2:237::2 remote-as external + neighbor 2001:db8:2:238::2 remote-as external + neighbor 2001:db8:2:239::2 remote-as external + neighbor 2001:db8:2:240::2 remote-as external + neighbor 2001:db8:2:241::2 remote-as external + neighbor 2001:db8:2:242::2 remote-as external + neighbor 2001:db8:2:243::2 remote-as external + neighbor 2001:db8:2:244::2 remote-as external + neighbor 2001:db8:2:245::2 remote-as external + neighbor 2001:db8:2:246::2 remote-as external + neighbor 2001:db8:2:247::2 remote-as external + neighbor 2001:db8:2:248::2 remote-as external + neighbor 2001:db8:2:249::2 remote-as external + neighbor 2001:db8:2:250::2 remote-as external + neighbor 2001:db8:2:251::2 remote-as external + neighbor 2001:db8:2:252::2 remote-as external + neighbor 2001:db8:2:253::2 remote-as external + neighbor 2001:db8:2:254::2 remote-as external + neighbor 2001:db8:2:255::2 remote-as external + neighbor 2001:db8:3:1::2 remote-as external + neighbor 2001:db8:3:2::2 remote-as external + neighbor 2001:db8:3:3::2 remote-as external + neighbor 2001:db8:3:4::2 remote-as external + address-family ipv6 unicast + redistribute sharp + neighbor 2001:db8:1:1::2 activate + neighbor 2001:db8:1:2::2 activate + neighbor 2001:db8:1:3::2 activate + neighbor 2001:db8:1:4::2 activate + neighbor 2001:db8:1:5::2 activate + neighbor 2001:db8:1:6::2 activate + neighbor 2001:db8:1:7::2 activate + neighbor 2001:db8:1:8::2 activate + neighbor 2001:db8:1:9::2 activate + neighbor 2001:db8:1:10::2 activate + neighbor 2001:db8:1:11::2 activate + neighbor 2001:db8:1:12::2 activate + neighbor 2001:db8:1:13::2 activate + neighbor 2001:db8:1:14::2 activate + neighbor 2001:db8:1:15::2 activate + neighbor 2001:db8:1:16::2 activate + neighbor 2001:db8:1:17::2 activate + neighbor 2001:db8:1:18::2 activate + neighbor 2001:db8:1:19::2 activate + neighbor 2001:db8:1:20::2 activate + neighbor 2001:db8:1:21::2 activate + neighbor 2001:db8:1:22::2 activate + neighbor 2001:db8:1:23::2 activate + neighbor 2001:db8:1:24::2 activate + neighbor 2001:db8:1:25::2 activate + neighbor 2001:db8:1:26::2 activate + neighbor 2001:db8:1:27::2 activate + neighbor 2001:db8:1:28::2 activate + neighbor 2001:db8:1:29::2 activate + neighbor 2001:db8:1:30::2 activate + neighbor 2001:db8:1:31::2 activate + neighbor 2001:db8:1:32::2 activate + neighbor 2001:db8:1:33::2 activate + neighbor 2001:db8:1:34::2 activate + neighbor 2001:db8:1:35::2 activate + neighbor 2001:db8:1:36::2 activate + neighbor 2001:db8:1:37::2 activate + neighbor 2001:db8:1:38::2 activate + neighbor 2001:db8:1:39::2 activate + neighbor 2001:db8:1:40::2 activate + neighbor 2001:db8:1:41::2 activate + neighbor 2001:db8:1:42::2 activate + neighbor 2001:db8:1:43::2 activate + neighbor 2001:db8:1:44::2 activate + neighbor 2001:db8:1:45::2 activate + neighbor 2001:db8:1:46::2 activate + neighbor 2001:db8:1:47::2 activate + neighbor 2001:db8:1:48::2 activate + neighbor 2001:db8:1:49::2 activate + neighbor 2001:db8:1:50::2 activate + neighbor 2001:db8:1:51::2 activate + neighbor 2001:db8:1:52::2 activate + neighbor 2001:db8:1:53::2 activate + neighbor 2001:db8:1:54::2 activate + neighbor 2001:db8:1:55::2 activate + neighbor 2001:db8:1:56::2 activate + neighbor 2001:db8:1:57::2 activate + neighbor 2001:db8:1:58::2 activate + neighbor 2001:db8:1:59::2 activate + neighbor 2001:db8:1:60::2 activate + neighbor 2001:db8:1:61::2 activate + neighbor 2001:db8:1:62::2 activate + neighbor 2001:db8:1:63::2 activate + neighbor 2001:db8:1:64::2 activate + neighbor 2001:db8:1:65::2 activate + neighbor 2001:db8:1:66::2 activate + neighbor 2001:db8:1:67::2 activate + neighbor 2001:db8:1:68::2 activate + neighbor 2001:db8:1:69::2 activate + neighbor 2001:db8:1:70::2 activate + neighbor 2001:db8:1:71::2 activate + neighbor 2001:db8:1:72::2 activate + neighbor 2001:db8:1:73::2 activate + neighbor 2001:db8:1:74::2 activate + neighbor 2001:db8:1:75::2 activate + neighbor 2001:db8:1:76::2 activate + neighbor 2001:db8:1:77::2 activate + neighbor 2001:db8:1:78::2 activate + neighbor 2001:db8:1:79::2 activate + neighbor 2001:db8:1:80::2 activate + neighbor 2001:db8:1:81::2 activate + neighbor 2001:db8:1:82::2 activate + neighbor 2001:db8:1:83::2 activate + neighbor 2001:db8:1:84::2 activate + neighbor 2001:db8:1:85::2 activate + neighbor 2001:db8:1:86::2 activate + neighbor 2001:db8:1:87::2 activate + neighbor 2001:db8:1:88::2 activate + neighbor 2001:db8:1:89::2 activate + neighbor 2001:db8:1:90::2 activate + neighbor 2001:db8:1:91::2 activate + neighbor 2001:db8:1:92::2 activate + neighbor 2001:db8:1:93::2 activate + neighbor 2001:db8:1:94::2 activate + neighbor 2001:db8:1:95::2 activate + neighbor 2001:db8:1:96::2 activate + neighbor 2001:db8:1:97::2 activate + neighbor 2001:db8:1:98::2 activate + neighbor 2001:db8:1:99::2 activate + neighbor 2001:db8:1:100::2 activate + neighbor 2001:db8:1:101::2 activate + neighbor 2001:db8:1:102::2 activate + neighbor 2001:db8:1:103::2 activate + neighbor 2001:db8:1:104::2 activate + neighbor 2001:db8:1:105::2 activate + neighbor 2001:db8:1:106::2 activate + neighbor 2001:db8:1:107::2 activate + neighbor 2001:db8:1:108::2 activate + neighbor 2001:db8:1:109::2 activate + neighbor 2001:db8:1:110::2 activate + neighbor 2001:db8:1:111::2 activate + neighbor 2001:db8:1:112::2 activate + neighbor 2001:db8:1:113::2 activate + neighbor 2001:db8:1:114::2 activate + neighbor 2001:db8:1:115::2 activate + neighbor 2001:db8:1:116::2 activate + neighbor 2001:db8:1:117::2 activate + neighbor 2001:db8:1:118::2 activate + neighbor 2001:db8:1:119::2 activate + neighbor 2001:db8:1:120::2 activate + neighbor 2001:db8:1:121::2 activate + neighbor 2001:db8:1:122::2 activate + neighbor 2001:db8:1:123::2 activate + neighbor 2001:db8:1:124::2 activate + neighbor 2001:db8:1:125::2 activate + neighbor 2001:db8:1:126::2 activate + neighbor 2001:db8:1:127::2 activate + neighbor 2001:db8:1:128::2 activate + neighbor 2001:db8:1:129::2 activate + neighbor 2001:db8:1:130::2 activate + neighbor 2001:db8:1:131::2 activate + neighbor 2001:db8:1:132::2 activate + neighbor 2001:db8:1:133::2 activate + neighbor 2001:db8:1:134::2 activate + neighbor 2001:db8:1:135::2 activate + neighbor 2001:db8:1:136::2 activate + neighbor 2001:db8:1:137::2 activate + neighbor 2001:db8:1:138::2 activate + neighbor 2001:db8:1:139::2 activate + neighbor 2001:db8:1:140::2 activate + neighbor 2001:db8:1:141::2 activate + neighbor 2001:db8:1:142::2 activate + neighbor 2001:db8:1:143::2 activate + neighbor 2001:db8:1:144::2 activate + neighbor 2001:db8:1:145::2 activate + neighbor 2001:db8:1:146::2 activate + neighbor 2001:db8:1:147::2 activate + neighbor 2001:db8:1:148::2 activate + neighbor 2001:db8:1:149::2 activate + neighbor 2001:db8:1:150::2 activate + neighbor 2001:db8:1:151::2 activate + neighbor 2001:db8:1:152::2 activate + neighbor 2001:db8:1:153::2 activate + neighbor 2001:db8:1:154::2 activate + neighbor 2001:db8:1:155::2 activate + neighbor 2001:db8:1:156::2 activate + neighbor 2001:db8:1:157::2 activate + neighbor 2001:db8:1:158::2 activate + neighbor 2001:db8:1:159::2 activate + neighbor 2001:db8:1:160::2 activate + neighbor 2001:db8:1:161::2 activate + neighbor 2001:db8:1:162::2 activate + neighbor 2001:db8:1:163::2 activate + neighbor 2001:db8:1:164::2 activate + neighbor 2001:db8:1:165::2 activate + neighbor 2001:db8:1:166::2 activate + neighbor 2001:db8:1:167::2 activate + neighbor 2001:db8:1:168::2 activate + neighbor 2001:db8:1:169::2 activate + neighbor 2001:db8:1:170::2 activate + neighbor 2001:db8:1:171::2 activate + neighbor 2001:db8:1:172::2 activate + neighbor 2001:db8:1:173::2 activate + neighbor 2001:db8:1:174::2 activate + neighbor 2001:db8:1:175::2 activate + neighbor 2001:db8:1:176::2 activate + neighbor 2001:db8:1:177::2 activate + neighbor 2001:db8:1:178::2 activate + neighbor 2001:db8:1:179::2 activate + neighbor 2001:db8:1:180::2 activate + neighbor 2001:db8:1:181::2 activate + neighbor 2001:db8:1:182::2 activate + neighbor 2001:db8:1:183::2 activate + neighbor 2001:db8:1:184::2 activate + neighbor 2001:db8:1:185::2 activate + neighbor 2001:db8:1:186::2 activate + neighbor 2001:db8:1:187::2 activate + neighbor 2001:db8:1:188::2 activate + neighbor 2001:db8:1:189::2 activate + neighbor 2001:db8:1:190::2 activate + neighbor 2001:db8:1:191::2 activate + neighbor 2001:db8:1:192::2 activate + neighbor 2001:db8:1:193::2 activate + neighbor 2001:db8:1:194::2 activate + neighbor 2001:db8:1:195::2 activate + neighbor 2001:db8:1:196::2 activate + neighbor 2001:db8:1:197::2 activate + neighbor 2001:db8:1:198::2 activate + neighbor 2001:db8:1:199::2 activate + neighbor 2001:db8:1:200::2 activate + neighbor 2001:db8:1:201::2 activate + neighbor 2001:db8:1:202::2 activate + neighbor 2001:db8:1:203::2 activate + neighbor 2001:db8:1:204::2 activate + neighbor 2001:db8:1:205::2 activate + neighbor 2001:db8:1:206::2 activate + neighbor 2001:db8:1:207::2 activate + neighbor 2001:db8:1:208::2 activate + neighbor 2001:db8:1:209::2 activate + neighbor 2001:db8:1:210::2 activate + neighbor 2001:db8:1:211::2 activate + neighbor 2001:db8:1:212::2 activate + neighbor 2001:db8:1:213::2 activate + neighbor 2001:db8:1:214::2 activate + neighbor 2001:db8:1:215::2 activate + neighbor 2001:db8:1:216::2 activate + neighbor 2001:db8:1:217::2 activate + neighbor 2001:db8:1:218::2 activate + neighbor 2001:db8:1:219::2 activate + neighbor 2001:db8:1:220::2 activate + neighbor 2001:db8:1:221::2 activate + neighbor 2001:db8:1:222::2 activate + neighbor 2001:db8:1:223::2 activate + neighbor 2001:db8:1:224::2 activate + neighbor 2001:db8:1:225::2 activate + neighbor 2001:db8:1:226::2 activate + neighbor 2001:db8:1:227::2 activate + neighbor 2001:db8:1:228::2 activate + neighbor 2001:db8:1:229::2 activate + neighbor 2001:db8:1:230::2 activate + neighbor 2001:db8:1:231::2 activate + neighbor 2001:db8:1:232::2 activate + neighbor 2001:db8:1:233::2 activate + neighbor 2001:db8:1:234::2 activate + neighbor 2001:db8:1:235::2 activate + neighbor 2001:db8:1:236::2 activate + neighbor 2001:db8:1:237::2 activate + neighbor 2001:db8:1:238::2 activate + neighbor 2001:db8:1:239::2 activate + neighbor 2001:db8:1:240::2 activate + neighbor 2001:db8:1:241::2 activate + neighbor 2001:db8:1:242::2 activate + neighbor 2001:db8:1:243::2 activate + neighbor 2001:db8:1:244::2 activate + neighbor 2001:db8:1:245::2 activate + neighbor 2001:db8:1:246::2 activate + neighbor 2001:db8:1:247::2 activate + neighbor 2001:db8:1:248::2 activate + neighbor 2001:db8:1:249::2 activate + neighbor 2001:db8:1:250::2 activate + neighbor 2001:db8:1:251::2 activate + neighbor 2001:db8:1:252::2 activate + neighbor 2001:db8:1:253::2 activate + neighbor 2001:db8:1:254::2 activate + neighbor 2001:db8:1:255::2 activate + neighbor 2001:db8:2:1::2 activate + neighbor 2001:db8:2:2::2 activate + neighbor 2001:db8:2:3::2 activate + neighbor 2001:db8:2:4::2 activate + neighbor 2001:db8:2:5::2 activate + neighbor 2001:db8:2:6::2 activate + neighbor 2001:db8:2:7::2 activate + neighbor 2001:db8:2:8::2 activate + neighbor 2001:db8:2:9::2 activate + neighbor 2001:db8:2:10::2 activate + neighbor 2001:db8:2:11::2 activate + neighbor 2001:db8:2:12::2 activate + neighbor 2001:db8:2:13::2 activate + neighbor 2001:db8:2:14::2 activate + neighbor 2001:db8:2:15::2 activate + neighbor 2001:db8:2:16::2 activate + neighbor 2001:db8:2:17::2 activate + neighbor 2001:db8:2:18::2 activate + neighbor 2001:db8:2:19::2 activate + neighbor 2001:db8:2:20::2 activate + neighbor 2001:db8:2:21::2 activate + neighbor 2001:db8:2:22::2 activate + neighbor 2001:db8:2:23::2 activate + neighbor 2001:db8:2:24::2 activate + neighbor 2001:db8:2:25::2 activate + neighbor 2001:db8:2:26::2 activate + neighbor 2001:db8:2:27::2 activate + neighbor 2001:db8:2:28::2 activate + neighbor 2001:db8:2:29::2 activate + neighbor 2001:db8:2:30::2 activate + neighbor 2001:db8:2:31::2 activate + neighbor 2001:db8:2:32::2 activate + neighbor 2001:db8:2:33::2 activate + neighbor 2001:db8:2:34::2 activate + neighbor 2001:db8:2:35::2 activate + neighbor 2001:db8:2:36::2 activate + neighbor 2001:db8:2:37::2 activate + neighbor 2001:db8:2:38::2 activate + neighbor 2001:db8:2:39::2 activate + neighbor 2001:db8:2:40::2 activate + neighbor 2001:db8:2:41::2 activate + neighbor 2001:db8:2:42::2 activate + neighbor 2001:db8:2:43::2 activate + neighbor 2001:db8:2:44::2 activate + neighbor 2001:db8:2:45::2 activate + neighbor 2001:db8:2:46::2 activate + neighbor 2001:db8:2:47::2 activate + neighbor 2001:db8:2:48::2 activate + neighbor 2001:db8:2:49::2 activate + neighbor 2001:db8:2:50::2 activate + neighbor 2001:db8:2:51::2 activate + neighbor 2001:db8:2:52::2 activate + neighbor 2001:db8:2:53::2 activate + neighbor 2001:db8:2:54::2 activate + neighbor 2001:db8:2:55::2 activate + neighbor 2001:db8:2:56::2 activate + neighbor 2001:db8:2:57::2 activate + neighbor 2001:db8:2:58::2 activate + neighbor 2001:db8:2:59::2 activate + neighbor 2001:db8:2:60::2 activate + neighbor 2001:db8:2:61::2 activate + neighbor 2001:db8:2:62::2 activate + neighbor 2001:db8:2:63::2 activate + neighbor 2001:db8:2:64::2 activate + neighbor 2001:db8:2:65::2 activate + neighbor 2001:db8:2:66::2 activate + neighbor 2001:db8:2:67::2 activate + neighbor 2001:db8:2:68::2 activate + neighbor 2001:db8:2:69::2 activate + neighbor 2001:db8:2:70::2 activate + neighbor 2001:db8:2:71::2 activate + neighbor 2001:db8:2:72::2 activate + neighbor 2001:db8:2:73::2 activate + neighbor 2001:db8:2:74::2 activate + neighbor 2001:db8:2:75::2 activate + neighbor 2001:db8:2:76::2 activate + neighbor 2001:db8:2:77::2 activate + neighbor 2001:db8:2:78::2 activate + neighbor 2001:db8:2:79::2 activate + neighbor 2001:db8:2:80::2 activate + neighbor 2001:db8:2:81::2 activate + neighbor 2001:db8:2:82::2 activate + neighbor 2001:db8:2:83::2 activate + neighbor 2001:db8:2:84::2 activate + neighbor 2001:db8:2:85::2 activate + neighbor 2001:db8:2:86::2 activate + neighbor 2001:db8:2:87::2 activate + neighbor 2001:db8:2:88::2 activate + neighbor 2001:db8:2:89::2 activate + neighbor 2001:db8:2:90::2 activate + neighbor 2001:db8:2:91::2 activate + neighbor 2001:db8:2:92::2 activate + neighbor 2001:db8:2:93::2 activate + neighbor 2001:db8:2:94::2 activate + neighbor 2001:db8:2:95::2 activate + neighbor 2001:db8:2:96::2 activate + neighbor 2001:db8:2:97::2 activate + neighbor 2001:db8:2:98::2 activate + neighbor 2001:db8:2:99::2 activate + neighbor 2001:db8:2:100::2 activate + neighbor 2001:db8:2:101::2 activate + neighbor 2001:db8:2:102::2 activate + neighbor 2001:db8:2:103::2 activate + neighbor 2001:db8:2:104::2 activate + neighbor 2001:db8:2:105::2 activate + neighbor 2001:db8:2:106::2 activate + neighbor 2001:db8:2:107::2 activate + neighbor 2001:db8:2:108::2 activate + neighbor 2001:db8:2:109::2 activate + neighbor 2001:db8:2:110::2 activate + neighbor 2001:db8:2:111::2 activate + neighbor 2001:db8:2:112::2 activate + neighbor 2001:db8:2:113::2 activate + neighbor 2001:db8:2:114::2 activate + neighbor 2001:db8:2:115::2 activate + neighbor 2001:db8:2:116::2 activate + neighbor 2001:db8:2:117::2 activate + neighbor 2001:db8:2:118::2 activate + neighbor 2001:db8:2:119::2 activate + neighbor 2001:db8:2:120::2 activate + neighbor 2001:db8:2:121::2 activate + neighbor 2001:db8:2:122::2 activate + neighbor 2001:db8:2:123::2 activate + neighbor 2001:db8:2:124::2 activate + neighbor 2001:db8:2:125::2 activate + neighbor 2001:db8:2:126::2 activate + neighbor 2001:db8:2:127::2 activate + neighbor 2001:db8:2:128::2 activate + neighbor 2001:db8:2:129::2 activate + neighbor 2001:db8:2:130::2 activate + neighbor 2001:db8:2:131::2 activate + neighbor 2001:db8:2:132::2 activate + neighbor 2001:db8:2:133::2 activate + neighbor 2001:db8:2:134::2 activate + neighbor 2001:db8:2:135::2 activate + neighbor 2001:db8:2:136::2 activate + neighbor 2001:db8:2:137::2 activate + neighbor 2001:db8:2:138::2 activate + neighbor 2001:db8:2:139::2 activate + neighbor 2001:db8:2:140::2 activate + neighbor 2001:db8:2:141::2 activate + neighbor 2001:db8:2:142::2 activate + neighbor 2001:db8:2:143::2 activate + neighbor 2001:db8:2:144::2 activate + neighbor 2001:db8:2:145::2 activate + neighbor 2001:db8:2:146::2 activate + neighbor 2001:db8:2:147::2 activate + neighbor 2001:db8:2:148::2 activate + neighbor 2001:db8:2:149::2 activate + neighbor 2001:db8:2:150::2 activate + neighbor 2001:db8:2:151::2 activate + neighbor 2001:db8:2:152::2 activate + neighbor 2001:db8:2:153::2 activate + neighbor 2001:db8:2:154::2 activate + neighbor 2001:db8:2:155::2 activate + neighbor 2001:db8:2:156::2 activate + neighbor 2001:db8:2:157::2 activate + neighbor 2001:db8:2:158::2 activate + neighbor 2001:db8:2:159::2 activate + neighbor 2001:db8:2:160::2 activate + neighbor 2001:db8:2:161::2 activate + neighbor 2001:db8:2:162::2 activate + neighbor 2001:db8:2:163::2 activate + neighbor 2001:db8:2:164::2 activate + neighbor 2001:db8:2:165::2 activate + neighbor 2001:db8:2:166::2 activate + neighbor 2001:db8:2:167::2 activate + neighbor 2001:db8:2:168::2 activate + neighbor 2001:db8:2:169::2 activate + neighbor 2001:db8:2:170::2 activate + neighbor 2001:db8:2:171::2 activate + neighbor 2001:db8:2:172::2 activate + neighbor 2001:db8:2:173::2 activate + neighbor 2001:db8:2:174::2 activate + neighbor 2001:db8:2:175::2 activate + neighbor 2001:db8:2:176::2 activate + neighbor 2001:db8:2:177::2 activate + neighbor 2001:db8:2:178::2 activate + neighbor 2001:db8:2:179::2 activate + neighbor 2001:db8:2:180::2 activate + neighbor 2001:db8:2:181::2 activate + neighbor 2001:db8:2:182::2 activate + neighbor 2001:db8:2:183::2 activate + neighbor 2001:db8:2:184::2 activate + neighbor 2001:db8:2:185::2 activate + neighbor 2001:db8:2:186::2 activate + neighbor 2001:db8:2:187::2 activate + neighbor 2001:db8:2:188::2 activate + neighbor 2001:db8:2:189::2 activate + neighbor 2001:db8:2:190::2 activate + neighbor 2001:db8:2:191::2 activate + neighbor 2001:db8:2:192::2 activate + neighbor 2001:db8:2:193::2 activate + neighbor 2001:db8:2:194::2 activate + neighbor 2001:db8:2:195::2 activate + neighbor 2001:db8:2:196::2 activate + neighbor 2001:db8:2:197::2 activate + neighbor 2001:db8:2:198::2 activate + neighbor 2001:db8:2:199::2 activate + neighbor 2001:db8:2:200::2 activate + neighbor 2001:db8:2:201::2 activate + neighbor 2001:db8:2:202::2 activate + neighbor 2001:db8:2:203::2 activate + neighbor 2001:db8:2:204::2 activate + neighbor 2001:db8:2:205::2 activate + neighbor 2001:db8:2:206::2 activate + neighbor 2001:db8:2:207::2 activate + neighbor 2001:db8:2:208::2 activate + neighbor 2001:db8:2:209::2 activate + neighbor 2001:db8:2:210::2 activate + neighbor 2001:db8:2:211::2 activate + neighbor 2001:db8:2:212::2 activate + neighbor 2001:db8:2:213::2 activate + neighbor 2001:db8:2:214::2 activate + neighbor 2001:db8:2:215::2 activate + neighbor 2001:db8:2:216::2 activate + neighbor 2001:db8:2:217::2 activate + neighbor 2001:db8:2:218::2 activate + neighbor 2001:db8:2:219::2 activate + neighbor 2001:db8:2:220::2 activate + neighbor 2001:db8:2:221::2 activate + neighbor 2001:db8:2:222::2 activate + neighbor 2001:db8:2:223::2 activate + neighbor 2001:db8:2:224::2 activate + neighbor 2001:db8:2:225::2 activate + neighbor 2001:db8:2:226::2 activate + neighbor 2001:db8:2:227::2 activate + neighbor 2001:db8:2:228::2 activate + neighbor 2001:db8:2:229::2 activate + neighbor 2001:db8:2:230::2 activate + neighbor 2001:db8:2:231::2 activate + neighbor 2001:db8:2:232::2 activate + neighbor 2001:db8:2:233::2 activate + neighbor 2001:db8:2:234::2 activate + neighbor 2001:db8:2:235::2 activate + neighbor 2001:db8:2:236::2 activate + neighbor 2001:db8:2:237::2 activate + neighbor 2001:db8:2:238::2 activate + neighbor 2001:db8:2:239::2 activate + neighbor 2001:db8:2:240::2 activate + neighbor 2001:db8:2:241::2 activate + neighbor 2001:db8:2:242::2 activate + neighbor 2001:db8:2:243::2 activate + neighbor 2001:db8:2:244::2 activate + neighbor 2001:db8:2:245::2 activate + neighbor 2001:db8:2:246::2 activate + neighbor 2001:db8:2:247::2 activate + neighbor 2001:db8:2:248::2 activate + neighbor 2001:db8:2:249::2 activate + neighbor 2001:db8:2:250::2 activate + neighbor 2001:db8:2:251::2 activate + neighbor 2001:db8:2:252::2 activate + neighbor 2001:db8:2:253::2 activate + neighbor 2001:db8:2:254::2 activate + neighbor 2001:db8:2:255::2 activate + neighbor 2001:db8:3:1::2 activate + neighbor 2001:db8:3:2::2 activate + neighbor 2001:db8:3:3::2 activate + neighbor 2001:db8:3:4::2 activate + exit-address-family + + exit diff --git a/tests/topotests/high_ecmp/r1/frr_unnumbered_bgp.conf b/tests/topotests/high_ecmp/r1/frr_unnumbered_bgp.conf new file mode 100644 index 0000000000..7985fe6e99 --- /dev/null +++ b/tests/topotests/high_ecmp/r1/frr_unnumbered_bgp.conf @@ -0,0 +1,522 @@ +router bgp 1001 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor r1-eth0 interface remote-as external + neighbor r1-eth1 interface remote-as external + neighbor r1-eth2 interface remote-as external + neighbor r1-eth3 interface remote-as external + neighbor r1-eth4 interface remote-as external + neighbor r1-eth5 interface remote-as external + neighbor r1-eth6 interface remote-as external + neighbor r1-eth7 interface remote-as external + neighbor r1-eth8 interface remote-as external + neighbor r1-eth9 interface remote-as external + neighbor r1-eth10 interface remote-as external + neighbor r1-eth11 interface remote-as external + neighbor r1-eth12 interface remote-as external + neighbor r1-eth13 interface remote-as external + neighbor r1-eth14 interface remote-as external + neighbor r1-eth15 interface remote-as external + neighbor r1-eth16 interface remote-as external + neighbor r1-eth17 interface remote-as external + neighbor r1-eth18 interface remote-as external + neighbor r1-eth19 interface remote-as external + neighbor r1-eth20 interface remote-as external + neighbor r1-eth21 interface remote-as external + neighbor r1-eth22 interface remote-as external + neighbor r1-eth23 interface remote-as external + neighbor r1-eth24 interface remote-as external + neighbor r1-eth25 interface remote-as external + neighbor r1-eth26 interface remote-as external + neighbor r1-eth27 interface remote-as external + neighbor r1-eth28 interface remote-as external + neighbor r1-eth29 interface remote-as external + neighbor r1-eth30 interface remote-as external + neighbor r1-eth31 interface remote-as external + neighbor r1-eth32 interface remote-as external + neighbor r1-eth33 interface remote-as external + neighbor r1-eth34 interface remote-as external + neighbor r1-eth35 interface remote-as external + neighbor r1-eth36 interface remote-as external + neighbor r1-eth37 interface remote-as external + neighbor r1-eth38 interface remote-as external + neighbor r1-eth39 interface remote-as external + neighbor r1-eth40 interface remote-as external + neighbor r1-eth41 interface remote-as external + neighbor r1-eth42 interface remote-as external + neighbor r1-eth43 interface remote-as external + neighbor r1-eth44 interface remote-as external + neighbor r1-eth45 interface remote-as external + neighbor r1-eth46 interface remote-as external + neighbor r1-eth47 interface remote-as external + neighbor r1-eth48 interface remote-as external + neighbor r1-eth49 interface remote-as external + neighbor r1-eth50 interface remote-as external + neighbor r1-eth51 interface remote-as external + neighbor r1-eth52 interface remote-as external + neighbor r1-eth53 interface remote-as external + neighbor r1-eth54 interface remote-as external + neighbor r1-eth55 interface remote-as external + neighbor r1-eth56 interface remote-as external + neighbor r1-eth57 interface remote-as external + neighbor r1-eth58 interface remote-as external + neighbor r1-eth59 interface remote-as external + neighbor r1-eth60 interface remote-as external + neighbor r1-eth61 interface remote-as external + neighbor r1-eth62 interface remote-as external + neighbor r1-eth63 interface remote-as external + neighbor r1-eth64 interface remote-as external + neighbor r1-eth65 interface remote-as external + neighbor r1-eth66 interface remote-as external + neighbor r1-eth67 interface remote-as external + neighbor r1-eth68 interface remote-as external + neighbor r1-eth69 interface remote-as external + neighbor r1-eth70 interface remote-as external + neighbor r1-eth71 interface remote-as external + neighbor r1-eth72 interface remote-as external + neighbor r1-eth73 interface remote-as external + neighbor r1-eth74 interface remote-as external + neighbor r1-eth75 interface remote-as external + neighbor r1-eth76 interface remote-as external + neighbor r1-eth77 interface remote-as external + neighbor r1-eth78 interface remote-as external + neighbor r1-eth79 interface remote-as external + neighbor r1-eth80 interface remote-as external + neighbor r1-eth81 interface remote-as external + neighbor r1-eth82 interface remote-as external + neighbor r1-eth83 interface remote-as external + neighbor r1-eth84 interface remote-as external + neighbor r1-eth85 interface remote-as external + neighbor r1-eth86 interface remote-as external + neighbor r1-eth87 interface remote-as external + neighbor r1-eth88 interface remote-as external + neighbor r1-eth89 interface remote-as external + neighbor r1-eth90 interface remote-as external + neighbor r1-eth91 interface remote-as external + neighbor r1-eth92 interface remote-as external + neighbor r1-eth93 interface remote-as external + neighbor r1-eth94 interface remote-as external + neighbor r1-eth95 interface remote-as external + neighbor r1-eth96 interface remote-as external + neighbor r1-eth97 interface remote-as external + neighbor r1-eth98 interface remote-as external + neighbor r1-eth99 interface remote-as external + neighbor r1-eth100 interface remote-as external + neighbor r1-eth101 interface remote-as external + neighbor r1-eth102 interface remote-as external + neighbor r1-eth103 interface remote-as external + neighbor r1-eth104 interface remote-as external + neighbor r1-eth105 interface remote-as external + neighbor r1-eth106 interface remote-as external + neighbor r1-eth107 interface remote-as external + neighbor r1-eth108 interface remote-as external + neighbor r1-eth109 interface remote-as external + neighbor r1-eth110 interface remote-as external + neighbor r1-eth111 interface remote-as external + neighbor r1-eth112 interface remote-as external + neighbor r1-eth113 interface remote-as external + neighbor r1-eth114 interface remote-as external + neighbor r1-eth115 interface remote-as external + neighbor r1-eth116 interface remote-as external + neighbor r1-eth117 interface remote-as external + neighbor r1-eth118 interface remote-as external + neighbor r1-eth119 interface remote-as external + neighbor r1-eth120 interface remote-as external + neighbor r1-eth121 interface remote-as external + neighbor r1-eth122 interface remote-as external + neighbor r1-eth123 interface remote-as external + neighbor r1-eth124 interface remote-as external + neighbor r1-eth125 interface remote-as external + neighbor r1-eth126 interface remote-as external + neighbor r1-eth127 interface remote-as external + neighbor r1-eth128 interface remote-as external + neighbor r1-eth129 interface remote-as external + neighbor r1-eth130 interface remote-as external + neighbor r1-eth131 interface remote-as external + neighbor r1-eth132 interface remote-as external + neighbor r1-eth133 interface remote-as external + neighbor r1-eth134 interface remote-as external + neighbor r1-eth135 interface remote-as external + neighbor r1-eth136 interface remote-as external + neighbor r1-eth137 interface remote-as external + neighbor r1-eth138 interface remote-as external + neighbor r1-eth139 interface remote-as external + neighbor r1-eth140 interface remote-as external + neighbor r1-eth141 interface remote-as external + neighbor r1-eth142 interface remote-as external + neighbor r1-eth143 interface remote-as external + neighbor r1-eth144 interface remote-as external + neighbor r1-eth145 interface remote-as external + neighbor r1-eth146 interface remote-as external + neighbor r1-eth147 interface remote-as external + neighbor r1-eth148 interface remote-as external + neighbor r1-eth149 interface remote-as external + neighbor r1-eth150 interface remote-as external + neighbor r1-eth151 interface remote-as external + neighbor r1-eth152 interface remote-as external + neighbor r1-eth153 interface remote-as external + neighbor r1-eth154 interface remote-as external + neighbor r1-eth155 interface remote-as external + neighbor r1-eth156 interface remote-as external + neighbor r1-eth157 interface remote-as external + neighbor r1-eth158 interface remote-as external + neighbor r1-eth159 interface remote-as external + neighbor r1-eth160 interface remote-as external + neighbor r1-eth161 interface remote-as external + neighbor r1-eth162 interface remote-as external + neighbor r1-eth163 interface remote-as external + neighbor r1-eth164 interface remote-as external + neighbor r1-eth165 interface remote-as external + neighbor r1-eth166 interface remote-as external + neighbor r1-eth167 interface remote-as external + neighbor r1-eth168 interface remote-as external + neighbor r1-eth169 interface remote-as external + neighbor r1-eth170 interface remote-as external + neighbor r1-eth171 interface remote-as external + neighbor r1-eth172 interface remote-as external + neighbor r1-eth173 interface remote-as external + neighbor r1-eth174 interface remote-as external + neighbor r1-eth175 interface remote-as external + neighbor r1-eth176 interface remote-as external + neighbor r1-eth177 interface remote-as external + neighbor r1-eth178 interface remote-as external + neighbor r1-eth179 interface remote-as external + neighbor r1-eth180 interface remote-as external + neighbor r1-eth181 interface remote-as external + neighbor r1-eth182 interface remote-as external + neighbor r1-eth183 interface remote-as external + neighbor r1-eth184 interface remote-as external + neighbor r1-eth185 interface remote-as external + neighbor r1-eth186 interface remote-as external + neighbor r1-eth187 interface remote-as external + neighbor r1-eth188 interface remote-as external + neighbor r1-eth189 interface remote-as external + neighbor r1-eth190 interface remote-as external + neighbor r1-eth191 interface remote-as external + neighbor r1-eth192 interface remote-as external + neighbor r1-eth193 interface remote-as external + neighbor r1-eth194 interface remote-as external + neighbor r1-eth195 interface remote-as external + neighbor r1-eth196 interface remote-as external + neighbor r1-eth197 interface remote-as external + neighbor r1-eth198 interface remote-as external + neighbor r1-eth199 interface remote-as external + neighbor r1-eth200 interface remote-as external + neighbor r1-eth201 interface remote-as external + neighbor r1-eth202 interface remote-as external + neighbor r1-eth203 interface remote-as external + neighbor r1-eth204 interface remote-as external + neighbor r1-eth205 interface remote-as external + neighbor r1-eth206 interface remote-as external + neighbor r1-eth207 interface remote-as external + neighbor r1-eth208 interface remote-as external + neighbor r1-eth209 interface remote-as external + neighbor r1-eth210 interface remote-as external + neighbor r1-eth211 interface remote-as external + neighbor r1-eth212 interface remote-as external + neighbor r1-eth213 interface remote-as external + neighbor r1-eth214 interface remote-as external + neighbor r1-eth215 interface remote-as external + neighbor r1-eth216 interface remote-as external + neighbor r1-eth217 interface remote-as external + neighbor r1-eth218 interface remote-as external + neighbor r1-eth219 interface remote-as external + neighbor r1-eth220 interface remote-as external + neighbor r1-eth221 interface remote-as external + neighbor r1-eth222 interface remote-as external + neighbor r1-eth223 interface remote-as external + neighbor r1-eth224 interface remote-as external + neighbor r1-eth225 interface remote-as external + neighbor r1-eth226 interface remote-as external + neighbor r1-eth227 interface remote-as external + neighbor r1-eth228 interface remote-as external + neighbor r1-eth229 interface remote-as external + neighbor r1-eth230 interface remote-as external + neighbor r1-eth231 interface remote-as external + neighbor r1-eth232 interface remote-as external + neighbor r1-eth233 interface remote-as external + neighbor r1-eth234 interface remote-as external + neighbor r1-eth235 interface remote-as external + neighbor r1-eth236 interface remote-as external + neighbor r1-eth237 interface remote-as external + neighbor r1-eth238 interface remote-as external + neighbor r1-eth239 interface remote-as external + neighbor r1-eth240 interface remote-as external + neighbor r1-eth241 interface remote-as external + neighbor r1-eth242 interface remote-as external + neighbor r1-eth243 interface remote-as external + neighbor r1-eth244 interface remote-as external + neighbor r1-eth245 interface remote-as external + neighbor r1-eth246 interface remote-as external + neighbor r1-eth247 interface remote-as external + neighbor r1-eth248 interface remote-as external + neighbor r1-eth249 interface remote-as external + neighbor r1-eth250 interface remote-as external + neighbor r1-eth251 interface remote-as external + neighbor r1-eth252 interface remote-as external + neighbor r1-eth253 interface remote-as external + neighbor r1-eth254 interface remote-as external + neighbor r1-eth255 interface remote-as external + neighbor r1-eth256 interface remote-as external + neighbor r1-eth257 interface remote-as external + neighbor r1-eth258 interface remote-as external + neighbor r1-eth259 interface remote-as external + neighbor r1-eth260 interface remote-as external + neighbor r1-eth261 interface remote-as external + neighbor r1-eth262 interface remote-as external + neighbor r1-eth263 interface remote-as external + neighbor r1-eth264 interface remote-as external + neighbor r1-eth265 interface remote-as external + neighbor r1-eth266 interface remote-as external + neighbor r1-eth267 interface remote-as external + neighbor r1-eth268 interface remote-as external + neighbor r1-eth269 interface remote-as external + neighbor r1-eth270 interface remote-as external + neighbor r1-eth271 interface remote-as external + neighbor r1-eth272 interface remote-as external + neighbor r1-eth273 interface remote-as external + neighbor r1-eth274 interface remote-as external + neighbor r1-eth275 interface remote-as external + neighbor r1-eth276 interface remote-as external + neighbor r1-eth277 interface remote-as external + neighbor r1-eth278 interface remote-as external + neighbor r1-eth279 interface remote-as external + neighbor r1-eth280 interface remote-as external + neighbor r1-eth281 interface remote-as external + neighbor r1-eth282 interface remote-as external + neighbor r1-eth283 interface remote-as external + neighbor r1-eth284 interface remote-as external + neighbor r1-eth285 interface remote-as external + neighbor r1-eth286 interface remote-as external + neighbor r1-eth287 interface remote-as external + neighbor r1-eth288 interface remote-as external + neighbor r1-eth289 interface remote-as external + neighbor r1-eth290 interface remote-as external + neighbor r1-eth291 interface remote-as external + neighbor r1-eth292 interface remote-as external + neighbor r1-eth293 interface remote-as external + neighbor r1-eth294 interface remote-as external + neighbor r1-eth295 interface remote-as external + neighbor r1-eth296 interface remote-as external + neighbor r1-eth297 interface remote-as external + neighbor r1-eth298 interface remote-as external + neighbor r1-eth299 interface remote-as external + neighbor r1-eth300 interface remote-as external + neighbor r1-eth301 interface remote-as external + neighbor r1-eth302 interface remote-as external + neighbor r1-eth303 interface remote-as external + neighbor r1-eth304 interface remote-as external + neighbor r1-eth305 interface remote-as external + neighbor r1-eth306 interface remote-as external + neighbor r1-eth307 interface remote-as external + neighbor r1-eth308 interface remote-as external + neighbor r1-eth309 interface remote-as external + neighbor r1-eth310 interface remote-as external + neighbor r1-eth311 interface remote-as external + neighbor r1-eth312 interface remote-as external + neighbor r1-eth313 interface remote-as external + neighbor r1-eth314 interface remote-as external + neighbor r1-eth315 interface remote-as external + neighbor r1-eth316 interface remote-as external + neighbor r1-eth317 interface remote-as external + neighbor r1-eth318 interface remote-as external + neighbor r1-eth319 interface remote-as external + neighbor r1-eth320 interface remote-as external + neighbor r1-eth321 interface remote-as external + neighbor r1-eth322 interface remote-as external + neighbor r1-eth323 interface remote-as external + neighbor r1-eth324 interface remote-as external + neighbor r1-eth325 interface remote-as external + neighbor r1-eth326 interface remote-as external + neighbor r1-eth327 interface remote-as external + neighbor r1-eth328 interface remote-as external + neighbor r1-eth329 interface remote-as external + neighbor r1-eth330 interface remote-as external + neighbor r1-eth331 interface remote-as external + neighbor r1-eth332 interface remote-as external + neighbor r1-eth333 interface remote-as external + neighbor r1-eth334 interface remote-as external + neighbor r1-eth335 interface remote-as external + neighbor r1-eth336 interface remote-as external + neighbor r1-eth337 interface remote-as external + neighbor r1-eth338 interface remote-as external + neighbor r1-eth339 interface remote-as external + neighbor r1-eth340 interface remote-as external + neighbor r1-eth341 interface remote-as external + neighbor r1-eth342 interface remote-as external + neighbor r1-eth343 interface remote-as external + neighbor r1-eth344 interface remote-as external + neighbor r1-eth345 interface remote-as external + neighbor r1-eth346 interface remote-as external + neighbor r1-eth347 interface remote-as external + neighbor r1-eth348 interface remote-as external + neighbor r1-eth349 interface remote-as external + neighbor r1-eth350 interface remote-as external + neighbor r1-eth351 interface remote-as external + neighbor r1-eth352 interface remote-as external + neighbor r1-eth353 interface remote-as external + neighbor r1-eth354 interface remote-as external + neighbor r1-eth355 interface remote-as external + neighbor r1-eth356 interface remote-as external + neighbor r1-eth357 interface remote-as external + neighbor r1-eth358 interface remote-as external + neighbor r1-eth359 interface remote-as external + neighbor r1-eth360 interface remote-as external + neighbor r1-eth361 interface remote-as external + neighbor r1-eth362 interface remote-as external + neighbor r1-eth363 interface remote-as external + neighbor r1-eth364 interface remote-as external + neighbor r1-eth365 interface remote-as external + neighbor r1-eth366 interface remote-as external + neighbor r1-eth367 interface remote-as external + neighbor r1-eth368 interface remote-as external + neighbor r1-eth369 interface remote-as external + neighbor r1-eth370 interface remote-as external + neighbor r1-eth371 interface remote-as external + neighbor r1-eth372 interface remote-as external + neighbor r1-eth373 interface remote-as external + neighbor r1-eth374 interface remote-as external + neighbor r1-eth375 interface remote-as external + neighbor r1-eth376 interface remote-as external + neighbor r1-eth377 interface remote-as external + neighbor r1-eth378 interface remote-as external + neighbor r1-eth379 interface remote-as external + neighbor r1-eth380 interface remote-as external + neighbor r1-eth381 interface remote-as external + neighbor r1-eth382 interface remote-as external + neighbor r1-eth383 interface remote-as external + neighbor r1-eth384 interface remote-as external + neighbor r1-eth385 interface remote-as external + neighbor r1-eth386 interface remote-as external + neighbor r1-eth387 interface remote-as external + neighbor r1-eth388 interface remote-as external + neighbor r1-eth389 interface remote-as external + neighbor r1-eth390 interface remote-as external + neighbor r1-eth391 interface remote-as external + neighbor r1-eth392 interface remote-as external + neighbor r1-eth393 interface remote-as external + neighbor r1-eth394 interface remote-as external + neighbor r1-eth395 interface remote-as external + neighbor r1-eth396 interface remote-as external + neighbor r1-eth397 interface remote-as external + neighbor r1-eth398 interface remote-as external + neighbor r1-eth399 interface remote-as external + neighbor r1-eth400 interface remote-as external + neighbor r1-eth401 interface remote-as external + neighbor r1-eth402 interface remote-as external + neighbor r1-eth403 interface remote-as external + neighbor r1-eth404 interface remote-as external + neighbor r1-eth405 interface remote-as external + neighbor r1-eth406 interface remote-as external + neighbor r1-eth407 interface remote-as external + neighbor r1-eth408 interface remote-as external + neighbor r1-eth409 interface remote-as external + neighbor r1-eth410 interface remote-as external + neighbor r1-eth411 interface remote-as external + neighbor r1-eth412 interface remote-as external + neighbor r1-eth413 interface remote-as external + neighbor r1-eth414 interface remote-as external + neighbor r1-eth415 interface remote-as external + neighbor r1-eth416 interface remote-as external + neighbor r1-eth417 interface remote-as external + neighbor r1-eth418 interface remote-as external + neighbor r1-eth419 interface remote-as external + neighbor r1-eth420 interface remote-as external + neighbor r1-eth421 interface remote-as external + neighbor r1-eth422 interface remote-as external + neighbor r1-eth423 interface remote-as external + neighbor r1-eth424 interface remote-as external + neighbor r1-eth425 interface remote-as external + neighbor r1-eth426 interface remote-as external + neighbor r1-eth427 interface remote-as external + neighbor r1-eth428 interface remote-as external + neighbor r1-eth429 interface remote-as external + neighbor r1-eth430 interface remote-as external + neighbor r1-eth431 interface remote-as external + neighbor r1-eth432 interface remote-as external + neighbor r1-eth433 interface remote-as external + neighbor r1-eth434 interface remote-as external + neighbor r1-eth435 interface remote-as external + neighbor r1-eth436 interface remote-as external + neighbor r1-eth437 interface remote-as external + neighbor r1-eth438 interface remote-as external + neighbor r1-eth439 interface remote-as external + neighbor r1-eth440 interface remote-as external + neighbor r1-eth441 interface remote-as external + neighbor r1-eth442 interface remote-as external + neighbor r1-eth443 interface remote-as external + neighbor r1-eth444 interface remote-as external + neighbor r1-eth445 interface remote-as external + neighbor r1-eth446 interface remote-as external + neighbor r1-eth447 interface remote-as external + neighbor r1-eth448 interface remote-as external + neighbor r1-eth449 interface remote-as external + neighbor r1-eth450 interface remote-as external + neighbor r1-eth451 interface remote-as external + neighbor r1-eth452 interface remote-as external + neighbor r1-eth453 interface remote-as external + neighbor r1-eth454 interface remote-as external + neighbor r1-eth455 interface remote-as external + neighbor r1-eth456 interface remote-as external + neighbor r1-eth457 interface remote-as external + neighbor r1-eth458 interface remote-as external + neighbor r1-eth459 interface remote-as external + neighbor r1-eth460 interface remote-as external + neighbor r1-eth461 interface remote-as external + neighbor r1-eth462 interface remote-as external + neighbor r1-eth463 interface remote-as external + neighbor r1-eth464 interface remote-as external + neighbor r1-eth465 interface remote-as external + neighbor r1-eth466 interface remote-as external + neighbor r1-eth467 interface remote-as external + neighbor r1-eth468 interface remote-as external + neighbor r1-eth469 interface remote-as external + neighbor r1-eth470 interface remote-as external + neighbor r1-eth471 interface remote-as external + neighbor r1-eth472 interface remote-as external + neighbor r1-eth473 interface remote-as external + neighbor r1-eth474 interface remote-as external + neighbor r1-eth475 interface remote-as external + neighbor r1-eth476 interface remote-as external + neighbor r1-eth477 interface remote-as external + neighbor r1-eth478 interface remote-as external + neighbor r1-eth479 interface remote-as external + neighbor r1-eth480 interface remote-as external + neighbor r1-eth481 interface remote-as external + neighbor r1-eth482 interface remote-as external + neighbor r1-eth483 interface remote-as external + neighbor r1-eth484 interface remote-as external + neighbor r1-eth485 interface remote-as external + neighbor r1-eth486 interface remote-as external + neighbor r1-eth487 interface remote-as external + neighbor r1-eth488 interface remote-as external + neighbor r1-eth489 interface remote-as external + neighbor r1-eth490 interface remote-as external + neighbor r1-eth491 interface remote-as external + neighbor r1-eth492 interface remote-as external + neighbor r1-eth493 interface remote-as external + neighbor r1-eth494 interface remote-as external + neighbor r1-eth495 interface remote-as external + neighbor r1-eth496 interface remote-as external + neighbor r1-eth497 interface remote-as external + neighbor r1-eth498 interface remote-as external + neighbor r1-eth499 interface remote-as external + neighbor r1-eth500 interface remote-as external + neighbor r1-eth501 interface remote-as external + neighbor r1-eth502 interface remote-as external + neighbor r1-eth503 interface remote-as external + neighbor r1-eth504 interface remote-as external + neighbor r1-eth505 interface remote-as external + neighbor r1-eth506 interface remote-as external + neighbor r1-eth507 interface remote-as external + neighbor r1-eth508 interface remote-as external + neighbor r1-eth509 interface remote-as external + neighbor r1-eth510 interface remote-as external + neighbor r1-eth511 interface remote-as external + neighbor r1-eth512 interface remote-as external + neighbor r1-eth513 interface remote-as external + neighbor r1-eth514 interface remote-as external + + address-family ipv4 uni + redistribute sharp diff --git a/tests/topotests/high_ecmp/r2/frr.conf b/tests/topotests/high_ecmp/r2/frr.conf index a9d65360f5..1dfa8cc02c 100644 --- a/tests/topotests/high_ecmp/r2/frr.conf +++ b/tests/topotests/high_ecmp/r2/frr.conf @@ -1,267 +1,2575 @@ int lo ip addr 192.168.1.2/32 + ipv6 address 2001:db8::2/128 ! -router bgp 1002 - timers bgp 5 20 - no bgp ebgp-requires-policy - read-quanta 1 - neighbor r2-eth0 interface remote-as external - neighbor r2-eth1 interface remote-as external - neighbor r2-eth2 interface remote-as external - neighbor r2-eth3 interface remote-as external - neighbor r2-eth4 interface remote-as external - neighbor r2-eth5 interface remote-as external - neighbor r2-eth6 interface remote-as external - neighbor r2-eth7 interface remote-as external - neighbor r2-eth8 interface remote-as external - neighbor r2-eth9 interface remote-as external - neighbor r2-eth10 interface remote-as external - neighbor r2-eth11 interface remote-as external - neighbor r2-eth12 interface remote-as external - neighbor r2-eth13 interface remote-as external - neighbor r2-eth14 interface remote-as external - neighbor r2-eth15 interface remote-as external - neighbor r2-eth16 interface remote-as external - neighbor r2-eth17 interface remote-as external - neighbor r2-eth18 interface remote-as external - neighbor r2-eth19 interface remote-as external - neighbor r2-eth20 interface remote-as external - neighbor r2-eth21 interface remote-as external - neighbor r2-eth22 interface remote-as external - neighbor r2-eth23 interface remote-as external - neighbor r2-eth24 interface remote-as external - neighbor r2-eth25 interface remote-as external - neighbor r2-eth26 interface remote-as external - neighbor r2-eth27 interface remote-as external - neighbor r2-eth28 interface remote-as external - neighbor r2-eth29 interface remote-as external - neighbor r2-eth30 interface remote-as external - neighbor r2-eth31 interface remote-as external - neighbor r2-eth32 interface remote-as external - neighbor r2-eth33 interface remote-as external - neighbor r2-eth34 interface remote-as external - neighbor r2-eth35 interface remote-as external - neighbor r2-eth36 interface remote-as external - neighbor r2-eth37 interface remote-as external - neighbor r2-eth38 interface remote-as external - neighbor r2-eth39 interface remote-as external - neighbor r2-eth40 interface remote-as external - neighbor r2-eth41 interface remote-as external - neighbor r2-eth42 interface remote-as external - neighbor r2-eth43 interface remote-as external - neighbor r2-eth44 interface remote-as external - neighbor r2-eth45 interface remote-as external - neighbor r2-eth46 interface remote-as external - neighbor r2-eth47 interface remote-as external - neighbor r2-eth48 interface remote-as external - neighbor r2-eth49 interface remote-as external - neighbor r2-eth50 interface remote-as external - neighbor r2-eth51 interface remote-as external - neighbor r2-eth52 interface remote-as external - neighbor r2-eth53 interface remote-as external - neighbor r2-eth54 interface remote-as external - neighbor r2-eth55 interface remote-as external - neighbor r2-eth56 interface remote-as external - neighbor r2-eth57 interface remote-as external - neighbor r2-eth58 interface remote-as external - neighbor r2-eth59 interface remote-as external - neighbor r2-eth60 interface remote-as external - neighbor r2-eth61 interface remote-as external - neighbor r2-eth62 interface remote-as external - neighbor r2-eth63 interface remote-as external - neighbor r2-eth64 interface remote-as external - neighbor r2-eth65 interface remote-as external - neighbor r2-eth66 interface remote-as external - neighbor r2-eth67 interface remote-as external - neighbor r2-eth68 interface remote-as external - neighbor r2-eth69 interface remote-as external - neighbor r2-eth70 interface remote-as external - neighbor r2-eth71 interface remote-as external - neighbor r2-eth72 interface remote-as external - neighbor r2-eth73 interface remote-as external - neighbor r2-eth74 interface remote-as external - neighbor r2-eth75 interface remote-as external - neighbor r2-eth76 interface remote-as external - neighbor r2-eth77 interface remote-as external - neighbor r2-eth78 interface remote-as external - neighbor r2-eth79 interface remote-as external - neighbor r2-eth80 interface remote-as external - neighbor r2-eth81 interface remote-as external - neighbor r2-eth82 interface remote-as external - neighbor r2-eth83 interface remote-as external - neighbor r2-eth84 interface remote-as external - neighbor r2-eth85 interface remote-as external - neighbor r2-eth86 interface remote-as external - neighbor r2-eth87 interface remote-as external - neighbor r2-eth88 interface remote-as external - neighbor r2-eth89 interface remote-as external - neighbor r2-eth90 interface remote-as external - neighbor r2-eth91 interface remote-as external - neighbor r2-eth92 interface remote-as external - neighbor r2-eth93 interface remote-as external - neighbor r2-eth94 interface remote-as external - neighbor r2-eth95 interface remote-as external - neighbor r2-eth96 interface remote-as external - neighbor r2-eth97 interface remote-as external - neighbor r2-eth98 interface remote-as external - neighbor r2-eth99 interface remote-as external - neighbor r2-eth100 interface remote-as external - neighbor r2-eth101 interface remote-as external - neighbor r2-eth102 interface remote-as external - neighbor r2-eth103 interface remote-as external - neighbor r2-eth104 interface remote-as external - neighbor r2-eth105 interface remote-as external - neighbor r2-eth106 interface remote-as external - neighbor r2-eth107 interface remote-as external - neighbor r2-eth108 interface remote-as external - neighbor r2-eth109 interface remote-as external - neighbor r2-eth110 interface remote-as external - neighbor r2-eth111 interface remote-as external - neighbor r2-eth112 interface remote-as external - neighbor r2-eth113 interface remote-as external - neighbor r2-eth114 interface remote-as external - neighbor r2-eth115 interface remote-as external - neighbor r2-eth116 interface remote-as external - neighbor r2-eth117 interface remote-as external - neighbor r2-eth118 interface remote-as external - neighbor r2-eth119 interface remote-as external - neighbor r2-eth120 interface remote-as external - neighbor r2-eth121 interface remote-as external - neighbor r2-eth122 interface remote-as external - neighbor r2-eth123 interface remote-as external - neighbor r2-eth124 interface remote-as external - neighbor r2-eth125 interface remote-as external - neighbor r2-eth126 interface remote-as external - neighbor r2-eth127 interface remote-as external - neighbor r2-eth128 interface remote-as external - neighbor r2-eth129 interface remote-as external - neighbor r2-eth130 interface remote-as external - neighbor r2-eth131 interface remote-as external - neighbor r2-eth132 interface remote-as external - neighbor r2-eth133 interface remote-as external - neighbor r2-eth134 interface remote-as external - neighbor r2-eth135 interface remote-as external - neighbor r2-eth136 interface remote-as external - neighbor r2-eth137 interface remote-as external - neighbor r2-eth138 interface remote-as external - neighbor r2-eth139 interface remote-as external - neighbor r2-eth140 interface remote-as external - neighbor r2-eth141 interface remote-as external - neighbor r2-eth142 interface remote-as external - neighbor r2-eth143 interface remote-as external - neighbor r2-eth144 interface remote-as external - neighbor r2-eth145 interface remote-as external - neighbor r2-eth146 interface remote-as external - neighbor r2-eth147 interface remote-as external - neighbor r2-eth148 interface remote-as external - neighbor r2-eth149 interface remote-as external - neighbor r2-eth150 interface remote-as external - neighbor r2-eth151 interface remote-as external - neighbor r2-eth152 interface remote-as external - neighbor r2-eth153 interface remote-as external - neighbor r2-eth154 interface remote-as external - neighbor r2-eth155 interface remote-as external - neighbor r2-eth156 interface remote-as external - neighbor r2-eth157 interface remote-as external - neighbor r2-eth158 interface remote-as external - neighbor r2-eth159 interface remote-as external - neighbor r2-eth160 interface remote-as external - neighbor r2-eth161 interface remote-as external - neighbor r2-eth162 interface remote-as external - neighbor r2-eth163 interface remote-as external - neighbor r2-eth164 interface remote-as external - neighbor r2-eth165 interface remote-as external - neighbor r2-eth166 interface remote-as external - neighbor r2-eth167 interface remote-as external - neighbor r2-eth168 interface remote-as external - neighbor r2-eth169 interface remote-as external - neighbor r2-eth170 interface remote-as external - neighbor r2-eth171 interface remote-as external - neighbor r2-eth172 interface remote-as external - neighbor r2-eth173 interface remote-as external - neighbor r2-eth174 interface remote-as external - neighbor r2-eth175 interface remote-as external - neighbor r2-eth176 interface remote-as external - neighbor r2-eth177 interface remote-as external - neighbor r2-eth178 interface remote-as external - neighbor r2-eth179 interface remote-as external - neighbor r2-eth180 interface remote-as external - neighbor r2-eth181 interface remote-as external - neighbor r2-eth182 interface remote-as external - neighbor r2-eth183 interface remote-as external - neighbor r2-eth184 interface remote-as external - neighbor r2-eth185 interface remote-as external - neighbor r2-eth186 interface remote-as external - neighbor r2-eth187 interface remote-as external - neighbor r2-eth188 interface remote-as external - neighbor r2-eth189 interface remote-as external - neighbor r2-eth190 interface remote-as external - neighbor r2-eth191 interface remote-as external - neighbor r2-eth192 interface remote-as external - neighbor r2-eth193 interface remote-as external - neighbor r2-eth194 interface remote-as external - neighbor r2-eth195 interface remote-as external - neighbor r2-eth196 interface remote-as external - neighbor r2-eth197 interface remote-as external - neighbor r2-eth198 interface remote-as external - neighbor r2-eth199 interface remote-as external - neighbor r2-eth200 interface remote-as external - neighbor r2-eth201 interface remote-as external - neighbor r2-eth202 interface remote-as external - neighbor r2-eth203 interface remote-as external - neighbor r2-eth204 interface remote-as external - neighbor r2-eth205 interface remote-as external - neighbor r2-eth206 interface remote-as external - neighbor r2-eth207 interface remote-as external - neighbor r2-eth208 interface remote-as external - neighbor r2-eth209 interface remote-as external - neighbor r2-eth210 interface remote-as external - neighbor r2-eth211 interface remote-as external - neighbor r2-eth212 interface remote-as external - neighbor r2-eth213 interface remote-as external - neighbor r2-eth214 interface remote-as external - neighbor r2-eth215 interface remote-as external - neighbor r2-eth216 interface remote-as external - neighbor r2-eth217 interface remote-as external - neighbor r2-eth218 interface remote-as external - neighbor r2-eth219 interface remote-as external - neighbor r2-eth220 interface remote-as external - neighbor r2-eth221 interface remote-as external - neighbor r2-eth222 interface remote-as external - neighbor r2-eth223 interface remote-as external - neighbor r2-eth224 interface remote-as external - neighbor r2-eth225 interface remote-as external - neighbor r2-eth226 interface remote-as external - neighbor r2-eth227 interface remote-as external - neighbor r2-eth228 interface remote-as external - neighbor r2-eth229 interface remote-as external - neighbor r2-eth230 interface remote-as external - neighbor r2-eth231 interface remote-as external - neighbor r2-eth232 interface remote-as external - neighbor r2-eth233 interface remote-as external - neighbor r2-eth234 interface remote-as external - neighbor r2-eth235 interface remote-as external - neighbor r2-eth236 interface remote-as external - neighbor r2-eth237 interface remote-as external - neighbor r2-eth238 interface remote-as external - neighbor r2-eth239 interface remote-as external - neighbor r2-eth240 interface remote-as external - neighbor r2-eth241 interface remote-as external - neighbor r2-eth242 interface remote-as external - neighbor r2-eth243 interface remote-as external - neighbor r2-eth244 interface remote-as external - neighbor r2-eth245 interface remote-as external - neighbor r2-eth246 interface remote-as external - neighbor r2-eth247 interface remote-as external - neighbor r2-eth248 interface remote-as external - neighbor r2-eth249 interface remote-as external - neighbor r2-eth250 interface remote-as external - neighbor r2-eth251 interface remote-as external - neighbor r2-eth252 interface remote-as external - neighbor r2-eth253 interface remote-as external - neighbor r2-eth254 interface remote-as external - neighbor r2-eth255 interface remote-as external - neighbor r2-eth256 interface remote-as external - neighbor r2-eth257 interface remote-as external - neighbor r2-eth258 interface remote-as external - neighbor r2-eth259 interface remote-as external +interface r2-eth0 + ip address 10.1.1.2/30 + ipv6 address 2001:db8:1:1::2/64 + no shutdown +! +interface r2-eth1 + ip address 10.1.2.2/30 + ipv6 address 2001:db8:1:2::2/64 + no shutdown +! +interface r2-eth2 + ip address 10.1.3.2/30 + ipv6 address 2001:db8:1:3::2/64 + no shutdown +! +interface r2-eth3 + ip address 10.1.4.2/30 + ipv6 address 2001:db8:1:4::2/64 + no shutdown +! +interface r2-eth4 + ip address 10.1.5.2/30 + ipv6 address 2001:db8:1:5::2/64 + no shutdown +! +interface r2-eth5 + ip address 10.1.6.2/30 + ipv6 address 2001:db8:1:6::2/64 + no shutdown +! +interface r2-eth6 + ip address 10.1.7.2/30 + ipv6 address 2001:db8:1:7::2/64 + no shutdown +! +interface r2-eth7 + ip address 10.1.8.2/30 + ipv6 address 2001:db8:1:8::2/64 + no shutdown +! +interface r2-eth8 + ip address 10.1.9.2/30 + ipv6 address 2001:db8:1:9::2/64 + no shutdown +! +interface r2-eth9 + ip address 10.1.10.2/30 + ipv6 address 2001:db8:1:10::2/64 + no shutdown +! +interface r2-eth10 + ip address 10.1.11.2/30 + ipv6 address 2001:db8:1:11::2/64 + no shutdown +! +interface r2-eth11 + ip address 10.1.12.2/30 + ipv6 address 2001:db8:1:12::2/64 + no shutdown +! +interface r2-eth12 + ip address 10.1.13.2/30 + ipv6 address 2001:db8:1:13::2/64 + no shutdown +! +interface r2-eth13 + ip address 10.1.14.2/30 + ipv6 address 2001:db8:1:14::2/64 + no shutdown +! +interface r2-eth14 + ip address 10.1.15.2/30 + ipv6 address 2001:db8:1:15::2/64 + no shutdown +! +interface r2-eth15 + ip address 10.1.16.2/30 + ipv6 address 2001:db8:1:16::2/64 + no shutdown +! +interface r2-eth16 + ip address 10.1.17.2/30 + ipv6 address 2001:db8:1:17::2/64 + no shutdown +! +interface r2-eth17 + ip address 10.1.18.2/30 + ipv6 address 2001:db8:1:18::2/64 + no shutdown +! +interface r2-eth18 + ip address 10.1.19.2/30 + ipv6 address 2001:db8:1:19::2/64 + no shutdown +! +interface r2-eth19 + ip address 10.1.20.2/30 + ipv6 address 2001:db8:1:20::2/64 + no shutdown +! +interface r2-eth20 + ip address 10.1.21.2/30 + ipv6 address 2001:db8:1:21::2/64 + no shutdown +! +interface r2-eth21 + ip address 10.1.22.2/30 + ipv6 address 2001:db8:1:22::2/64 + no shutdown +! +interface r2-eth22 + ip address 10.1.23.2/30 + ipv6 address 2001:db8:1:23::2/64 + no shutdown +! +interface r2-eth23 + ip address 10.1.24.2/30 + ipv6 address 2001:db8:1:24::2/64 + no shutdown +! +interface r2-eth24 + ip address 10.1.25.2/30 + ipv6 address 2001:db8:1:25::2/64 + no shutdown +! +interface r2-eth25 + ip address 10.1.26.2/30 + ipv6 address 2001:db8:1:26::2/64 + no shutdown +! +interface r2-eth26 + ip address 10.1.27.2/30 + ipv6 address 2001:db8:1:27::2/64 + no shutdown +! +interface r2-eth27 + ip address 10.1.28.2/30 + ipv6 address 2001:db8:1:28::2/64 + no shutdown +! +interface r2-eth28 + ip address 10.1.29.2/30 + ipv6 address 2001:db8:1:29::2/64 + no shutdown +! +interface r2-eth29 + ip address 10.1.30.2/30 + ipv6 address 2001:db8:1:30::2/64 + no shutdown +! +interface r2-eth30 + ip address 10.1.31.2/30 + ipv6 address 2001:db8:1:31::2/64 + no shutdown +! +interface r2-eth31 + ip address 10.1.32.2/30 + ipv6 address 2001:db8:1:32::2/64 + no shutdown +! +interface r2-eth32 + ip address 10.1.33.2/30 + ipv6 address 2001:db8:1:33::2/64 + no shutdown +! +interface r2-eth33 + ip address 10.1.34.2/30 + ipv6 address 2001:db8:1:34::2/64 + no shutdown +! +interface r2-eth34 + ip address 10.1.35.2/30 + ipv6 address 2001:db8:1:35::2/64 + no shutdown +! +interface r2-eth35 + ip address 10.1.36.2/30 + ipv6 address 2001:db8:1:36::2/64 + no shutdown +! +interface r2-eth36 + ip address 10.1.37.2/30 + ipv6 address 2001:db8:1:37::2/64 + no shutdown +! +interface r2-eth37 + ip address 10.1.38.2/30 + ipv6 address 2001:db8:1:38::2/64 + no shutdown +! +interface r2-eth38 + ip address 10.1.39.2/30 + ipv6 address 2001:db8:1:39::2/64 + no shutdown +! +interface r2-eth39 + ip address 10.1.40.2/30 + ipv6 address 2001:db8:1:40::2/64 + no shutdown +! +interface r2-eth40 + ip address 10.1.41.2/30 + ipv6 address 2001:db8:1:41::2/64 + no shutdown +! +interface r2-eth41 + ip address 10.1.42.2/30 + ipv6 address 2001:db8:1:42::2/64 + no shutdown +! +interface r2-eth42 + ip address 10.1.43.2/30 + ipv6 address 2001:db8:1:43::2/64 + no shutdown +! +interface r2-eth43 + ip address 10.1.44.2/30 + ipv6 address 2001:db8:1:44::2/64 + no shutdown +! +interface r2-eth44 + ip address 10.1.45.2/30 + ipv6 address 2001:db8:1:45::2/64 + no shutdown +! +interface r2-eth45 + ip address 10.1.46.2/30 + ipv6 address 2001:db8:1:46::2/64 + no shutdown +! +interface r2-eth46 + ip address 10.1.47.2/30 + ipv6 address 2001:db8:1:47::2/64 + no shutdown +! +interface r2-eth47 + ip address 10.1.48.2/30 + ipv6 address 2001:db8:1:48::2/64 + no shutdown +! +interface r2-eth48 + ip address 10.1.49.2/30 + ipv6 address 2001:db8:1:49::2/64 + no shutdown +! +interface r2-eth49 + ip address 10.1.50.2/30 + ipv6 address 2001:db8:1:50::2/64 + no shutdown +! +interface r2-eth50 + ip address 10.1.51.2/30 + ipv6 address 2001:db8:1:51::2/64 + no shutdown +! +interface r2-eth51 + ip address 10.1.52.2/30 + ipv6 address 2001:db8:1:52::2/64 + no shutdown +! +interface r2-eth52 + ip address 10.1.53.2/30 + ipv6 address 2001:db8:1:53::2/64 + no shutdown +! +interface r2-eth53 + ip address 10.1.54.2/30 + ipv6 address 2001:db8:1:54::2/64 + no shutdown +! +interface r2-eth54 + ip address 10.1.55.2/30 + ipv6 address 2001:db8:1:55::2/64 + no shutdown +! +interface r2-eth55 + ip address 10.1.56.2/30 + ipv6 address 2001:db8:1:56::2/64 + no shutdown +! +interface r2-eth56 + ip address 10.1.57.2/30 + ipv6 address 2001:db8:1:57::2/64 + no shutdown +! +interface r2-eth57 + ip address 10.1.58.2/30 + ipv6 address 2001:db8:1:58::2/64 + no shutdown +! +interface r2-eth58 + ip address 10.1.59.2/30 + ipv6 address 2001:db8:1:59::2/64 + no shutdown +! +interface r2-eth59 + ip address 10.1.60.2/30 + ipv6 address 2001:db8:1:60::2/64 + no shutdown +! +interface r2-eth60 + ip address 10.1.61.2/30 + ipv6 address 2001:db8:1:61::2/64 + no shutdown +! +interface r2-eth61 + ip address 10.1.62.2/30 + ipv6 address 2001:db8:1:62::2/64 + no shutdown +! +interface r2-eth62 + ip address 10.1.63.2/30 + ipv6 address 2001:db8:1:63::2/64 + no shutdown +! +interface r2-eth63 + ip address 10.1.64.2/30 + ipv6 address 2001:db8:1:64::2/64 + no shutdown +! +interface r2-eth64 + ip address 10.1.65.2/30 + ipv6 address 2001:db8:1:65::2/64 + no shutdown +! +interface r2-eth65 + ip address 10.1.66.2/30 + ipv6 address 2001:db8:1:66::2/64 + no shutdown +! +interface r2-eth66 + ip address 10.1.67.2/30 + ipv6 address 2001:db8:1:67::2/64 + no shutdown +! +interface r2-eth67 + ip address 10.1.68.2/30 + ipv6 address 2001:db8:1:68::2/64 + no shutdown +! +interface r2-eth68 + ip address 10.1.69.2/30 + ipv6 address 2001:db8:1:69::2/64 + no shutdown +! +interface r2-eth69 + ip address 10.1.70.2/30 + ipv6 address 2001:db8:1:70::2/64 + no shutdown +! +interface r2-eth70 + ip address 10.1.71.2/30 + ipv6 address 2001:db8:1:71::2/64 + no shutdown +! +interface r2-eth71 + ip address 10.1.72.2/30 + ipv6 address 2001:db8:1:72::2/64 + no shutdown +! +interface r2-eth72 + ip address 10.1.73.2/30 + ipv6 address 2001:db8:1:73::2/64 + no shutdown +! +interface r2-eth73 + ip address 10.1.74.2/30 + ipv6 address 2001:db8:1:74::2/64 + no shutdown +! +interface r2-eth74 + ip address 10.1.75.2/30 + ipv6 address 2001:db8:1:75::2/64 + no shutdown +! +interface r2-eth75 + ip address 10.1.76.2/30 + ipv6 address 2001:db8:1:76::2/64 + no shutdown +! +interface r2-eth76 + ip address 10.1.77.2/30 + ipv6 address 2001:db8:1:77::2/64 + no shutdown +! +interface r2-eth77 + ip address 10.1.78.2/30 + ipv6 address 2001:db8:1:78::2/64 + no shutdown +! +interface r2-eth78 + ip address 10.1.79.2/30 + ipv6 address 2001:db8:1:79::2/64 + no shutdown +! +interface r2-eth79 + ip address 10.1.80.2/30 + ipv6 address 2001:db8:1:80::2/64 + no shutdown +! +interface r2-eth80 + ip address 10.1.81.2/30 + ipv6 address 2001:db8:1:81::2/64 + no shutdown +! +interface r2-eth81 + ip address 10.1.82.2/30 + ipv6 address 2001:db8:1:82::2/64 + no shutdown +! +interface r2-eth82 + ip address 10.1.83.2/30 + ipv6 address 2001:db8:1:83::2/64 + no shutdown +! +interface r2-eth83 + ip address 10.1.84.2/30 + ipv6 address 2001:db8:1:84::2/64 + no shutdown +! +interface r2-eth84 + ip address 10.1.85.2/30 + ipv6 address 2001:db8:1:85::2/64 + no shutdown +! +interface r2-eth85 + ip address 10.1.86.2/30 + ipv6 address 2001:db8:1:86::2/64 + no shutdown +! +interface r2-eth86 + ip address 10.1.87.2/30 + ipv6 address 2001:db8:1:87::2/64 + no shutdown +! +interface r2-eth87 + ip address 10.1.88.2/30 + ipv6 address 2001:db8:1:88::2/64 + no shutdown +! +interface r2-eth88 + ip address 10.1.89.2/30 + ipv6 address 2001:db8:1:89::2/64 + no shutdown +! +interface r2-eth89 + ip address 10.1.90.2/30 + ipv6 address 2001:db8:1:90::2/64 + no shutdown +! +interface r2-eth90 + ip address 10.1.91.2/30 + ipv6 address 2001:db8:1:91::2/64 + no shutdown +! +interface r2-eth91 + ip address 10.1.92.2/30 + ipv6 address 2001:db8:1:92::2/64 + no shutdown +! +interface r2-eth92 + ip address 10.1.93.2/30 + ipv6 address 2001:db8:1:93::2/64 + no shutdown +! +interface r2-eth93 + ip address 10.1.94.2/30 + ipv6 address 2001:db8:1:94::2/64 + no shutdown +! +interface r2-eth94 + ip address 10.1.95.2/30 + ipv6 address 2001:db8:1:95::2/64 + no shutdown +! +interface r2-eth95 + ip address 10.1.96.2/30 + ipv6 address 2001:db8:1:96::2/64 + no shutdown +! +interface r2-eth96 + ip address 10.1.97.2/30 + ipv6 address 2001:db8:1:97::2/64 + no shutdown +! +interface r2-eth97 + ip address 10.1.98.2/30 + ipv6 address 2001:db8:1:98::2/64 + no shutdown +! +interface r2-eth98 + ip address 10.1.99.2/30 + ipv6 address 2001:db8:1:99::2/64 + no shutdown +! +interface r2-eth99 + ip address 10.1.100.2/30 + ipv6 address 2001:db8:1:100::2/64 + no shutdown +! +interface r2-eth100 + ip address 10.1.101.2/30 + ipv6 address 2001:db8:1:101::2/64 + no shutdown +! +interface r2-eth101 + ip address 10.1.102.2/30 + ipv6 address 2001:db8:1:102::2/64 + no shutdown +! +interface r2-eth102 + ip address 10.1.103.2/30 + ipv6 address 2001:db8:1:103::2/64 + no shutdown +! +interface r2-eth103 + ip address 10.1.104.2/30 + ipv6 address 2001:db8:1:104::2/64 + no shutdown +! +interface r2-eth104 + ip address 10.1.105.2/30 + ipv6 address 2001:db8:1:105::2/64 + no shutdown +! +interface r2-eth105 + ip address 10.1.106.2/30 + ipv6 address 2001:db8:1:106::2/64 + no shutdown +! +interface r2-eth106 + ip address 10.1.107.2/30 + ipv6 address 2001:db8:1:107::2/64 + no shutdown +! +interface r2-eth107 + ip address 10.1.108.2/30 + ipv6 address 2001:db8:1:108::2/64 + no shutdown +! +interface r2-eth108 + ip address 10.1.109.2/30 + ipv6 address 2001:db8:1:109::2/64 + no shutdown +! +interface r2-eth109 + ip address 10.1.110.2/30 + ipv6 address 2001:db8:1:110::2/64 + no shutdown +! +interface r2-eth110 + ip address 10.1.111.2/30 + ipv6 address 2001:db8:1:111::2/64 + no shutdown +! +interface r2-eth111 + ip address 10.1.112.2/30 + ipv6 address 2001:db8:1:112::2/64 + no shutdown +! +interface r2-eth112 + ip address 10.1.113.2/30 + ipv6 address 2001:db8:1:113::2/64 + no shutdown +! +interface r2-eth113 + ip address 10.1.114.2/30 + ipv6 address 2001:db8:1:114::2/64 + no shutdown +! +interface r2-eth114 + ip address 10.1.115.2/30 + ipv6 address 2001:db8:1:115::2/64 + no shutdown +! +interface r2-eth115 + ip address 10.1.116.2/30 + ipv6 address 2001:db8:1:116::2/64 + no shutdown +! +interface r2-eth116 + ip address 10.1.117.2/30 + ipv6 address 2001:db8:1:117::2/64 + no shutdown +! +interface r2-eth117 + ip address 10.1.118.2/30 + ipv6 address 2001:db8:1:118::2/64 + no shutdown +! +interface r2-eth118 + ip address 10.1.119.2/30 + ipv6 address 2001:db8:1:119::2/64 + no shutdown +! +interface r2-eth119 + ip address 10.1.120.2/30 + ipv6 address 2001:db8:1:120::2/64 + no shutdown +! +interface r2-eth120 + ip address 10.1.121.2/30 + ipv6 address 2001:db8:1:121::2/64 + no shutdown +! +interface r2-eth121 + ip address 10.1.122.2/30 + ipv6 address 2001:db8:1:122::2/64 + no shutdown +! +interface r2-eth122 + ip address 10.1.123.2/30 + ipv6 address 2001:db8:1:123::2/64 + no shutdown +! +interface r2-eth123 + ip address 10.1.124.2/30 + ipv6 address 2001:db8:1:124::2/64 + no shutdown +! +interface r2-eth124 + ip address 10.1.125.2/30 + ipv6 address 2001:db8:1:125::2/64 + no shutdown +! +interface r2-eth125 + ip address 10.1.126.2/30 + ipv6 address 2001:db8:1:126::2/64 + no shutdown +! +interface r2-eth126 + ip address 10.1.127.2/30 + ipv6 address 2001:db8:1:127::2/64 + no shutdown +! +interface r2-eth127 + ip address 10.1.128.2/30 + ipv6 address 2001:db8:1:128::2/64 + no shutdown +! +interface r2-eth128 + ip address 10.1.129.2/30 + ipv6 address 2001:db8:1:129::2/64 + no shutdown +! +interface r2-eth129 + ip address 10.1.130.2/30 + ipv6 address 2001:db8:1:130::2/64 + no shutdown +! +interface r2-eth130 + ip address 10.1.131.2/30 + ipv6 address 2001:db8:1:131::2/64 + no shutdown +! +interface r2-eth131 + ip address 10.1.132.2/30 + ipv6 address 2001:db8:1:132::2/64 + no shutdown +! +interface r2-eth132 + ip address 10.1.133.2/30 + ipv6 address 2001:db8:1:133::2/64 + no shutdown +! +interface r2-eth133 + ip address 10.1.134.2/30 + ipv6 address 2001:db8:1:134::2/64 + no shutdown +! +interface r2-eth134 + ip address 10.1.135.2/30 + ipv6 address 2001:db8:1:135::2/64 + no shutdown +! +interface r2-eth135 + ip address 10.1.136.2/30 + ipv6 address 2001:db8:1:136::2/64 + no shutdown +! +interface r2-eth136 + ip address 10.1.137.2/30 + ipv6 address 2001:db8:1:137::2/64 + no shutdown +! +interface r2-eth137 + ip address 10.1.138.2/30 + ipv6 address 2001:db8:1:138::2/64 + no shutdown +! +interface r2-eth138 + ip address 10.1.139.2/30 + ipv6 address 2001:db8:1:139::2/64 + no shutdown +! +interface r2-eth139 + ip address 10.1.140.2/30 + ipv6 address 2001:db8:1:140::2/64 + no shutdown +! +interface r2-eth140 + ip address 10.1.141.2/30 + ipv6 address 2001:db8:1:141::2/64 + no shutdown +! +interface r2-eth141 + ip address 10.1.142.2/30 + ipv6 address 2001:db8:1:142::2/64 + no shutdown +! +interface r2-eth142 + ip address 10.1.143.2/30 + ipv6 address 2001:db8:1:143::2/64 + no shutdown +! +interface r2-eth143 + ip address 10.1.144.2/30 + ipv6 address 2001:db8:1:144::2/64 + no shutdown +! +interface r2-eth144 + ip address 10.1.145.2/30 + ipv6 address 2001:db8:1:145::2/64 + no shutdown +! +interface r2-eth145 + ip address 10.1.146.2/30 + ipv6 address 2001:db8:1:146::2/64 + no shutdown +! +interface r2-eth146 + ip address 10.1.147.2/30 + ipv6 address 2001:db8:1:147::2/64 + no shutdown +! +interface r2-eth147 + ip address 10.1.148.2/30 + ipv6 address 2001:db8:1:148::2/64 + no shutdown +! +interface r2-eth148 + ip address 10.1.149.2/30 + ipv6 address 2001:db8:1:149::2/64 + no shutdown +! +interface r2-eth149 + ip address 10.1.150.2/30 + ipv6 address 2001:db8:1:150::2/64 + no shutdown +! +interface r2-eth150 + ip address 10.1.151.2/30 + ipv6 address 2001:db8:1:151::2/64 + no shutdown +! +interface r2-eth151 + ip address 10.1.152.2/30 + ipv6 address 2001:db8:1:152::2/64 + no shutdown +! +interface r2-eth152 + ip address 10.1.153.2/30 + ipv6 address 2001:db8:1:153::2/64 + no shutdown +! +interface r2-eth153 + ip address 10.1.154.2/30 + ipv6 address 2001:db8:1:154::2/64 + no shutdown +! +interface r2-eth154 + ip address 10.1.155.2/30 + ipv6 address 2001:db8:1:155::2/64 + no shutdown +! +interface r2-eth155 + ip address 10.1.156.2/30 + ipv6 address 2001:db8:1:156::2/64 + no shutdown +! +interface r2-eth156 + ip address 10.1.157.2/30 + ipv6 address 2001:db8:1:157::2/64 + no shutdown +! +interface r2-eth157 + ip address 10.1.158.2/30 + ipv6 address 2001:db8:1:158::2/64 + no shutdown +! +interface r2-eth158 + ip address 10.1.159.2/30 + ipv6 address 2001:db8:1:159::2/64 + no shutdown +! +interface r2-eth159 + ip address 10.1.160.2/30 + ipv6 address 2001:db8:1:160::2/64 + no shutdown +! +interface r2-eth160 + ip address 10.1.161.2/30 + ipv6 address 2001:db8:1:161::2/64 + no shutdown +! +interface r2-eth161 + ip address 10.1.162.2/30 + ipv6 address 2001:db8:1:162::2/64 + no shutdown +! +interface r2-eth162 + ip address 10.1.163.2/30 + ipv6 address 2001:db8:1:163::2/64 + no shutdown +! +interface r2-eth163 + ip address 10.1.164.2/30 + ipv6 address 2001:db8:1:164::2/64 + no shutdown +! +interface r2-eth164 + ip address 10.1.165.2/30 + ipv6 address 2001:db8:1:165::2/64 + no shutdown +! +interface r2-eth165 + ip address 10.1.166.2/30 + ipv6 address 2001:db8:1:166::2/64 + no shutdown +! +interface r2-eth166 + ip address 10.1.167.2/30 + ipv6 address 2001:db8:1:167::2/64 + no shutdown +! +interface r2-eth167 + ip address 10.1.168.2/30 + ipv6 address 2001:db8:1:168::2/64 + no shutdown +! +interface r2-eth168 + ip address 10.1.169.2/30 + ipv6 address 2001:db8:1:169::2/64 + no shutdown +! +interface r2-eth169 + ip address 10.1.170.2/30 + ipv6 address 2001:db8:1:170::2/64 + no shutdown +! +interface r2-eth170 + ip address 10.1.171.2/30 + ipv6 address 2001:db8:1:171::2/64 + no shutdown +! +interface r2-eth171 + ip address 10.1.172.2/30 + ipv6 address 2001:db8:1:172::2/64 + no shutdown +! +interface r2-eth172 + ip address 10.1.173.2/30 + ipv6 address 2001:db8:1:173::2/64 + no shutdown +! +interface r2-eth173 + ip address 10.1.174.2/30 + ipv6 address 2001:db8:1:174::2/64 + no shutdown +! +interface r2-eth174 + ip address 10.1.175.2/30 + ipv6 address 2001:db8:1:175::2/64 + no shutdown +! +interface r2-eth175 + ip address 10.1.176.2/30 + ipv6 address 2001:db8:1:176::2/64 + no shutdown +! +interface r2-eth176 + ip address 10.1.177.2/30 + ipv6 address 2001:db8:1:177::2/64 + no shutdown +! +interface r2-eth177 + ip address 10.1.178.2/30 + ipv6 address 2001:db8:1:178::2/64 + no shutdown +! +interface r2-eth178 + ip address 10.1.179.2/30 + ipv6 address 2001:db8:1:179::2/64 + no shutdown +! +interface r2-eth179 + ip address 10.1.180.2/30 + ipv6 address 2001:db8:1:180::2/64 + no shutdown +! +interface r2-eth180 + ip address 10.1.181.2/30 + ipv6 address 2001:db8:1:181::2/64 + no shutdown +! +interface r2-eth181 + ip address 10.1.182.2/30 + ipv6 address 2001:db8:1:182::2/64 + no shutdown +! +interface r2-eth182 + ip address 10.1.183.2/30 + ipv6 address 2001:db8:1:183::2/64 + no shutdown +! +interface r2-eth183 + ip address 10.1.184.2/30 + ipv6 address 2001:db8:1:184::2/64 + no shutdown +! +interface r2-eth184 + ip address 10.1.185.2/30 + ipv6 address 2001:db8:1:185::2/64 + no shutdown +! +interface r2-eth185 + ip address 10.1.186.2/30 + ipv6 address 2001:db8:1:186::2/64 + no shutdown +! +interface r2-eth186 + ip address 10.1.187.2/30 + ipv6 address 2001:db8:1:187::2/64 + no shutdown +! +interface r2-eth187 + ip address 10.1.188.2/30 + ipv6 address 2001:db8:1:188::2/64 + no shutdown +! +interface r2-eth188 + ip address 10.1.189.2/30 + ipv6 address 2001:db8:1:189::2/64 + no shutdown +! +interface r2-eth189 + ip address 10.1.190.2/30 + ipv6 address 2001:db8:1:190::2/64 + no shutdown +! +interface r2-eth190 + ip address 10.1.191.2/30 + ipv6 address 2001:db8:1:191::2/64 + no shutdown +! +interface r2-eth191 + ip address 10.1.192.2/30 + ipv6 address 2001:db8:1:192::2/64 + no shutdown +! +interface r2-eth192 + ip address 10.1.193.2/30 + ipv6 address 2001:db8:1:193::2/64 + no shutdown +! +interface r2-eth193 + ip address 10.1.194.2/30 + ipv6 address 2001:db8:1:194::2/64 + no shutdown +! +interface r2-eth194 + ip address 10.1.195.2/30 + ipv6 address 2001:db8:1:195::2/64 + no shutdown +! +interface r2-eth195 + ip address 10.1.196.2/30 + ipv6 address 2001:db8:1:196::2/64 + no shutdown +! +interface r2-eth196 + ip address 10.1.197.2/30 + ipv6 address 2001:db8:1:197::2/64 + no shutdown +! +interface r2-eth197 + ip address 10.1.198.2/30 + ipv6 address 2001:db8:1:198::2/64 + no shutdown +! +interface r2-eth198 + ip address 10.1.199.2/30 + ipv6 address 2001:db8:1:199::2/64 + no shutdown +! +interface r2-eth199 + ip address 10.1.200.2/30 + ipv6 address 2001:db8:1:200::2/64 + no shutdown +! +interface r2-eth200 + ip address 10.1.201.2/30 + ipv6 address 2001:db8:1:201::2/64 + no shutdown +! +interface r2-eth201 + ip address 10.1.202.2/30 + ipv6 address 2001:db8:1:202::2/64 + no shutdown +! +interface r2-eth202 + ip address 10.1.203.2/30 + ipv6 address 2001:db8:1:203::2/64 + no shutdown +! +interface r2-eth203 + ip address 10.1.204.2/30 + ipv6 address 2001:db8:1:204::2/64 + no shutdown +! +interface r2-eth204 + ip address 10.1.205.2/30 + ipv6 address 2001:db8:1:205::2/64 + no shutdown +! +interface r2-eth205 + ip address 10.1.206.2/30 + ipv6 address 2001:db8:1:206::2/64 + no shutdown +! +interface r2-eth206 + ip address 10.1.207.2/30 + ipv6 address 2001:db8:1:207::2/64 + no shutdown +! +interface r2-eth207 + ip address 10.1.208.2/30 + ipv6 address 2001:db8:1:208::2/64 + no shutdown +! +interface r2-eth208 + ip address 10.1.209.2/30 + ipv6 address 2001:db8:1:209::2/64 + no shutdown +! +interface r2-eth209 + ip address 10.1.210.2/30 + ipv6 address 2001:db8:1:210::2/64 + no shutdown +! +interface r2-eth210 + ip address 10.1.211.2/30 + ipv6 address 2001:db8:1:211::2/64 + no shutdown +! +interface r2-eth211 + ip address 10.1.212.2/30 + ipv6 address 2001:db8:1:212::2/64 + no shutdown +! +interface r2-eth212 + ip address 10.1.213.2/30 + ipv6 address 2001:db8:1:213::2/64 + no shutdown +! +interface r2-eth213 + ip address 10.1.214.2/30 + ipv6 address 2001:db8:1:214::2/64 + no shutdown +! +interface r2-eth214 + ip address 10.1.215.2/30 + ipv6 address 2001:db8:1:215::2/64 + no shutdown +! +interface r2-eth215 + ip address 10.1.216.2/30 + ipv6 address 2001:db8:1:216::2/64 + no shutdown +! +interface r2-eth216 + ip address 10.1.217.2/30 + ipv6 address 2001:db8:1:217::2/64 + no shutdown +! +interface r2-eth217 + ip address 10.1.218.2/30 + ipv6 address 2001:db8:1:218::2/64 + no shutdown +! +interface r2-eth218 + ip address 10.1.219.2/30 + ipv6 address 2001:db8:1:219::2/64 + no shutdown +! +interface r2-eth219 + ip address 10.1.220.2/30 + ipv6 address 2001:db8:1:220::2/64 + no shutdown +! +interface r2-eth220 + ip address 10.1.221.2/30 + ipv6 address 2001:db8:1:221::2/64 + no shutdown +! +interface r2-eth221 + ip address 10.1.222.2/30 + ipv6 address 2001:db8:1:222::2/64 + no shutdown +! +interface r2-eth222 + ip address 10.1.223.2/30 + ipv6 address 2001:db8:1:223::2/64 + no shutdown +! +interface r2-eth223 + ip address 10.1.224.2/30 + ipv6 address 2001:db8:1:224::2/64 + no shutdown +! +interface r2-eth224 + ip address 10.1.225.2/30 + ipv6 address 2001:db8:1:225::2/64 + no shutdown +! +interface r2-eth225 + ip address 10.1.226.2/30 + ipv6 address 2001:db8:1:226::2/64 + no shutdown +! +interface r2-eth226 + ip address 10.1.227.2/30 + ipv6 address 2001:db8:1:227::2/64 + no shutdown +! +interface r2-eth227 + ip address 10.1.228.2/30 + ipv6 address 2001:db8:1:228::2/64 + no shutdown +! +interface r2-eth228 + ip address 10.1.229.2/30 + ipv6 address 2001:db8:1:229::2/64 + no shutdown +! +interface r2-eth229 + ip address 10.1.230.2/30 + ipv6 address 2001:db8:1:230::2/64 + no shutdown +! +interface r2-eth230 + ip address 10.1.231.2/30 + ipv6 address 2001:db8:1:231::2/64 + no shutdown +! +interface r2-eth231 + ip address 10.1.232.2/30 + ipv6 address 2001:db8:1:232::2/64 + no shutdown +! +interface r2-eth232 + ip address 10.1.233.2/30 + ipv6 address 2001:db8:1:233::2/64 + no shutdown +! +interface r2-eth233 + ip address 10.1.234.2/30 + ipv6 address 2001:db8:1:234::2/64 + no shutdown +! +interface r2-eth234 + ip address 10.1.235.2/30 + ipv6 address 2001:db8:1:235::2/64 + no shutdown +! +interface r2-eth235 + ip address 10.1.236.2/30 + ipv6 address 2001:db8:1:236::2/64 + no shutdown +! +interface r2-eth236 + ip address 10.1.237.2/30 + ipv6 address 2001:db8:1:237::2/64 + no shutdown +! +interface r2-eth237 + ip address 10.1.238.2/30 + ipv6 address 2001:db8:1:238::2/64 + no shutdown +! +interface r2-eth238 + ip address 10.1.239.2/30 + ipv6 address 2001:db8:1:239::2/64 + no shutdown +! +interface r2-eth239 + ip address 10.1.240.2/30 + ipv6 address 2001:db8:1:240::2/64 + no shutdown +! +interface r2-eth240 + ip address 10.1.241.2/30 + ipv6 address 2001:db8:1:241::2/64 + no shutdown +! +interface r2-eth241 + ip address 10.1.242.2/30 + ipv6 address 2001:db8:1:242::2/64 + no shutdown +! +interface r2-eth242 + ip address 10.1.243.2/30 + ipv6 address 2001:db8:1:243::2/64 + no shutdown +! +interface r2-eth243 + ip address 10.1.244.2/30 + ipv6 address 2001:db8:1:244::2/64 + no shutdown +! +interface r2-eth244 + ip address 10.1.245.2/30 + ipv6 address 2001:db8:1:245::2/64 + no shutdown +! +interface r2-eth245 + ip address 10.1.246.2/30 + ipv6 address 2001:db8:1:246::2/64 + no shutdown +! +interface r2-eth246 + ip address 10.1.247.2/30 + ipv6 address 2001:db8:1:247::2/64 + no shutdown +! +interface r2-eth247 + ip address 10.1.248.2/30 + ipv6 address 2001:db8:1:248::2/64 + no shutdown +! +interface r2-eth248 + ip address 10.1.249.2/30 + ipv6 address 2001:db8:1:249::2/64 + no shutdown +! +interface r2-eth249 + ip address 10.1.250.2/30 + ipv6 address 2001:db8:1:250::2/64 + no shutdown +! +interface r2-eth250 + ip address 10.1.251.2/30 + ipv6 address 2001:db8:1:251::2/64 + no shutdown +! +interface r2-eth251 + ip address 10.1.252.2/30 + ipv6 address 2001:db8:1:252::2/64 + no shutdown +! +interface r2-eth252 + ip address 10.1.253.2/30 + ipv6 address 2001:db8:1:253::2/64 + no shutdown +! +interface r2-eth253 + ip address 10.1.254.2/30 + ipv6 address 2001:db8:1:254::2/64 + no shutdown +! +interface r2-eth254 + ip address 10.1.255.2/30 + ipv6 address 2001:db8:1:255::2/64 + no shutdown +! +interface r2-eth255 + ip address 10.2.1.2/30 + ipv6 address 2001:db8:2:1::2/64 + no shutdown +! +interface r2-eth256 + ip address 10.2.2.2/30 + ipv6 address 2001:db8:2:2::2/64 + no shutdown +! +interface r2-eth257 + ip address 10.2.3.2/30 + ipv6 address 2001:db8:2:3::2/64 + no shutdown +! +interface r2-eth258 + ip address 10.2.4.2/30 + ipv6 address 2001:db8:2:4::2/64 + no shutdown +! +interface r2-eth259 + ip address 10.2.5.2/30 + ipv6 address 2001:db8:2:5::2/64 + no shutdown +! +interface r2-eth260 + ip address 10.2.6.2/30 + ipv6 address 2001:db8:2:6::2/64 + no shutdown +! +interface r2-eth261 + ip address 10.2.7.2/30 + ipv6 address 2001:db8:2:7::2/64 + no shutdown +! +interface r2-eth262 + ip address 10.2.8.2/30 + ipv6 address 2001:db8:2:8::2/64 + no shutdown +! +interface r2-eth263 + ip address 10.2.9.2/30 + ipv6 address 2001:db8:2:9::2/64 + no shutdown +! +interface r2-eth264 + ip address 10.2.10.2/30 + ipv6 address 2001:db8:2:10::2/64 + no shutdown +! +interface r2-eth265 + ip address 10.2.11.2/30 + ipv6 address 2001:db8:2:11::2/64 + no shutdown +! +interface r2-eth266 + ip address 10.2.12.2/30 + ipv6 address 2001:db8:2:12::2/64 + no shutdown +! +interface r2-eth267 + ip address 10.2.13.2/30 + ipv6 address 2001:db8:2:13::2/64 + no shutdown +! +interface r2-eth268 + ip address 10.2.14.2/30 + ipv6 address 2001:db8:2:14::2/64 + no shutdown +! +interface r2-eth269 + ip address 10.2.15.2/30 + ipv6 address 2001:db8:2:15::2/64 + no shutdown +! +interface r2-eth270 + ip address 10.2.16.2/30 + ipv6 address 2001:db8:2:16::2/64 + no shutdown +! +interface r2-eth271 + ip address 10.2.17.2/30 + ipv6 address 2001:db8:2:17::2/64 + no shutdown +! +interface r2-eth272 + ip address 10.2.18.2/30 + ipv6 address 2001:db8:2:18::2/64 + no shutdown +! +interface r2-eth273 + ip address 10.2.19.2/30 + ipv6 address 2001:db8:2:19::2/64 + no shutdown +! +interface r2-eth274 + ip address 10.2.20.2/30 + ipv6 address 2001:db8:2:20::2/64 + no shutdown +! +interface r2-eth275 + ip address 10.2.21.2/30 + ipv6 address 2001:db8:2:21::2/64 + no shutdown +! +interface r2-eth276 + ip address 10.2.22.2/30 + ipv6 address 2001:db8:2:22::2/64 + no shutdown +! +interface r2-eth277 + ip address 10.2.23.2/30 + ipv6 address 2001:db8:2:23::2/64 + no shutdown +! +interface r2-eth278 + ip address 10.2.24.2/30 + ipv6 address 2001:db8:2:24::2/64 + no shutdown +! +interface r2-eth279 + ip address 10.2.25.2/30 + ipv6 address 2001:db8:2:25::2/64 + no shutdown +! +interface r2-eth280 + ip address 10.2.26.2/30 + ipv6 address 2001:db8:2:26::2/64 + no shutdown +! +interface r2-eth281 + ip address 10.2.27.2/30 + ipv6 address 2001:db8:2:27::2/64 + no shutdown +! +interface r2-eth282 + ip address 10.2.28.2/30 + ipv6 address 2001:db8:2:28::2/64 + no shutdown +! +interface r2-eth283 + ip address 10.2.29.2/30 + ipv6 address 2001:db8:2:29::2/64 + no shutdown +! +interface r2-eth284 + ip address 10.2.30.2/30 + ipv6 address 2001:db8:2:30::2/64 + no shutdown +! +interface r2-eth285 + ip address 10.2.31.2/30 + ipv6 address 2001:db8:2:31::2/64 + no shutdown +! +interface r2-eth286 + ip address 10.2.32.2/30 + ipv6 address 2001:db8:2:32::2/64 + no shutdown +! +interface r2-eth287 + ip address 10.2.33.2/30 + ipv6 address 2001:db8:2:33::2/64 + no shutdown +! +interface r2-eth288 + ip address 10.2.34.2/30 + ipv6 address 2001:db8:2:34::2/64 + no shutdown +! +interface r2-eth289 + ip address 10.2.35.2/30 + ipv6 address 2001:db8:2:35::2/64 + no shutdown +! +interface r2-eth290 + ip address 10.2.36.2/30 + ipv6 address 2001:db8:2:36::2/64 + no shutdown +! +interface r2-eth291 + ip address 10.2.37.2/30 + ipv6 address 2001:db8:2:37::2/64 + no shutdown +! +interface r2-eth292 + ip address 10.2.38.2/30 + ipv6 address 2001:db8:2:38::2/64 + no shutdown +! +interface r2-eth293 + ip address 10.2.39.2/30 + ipv6 address 2001:db8:2:39::2/64 + no shutdown +! +interface r2-eth294 + ip address 10.2.40.2/30 + ipv6 address 2001:db8:2:40::2/64 + no shutdown +! +interface r2-eth295 + ip address 10.2.41.2/30 + ipv6 address 2001:db8:2:41::2/64 + no shutdown +! +interface r2-eth296 + ip address 10.2.42.2/30 + ipv6 address 2001:db8:2:42::2/64 + no shutdown +! +interface r2-eth297 + ip address 10.2.43.2/30 + ipv6 address 2001:db8:2:43::2/64 + no shutdown +! +interface r2-eth298 + ip address 10.2.44.2/30 + ipv6 address 2001:db8:2:44::2/64 + no shutdown +! +interface r2-eth299 + ip address 10.2.45.2/30 + ipv6 address 2001:db8:2:45::2/64 + no shutdown +! +interface r2-eth300 + ip address 10.2.46.2/30 + ipv6 address 2001:db8:2:46::2/64 + no shutdown +! +interface r2-eth301 + ip address 10.2.47.2/30 + ipv6 address 2001:db8:2:47::2/64 + no shutdown +! +interface r2-eth302 + ip address 10.2.48.2/30 + ipv6 address 2001:db8:2:48::2/64 + no shutdown +! +interface r2-eth303 + ip address 10.2.49.2/30 + ipv6 address 2001:db8:2:49::2/64 + no shutdown +! +interface r2-eth304 + ip address 10.2.50.2/30 + ipv6 address 2001:db8:2:50::2/64 + no shutdown +! +interface r2-eth305 + ip address 10.2.51.2/30 + ipv6 address 2001:db8:2:51::2/64 + no shutdown +! +interface r2-eth306 + ip address 10.2.52.2/30 + ipv6 address 2001:db8:2:52::2/64 + no shutdown +! +interface r2-eth307 + ip address 10.2.53.2/30 + ipv6 address 2001:db8:2:53::2/64 + no shutdown +! +interface r2-eth308 + ip address 10.2.54.2/30 + ipv6 address 2001:db8:2:54::2/64 + no shutdown +! +interface r2-eth309 + ip address 10.2.55.2/30 + ipv6 address 2001:db8:2:55::2/64 + no shutdown +! +interface r2-eth310 + ip address 10.2.56.2/30 + ipv6 address 2001:db8:2:56::2/64 + no shutdown +! +interface r2-eth311 + ip address 10.2.57.2/30 + ipv6 address 2001:db8:2:57::2/64 + no shutdown +! +interface r2-eth312 + ip address 10.2.58.2/30 + ipv6 address 2001:db8:2:58::2/64 + no shutdown +! +interface r2-eth313 + ip address 10.2.59.2/30 + ipv6 address 2001:db8:2:59::2/64 + no shutdown +! +interface r2-eth314 + ip address 10.2.60.2/30 + ipv6 address 2001:db8:2:60::2/64 + no shutdown +! +interface r2-eth315 + ip address 10.2.61.2/30 + ipv6 address 2001:db8:2:61::2/64 + no shutdown +! +interface r2-eth316 + ip address 10.2.62.2/30 + ipv6 address 2001:db8:2:62::2/64 + no shutdown +! +interface r2-eth317 + ip address 10.2.63.2/30 + ipv6 address 2001:db8:2:63::2/64 + no shutdown +! +interface r2-eth318 + ip address 10.2.64.2/30 + ipv6 address 2001:db8:2:64::2/64 + no shutdown +! +interface r2-eth319 + ip address 10.2.65.2/30 + ipv6 address 2001:db8:2:65::2/64 + no shutdown +! +interface r2-eth320 + ip address 10.2.66.2/30 + ipv6 address 2001:db8:2:66::2/64 + no shutdown +! +interface r2-eth321 + ip address 10.2.67.2/30 + ipv6 address 2001:db8:2:67::2/64 + no shutdown +! +interface r2-eth322 + ip address 10.2.68.2/30 + ipv6 address 2001:db8:2:68::2/64 + no shutdown +! +interface r2-eth323 + ip address 10.2.69.2/30 + ipv6 address 2001:db8:2:69::2/64 + no shutdown +! +interface r2-eth324 + ip address 10.2.70.2/30 + ipv6 address 2001:db8:2:70::2/64 + no shutdown +! +interface r2-eth325 + ip address 10.2.71.2/30 + ipv6 address 2001:db8:2:71::2/64 + no shutdown +! +interface r2-eth326 + ip address 10.2.72.2/30 + ipv6 address 2001:db8:2:72::2/64 + no shutdown +! +interface r2-eth327 + ip address 10.2.73.2/30 + ipv6 address 2001:db8:2:73::2/64 + no shutdown +! +interface r2-eth328 + ip address 10.2.74.2/30 + ipv6 address 2001:db8:2:74::2/64 + no shutdown +! +interface r2-eth329 + ip address 10.2.75.2/30 + ipv6 address 2001:db8:2:75::2/64 + no shutdown +! +interface r2-eth330 + ip address 10.2.76.2/30 + ipv6 address 2001:db8:2:76::2/64 + no shutdown +! +interface r2-eth331 + ip address 10.2.77.2/30 + ipv6 address 2001:db8:2:77::2/64 + no shutdown +! +interface r2-eth332 + ip address 10.2.78.2/30 + ipv6 address 2001:db8:2:78::2/64 + no shutdown +! +interface r2-eth333 + ip address 10.2.79.2/30 + ipv6 address 2001:db8:2:79::2/64 + no shutdown +! +interface r2-eth334 + ip address 10.2.80.2/30 + ipv6 address 2001:db8:2:80::2/64 + no shutdown +! +interface r2-eth335 + ip address 10.2.81.2/30 + ipv6 address 2001:db8:2:81::2/64 + no shutdown +! +interface r2-eth336 + ip address 10.2.82.2/30 + ipv6 address 2001:db8:2:82::2/64 + no shutdown +! +interface r2-eth337 + ip address 10.2.83.2/30 + ipv6 address 2001:db8:2:83::2/64 + no shutdown +! +interface r2-eth338 + ip address 10.2.84.2/30 + ipv6 address 2001:db8:2:84::2/64 + no shutdown +! +interface r2-eth339 + ip address 10.2.85.2/30 + ipv6 address 2001:db8:2:85::2/64 + no shutdown +! +interface r2-eth340 + ip address 10.2.86.2/30 + ipv6 address 2001:db8:2:86::2/64 + no shutdown +! +interface r2-eth341 + ip address 10.2.87.2/30 + ipv6 address 2001:db8:2:87::2/64 + no shutdown +! +interface r2-eth342 + ip address 10.2.88.2/30 + ipv6 address 2001:db8:2:88::2/64 + no shutdown +! +interface r2-eth343 + ip address 10.2.89.2/30 + ipv6 address 2001:db8:2:89::2/64 + no shutdown +! +interface r2-eth344 + ip address 10.2.90.2/30 + ipv6 address 2001:db8:2:90::2/64 + no shutdown +! +interface r2-eth345 + ip address 10.2.91.2/30 + ipv6 address 2001:db8:2:91::2/64 + no shutdown +! +interface r2-eth346 + ip address 10.2.92.2/30 + ipv6 address 2001:db8:2:92::2/64 + no shutdown +! +interface r2-eth347 + ip address 10.2.93.2/30 + ipv6 address 2001:db8:2:93::2/64 + no shutdown +! +interface r2-eth348 + ip address 10.2.94.2/30 + ipv6 address 2001:db8:2:94::2/64 + no shutdown +! +interface r2-eth349 + ip address 10.2.95.2/30 + ipv6 address 2001:db8:2:95::2/64 + no shutdown +! +interface r2-eth350 + ip address 10.2.96.2/30 + ipv6 address 2001:db8:2:96::2/64 + no shutdown +! +interface r2-eth351 + ip address 10.2.97.2/30 + ipv6 address 2001:db8:2:97::2/64 + no shutdown +! +interface r2-eth352 + ip address 10.2.98.2/30 + ipv6 address 2001:db8:2:98::2/64 + no shutdown +! +interface r2-eth353 + ip address 10.2.99.2/30 + ipv6 address 2001:db8:2:99::2/64 + no shutdown +! +interface r2-eth354 + ip address 10.2.100.2/30 + ipv6 address 2001:db8:2:100::2/64 + no shutdown +! +interface r2-eth355 + ip address 10.2.101.2/30 + ipv6 address 2001:db8:2:101::2/64 + no shutdown +! +interface r2-eth356 + ip address 10.2.102.2/30 + ipv6 address 2001:db8:2:102::2/64 + no shutdown +! +interface r2-eth357 + ip address 10.2.103.2/30 + ipv6 address 2001:db8:2:103::2/64 + no shutdown +! +interface r2-eth358 + ip address 10.2.104.2/30 + ipv6 address 2001:db8:2:104::2/64 + no shutdown +! +interface r2-eth359 + ip address 10.2.105.2/30 + ipv6 address 2001:db8:2:105::2/64 + no shutdown +! +interface r2-eth360 + ip address 10.2.106.2/30 + ipv6 address 2001:db8:2:106::2/64 + no shutdown +! +interface r2-eth361 + ip address 10.2.107.2/30 + ipv6 address 2001:db8:2:107::2/64 + no shutdown +! +interface r2-eth362 + ip address 10.2.108.2/30 + ipv6 address 2001:db8:2:108::2/64 + no shutdown +! +interface r2-eth363 + ip address 10.2.109.2/30 + ipv6 address 2001:db8:2:109::2/64 + no shutdown +! +interface r2-eth364 + ip address 10.2.110.2/30 + ipv6 address 2001:db8:2:110::2/64 + no shutdown +! +interface r2-eth365 + ip address 10.2.111.2/30 + ipv6 address 2001:db8:2:111::2/64 + no shutdown +! +interface r2-eth366 + ip address 10.2.112.2/30 + ipv6 address 2001:db8:2:112::2/64 + no shutdown +! +interface r2-eth367 + ip address 10.2.113.2/30 + ipv6 address 2001:db8:2:113::2/64 + no shutdown +! +interface r2-eth368 + ip address 10.2.114.2/30 + ipv6 address 2001:db8:2:114::2/64 + no shutdown +! +interface r2-eth369 + ip address 10.2.115.2/30 + ipv6 address 2001:db8:2:115::2/64 + no shutdown +! +interface r2-eth370 + ip address 10.2.116.2/30 + ipv6 address 2001:db8:2:116::2/64 + no shutdown +! +interface r2-eth371 + ip address 10.2.117.2/30 + ipv6 address 2001:db8:2:117::2/64 + no shutdown +! +interface r2-eth372 + ip address 10.2.118.2/30 + ipv6 address 2001:db8:2:118::2/64 + no shutdown +! +interface r2-eth373 + ip address 10.2.119.2/30 + ipv6 address 2001:db8:2:119::2/64 + no shutdown +! +interface r2-eth374 + ip address 10.2.120.2/30 + ipv6 address 2001:db8:2:120::2/64 + no shutdown +! +interface r2-eth375 + ip address 10.2.121.2/30 + ipv6 address 2001:db8:2:121::2/64 + no shutdown +! +interface r2-eth376 + ip address 10.2.122.2/30 + ipv6 address 2001:db8:2:122::2/64 + no shutdown +! +interface r2-eth377 + ip address 10.2.123.2/30 + ipv6 address 2001:db8:2:123::2/64 + no shutdown +! +interface r2-eth378 + ip address 10.2.124.2/30 + ipv6 address 2001:db8:2:124::2/64 + no shutdown +! +interface r2-eth379 + ip address 10.2.125.2/30 + ipv6 address 2001:db8:2:125::2/64 + no shutdown +! +interface r2-eth380 + ip address 10.2.126.2/30 + ipv6 address 2001:db8:2:126::2/64 + no shutdown +! +interface r2-eth381 + ip address 10.2.127.2/30 + ipv6 address 2001:db8:2:127::2/64 + no shutdown +! +interface r2-eth382 + ip address 10.2.128.2/30 + ipv6 address 2001:db8:2:128::2/64 + no shutdown +! +interface r2-eth383 + ip address 10.2.129.2/30 + ipv6 address 2001:db8:2:129::2/64 + no shutdown +! +interface r2-eth384 + ip address 10.2.130.2/30 + ipv6 address 2001:db8:2:130::2/64 + no shutdown +! +interface r2-eth385 + ip address 10.2.131.2/30 + ipv6 address 2001:db8:2:131::2/64 + no shutdown +! +interface r2-eth386 + ip address 10.2.132.2/30 + ipv6 address 2001:db8:2:132::2/64 + no shutdown +! +interface r2-eth387 + ip address 10.2.133.2/30 + ipv6 address 2001:db8:2:133::2/64 + no shutdown +! +interface r2-eth388 + ip address 10.2.134.2/30 + ipv6 address 2001:db8:2:134::2/64 + no shutdown +! +interface r2-eth389 + ip address 10.2.135.2/30 + ipv6 address 2001:db8:2:135::2/64 + no shutdown +! +interface r2-eth390 + ip address 10.2.136.2/30 + ipv6 address 2001:db8:2:136::2/64 + no shutdown +! +interface r2-eth391 + ip address 10.2.137.2/30 + ipv6 address 2001:db8:2:137::2/64 + no shutdown +! +interface r2-eth392 + ip address 10.2.138.2/30 + ipv6 address 2001:db8:2:138::2/64 + no shutdown +! +interface r2-eth393 + ip address 10.2.139.2/30 + ipv6 address 2001:db8:2:139::2/64 + no shutdown +! +interface r2-eth394 + ip address 10.2.140.2/30 + ipv6 address 2001:db8:2:140::2/64 + no shutdown +! +interface r2-eth395 + ip address 10.2.141.2/30 + ipv6 address 2001:db8:2:141::2/64 + no shutdown +! +interface r2-eth396 + ip address 10.2.142.2/30 + ipv6 address 2001:db8:2:142::2/64 + no shutdown +! +interface r2-eth397 + ip address 10.2.143.2/30 + ipv6 address 2001:db8:2:143::2/64 + no shutdown +! +interface r2-eth398 + ip address 10.2.144.2/30 + ipv6 address 2001:db8:2:144::2/64 + no shutdown +! +interface r2-eth399 + ip address 10.2.145.2/30 + ipv6 address 2001:db8:2:145::2/64 + no shutdown +! +interface r2-eth400 + ip address 10.2.146.2/30 + ipv6 address 2001:db8:2:146::2/64 + no shutdown +! +interface r2-eth401 + ip address 10.2.147.2/30 + ipv6 address 2001:db8:2:147::2/64 + no shutdown +! +interface r2-eth402 + ip address 10.2.148.2/30 + ipv6 address 2001:db8:2:148::2/64 + no shutdown +! +interface r2-eth403 + ip address 10.2.149.2/30 + ipv6 address 2001:db8:2:149::2/64 + no shutdown +! +interface r2-eth404 + ip address 10.2.150.2/30 + ipv6 address 2001:db8:2:150::2/64 + no shutdown +! +interface r2-eth405 + ip address 10.2.151.2/30 + ipv6 address 2001:db8:2:151::2/64 + no shutdown +! +interface r2-eth406 + ip address 10.2.152.2/30 + ipv6 address 2001:db8:2:152::2/64 + no shutdown +! +interface r2-eth407 + ip address 10.2.153.2/30 + ipv6 address 2001:db8:2:153::2/64 + no shutdown +! +interface r2-eth408 + ip address 10.2.154.2/30 + ipv6 address 2001:db8:2:154::2/64 + no shutdown +! +interface r2-eth409 + ip address 10.2.155.2/30 + ipv6 address 2001:db8:2:155::2/64 + no shutdown +! +interface r2-eth410 + ip address 10.2.156.2/30 + ipv6 address 2001:db8:2:156::2/64 + no shutdown +! +interface r2-eth411 + ip address 10.2.157.2/30 + ipv6 address 2001:db8:2:157::2/64 + no shutdown +! +interface r2-eth412 + ip address 10.2.158.2/30 + ipv6 address 2001:db8:2:158::2/64 + no shutdown +! +interface r2-eth413 + ip address 10.2.159.2/30 + ipv6 address 2001:db8:2:159::2/64 + no shutdown +! +interface r2-eth414 + ip address 10.2.160.2/30 + ipv6 address 2001:db8:2:160::2/64 + no shutdown +! +interface r2-eth415 + ip address 10.2.161.2/30 + ipv6 address 2001:db8:2:161::2/64 + no shutdown +! +interface r2-eth416 + ip address 10.2.162.2/30 + ipv6 address 2001:db8:2:162::2/64 + no shutdown +! +interface r2-eth417 + ip address 10.2.163.2/30 + ipv6 address 2001:db8:2:163::2/64 + no shutdown +! +interface r2-eth418 + ip address 10.2.164.2/30 + ipv6 address 2001:db8:2:164::2/64 + no shutdown +! +interface r2-eth419 + ip address 10.2.165.2/30 + ipv6 address 2001:db8:2:165::2/64 + no shutdown +! +interface r2-eth420 + ip address 10.2.166.2/30 + ipv6 address 2001:db8:2:166::2/64 + no shutdown +! +interface r2-eth421 + ip address 10.2.167.2/30 + ipv6 address 2001:db8:2:167::2/64 + no shutdown +! +interface r2-eth422 + ip address 10.2.168.2/30 + ipv6 address 2001:db8:2:168::2/64 + no shutdown +! +interface r2-eth423 + ip address 10.2.169.2/30 + ipv6 address 2001:db8:2:169::2/64 + no shutdown +! +interface r2-eth424 + ip address 10.2.170.2/30 + ipv6 address 2001:db8:2:170::2/64 + no shutdown +! +interface r2-eth425 + ip address 10.2.171.2/30 + ipv6 address 2001:db8:2:171::2/64 + no shutdown +! +interface r2-eth426 + ip address 10.2.172.2/30 + ipv6 address 2001:db8:2:172::2/64 + no shutdown +! +interface r2-eth427 + ip address 10.2.173.2/30 + ipv6 address 2001:db8:2:173::2/64 + no shutdown +! +interface r2-eth428 + ip address 10.2.174.2/30 + ipv6 address 2001:db8:2:174::2/64 + no shutdown +! +interface r2-eth429 + ip address 10.2.175.2/30 + ipv6 address 2001:db8:2:175::2/64 + no shutdown +! +interface r2-eth430 + ip address 10.2.176.2/30 + ipv6 address 2001:db8:2:176::2/64 + no shutdown +! +interface r2-eth431 + ip address 10.2.177.2/30 + ipv6 address 2001:db8:2:177::2/64 + no shutdown +! +interface r2-eth432 + ip address 10.2.178.2/30 + ipv6 address 2001:db8:2:178::2/64 + no shutdown +! +interface r2-eth433 + ip address 10.2.179.2/30 + ipv6 address 2001:db8:2:179::2/64 + no shutdown +! +interface r2-eth434 + ip address 10.2.180.2/30 + ipv6 address 2001:db8:2:180::2/64 + no shutdown +! +interface r2-eth435 + ip address 10.2.181.2/30 + ipv6 address 2001:db8:2:181::2/64 + no shutdown +! +interface r2-eth436 + ip address 10.2.182.2/30 + ipv6 address 2001:db8:2:182::2/64 + no shutdown +! +interface r2-eth437 + ip address 10.2.183.2/30 + ipv6 address 2001:db8:2:183::2/64 + no shutdown +! +interface r2-eth438 + ip address 10.2.184.2/30 + ipv6 address 2001:db8:2:184::2/64 + no shutdown +! +interface r2-eth439 + ip address 10.2.185.2/30 + ipv6 address 2001:db8:2:185::2/64 + no shutdown +! +interface r2-eth440 + ip address 10.2.186.2/30 + ipv6 address 2001:db8:2:186::2/64 + no shutdown +! +interface r2-eth441 + ip address 10.2.187.2/30 + ipv6 address 2001:db8:2:187::2/64 + no shutdown +! +interface r2-eth442 + ip address 10.2.188.2/30 + ipv6 address 2001:db8:2:188::2/64 + no shutdown +! +interface r2-eth443 + ip address 10.2.189.2/30 + ipv6 address 2001:db8:2:189::2/64 + no shutdown +! +interface r2-eth444 + ip address 10.2.190.2/30 + ipv6 address 2001:db8:2:190::2/64 + no shutdown +! +interface r2-eth445 + ip address 10.2.191.2/30 + ipv6 address 2001:db8:2:191::2/64 + no shutdown +! +interface r2-eth446 + ip address 10.2.192.2/30 + ipv6 address 2001:db8:2:192::2/64 + no shutdown +! +interface r2-eth447 + ip address 10.2.193.2/30 + ipv6 address 2001:db8:2:193::2/64 + no shutdown +! +interface r2-eth448 + ip address 10.2.194.2/30 + ipv6 address 2001:db8:2:194::2/64 + no shutdown +! +interface r2-eth449 + ip address 10.2.195.2/30 + ipv6 address 2001:db8:2:195::2/64 + no shutdown +! +interface r2-eth450 + ip address 10.2.196.2/30 + ipv6 address 2001:db8:2:196::2/64 + no shutdown +! +interface r2-eth451 + ip address 10.2.197.2/30 + ipv6 address 2001:db8:2:197::2/64 + no shutdown +! +interface r2-eth452 + ip address 10.2.198.2/30 + ipv6 address 2001:db8:2:198::2/64 + no shutdown +! +interface r2-eth453 + ip address 10.2.199.2/30 + ipv6 address 2001:db8:2:199::2/64 + no shutdown +! +interface r2-eth454 + ip address 10.2.200.2/30 + ipv6 address 2001:db8:2:200::2/64 + no shutdown +! +interface r2-eth455 + ip address 10.2.201.2/30 + ipv6 address 2001:db8:2:201::2/64 + no shutdown +! +interface r2-eth456 + ip address 10.2.202.2/30 + ipv6 address 2001:db8:2:202::2/64 + no shutdown +! +interface r2-eth457 + ip address 10.2.203.2/30 + ipv6 address 2001:db8:2:203::2/64 + no shutdown +! +interface r2-eth458 + ip address 10.2.204.2/30 + ipv6 address 2001:db8:2:204::2/64 + no shutdown +! +interface r2-eth459 + ip address 10.2.205.2/30 + ipv6 address 2001:db8:2:205::2/64 + no shutdown +! +interface r2-eth460 + ip address 10.2.206.2/30 + ipv6 address 2001:db8:2:206::2/64 + no shutdown +! +interface r2-eth461 + ip address 10.2.207.2/30 + ipv6 address 2001:db8:2:207::2/64 + no shutdown +! +interface r2-eth462 + ip address 10.2.208.2/30 + ipv6 address 2001:db8:2:208::2/64 + no shutdown +! +interface r2-eth463 + ip address 10.2.209.2/30 + ipv6 address 2001:db8:2:209::2/64 + no shutdown +! +interface r2-eth464 + ip address 10.2.210.2/30 + ipv6 address 2001:db8:2:210::2/64 + no shutdown +! +interface r2-eth465 + ip address 10.2.211.2/30 + ipv6 address 2001:db8:2:211::2/64 + no shutdown +! +interface r2-eth466 + ip address 10.2.212.2/30 + ipv6 address 2001:db8:2:212::2/64 + no shutdown +! +interface r2-eth467 + ip address 10.2.213.2/30 + ipv6 address 2001:db8:2:213::2/64 + no shutdown +! +interface r2-eth468 + ip address 10.2.214.2/30 + ipv6 address 2001:db8:2:214::2/64 + no shutdown +! +interface r2-eth469 + ip address 10.2.215.2/30 + ipv6 address 2001:db8:2:215::2/64 + no shutdown +! +interface r2-eth470 + ip address 10.2.216.2/30 + ipv6 address 2001:db8:2:216::2/64 + no shutdown +! +interface r2-eth471 + ip address 10.2.217.2/30 + ipv6 address 2001:db8:2:217::2/64 + no shutdown +! +interface r2-eth472 + ip address 10.2.218.2/30 + ipv6 address 2001:db8:2:218::2/64 + no shutdown +! +interface r2-eth473 + ip address 10.2.219.2/30 + ipv6 address 2001:db8:2:219::2/64 + no shutdown +! +interface r2-eth474 + ip address 10.2.220.2/30 + ipv6 address 2001:db8:2:220::2/64 + no shutdown +! +interface r2-eth475 + ip address 10.2.221.2/30 + ipv6 address 2001:db8:2:221::2/64 + no shutdown +! +interface r2-eth476 + ip address 10.2.222.2/30 + ipv6 address 2001:db8:2:222::2/64 + no shutdown +! +interface r2-eth477 + ip address 10.2.223.2/30 + ipv6 address 2001:db8:2:223::2/64 + no shutdown +! +interface r2-eth478 + ip address 10.2.224.2/30 + ipv6 address 2001:db8:2:224::2/64 + no shutdown +! +interface r2-eth479 + ip address 10.2.225.2/30 + ipv6 address 2001:db8:2:225::2/64 + no shutdown +! +interface r2-eth480 + ip address 10.2.226.2/30 + ipv6 address 2001:db8:2:226::2/64 + no shutdown +! +interface r2-eth481 + ip address 10.2.227.2/30 + ipv6 address 2001:db8:2:227::2/64 + no shutdown +! +interface r2-eth482 + ip address 10.2.228.2/30 + ipv6 address 2001:db8:2:228::2/64 + no shutdown +! +interface r2-eth483 + ip address 10.2.229.2/30 + ipv6 address 2001:db8:2:229::2/64 + no shutdown +! +interface r2-eth484 + ip address 10.2.230.2/30 + ipv6 address 2001:db8:2:230::2/64 + no shutdown +! +interface r2-eth485 + ip address 10.2.231.2/30 + ipv6 address 2001:db8:2:231::2/64 + no shutdown +! +interface r2-eth486 + ip address 10.2.232.2/30 + ipv6 address 2001:db8:2:232::2/64 + no shutdown +! +interface r2-eth487 + ip address 10.2.233.2/30 + ipv6 address 2001:db8:2:233::2/64 + no shutdown +! +interface r2-eth488 + ip address 10.2.234.2/30 + ipv6 address 2001:db8:2:234::2/64 + no shutdown +! +interface r2-eth489 + ip address 10.2.235.2/30 + ipv6 address 2001:db8:2:235::2/64 + no shutdown +! +interface r2-eth490 + ip address 10.2.236.2/30 + ipv6 address 2001:db8:2:236::2/64 + no shutdown +! +interface r2-eth491 + ip address 10.2.237.2/30 + ipv6 address 2001:db8:2:237::2/64 + no shutdown +! +interface r2-eth492 + ip address 10.2.238.2/30 + ipv6 address 2001:db8:2:238::2/64 + no shutdown +! +interface r2-eth493 + ip address 10.2.239.2/30 + ipv6 address 2001:db8:2:239::2/64 + no shutdown +! +interface r2-eth494 + ip address 10.2.240.2/30 + ipv6 address 2001:db8:2:240::2/64 + no shutdown +! +interface r2-eth495 + ip address 10.2.241.2/30 + ipv6 address 2001:db8:2:241::2/64 + no shutdown +! +interface r2-eth496 + ip address 10.2.242.2/30 + ipv6 address 2001:db8:2:242::2/64 + no shutdown +! +interface r2-eth497 + ip address 10.2.243.2/30 + ipv6 address 2001:db8:2:243::2/64 + no shutdown +! +interface r2-eth498 + ip address 10.2.244.2/30 + ipv6 address 2001:db8:2:244::2/64 + no shutdown +! +interface r2-eth499 + ip address 10.2.245.2/30 + ipv6 address 2001:db8:2:245::2/64 + no shutdown +! +interface r2-eth500 + ip address 10.2.246.2/30 + ipv6 address 2001:db8:2:246::2/64 + no shutdown +! +interface r2-eth501 + ip address 10.2.247.2/30 + ipv6 address 2001:db8:2:247::2/64 + no shutdown +! +interface r2-eth502 + ip address 10.2.248.2/30 + ipv6 address 2001:db8:2:248::2/64 + no shutdown +! +interface r2-eth503 + ip address 10.2.249.2/30 + ipv6 address 2001:db8:2:249::2/64 + no shutdown +! +interface r2-eth504 + ip address 10.2.250.2/30 + ipv6 address 2001:db8:2:250::2/64 + no shutdown +! +interface r2-eth505 + ip address 10.2.251.2/30 + ipv6 address 2001:db8:2:251::2/64 + no shutdown +! +interface r2-eth506 + ip address 10.2.252.2/30 + ipv6 address 2001:db8:2:252::2/64 + no shutdown +! +interface r2-eth507 + ip address 10.2.253.2/30 + ipv6 address 2001:db8:2:253::2/64 + no shutdown +! +interface r2-eth508 + ip address 10.2.254.2/30 + ipv6 address 2001:db8:2:254::2/64 + no shutdown +! +interface r2-eth509 + ip address 10.2.255.2/30 + ipv6 address 2001:db8:2:255::2/64 + no shutdown +! +interface r2-eth510 + ip address 10.3.1.2/30 + ipv6 address 2001:db8:3:1::2/64 + no shutdown +! +interface r2-eth511 + ip address 10.3.2.2/30 + ipv6 address 2001:db8:3:2::2/64 + no shutdown +! +interface r2-eth512 + ip address 10.3.3.2/30 + ipv6 address 2001:db8:3:3::2/64 + no shutdown +! +interface r2-eth513 + ip address 10.3.4.2/30 + ipv6 address 2001:db8:3:4::2/64 + no shutdown +! + diff --git a/tests/topotests/high_ecmp/r2/frr_ipv4_bgp.conf b/tests/topotests/high_ecmp/r2/frr_ipv4_bgp.conf new file mode 100644 index 0000000000..48842bbfc2 --- /dev/null +++ b/tests/topotests/high_ecmp/r2/frr_ipv4_bgp.conf @@ -0,0 +1,519 @@ +router bgp 1002 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor 10.1.1.1 remote-as external + neighbor 10.1.2.1 remote-as external + neighbor 10.1.3.1 remote-as external + neighbor 10.1.4.1 remote-as external + neighbor 10.1.5.1 remote-as external + neighbor 10.1.6.1 remote-as external + neighbor 10.1.7.1 remote-as external + neighbor 10.1.8.1 remote-as external + neighbor 10.1.9.1 remote-as external + neighbor 10.1.10.1 remote-as external + neighbor 10.1.11.1 remote-as external + neighbor 10.1.12.1 remote-as external + neighbor 10.1.13.1 remote-as external + neighbor 10.1.14.1 remote-as external + neighbor 10.1.15.1 remote-as external + neighbor 10.1.16.1 remote-as external + neighbor 10.1.17.1 remote-as external + neighbor 10.1.18.1 remote-as external + neighbor 10.1.19.1 remote-as external + neighbor 10.1.20.1 remote-as external + neighbor 10.1.21.1 remote-as external + neighbor 10.1.22.1 remote-as external + neighbor 10.1.23.1 remote-as external + neighbor 10.1.24.1 remote-as external + neighbor 10.1.25.1 remote-as external + neighbor 10.1.26.1 remote-as external + neighbor 10.1.27.1 remote-as external + neighbor 10.1.28.1 remote-as external + neighbor 10.1.29.1 remote-as external + neighbor 10.1.30.1 remote-as external + neighbor 10.1.31.1 remote-as external + neighbor 10.1.32.1 remote-as external + neighbor 10.1.33.1 remote-as external + neighbor 10.1.34.1 remote-as external + neighbor 10.1.35.1 remote-as external + neighbor 10.1.36.1 remote-as external + neighbor 10.1.37.1 remote-as external + neighbor 10.1.38.1 remote-as external + neighbor 10.1.39.1 remote-as external + neighbor 10.1.40.1 remote-as external + neighbor 10.1.41.1 remote-as external + neighbor 10.1.42.1 remote-as external + neighbor 10.1.43.1 remote-as external + neighbor 10.1.44.1 remote-as external + neighbor 10.1.45.1 remote-as external + neighbor 10.1.46.1 remote-as external + neighbor 10.1.47.1 remote-as external + neighbor 10.1.48.1 remote-as external + neighbor 10.1.49.1 remote-as external + neighbor 10.1.50.1 remote-as external + neighbor 10.1.51.1 remote-as external + neighbor 10.1.52.1 remote-as external + neighbor 10.1.53.1 remote-as external + neighbor 10.1.54.1 remote-as external + neighbor 10.1.55.1 remote-as external + neighbor 10.1.56.1 remote-as external + neighbor 10.1.57.1 remote-as external + neighbor 10.1.58.1 remote-as external + neighbor 10.1.59.1 remote-as external + neighbor 10.1.60.1 remote-as external + neighbor 10.1.61.1 remote-as external + neighbor 10.1.62.1 remote-as external + neighbor 10.1.63.1 remote-as external + neighbor 10.1.64.1 remote-as external + neighbor 10.1.65.1 remote-as external + neighbor 10.1.66.1 remote-as external + neighbor 10.1.67.1 remote-as external + neighbor 10.1.68.1 remote-as external + neighbor 10.1.69.1 remote-as external + neighbor 10.1.70.1 remote-as external + neighbor 10.1.71.1 remote-as external + neighbor 10.1.72.1 remote-as external + neighbor 10.1.73.1 remote-as external + neighbor 10.1.74.1 remote-as external + neighbor 10.1.75.1 remote-as external + neighbor 10.1.76.1 remote-as external + neighbor 10.1.77.1 remote-as external + neighbor 10.1.78.1 remote-as external + neighbor 10.1.79.1 remote-as external + neighbor 10.1.80.1 remote-as external + neighbor 10.1.81.1 remote-as external + neighbor 10.1.82.1 remote-as external + neighbor 10.1.83.1 remote-as external + neighbor 10.1.84.1 remote-as external + neighbor 10.1.85.1 remote-as external + neighbor 10.1.86.1 remote-as external + neighbor 10.1.87.1 remote-as external + neighbor 10.1.88.1 remote-as external + neighbor 10.1.89.1 remote-as external + neighbor 10.1.90.1 remote-as external + neighbor 10.1.91.1 remote-as external + neighbor 10.1.92.1 remote-as external + neighbor 10.1.93.1 remote-as external + neighbor 10.1.94.1 remote-as external + neighbor 10.1.95.1 remote-as external + neighbor 10.1.96.1 remote-as external + neighbor 10.1.97.1 remote-as external + neighbor 10.1.98.1 remote-as external + neighbor 10.1.99.1 remote-as external + neighbor 10.1.100.1 remote-as external + neighbor 10.1.101.1 remote-as external + neighbor 10.1.102.1 remote-as external + neighbor 10.1.103.1 remote-as external + neighbor 10.1.104.1 remote-as external + neighbor 10.1.105.1 remote-as external + neighbor 10.1.106.1 remote-as external + neighbor 10.1.107.1 remote-as external + neighbor 10.1.108.1 remote-as external + neighbor 10.1.109.1 remote-as external + neighbor 10.1.110.1 remote-as external + neighbor 10.1.111.1 remote-as external + neighbor 10.1.112.1 remote-as external + neighbor 10.1.113.1 remote-as external + neighbor 10.1.114.1 remote-as external + neighbor 10.1.115.1 remote-as external + neighbor 10.1.116.1 remote-as external + neighbor 10.1.117.1 remote-as external + neighbor 10.1.118.1 remote-as external + neighbor 10.1.119.1 remote-as external + neighbor 10.1.120.1 remote-as external + neighbor 10.1.121.1 remote-as external + neighbor 10.1.122.1 remote-as external + neighbor 10.1.123.1 remote-as external + neighbor 10.1.124.1 remote-as external + neighbor 10.1.125.1 remote-as external + neighbor 10.1.126.1 remote-as external + neighbor 10.1.127.1 remote-as external + neighbor 10.1.128.1 remote-as external + neighbor 10.1.129.1 remote-as external + neighbor 10.1.130.1 remote-as external + neighbor 10.1.131.1 remote-as external + neighbor 10.1.132.1 remote-as external + neighbor 10.1.133.1 remote-as external + neighbor 10.1.134.1 remote-as external + neighbor 10.1.135.1 remote-as external + neighbor 10.1.136.1 remote-as external + neighbor 10.1.137.1 remote-as external + neighbor 10.1.138.1 remote-as external + neighbor 10.1.139.1 remote-as external + neighbor 10.1.140.1 remote-as external + neighbor 10.1.141.1 remote-as external + neighbor 10.1.142.1 remote-as external + neighbor 10.1.143.1 remote-as external + neighbor 10.1.144.1 remote-as external + neighbor 10.1.145.1 remote-as external + neighbor 10.1.146.1 remote-as external + neighbor 10.1.147.1 remote-as external + neighbor 10.1.148.1 remote-as external + neighbor 10.1.149.1 remote-as external + neighbor 10.1.150.1 remote-as external + neighbor 10.1.151.1 remote-as external + neighbor 10.1.152.1 remote-as external + neighbor 10.1.153.1 remote-as external + neighbor 10.1.154.1 remote-as external + neighbor 10.1.155.1 remote-as external + neighbor 10.1.156.1 remote-as external + neighbor 10.1.157.1 remote-as external + neighbor 10.1.158.1 remote-as external + neighbor 10.1.159.1 remote-as external + neighbor 10.1.160.1 remote-as external + neighbor 10.1.161.1 remote-as external + neighbor 10.1.162.1 remote-as external + neighbor 10.1.163.1 remote-as external + neighbor 10.1.164.1 remote-as external + neighbor 10.1.165.1 remote-as external + neighbor 10.1.166.1 remote-as external + neighbor 10.1.167.1 remote-as external + neighbor 10.1.168.1 remote-as external + neighbor 10.1.169.1 remote-as external + neighbor 10.1.170.1 remote-as external + neighbor 10.1.171.1 remote-as external + neighbor 10.1.172.1 remote-as external + neighbor 10.1.173.1 remote-as external + neighbor 10.1.174.1 remote-as external + neighbor 10.1.175.1 remote-as external + neighbor 10.1.176.1 remote-as external + neighbor 10.1.177.1 remote-as external + neighbor 10.1.178.1 remote-as external + neighbor 10.1.179.1 remote-as external + neighbor 10.1.180.1 remote-as external + neighbor 10.1.181.1 remote-as external + neighbor 10.1.182.1 remote-as external + neighbor 10.1.183.1 remote-as external + neighbor 10.1.184.1 remote-as external + neighbor 10.1.185.1 remote-as external + neighbor 10.1.186.1 remote-as external + neighbor 10.1.187.1 remote-as external + neighbor 10.1.188.1 remote-as external + neighbor 10.1.189.1 remote-as external + neighbor 10.1.190.1 remote-as external + neighbor 10.1.191.1 remote-as external + neighbor 10.1.192.1 remote-as external + neighbor 10.1.193.1 remote-as external + neighbor 10.1.194.1 remote-as external + neighbor 10.1.195.1 remote-as external + neighbor 10.1.196.1 remote-as external + neighbor 10.1.197.1 remote-as external + neighbor 10.1.198.1 remote-as external + neighbor 10.1.199.1 remote-as external + neighbor 10.1.200.1 remote-as external + neighbor 10.1.201.1 remote-as external + neighbor 10.1.202.1 remote-as external + neighbor 10.1.203.1 remote-as external + neighbor 10.1.204.1 remote-as external + neighbor 10.1.205.1 remote-as external + neighbor 10.1.206.1 remote-as external + neighbor 10.1.207.1 remote-as external + neighbor 10.1.208.1 remote-as external + neighbor 10.1.209.1 remote-as external + neighbor 10.1.210.1 remote-as external + neighbor 10.1.211.1 remote-as external + neighbor 10.1.212.1 remote-as external + neighbor 10.1.213.1 remote-as external + neighbor 10.1.214.1 remote-as external + neighbor 10.1.215.1 remote-as external + neighbor 10.1.216.1 remote-as external + neighbor 10.1.217.1 remote-as external + neighbor 10.1.218.1 remote-as external + neighbor 10.1.219.1 remote-as external + neighbor 10.1.220.1 remote-as external + neighbor 10.1.221.1 remote-as external + neighbor 10.1.222.1 remote-as external + neighbor 10.1.223.1 remote-as external + neighbor 10.1.224.1 remote-as external + neighbor 10.1.225.1 remote-as external + neighbor 10.1.226.1 remote-as external + neighbor 10.1.227.1 remote-as external + neighbor 10.1.228.1 remote-as external + neighbor 10.1.229.1 remote-as external + neighbor 10.1.230.1 remote-as external + neighbor 10.1.231.1 remote-as external + neighbor 10.1.232.1 remote-as external + neighbor 10.1.233.1 remote-as external + neighbor 10.1.234.1 remote-as external + neighbor 10.1.235.1 remote-as external + neighbor 10.1.236.1 remote-as external + neighbor 10.1.237.1 remote-as external + neighbor 10.1.238.1 remote-as external + neighbor 10.1.239.1 remote-as external + neighbor 10.1.240.1 remote-as external + neighbor 10.1.241.1 remote-as external + neighbor 10.1.242.1 remote-as external + neighbor 10.1.243.1 remote-as external + neighbor 10.1.244.1 remote-as external + neighbor 10.1.245.1 remote-as external + neighbor 10.1.246.1 remote-as external + neighbor 10.1.247.1 remote-as external + neighbor 10.1.248.1 remote-as external + neighbor 10.1.249.1 remote-as external + neighbor 10.1.250.1 remote-as external + neighbor 10.1.251.1 remote-as external + neighbor 10.1.252.1 remote-as external + neighbor 10.1.253.1 remote-as external + neighbor 10.1.254.1 remote-as external + neighbor 10.1.255.1 remote-as external + neighbor 10.2.1.1 remote-as external + neighbor 10.2.2.1 remote-as external + neighbor 10.2.3.1 remote-as external + neighbor 10.2.4.1 remote-as external + neighbor 10.2.5.1 remote-as external + neighbor 10.2.6.1 remote-as external + neighbor 10.2.7.1 remote-as external + neighbor 10.2.8.1 remote-as external + neighbor 10.2.9.1 remote-as external + neighbor 10.2.10.1 remote-as external + neighbor 10.2.11.1 remote-as external + neighbor 10.2.12.1 remote-as external + neighbor 10.2.13.1 remote-as external + neighbor 10.2.14.1 remote-as external + neighbor 10.2.15.1 remote-as external + neighbor 10.2.16.1 remote-as external + neighbor 10.2.17.1 remote-as external + neighbor 10.2.18.1 remote-as external + neighbor 10.2.19.1 remote-as external + neighbor 10.2.20.1 remote-as external + neighbor 10.2.21.1 remote-as external + neighbor 10.2.22.1 remote-as external + neighbor 10.2.23.1 remote-as external + neighbor 10.2.24.1 remote-as external + neighbor 10.2.25.1 remote-as external + neighbor 10.2.26.1 remote-as external + neighbor 10.2.27.1 remote-as external + neighbor 10.2.28.1 remote-as external + neighbor 10.2.29.1 remote-as external + neighbor 10.2.30.1 remote-as external + neighbor 10.2.31.1 remote-as external + neighbor 10.2.32.1 remote-as external + neighbor 10.2.33.1 remote-as external + neighbor 10.2.34.1 remote-as external + neighbor 10.2.35.1 remote-as external + neighbor 10.2.36.1 remote-as external + neighbor 10.2.37.1 remote-as external + neighbor 10.2.38.1 remote-as external + neighbor 10.2.39.1 remote-as external + neighbor 10.2.40.1 remote-as external + neighbor 10.2.41.1 remote-as external + neighbor 10.2.42.1 remote-as external + neighbor 10.2.43.1 remote-as external + neighbor 10.2.44.1 remote-as external + neighbor 10.2.45.1 remote-as external + neighbor 10.2.46.1 remote-as external + neighbor 10.2.47.1 remote-as external + neighbor 10.2.48.1 remote-as external + neighbor 10.2.49.1 remote-as external + neighbor 10.2.50.1 remote-as external + neighbor 10.2.51.1 remote-as external + neighbor 10.2.52.1 remote-as external + neighbor 10.2.53.1 remote-as external + neighbor 10.2.54.1 remote-as external + neighbor 10.2.55.1 remote-as external + neighbor 10.2.56.1 remote-as external + neighbor 10.2.57.1 remote-as external + neighbor 10.2.58.1 remote-as external + neighbor 10.2.59.1 remote-as external + neighbor 10.2.60.1 remote-as external + neighbor 10.2.61.1 remote-as external + neighbor 10.2.62.1 remote-as external + neighbor 10.2.63.1 remote-as external + neighbor 10.2.64.1 remote-as external + neighbor 10.2.65.1 remote-as external + neighbor 10.2.66.1 remote-as external + neighbor 10.2.67.1 remote-as external + neighbor 10.2.68.1 remote-as external + neighbor 10.2.69.1 remote-as external + neighbor 10.2.70.1 remote-as external + neighbor 10.2.71.1 remote-as external + neighbor 10.2.72.1 remote-as external + neighbor 10.2.73.1 remote-as external + neighbor 10.2.74.1 remote-as external + neighbor 10.2.75.1 remote-as external + neighbor 10.2.76.1 remote-as external + neighbor 10.2.77.1 remote-as external + neighbor 10.2.78.1 remote-as external + neighbor 10.2.79.1 remote-as external + neighbor 10.2.80.1 remote-as external + neighbor 10.2.81.1 remote-as external + neighbor 10.2.82.1 remote-as external + neighbor 10.2.83.1 remote-as external + neighbor 10.2.84.1 remote-as external + neighbor 10.2.85.1 remote-as external + neighbor 10.2.86.1 remote-as external + neighbor 10.2.87.1 remote-as external + neighbor 10.2.88.1 remote-as external + neighbor 10.2.89.1 remote-as external + neighbor 10.2.90.1 remote-as external + neighbor 10.2.91.1 remote-as external + neighbor 10.2.92.1 remote-as external + neighbor 10.2.93.1 remote-as external + neighbor 10.2.94.1 remote-as external + neighbor 10.2.95.1 remote-as external + neighbor 10.2.96.1 remote-as external + neighbor 10.2.97.1 remote-as external + neighbor 10.2.98.1 remote-as external + neighbor 10.2.99.1 remote-as external + neighbor 10.2.100.1 remote-as external + neighbor 10.2.101.1 remote-as external + neighbor 10.2.102.1 remote-as external + neighbor 10.2.103.1 remote-as external + neighbor 10.2.104.1 remote-as external + neighbor 10.2.105.1 remote-as external + neighbor 10.2.106.1 remote-as external + neighbor 10.2.107.1 remote-as external + neighbor 10.2.108.1 remote-as external + neighbor 10.2.109.1 remote-as external + neighbor 10.2.110.1 remote-as external + neighbor 10.2.111.1 remote-as external + neighbor 10.2.112.1 remote-as external + neighbor 10.2.113.1 remote-as external + neighbor 10.2.114.1 remote-as external + neighbor 10.2.115.1 remote-as external + neighbor 10.2.116.1 remote-as external + neighbor 10.2.117.1 remote-as external + neighbor 10.2.118.1 remote-as external + neighbor 10.2.119.1 remote-as external + neighbor 10.2.120.1 remote-as external + neighbor 10.2.121.1 remote-as external + neighbor 10.2.122.1 remote-as external + neighbor 10.2.123.1 remote-as external + neighbor 10.2.124.1 remote-as external + neighbor 10.2.125.1 remote-as external + neighbor 10.2.126.1 remote-as external + neighbor 10.2.127.1 remote-as external + neighbor 10.2.128.1 remote-as external + neighbor 10.2.129.1 remote-as external + neighbor 10.2.130.1 remote-as external + neighbor 10.2.131.1 remote-as external + neighbor 10.2.132.1 remote-as external + neighbor 10.2.133.1 remote-as external + neighbor 10.2.134.1 remote-as external + neighbor 10.2.135.1 remote-as external + neighbor 10.2.136.1 remote-as external + neighbor 10.2.137.1 remote-as external + neighbor 10.2.138.1 remote-as external + neighbor 10.2.139.1 remote-as external + neighbor 10.2.140.1 remote-as external + neighbor 10.2.141.1 remote-as external + neighbor 10.2.142.1 remote-as external + neighbor 10.2.143.1 remote-as external + neighbor 10.2.144.1 remote-as external + neighbor 10.2.145.1 remote-as external + neighbor 10.2.146.1 remote-as external + neighbor 10.2.147.1 remote-as external + neighbor 10.2.148.1 remote-as external + neighbor 10.2.149.1 remote-as external + neighbor 10.2.150.1 remote-as external + neighbor 10.2.151.1 remote-as external + neighbor 10.2.152.1 remote-as external + neighbor 10.2.153.1 remote-as external + neighbor 10.2.154.1 remote-as external + neighbor 10.2.155.1 remote-as external + neighbor 10.2.156.1 remote-as external + neighbor 10.2.157.1 remote-as external + neighbor 10.2.158.1 remote-as external + neighbor 10.2.159.1 remote-as external + neighbor 10.2.160.1 remote-as external + neighbor 10.2.161.1 remote-as external + neighbor 10.2.162.1 remote-as external + neighbor 10.2.163.1 remote-as external + neighbor 10.2.164.1 remote-as external + neighbor 10.2.165.1 remote-as external + neighbor 10.2.166.1 remote-as external + neighbor 10.2.167.1 remote-as external + neighbor 10.2.168.1 remote-as external + neighbor 10.2.169.1 remote-as external + neighbor 10.2.170.1 remote-as external + neighbor 10.2.171.1 remote-as external + neighbor 10.2.172.1 remote-as external + neighbor 10.2.173.1 remote-as external + neighbor 10.2.174.1 remote-as external + neighbor 10.2.175.1 remote-as external + neighbor 10.2.176.1 remote-as external + neighbor 10.2.177.1 remote-as external + neighbor 10.2.178.1 remote-as external + neighbor 10.2.179.1 remote-as external + neighbor 10.2.180.1 remote-as external + neighbor 10.2.181.1 remote-as external + neighbor 10.2.182.1 remote-as external + neighbor 10.2.183.1 remote-as external + neighbor 10.2.184.1 remote-as external + neighbor 10.2.185.1 remote-as external + neighbor 10.2.186.1 remote-as external + neighbor 10.2.187.1 remote-as external + neighbor 10.2.188.1 remote-as external + neighbor 10.2.189.1 remote-as external + neighbor 10.2.190.1 remote-as external + neighbor 10.2.191.1 remote-as external + neighbor 10.2.192.1 remote-as external + neighbor 10.2.193.1 remote-as external + neighbor 10.2.194.1 remote-as external + neighbor 10.2.195.1 remote-as external + neighbor 10.2.196.1 remote-as external + neighbor 10.2.197.1 remote-as external + neighbor 10.2.198.1 remote-as external + neighbor 10.2.199.1 remote-as external + neighbor 10.2.200.1 remote-as external + neighbor 10.2.201.1 remote-as external + neighbor 10.2.202.1 remote-as external + neighbor 10.2.203.1 remote-as external + neighbor 10.2.204.1 remote-as external + neighbor 10.2.205.1 remote-as external + neighbor 10.2.206.1 remote-as external + neighbor 10.2.207.1 remote-as external + neighbor 10.2.208.1 remote-as external + neighbor 10.2.209.1 remote-as external + neighbor 10.2.210.1 remote-as external + neighbor 10.2.211.1 remote-as external + neighbor 10.2.212.1 remote-as external + neighbor 10.2.213.1 remote-as external + neighbor 10.2.214.1 remote-as external + neighbor 10.2.215.1 remote-as external + neighbor 10.2.216.1 remote-as external + neighbor 10.2.217.1 remote-as external + neighbor 10.2.218.1 remote-as external + neighbor 10.2.219.1 remote-as external + neighbor 10.2.220.1 remote-as external + neighbor 10.2.221.1 remote-as external + neighbor 10.2.222.1 remote-as external + neighbor 10.2.223.1 remote-as external + neighbor 10.2.224.1 remote-as external + neighbor 10.2.225.1 remote-as external + neighbor 10.2.226.1 remote-as external + neighbor 10.2.227.1 remote-as external + neighbor 10.2.228.1 remote-as external + neighbor 10.2.229.1 remote-as external + neighbor 10.2.230.1 remote-as external + neighbor 10.2.231.1 remote-as external + neighbor 10.2.232.1 remote-as external + neighbor 10.2.233.1 remote-as external + neighbor 10.2.234.1 remote-as external + neighbor 10.2.235.1 remote-as external + neighbor 10.2.236.1 remote-as external + neighbor 10.2.237.1 remote-as external + neighbor 10.2.238.1 remote-as external + neighbor 10.2.239.1 remote-as external + neighbor 10.2.240.1 remote-as external + neighbor 10.2.241.1 remote-as external + neighbor 10.2.242.1 remote-as external + neighbor 10.2.243.1 remote-as external + neighbor 10.2.244.1 remote-as external + neighbor 10.2.245.1 remote-as external + neighbor 10.2.246.1 remote-as external + neighbor 10.2.247.1 remote-as external + neighbor 10.2.248.1 remote-as external + neighbor 10.2.249.1 remote-as external + neighbor 10.2.250.1 remote-as external + neighbor 10.2.251.1 remote-as external + neighbor 10.2.252.1 remote-as external + neighbor 10.2.253.1 remote-as external + neighbor 10.2.254.1 remote-as external + neighbor 10.2.255.1 remote-as external + neighbor 10.3.1.1 remote-as external + neighbor 10.3.2.1 remote-as external + neighbor 10.3.3.1 remote-as external + neighbor 10.3.4.1 remote-as external + diff --git a/tests/topotests/high_ecmp/r2/frr_ipv6_bgp.conf b/tests/topotests/high_ecmp/r2/frr_ipv6_bgp.conf new file mode 100644 index 0000000000..e3258cabd4 --- /dev/null +++ b/tests/topotests/high_ecmp/r2/frr_ipv6_bgp.conf @@ -0,0 +1,1035 @@ +router bgp 1002 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor 2001:db8:1:1::1 remote-as external + neighbor 2001:db8:1:2::1 remote-as external + neighbor 2001:db8:1:3::1 remote-as external + neighbor 2001:db8:1:4::1 remote-as external + neighbor 2001:db8:1:5::1 remote-as external + neighbor 2001:db8:1:6::1 remote-as external + neighbor 2001:db8:1:7::1 remote-as external + neighbor 2001:db8:1:8::1 remote-as external + neighbor 2001:db8:1:9::1 remote-as external + neighbor 2001:db8:1:10::1 remote-as external + neighbor 2001:db8:1:11::1 remote-as external + neighbor 2001:db8:1:12::1 remote-as external + neighbor 2001:db8:1:13::1 remote-as external + neighbor 2001:db8:1:14::1 remote-as external + neighbor 2001:db8:1:15::1 remote-as external + neighbor 2001:db8:1:16::1 remote-as external + neighbor 2001:db8:1:17::1 remote-as external + neighbor 2001:db8:1:18::1 remote-as external + neighbor 2001:db8:1:19::1 remote-as external + neighbor 2001:db8:1:20::1 remote-as external + neighbor 2001:db8:1:21::1 remote-as external + neighbor 2001:db8:1:22::1 remote-as external + neighbor 2001:db8:1:23::1 remote-as external + neighbor 2001:db8:1:24::1 remote-as external + neighbor 2001:db8:1:25::1 remote-as external + neighbor 2001:db8:1:26::1 remote-as external + neighbor 2001:db8:1:27::1 remote-as external + neighbor 2001:db8:1:28::1 remote-as external + neighbor 2001:db8:1:29::1 remote-as external + neighbor 2001:db8:1:30::1 remote-as external + neighbor 2001:db8:1:31::1 remote-as external + neighbor 2001:db8:1:32::1 remote-as external + neighbor 2001:db8:1:33::1 remote-as external + neighbor 2001:db8:1:34::1 remote-as external + neighbor 2001:db8:1:35::1 remote-as external + neighbor 2001:db8:1:36::1 remote-as external + neighbor 2001:db8:1:37::1 remote-as external + neighbor 2001:db8:1:38::1 remote-as external + neighbor 2001:db8:1:39::1 remote-as external + neighbor 2001:db8:1:40::1 remote-as external + neighbor 2001:db8:1:41::1 remote-as external + neighbor 2001:db8:1:42::1 remote-as external + neighbor 2001:db8:1:43::1 remote-as external + neighbor 2001:db8:1:44::1 remote-as external + neighbor 2001:db8:1:45::1 remote-as external + neighbor 2001:db8:1:46::1 remote-as external + neighbor 2001:db8:1:47::1 remote-as external + neighbor 2001:db8:1:48::1 remote-as external + neighbor 2001:db8:1:49::1 remote-as external + neighbor 2001:db8:1:50::1 remote-as external + neighbor 2001:db8:1:51::1 remote-as external + neighbor 2001:db8:1:52::1 remote-as external + neighbor 2001:db8:1:53::1 remote-as external + neighbor 2001:db8:1:54::1 remote-as external + neighbor 2001:db8:1:55::1 remote-as external + neighbor 2001:db8:1:56::1 remote-as external + neighbor 2001:db8:1:57::1 remote-as external + neighbor 2001:db8:1:58::1 remote-as external + neighbor 2001:db8:1:59::1 remote-as external + neighbor 2001:db8:1:60::1 remote-as external + neighbor 2001:db8:1:61::1 remote-as external + neighbor 2001:db8:1:62::1 remote-as external + neighbor 2001:db8:1:63::1 remote-as external + neighbor 2001:db8:1:64::1 remote-as external + neighbor 2001:db8:1:65::1 remote-as external + neighbor 2001:db8:1:66::1 remote-as external + neighbor 2001:db8:1:67::1 remote-as external + neighbor 2001:db8:1:68::1 remote-as external + neighbor 2001:db8:1:69::1 remote-as external + neighbor 2001:db8:1:70::1 remote-as external + neighbor 2001:db8:1:71::1 remote-as external + neighbor 2001:db8:1:72::1 remote-as external + neighbor 2001:db8:1:73::1 remote-as external + neighbor 2001:db8:1:74::1 remote-as external + neighbor 2001:db8:1:75::1 remote-as external + neighbor 2001:db8:1:76::1 remote-as external + neighbor 2001:db8:1:77::1 remote-as external + neighbor 2001:db8:1:78::1 remote-as external + neighbor 2001:db8:1:79::1 remote-as external + neighbor 2001:db8:1:80::1 remote-as external + neighbor 2001:db8:1:81::1 remote-as external + neighbor 2001:db8:1:82::1 remote-as external + neighbor 2001:db8:1:83::1 remote-as external + neighbor 2001:db8:1:84::1 remote-as external + neighbor 2001:db8:1:85::1 remote-as external + neighbor 2001:db8:1:86::1 remote-as external + neighbor 2001:db8:1:87::1 remote-as external + neighbor 2001:db8:1:88::1 remote-as external + neighbor 2001:db8:1:89::1 remote-as external + neighbor 2001:db8:1:90::1 remote-as external + neighbor 2001:db8:1:91::1 remote-as external + neighbor 2001:db8:1:92::1 remote-as external + neighbor 2001:db8:1:93::1 remote-as external + neighbor 2001:db8:1:94::1 remote-as external + neighbor 2001:db8:1:95::1 remote-as external + neighbor 2001:db8:1:96::1 remote-as external + neighbor 2001:db8:1:97::1 remote-as external + neighbor 2001:db8:1:98::1 remote-as external + neighbor 2001:db8:1:99::1 remote-as external + neighbor 2001:db8:1:100::1 remote-as external + neighbor 2001:db8:1:101::1 remote-as external + neighbor 2001:db8:1:102::1 remote-as external + neighbor 2001:db8:1:103::1 remote-as external + neighbor 2001:db8:1:104::1 remote-as external + neighbor 2001:db8:1:105::1 remote-as external + neighbor 2001:db8:1:106::1 remote-as external + neighbor 2001:db8:1:107::1 remote-as external + neighbor 2001:db8:1:108::1 remote-as external + neighbor 2001:db8:1:109::1 remote-as external + neighbor 2001:db8:1:110::1 remote-as external + neighbor 2001:db8:1:111::1 remote-as external + neighbor 2001:db8:1:112::1 remote-as external + neighbor 2001:db8:1:113::1 remote-as external + neighbor 2001:db8:1:114::1 remote-as external + neighbor 2001:db8:1:115::1 remote-as external + neighbor 2001:db8:1:116::1 remote-as external + neighbor 2001:db8:1:117::1 remote-as external + neighbor 2001:db8:1:118::1 remote-as external + neighbor 2001:db8:1:119::1 remote-as external + neighbor 2001:db8:1:120::1 remote-as external + neighbor 2001:db8:1:121::1 remote-as external + neighbor 2001:db8:1:122::1 remote-as external + neighbor 2001:db8:1:123::1 remote-as external + neighbor 2001:db8:1:124::1 remote-as external + neighbor 2001:db8:1:125::1 remote-as external + neighbor 2001:db8:1:126::1 remote-as external + neighbor 2001:db8:1:127::1 remote-as external + neighbor 2001:db8:1:128::1 remote-as external + neighbor 2001:db8:1:129::1 remote-as external + neighbor 2001:db8:1:130::1 remote-as external + neighbor 2001:db8:1:131::1 remote-as external + neighbor 2001:db8:1:132::1 remote-as external + neighbor 2001:db8:1:133::1 remote-as external + neighbor 2001:db8:1:134::1 remote-as external + neighbor 2001:db8:1:135::1 remote-as external + neighbor 2001:db8:1:136::1 remote-as external + neighbor 2001:db8:1:137::1 remote-as external + neighbor 2001:db8:1:138::1 remote-as external + neighbor 2001:db8:1:139::1 remote-as external + neighbor 2001:db8:1:140::1 remote-as external + neighbor 2001:db8:1:141::1 remote-as external + neighbor 2001:db8:1:142::1 remote-as external + neighbor 2001:db8:1:143::1 remote-as external + neighbor 2001:db8:1:144::1 remote-as external + neighbor 2001:db8:1:145::1 remote-as external + neighbor 2001:db8:1:146::1 remote-as external + neighbor 2001:db8:1:147::1 remote-as external + neighbor 2001:db8:1:148::1 remote-as external + neighbor 2001:db8:1:149::1 remote-as external + neighbor 2001:db8:1:150::1 remote-as external + neighbor 2001:db8:1:151::1 remote-as external + neighbor 2001:db8:1:152::1 remote-as external + neighbor 2001:db8:1:153::1 remote-as external + neighbor 2001:db8:1:154::1 remote-as external + neighbor 2001:db8:1:155::1 remote-as external + neighbor 2001:db8:1:156::1 remote-as external + neighbor 2001:db8:1:157::1 remote-as external + neighbor 2001:db8:1:158::1 remote-as external + neighbor 2001:db8:1:159::1 remote-as external + neighbor 2001:db8:1:160::1 remote-as external + neighbor 2001:db8:1:161::1 remote-as external + neighbor 2001:db8:1:162::1 remote-as external + neighbor 2001:db8:1:163::1 remote-as external + neighbor 2001:db8:1:164::1 remote-as external + neighbor 2001:db8:1:165::1 remote-as external + neighbor 2001:db8:1:166::1 remote-as external + neighbor 2001:db8:1:167::1 remote-as external + neighbor 2001:db8:1:168::1 remote-as external + neighbor 2001:db8:1:169::1 remote-as external + neighbor 2001:db8:1:170::1 remote-as external + neighbor 2001:db8:1:171::1 remote-as external + neighbor 2001:db8:1:172::1 remote-as external + neighbor 2001:db8:1:173::1 remote-as external + neighbor 2001:db8:1:174::1 remote-as external + neighbor 2001:db8:1:175::1 remote-as external + neighbor 2001:db8:1:176::1 remote-as external + neighbor 2001:db8:1:177::1 remote-as external + neighbor 2001:db8:1:178::1 remote-as external + neighbor 2001:db8:1:179::1 remote-as external + neighbor 2001:db8:1:180::1 remote-as external + neighbor 2001:db8:1:181::1 remote-as external + neighbor 2001:db8:1:182::1 remote-as external + neighbor 2001:db8:1:183::1 remote-as external + neighbor 2001:db8:1:184::1 remote-as external + neighbor 2001:db8:1:185::1 remote-as external + neighbor 2001:db8:1:186::1 remote-as external + neighbor 2001:db8:1:187::1 remote-as external + neighbor 2001:db8:1:188::1 remote-as external + neighbor 2001:db8:1:189::1 remote-as external + neighbor 2001:db8:1:190::1 remote-as external + neighbor 2001:db8:1:191::1 remote-as external + neighbor 2001:db8:1:192::1 remote-as external + neighbor 2001:db8:1:193::1 remote-as external + neighbor 2001:db8:1:194::1 remote-as external + neighbor 2001:db8:1:195::1 remote-as external + neighbor 2001:db8:1:196::1 remote-as external + neighbor 2001:db8:1:197::1 remote-as external + neighbor 2001:db8:1:198::1 remote-as external + neighbor 2001:db8:1:199::1 remote-as external + neighbor 2001:db8:1:200::1 remote-as external + neighbor 2001:db8:1:201::1 remote-as external + neighbor 2001:db8:1:202::1 remote-as external + neighbor 2001:db8:1:203::1 remote-as external + neighbor 2001:db8:1:204::1 remote-as external + neighbor 2001:db8:1:205::1 remote-as external + neighbor 2001:db8:1:206::1 remote-as external + neighbor 2001:db8:1:207::1 remote-as external + neighbor 2001:db8:1:208::1 remote-as external + neighbor 2001:db8:1:209::1 remote-as external + neighbor 2001:db8:1:210::1 remote-as external + neighbor 2001:db8:1:211::1 remote-as external + neighbor 2001:db8:1:212::1 remote-as external + neighbor 2001:db8:1:213::1 remote-as external + neighbor 2001:db8:1:214::1 remote-as external + neighbor 2001:db8:1:215::1 remote-as external + neighbor 2001:db8:1:216::1 remote-as external + neighbor 2001:db8:1:217::1 remote-as external + neighbor 2001:db8:1:218::1 remote-as external + neighbor 2001:db8:1:219::1 remote-as external + neighbor 2001:db8:1:220::1 remote-as external + neighbor 2001:db8:1:221::1 remote-as external + neighbor 2001:db8:1:222::1 remote-as external + neighbor 2001:db8:1:223::1 remote-as external + neighbor 2001:db8:1:224::1 remote-as external + neighbor 2001:db8:1:225::1 remote-as external + neighbor 2001:db8:1:226::1 remote-as external + neighbor 2001:db8:1:227::1 remote-as external + neighbor 2001:db8:1:228::1 remote-as external + neighbor 2001:db8:1:229::1 remote-as external + neighbor 2001:db8:1:230::1 remote-as external + neighbor 2001:db8:1:231::1 remote-as external + neighbor 2001:db8:1:232::1 remote-as external + neighbor 2001:db8:1:233::1 remote-as external + neighbor 2001:db8:1:234::1 remote-as external + neighbor 2001:db8:1:235::1 remote-as external + neighbor 2001:db8:1:236::1 remote-as external + neighbor 2001:db8:1:237::1 remote-as external + neighbor 2001:db8:1:238::1 remote-as external + neighbor 2001:db8:1:239::1 remote-as external + neighbor 2001:db8:1:240::1 remote-as external + neighbor 2001:db8:1:241::1 remote-as external + neighbor 2001:db8:1:242::1 remote-as external + neighbor 2001:db8:1:243::1 remote-as external + neighbor 2001:db8:1:244::1 remote-as external + neighbor 2001:db8:1:245::1 remote-as external + neighbor 2001:db8:1:246::1 remote-as external + neighbor 2001:db8:1:247::1 remote-as external + neighbor 2001:db8:1:248::1 remote-as external + neighbor 2001:db8:1:249::1 remote-as external + neighbor 2001:db8:1:250::1 remote-as external + neighbor 2001:db8:1:251::1 remote-as external + neighbor 2001:db8:1:252::1 remote-as external + neighbor 2001:db8:1:253::1 remote-as external + neighbor 2001:db8:1:254::1 remote-as external + neighbor 2001:db8:1:255::1 remote-as external + neighbor 2001:db8:2:1::1 remote-as external + neighbor 2001:db8:2:2::1 remote-as external + neighbor 2001:db8:2:3::1 remote-as external + neighbor 2001:db8:2:4::1 remote-as external + neighbor 2001:db8:2:5::1 remote-as external + neighbor 2001:db8:2:6::1 remote-as external + neighbor 2001:db8:2:7::1 remote-as external + neighbor 2001:db8:2:8::1 remote-as external + neighbor 2001:db8:2:9::1 remote-as external + neighbor 2001:db8:2:10::1 remote-as external + neighbor 2001:db8:2:11::1 remote-as external + neighbor 2001:db8:2:12::1 remote-as external + neighbor 2001:db8:2:13::1 remote-as external + neighbor 2001:db8:2:14::1 remote-as external + neighbor 2001:db8:2:15::1 remote-as external + neighbor 2001:db8:2:16::1 remote-as external + neighbor 2001:db8:2:17::1 remote-as external + neighbor 2001:db8:2:18::1 remote-as external + neighbor 2001:db8:2:19::1 remote-as external + neighbor 2001:db8:2:20::1 remote-as external + neighbor 2001:db8:2:21::1 remote-as external + neighbor 2001:db8:2:22::1 remote-as external + neighbor 2001:db8:2:23::1 remote-as external + neighbor 2001:db8:2:24::1 remote-as external + neighbor 2001:db8:2:25::1 remote-as external + neighbor 2001:db8:2:26::1 remote-as external + neighbor 2001:db8:2:27::1 remote-as external + neighbor 2001:db8:2:28::1 remote-as external + neighbor 2001:db8:2:29::1 remote-as external + neighbor 2001:db8:2:30::1 remote-as external + neighbor 2001:db8:2:31::1 remote-as external + neighbor 2001:db8:2:32::1 remote-as external + neighbor 2001:db8:2:33::1 remote-as external + neighbor 2001:db8:2:34::1 remote-as external + neighbor 2001:db8:2:35::1 remote-as external + neighbor 2001:db8:2:36::1 remote-as external + neighbor 2001:db8:2:37::1 remote-as external + neighbor 2001:db8:2:38::1 remote-as external + neighbor 2001:db8:2:39::1 remote-as external + neighbor 2001:db8:2:40::1 remote-as external + neighbor 2001:db8:2:41::1 remote-as external + neighbor 2001:db8:2:42::1 remote-as external + neighbor 2001:db8:2:43::1 remote-as external + neighbor 2001:db8:2:44::1 remote-as external + neighbor 2001:db8:2:45::1 remote-as external + neighbor 2001:db8:2:46::1 remote-as external + neighbor 2001:db8:2:47::1 remote-as external + neighbor 2001:db8:2:48::1 remote-as external + neighbor 2001:db8:2:49::1 remote-as external + neighbor 2001:db8:2:50::1 remote-as external + neighbor 2001:db8:2:51::1 remote-as external + neighbor 2001:db8:2:52::1 remote-as external + neighbor 2001:db8:2:53::1 remote-as external + neighbor 2001:db8:2:54::1 remote-as external + neighbor 2001:db8:2:55::1 remote-as external + neighbor 2001:db8:2:56::1 remote-as external + neighbor 2001:db8:2:57::1 remote-as external + neighbor 2001:db8:2:58::1 remote-as external + neighbor 2001:db8:2:59::1 remote-as external + neighbor 2001:db8:2:60::1 remote-as external + neighbor 2001:db8:2:61::1 remote-as external + neighbor 2001:db8:2:62::1 remote-as external + neighbor 2001:db8:2:63::1 remote-as external + neighbor 2001:db8:2:64::1 remote-as external + neighbor 2001:db8:2:65::1 remote-as external + neighbor 2001:db8:2:66::1 remote-as external + neighbor 2001:db8:2:67::1 remote-as external + neighbor 2001:db8:2:68::1 remote-as external + neighbor 2001:db8:2:69::1 remote-as external + neighbor 2001:db8:2:70::1 remote-as external + neighbor 2001:db8:2:71::1 remote-as external + neighbor 2001:db8:2:72::1 remote-as external + neighbor 2001:db8:2:73::1 remote-as external + neighbor 2001:db8:2:74::1 remote-as external + neighbor 2001:db8:2:75::1 remote-as external + neighbor 2001:db8:2:76::1 remote-as external + neighbor 2001:db8:2:77::1 remote-as external + neighbor 2001:db8:2:78::1 remote-as external + neighbor 2001:db8:2:79::1 remote-as external + neighbor 2001:db8:2:80::1 remote-as external + neighbor 2001:db8:2:81::1 remote-as external + neighbor 2001:db8:2:82::1 remote-as external + neighbor 2001:db8:2:83::1 remote-as external + neighbor 2001:db8:2:84::1 remote-as external + neighbor 2001:db8:2:85::1 remote-as external + neighbor 2001:db8:2:86::1 remote-as external + neighbor 2001:db8:2:87::1 remote-as external + neighbor 2001:db8:2:88::1 remote-as external + neighbor 2001:db8:2:89::1 remote-as external + neighbor 2001:db8:2:90::1 remote-as external + neighbor 2001:db8:2:91::1 remote-as external + neighbor 2001:db8:2:92::1 remote-as external + neighbor 2001:db8:2:93::1 remote-as external + neighbor 2001:db8:2:94::1 remote-as external + neighbor 2001:db8:2:95::1 remote-as external + neighbor 2001:db8:2:96::1 remote-as external + neighbor 2001:db8:2:97::1 remote-as external + neighbor 2001:db8:2:98::1 remote-as external + neighbor 2001:db8:2:99::1 remote-as external + neighbor 2001:db8:2:100::1 remote-as external + neighbor 2001:db8:2:101::1 remote-as external + neighbor 2001:db8:2:102::1 remote-as external + neighbor 2001:db8:2:103::1 remote-as external + neighbor 2001:db8:2:104::1 remote-as external + neighbor 2001:db8:2:105::1 remote-as external + neighbor 2001:db8:2:106::1 remote-as external + neighbor 2001:db8:2:107::1 remote-as external + neighbor 2001:db8:2:108::1 remote-as external + neighbor 2001:db8:2:109::1 remote-as external + neighbor 2001:db8:2:110::1 remote-as external + neighbor 2001:db8:2:111::1 remote-as external + neighbor 2001:db8:2:112::1 remote-as external + neighbor 2001:db8:2:113::1 remote-as external + neighbor 2001:db8:2:114::1 remote-as external + neighbor 2001:db8:2:115::1 remote-as external + neighbor 2001:db8:2:116::1 remote-as external + neighbor 2001:db8:2:117::1 remote-as external + neighbor 2001:db8:2:118::1 remote-as external + neighbor 2001:db8:2:119::1 remote-as external + neighbor 2001:db8:2:120::1 remote-as external + neighbor 2001:db8:2:121::1 remote-as external + neighbor 2001:db8:2:122::1 remote-as external + neighbor 2001:db8:2:123::1 remote-as external + neighbor 2001:db8:2:124::1 remote-as external + neighbor 2001:db8:2:125::1 remote-as external + neighbor 2001:db8:2:126::1 remote-as external + neighbor 2001:db8:2:127::1 remote-as external + neighbor 2001:db8:2:128::1 remote-as external + neighbor 2001:db8:2:129::1 remote-as external + neighbor 2001:db8:2:130::1 remote-as external + neighbor 2001:db8:2:131::1 remote-as external + neighbor 2001:db8:2:132::1 remote-as external + neighbor 2001:db8:2:133::1 remote-as external + neighbor 2001:db8:2:134::1 remote-as external + neighbor 2001:db8:2:135::1 remote-as external + neighbor 2001:db8:2:136::1 remote-as external + neighbor 2001:db8:2:137::1 remote-as external + neighbor 2001:db8:2:138::1 remote-as external + neighbor 2001:db8:2:139::1 remote-as external + neighbor 2001:db8:2:140::1 remote-as external + neighbor 2001:db8:2:141::1 remote-as external + neighbor 2001:db8:2:142::1 remote-as external + neighbor 2001:db8:2:143::1 remote-as external + neighbor 2001:db8:2:144::1 remote-as external + neighbor 2001:db8:2:145::1 remote-as external + neighbor 2001:db8:2:146::1 remote-as external + neighbor 2001:db8:2:147::1 remote-as external + neighbor 2001:db8:2:148::1 remote-as external + neighbor 2001:db8:2:149::1 remote-as external + neighbor 2001:db8:2:150::1 remote-as external + neighbor 2001:db8:2:151::1 remote-as external + neighbor 2001:db8:2:152::1 remote-as external + neighbor 2001:db8:2:153::1 remote-as external + neighbor 2001:db8:2:154::1 remote-as external + neighbor 2001:db8:2:155::1 remote-as external + neighbor 2001:db8:2:156::1 remote-as external + neighbor 2001:db8:2:157::1 remote-as external + neighbor 2001:db8:2:158::1 remote-as external + neighbor 2001:db8:2:159::1 remote-as external + neighbor 2001:db8:2:160::1 remote-as external + neighbor 2001:db8:2:161::1 remote-as external + neighbor 2001:db8:2:162::1 remote-as external + neighbor 2001:db8:2:163::1 remote-as external + neighbor 2001:db8:2:164::1 remote-as external + neighbor 2001:db8:2:165::1 remote-as external + neighbor 2001:db8:2:166::1 remote-as external + neighbor 2001:db8:2:167::1 remote-as external + neighbor 2001:db8:2:168::1 remote-as external + neighbor 2001:db8:2:169::1 remote-as external + neighbor 2001:db8:2:170::1 remote-as external + neighbor 2001:db8:2:171::1 remote-as external + neighbor 2001:db8:2:172::1 remote-as external + neighbor 2001:db8:2:173::1 remote-as external + neighbor 2001:db8:2:174::1 remote-as external + neighbor 2001:db8:2:175::1 remote-as external + neighbor 2001:db8:2:176::1 remote-as external + neighbor 2001:db8:2:177::1 remote-as external + neighbor 2001:db8:2:178::1 remote-as external + neighbor 2001:db8:2:179::1 remote-as external + neighbor 2001:db8:2:180::1 remote-as external + neighbor 2001:db8:2:181::1 remote-as external + neighbor 2001:db8:2:182::1 remote-as external + neighbor 2001:db8:2:183::1 remote-as external + neighbor 2001:db8:2:184::1 remote-as external + neighbor 2001:db8:2:185::1 remote-as external + neighbor 2001:db8:2:186::1 remote-as external + neighbor 2001:db8:2:187::1 remote-as external + neighbor 2001:db8:2:188::1 remote-as external + neighbor 2001:db8:2:189::1 remote-as external + neighbor 2001:db8:2:190::1 remote-as external + neighbor 2001:db8:2:191::1 remote-as external + neighbor 2001:db8:2:192::1 remote-as external + neighbor 2001:db8:2:193::1 remote-as external + neighbor 2001:db8:2:194::1 remote-as external + neighbor 2001:db8:2:195::1 remote-as external + neighbor 2001:db8:2:196::1 remote-as external + neighbor 2001:db8:2:197::1 remote-as external + neighbor 2001:db8:2:198::1 remote-as external + neighbor 2001:db8:2:199::1 remote-as external + neighbor 2001:db8:2:200::1 remote-as external + neighbor 2001:db8:2:201::1 remote-as external + neighbor 2001:db8:2:202::1 remote-as external + neighbor 2001:db8:2:203::1 remote-as external + neighbor 2001:db8:2:204::1 remote-as external + neighbor 2001:db8:2:205::1 remote-as external + neighbor 2001:db8:2:206::1 remote-as external + neighbor 2001:db8:2:207::1 remote-as external + neighbor 2001:db8:2:208::1 remote-as external + neighbor 2001:db8:2:209::1 remote-as external + neighbor 2001:db8:2:210::1 remote-as external + neighbor 2001:db8:2:211::1 remote-as external + neighbor 2001:db8:2:212::1 remote-as external + neighbor 2001:db8:2:213::1 remote-as external + neighbor 2001:db8:2:214::1 remote-as external + neighbor 2001:db8:2:215::1 remote-as external + neighbor 2001:db8:2:216::1 remote-as external + neighbor 2001:db8:2:217::1 remote-as external + neighbor 2001:db8:2:218::1 remote-as external + neighbor 2001:db8:2:219::1 remote-as external + neighbor 2001:db8:2:220::1 remote-as external + neighbor 2001:db8:2:221::1 remote-as external + neighbor 2001:db8:2:222::1 remote-as external + neighbor 2001:db8:2:223::1 remote-as external + neighbor 2001:db8:2:224::1 remote-as external + neighbor 2001:db8:2:225::1 remote-as external + neighbor 2001:db8:2:226::1 remote-as external + neighbor 2001:db8:2:227::1 remote-as external + neighbor 2001:db8:2:228::1 remote-as external + neighbor 2001:db8:2:229::1 remote-as external + neighbor 2001:db8:2:230::1 remote-as external + neighbor 2001:db8:2:231::1 remote-as external + neighbor 2001:db8:2:232::1 remote-as external + neighbor 2001:db8:2:233::1 remote-as external + neighbor 2001:db8:2:234::1 remote-as external + neighbor 2001:db8:2:235::1 remote-as external + neighbor 2001:db8:2:236::1 remote-as external + neighbor 2001:db8:2:237::1 remote-as external + neighbor 2001:db8:2:238::1 remote-as external + neighbor 2001:db8:2:239::1 remote-as external + neighbor 2001:db8:2:240::1 remote-as external + neighbor 2001:db8:2:241::1 remote-as external + neighbor 2001:db8:2:242::1 remote-as external + neighbor 2001:db8:2:243::1 remote-as external + neighbor 2001:db8:2:244::1 remote-as external + neighbor 2001:db8:2:245::1 remote-as external + neighbor 2001:db8:2:246::1 remote-as external + neighbor 2001:db8:2:247::1 remote-as external + neighbor 2001:db8:2:248::1 remote-as external + neighbor 2001:db8:2:249::1 remote-as external + neighbor 2001:db8:2:250::1 remote-as external + neighbor 2001:db8:2:251::1 remote-as external + neighbor 2001:db8:2:252::1 remote-as external + neighbor 2001:db8:2:253::1 remote-as external + neighbor 2001:db8:2:254::1 remote-as external + neighbor 2001:db8:2:255::1 remote-as external + neighbor 2001:db8:3:1::1 remote-as external + neighbor 2001:db8:3:2::1 remote-as external + neighbor 2001:db8:3:3::1 remote-as external + neighbor 2001:db8:3:4::1 remote-as external + address-family ipv6 unicast + neighbor 2001:db8:1:1::1 activate + neighbor 2001:db8:1:2::1 activate + neighbor 2001:db8:1:3::1 activate + neighbor 2001:db8:1:4::1 activate + neighbor 2001:db8:1:5::1 activate + neighbor 2001:db8:1:6::1 activate + neighbor 2001:db8:1:7::1 activate + neighbor 2001:db8:1:8::1 activate + neighbor 2001:db8:1:9::1 activate + neighbor 2001:db8:1:10::1 activate + neighbor 2001:db8:1:11::1 activate + neighbor 2001:db8:1:12::1 activate + neighbor 2001:db8:1:13::1 activate + neighbor 2001:db8:1:14::1 activate + neighbor 2001:db8:1:15::1 activate + neighbor 2001:db8:1:16::1 activate + neighbor 2001:db8:1:17::1 activate + neighbor 2001:db8:1:18::1 activate + neighbor 2001:db8:1:19::1 activate + neighbor 2001:db8:1:20::1 activate + neighbor 2001:db8:1:21::1 activate + neighbor 2001:db8:1:22::1 activate + neighbor 2001:db8:1:23::1 activate + neighbor 2001:db8:1:24::1 activate + neighbor 2001:db8:1:25::1 activate + neighbor 2001:db8:1:26::1 activate + neighbor 2001:db8:1:27::1 activate + neighbor 2001:db8:1:28::1 activate + neighbor 2001:db8:1:29::1 activate + neighbor 2001:db8:1:30::1 activate + neighbor 2001:db8:1:31::1 activate + neighbor 2001:db8:1:32::1 activate + neighbor 2001:db8:1:33::1 activate + neighbor 2001:db8:1:34::1 activate + neighbor 2001:db8:1:35::1 activate + neighbor 2001:db8:1:36::1 activate + neighbor 2001:db8:1:37::1 activate + neighbor 2001:db8:1:38::1 activate + neighbor 2001:db8:1:39::1 activate + neighbor 2001:db8:1:40::1 activate + neighbor 2001:db8:1:41::1 activate + neighbor 2001:db8:1:42::1 activate + neighbor 2001:db8:1:43::1 activate + neighbor 2001:db8:1:44::1 activate + neighbor 2001:db8:1:45::1 activate + neighbor 2001:db8:1:46::1 activate + neighbor 2001:db8:1:47::1 activate + neighbor 2001:db8:1:48::1 activate + neighbor 2001:db8:1:49::1 activate + neighbor 2001:db8:1:50::1 activate + neighbor 2001:db8:1:51::1 activate + neighbor 2001:db8:1:52::1 activate + neighbor 2001:db8:1:53::1 activate + neighbor 2001:db8:1:54::1 activate + neighbor 2001:db8:1:55::1 activate + neighbor 2001:db8:1:56::1 activate + neighbor 2001:db8:1:57::1 activate + neighbor 2001:db8:1:58::1 activate + neighbor 2001:db8:1:59::1 activate + neighbor 2001:db8:1:60::1 activate + neighbor 2001:db8:1:61::1 activate + neighbor 2001:db8:1:62::1 activate + neighbor 2001:db8:1:63::1 activate + neighbor 2001:db8:1:64::1 activate + neighbor 2001:db8:1:65::1 activate + neighbor 2001:db8:1:66::1 activate + neighbor 2001:db8:1:67::1 activate + neighbor 2001:db8:1:68::1 activate + neighbor 2001:db8:1:69::1 activate + neighbor 2001:db8:1:70::1 activate + neighbor 2001:db8:1:71::1 activate + neighbor 2001:db8:1:72::1 activate + neighbor 2001:db8:1:73::1 activate + neighbor 2001:db8:1:74::1 activate + neighbor 2001:db8:1:75::1 activate + neighbor 2001:db8:1:76::1 activate + neighbor 2001:db8:1:77::1 activate + neighbor 2001:db8:1:78::1 activate + neighbor 2001:db8:1:79::1 activate + neighbor 2001:db8:1:80::1 activate + neighbor 2001:db8:1:81::1 activate + neighbor 2001:db8:1:82::1 activate + neighbor 2001:db8:1:83::1 activate + neighbor 2001:db8:1:84::1 activate + neighbor 2001:db8:1:85::1 activate + neighbor 2001:db8:1:86::1 activate + neighbor 2001:db8:1:87::1 activate + neighbor 2001:db8:1:88::1 activate + neighbor 2001:db8:1:89::1 activate + neighbor 2001:db8:1:90::1 activate + neighbor 2001:db8:1:91::1 activate + neighbor 2001:db8:1:92::1 activate + neighbor 2001:db8:1:93::1 activate + neighbor 2001:db8:1:94::1 activate + neighbor 2001:db8:1:95::1 activate + neighbor 2001:db8:1:96::1 activate + neighbor 2001:db8:1:97::1 activate + neighbor 2001:db8:1:98::1 activate + neighbor 2001:db8:1:99::1 activate + neighbor 2001:db8:1:100::1 activate + neighbor 2001:db8:1:101::1 activate + neighbor 2001:db8:1:102::1 activate + neighbor 2001:db8:1:103::1 activate + neighbor 2001:db8:1:104::1 activate + neighbor 2001:db8:1:105::1 activate + neighbor 2001:db8:1:106::1 activate + neighbor 2001:db8:1:107::1 activate + neighbor 2001:db8:1:108::1 activate + neighbor 2001:db8:1:109::1 activate + neighbor 2001:db8:1:110::1 activate + neighbor 2001:db8:1:111::1 activate + neighbor 2001:db8:1:112::1 activate + neighbor 2001:db8:1:113::1 activate + neighbor 2001:db8:1:114::1 activate + neighbor 2001:db8:1:115::1 activate + neighbor 2001:db8:1:116::1 activate + neighbor 2001:db8:1:117::1 activate + neighbor 2001:db8:1:118::1 activate + neighbor 2001:db8:1:119::1 activate + neighbor 2001:db8:1:120::1 activate + neighbor 2001:db8:1:121::1 activate + neighbor 2001:db8:1:122::1 activate + neighbor 2001:db8:1:123::1 activate + neighbor 2001:db8:1:124::1 activate + neighbor 2001:db8:1:125::1 activate + neighbor 2001:db8:1:126::1 activate + neighbor 2001:db8:1:127::1 activate + neighbor 2001:db8:1:128::1 activate + neighbor 2001:db8:1:129::1 activate + neighbor 2001:db8:1:130::1 activate + neighbor 2001:db8:1:131::1 activate + neighbor 2001:db8:1:132::1 activate + neighbor 2001:db8:1:133::1 activate + neighbor 2001:db8:1:134::1 activate + neighbor 2001:db8:1:135::1 activate + neighbor 2001:db8:1:136::1 activate + neighbor 2001:db8:1:137::1 activate + neighbor 2001:db8:1:138::1 activate + neighbor 2001:db8:1:139::1 activate + neighbor 2001:db8:1:140::1 activate + neighbor 2001:db8:1:141::1 activate + neighbor 2001:db8:1:142::1 activate + neighbor 2001:db8:1:143::1 activate + neighbor 2001:db8:1:144::1 activate + neighbor 2001:db8:1:145::1 activate + neighbor 2001:db8:1:146::1 activate + neighbor 2001:db8:1:147::1 activate + neighbor 2001:db8:1:148::1 activate + neighbor 2001:db8:1:149::1 activate + neighbor 2001:db8:1:150::1 activate + neighbor 2001:db8:1:151::1 activate + neighbor 2001:db8:1:152::1 activate + neighbor 2001:db8:1:153::1 activate + neighbor 2001:db8:1:154::1 activate + neighbor 2001:db8:1:155::1 activate + neighbor 2001:db8:1:156::1 activate + neighbor 2001:db8:1:157::1 activate + neighbor 2001:db8:1:158::1 activate + neighbor 2001:db8:1:159::1 activate + neighbor 2001:db8:1:160::1 activate + neighbor 2001:db8:1:161::1 activate + neighbor 2001:db8:1:162::1 activate + neighbor 2001:db8:1:163::1 activate + neighbor 2001:db8:1:164::1 activate + neighbor 2001:db8:1:165::1 activate + neighbor 2001:db8:1:166::1 activate + neighbor 2001:db8:1:167::1 activate + neighbor 2001:db8:1:168::1 activate + neighbor 2001:db8:1:169::1 activate + neighbor 2001:db8:1:170::1 activate + neighbor 2001:db8:1:171::1 activate + neighbor 2001:db8:1:172::1 activate + neighbor 2001:db8:1:173::1 activate + neighbor 2001:db8:1:174::1 activate + neighbor 2001:db8:1:175::1 activate + neighbor 2001:db8:1:176::1 activate + neighbor 2001:db8:1:177::1 activate + neighbor 2001:db8:1:178::1 activate + neighbor 2001:db8:1:179::1 activate + neighbor 2001:db8:1:180::1 activate + neighbor 2001:db8:1:181::1 activate + neighbor 2001:db8:1:182::1 activate + neighbor 2001:db8:1:183::1 activate + neighbor 2001:db8:1:184::1 activate + neighbor 2001:db8:1:185::1 activate + neighbor 2001:db8:1:186::1 activate + neighbor 2001:db8:1:187::1 activate + neighbor 2001:db8:1:188::1 activate + neighbor 2001:db8:1:189::1 activate + neighbor 2001:db8:1:190::1 activate + neighbor 2001:db8:1:191::1 activate + neighbor 2001:db8:1:192::1 activate + neighbor 2001:db8:1:193::1 activate + neighbor 2001:db8:1:194::1 activate + neighbor 2001:db8:1:195::1 activate + neighbor 2001:db8:1:196::1 activate + neighbor 2001:db8:1:197::1 activate + neighbor 2001:db8:1:198::1 activate + neighbor 2001:db8:1:199::1 activate + neighbor 2001:db8:1:200::1 activate + neighbor 2001:db8:1:201::1 activate + neighbor 2001:db8:1:202::1 activate + neighbor 2001:db8:1:203::1 activate + neighbor 2001:db8:1:204::1 activate + neighbor 2001:db8:1:205::1 activate + neighbor 2001:db8:1:206::1 activate + neighbor 2001:db8:1:207::1 activate + neighbor 2001:db8:1:208::1 activate + neighbor 2001:db8:1:209::1 activate + neighbor 2001:db8:1:210::1 activate + neighbor 2001:db8:1:211::1 activate + neighbor 2001:db8:1:212::1 activate + neighbor 2001:db8:1:213::1 activate + neighbor 2001:db8:1:214::1 activate + neighbor 2001:db8:1:215::1 activate + neighbor 2001:db8:1:216::1 activate + neighbor 2001:db8:1:217::1 activate + neighbor 2001:db8:1:218::1 activate + neighbor 2001:db8:1:219::1 activate + neighbor 2001:db8:1:220::1 activate + neighbor 2001:db8:1:221::1 activate + neighbor 2001:db8:1:222::1 activate + neighbor 2001:db8:1:223::1 activate + neighbor 2001:db8:1:224::1 activate + neighbor 2001:db8:1:225::1 activate + neighbor 2001:db8:1:226::1 activate + neighbor 2001:db8:1:227::1 activate + neighbor 2001:db8:1:228::1 activate + neighbor 2001:db8:1:229::1 activate + neighbor 2001:db8:1:230::1 activate + neighbor 2001:db8:1:231::1 activate + neighbor 2001:db8:1:232::1 activate + neighbor 2001:db8:1:233::1 activate + neighbor 2001:db8:1:234::1 activate + neighbor 2001:db8:1:235::1 activate + neighbor 2001:db8:1:236::1 activate + neighbor 2001:db8:1:237::1 activate + neighbor 2001:db8:1:238::1 activate + neighbor 2001:db8:1:239::1 activate + neighbor 2001:db8:1:240::1 activate + neighbor 2001:db8:1:241::1 activate + neighbor 2001:db8:1:242::1 activate + neighbor 2001:db8:1:243::1 activate + neighbor 2001:db8:1:244::1 activate + neighbor 2001:db8:1:245::1 activate + neighbor 2001:db8:1:246::1 activate + neighbor 2001:db8:1:247::1 activate + neighbor 2001:db8:1:248::1 activate + neighbor 2001:db8:1:249::1 activate + neighbor 2001:db8:1:250::1 activate + neighbor 2001:db8:1:251::1 activate + neighbor 2001:db8:1:252::1 activate + neighbor 2001:db8:1:253::1 activate + neighbor 2001:db8:1:254::1 activate + neighbor 2001:db8:1:255::1 activate + neighbor 2001:db8:2:1::1 activate + neighbor 2001:db8:2:2::1 activate + neighbor 2001:db8:2:3::1 activate + neighbor 2001:db8:2:4::1 activate + neighbor 2001:db8:2:5::1 activate + neighbor 2001:db8:2:6::1 activate + neighbor 2001:db8:2:7::1 activate + neighbor 2001:db8:2:8::1 activate + neighbor 2001:db8:2:9::1 activate + neighbor 2001:db8:2:10::1 activate + neighbor 2001:db8:2:11::1 activate + neighbor 2001:db8:2:12::1 activate + neighbor 2001:db8:2:13::1 activate + neighbor 2001:db8:2:14::1 activate + neighbor 2001:db8:2:15::1 activate + neighbor 2001:db8:2:16::1 activate + neighbor 2001:db8:2:17::1 activate + neighbor 2001:db8:2:18::1 activate + neighbor 2001:db8:2:19::1 activate + neighbor 2001:db8:2:20::1 activate + neighbor 2001:db8:2:21::1 activate + neighbor 2001:db8:2:22::1 activate + neighbor 2001:db8:2:23::1 activate + neighbor 2001:db8:2:24::1 activate + neighbor 2001:db8:2:25::1 activate + neighbor 2001:db8:2:26::1 activate + neighbor 2001:db8:2:27::1 activate + neighbor 2001:db8:2:28::1 activate + neighbor 2001:db8:2:29::1 activate + neighbor 2001:db8:2:30::1 activate + neighbor 2001:db8:2:31::1 activate + neighbor 2001:db8:2:32::1 activate + neighbor 2001:db8:2:33::1 activate + neighbor 2001:db8:2:34::1 activate + neighbor 2001:db8:2:35::1 activate + neighbor 2001:db8:2:36::1 activate + neighbor 2001:db8:2:37::1 activate + neighbor 2001:db8:2:38::1 activate + neighbor 2001:db8:2:39::1 activate + neighbor 2001:db8:2:40::1 activate + neighbor 2001:db8:2:41::1 activate + neighbor 2001:db8:2:42::1 activate + neighbor 2001:db8:2:43::1 activate + neighbor 2001:db8:2:44::1 activate + neighbor 2001:db8:2:45::1 activate + neighbor 2001:db8:2:46::1 activate + neighbor 2001:db8:2:47::1 activate + neighbor 2001:db8:2:48::1 activate + neighbor 2001:db8:2:49::1 activate + neighbor 2001:db8:2:50::1 activate + neighbor 2001:db8:2:51::1 activate + neighbor 2001:db8:2:52::1 activate + neighbor 2001:db8:2:53::1 activate + neighbor 2001:db8:2:54::1 activate + neighbor 2001:db8:2:55::1 activate + neighbor 2001:db8:2:56::1 activate + neighbor 2001:db8:2:57::1 activate + neighbor 2001:db8:2:58::1 activate + neighbor 2001:db8:2:59::1 activate + neighbor 2001:db8:2:60::1 activate + neighbor 2001:db8:2:61::1 activate + neighbor 2001:db8:2:62::1 activate + neighbor 2001:db8:2:63::1 activate + neighbor 2001:db8:2:64::1 activate + neighbor 2001:db8:2:65::1 activate + neighbor 2001:db8:2:66::1 activate + neighbor 2001:db8:2:67::1 activate + neighbor 2001:db8:2:68::1 activate + neighbor 2001:db8:2:69::1 activate + neighbor 2001:db8:2:70::1 activate + neighbor 2001:db8:2:71::1 activate + neighbor 2001:db8:2:72::1 activate + neighbor 2001:db8:2:73::1 activate + neighbor 2001:db8:2:74::1 activate + neighbor 2001:db8:2:75::1 activate + neighbor 2001:db8:2:76::1 activate + neighbor 2001:db8:2:77::1 activate + neighbor 2001:db8:2:78::1 activate + neighbor 2001:db8:2:79::1 activate + neighbor 2001:db8:2:80::1 activate + neighbor 2001:db8:2:81::1 activate + neighbor 2001:db8:2:82::1 activate + neighbor 2001:db8:2:83::1 activate + neighbor 2001:db8:2:84::1 activate + neighbor 2001:db8:2:85::1 activate + neighbor 2001:db8:2:86::1 activate + neighbor 2001:db8:2:87::1 activate + neighbor 2001:db8:2:88::1 activate + neighbor 2001:db8:2:89::1 activate + neighbor 2001:db8:2:90::1 activate + neighbor 2001:db8:2:91::1 activate + neighbor 2001:db8:2:92::1 activate + neighbor 2001:db8:2:93::1 activate + neighbor 2001:db8:2:94::1 activate + neighbor 2001:db8:2:95::1 activate + neighbor 2001:db8:2:96::1 activate + neighbor 2001:db8:2:97::1 activate + neighbor 2001:db8:2:98::1 activate + neighbor 2001:db8:2:99::1 activate + neighbor 2001:db8:2:100::1 activate + neighbor 2001:db8:2:101::1 activate + neighbor 2001:db8:2:102::1 activate + neighbor 2001:db8:2:103::1 activate + neighbor 2001:db8:2:104::1 activate + neighbor 2001:db8:2:105::1 activate + neighbor 2001:db8:2:106::1 activate + neighbor 2001:db8:2:107::1 activate + neighbor 2001:db8:2:108::1 activate + neighbor 2001:db8:2:109::1 activate + neighbor 2001:db8:2:110::1 activate + neighbor 2001:db8:2:111::1 activate + neighbor 2001:db8:2:112::1 activate + neighbor 2001:db8:2:113::1 activate + neighbor 2001:db8:2:114::1 activate + neighbor 2001:db8:2:115::1 activate + neighbor 2001:db8:2:116::1 activate + neighbor 2001:db8:2:117::1 activate + neighbor 2001:db8:2:118::1 activate + neighbor 2001:db8:2:119::1 activate + neighbor 2001:db8:2:120::1 activate + neighbor 2001:db8:2:121::1 activate + neighbor 2001:db8:2:122::1 activate + neighbor 2001:db8:2:123::1 activate + neighbor 2001:db8:2:124::1 activate + neighbor 2001:db8:2:125::1 activate + neighbor 2001:db8:2:126::1 activate + neighbor 2001:db8:2:127::1 activate + neighbor 2001:db8:2:128::1 activate + neighbor 2001:db8:2:129::1 activate + neighbor 2001:db8:2:130::1 activate + neighbor 2001:db8:2:131::1 activate + neighbor 2001:db8:2:132::1 activate + neighbor 2001:db8:2:133::1 activate + neighbor 2001:db8:2:134::1 activate + neighbor 2001:db8:2:135::1 activate + neighbor 2001:db8:2:136::1 activate + neighbor 2001:db8:2:137::1 activate + neighbor 2001:db8:2:138::1 activate + neighbor 2001:db8:2:139::1 activate + neighbor 2001:db8:2:140::1 activate + neighbor 2001:db8:2:141::1 activate + neighbor 2001:db8:2:142::1 activate + neighbor 2001:db8:2:143::1 activate + neighbor 2001:db8:2:144::1 activate + neighbor 2001:db8:2:145::1 activate + neighbor 2001:db8:2:146::1 activate + neighbor 2001:db8:2:147::1 activate + neighbor 2001:db8:2:148::1 activate + neighbor 2001:db8:2:149::1 activate + neighbor 2001:db8:2:150::1 activate + neighbor 2001:db8:2:151::1 activate + neighbor 2001:db8:2:152::1 activate + neighbor 2001:db8:2:153::1 activate + neighbor 2001:db8:2:154::1 activate + neighbor 2001:db8:2:155::1 activate + neighbor 2001:db8:2:156::1 activate + neighbor 2001:db8:2:157::1 activate + neighbor 2001:db8:2:158::1 activate + neighbor 2001:db8:2:159::1 activate + neighbor 2001:db8:2:160::1 activate + neighbor 2001:db8:2:161::1 activate + neighbor 2001:db8:2:162::1 activate + neighbor 2001:db8:2:163::1 activate + neighbor 2001:db8:2:164::1 activate + neighbor 2001:db8:2:165::1 activate + neighbor 2001:db8:2:166::1 activate + neighbor 2001:db8:2:167::1 activate + neighbor 2001:db8:2:168::1 activate + neighbor 2001:db8:2:169::1 activate + neighbor 2001:db8:2:170::1 activate + neighbor 2001:db8:2:171::1 activate + neighbor 2001:db8:2:172::1 activate + neighbor 2001:db8:2:173::1 activate + neighbor 2001:db8:2:174::1 activate + neighbor 2001:db8:2:175::1 activate + neighbor 2001:db8:2:176::1 activate + neighbor 2001:db8:2:177::1 activate + neighbor 2001:db8:2:178::1 activate + neighbor 2001:db8:2:179::1 activate + neighbor 2001:db8:2:180::1 activate + neighbor 2001:db8:2:181::1 activate + neighbor 2001:db8:2:182::1 activate + neighbor 2001:db8:2:183::1 activate + neighbor 2001:db8:2:184::1 activate + neighbor 2001:db8:2:185::1 activate + neighbor 2001:db8:2:186::1 activate + neighbor 2001:db8:2:187::1 activate + neighbor 2001:db8:2:188::1 activate + neighbor 2001:db8:2:189::1 activate + neighbor 2001:db8:2:190::1 activate + neighbor 2001:db8:2:191::1 activate + neighbor 2001:db8:2:192::1 activate + neighbor 2001:db8:2:193::1 activate + neighbor 2001:db8:2:194::1 activate + neighbor 2001:db8:2:195::1 activate + neighbor 2001:db8:2:196::1 activate + neighbor 2001:db8:2:197::1 activate + neighbor 2001:db8:2:198::1 activate + neighbor 2001:db8:2:199::1 activate + neighbor 2001:db8:2:200::1 activate + neighbor 2001:db8:2:201::1 activate + neighbor 2001:db8:2:202::1 activate + neighbor 2001:db8:2:203::1 activate + neighbor 2001:db8:2:204::1 activate + neighbor 2001:db8:2:205::1 activate + neighbor 2001:db8:2:206::1 activate + neighbor 2001:db8:2:207::1 activate + neighbor 2001:db8:2:208::1 activate + neighbor 2001:db8:2:209::1 activate + neighbor 2001:db8:2:210::1 activate + neighbor 2001:db8:2:211::1 activate + neighbor 2001:db8:2:212::1 activate + neighbor 2001:db8:2:213::1 activate + neighbor 2001:db8:2:214::1 activate + neighbor 2001:db8:2:215::1 activate + neighbor 2001:db8:2:216::1 activate + neighbor 2001:db8:2:217::1 activate + neighbor 2001:db8:2:218::1 activate + neighbor 2001:db8:2:219::1 activate + neighbor 2001:db8:2:220::1 activate + neighbor 2001:db8:2:221::1 activate + neighbor 2001:db8:2:222::1 activate + neighbor 2001:db8:2:223::1 activate + neighbor 2001:db8:2:224::1 activate + neighbor 2001:db8:2:225::1 activate + neighbor 2001:db8:2:226::1 activate + neighbor 2001:db8:2:227::1 activate + neighbor 2001:db8:2:228::1 activate + neighbor 2001:db8:2:229::1 activate + neighbor 2001:db8:2:230::1 activate + neighbor 2001:db8:2:231::1 activate + neighbor 2001:db8:2:232::1 activate + neighbor 2001:db8:2:233::1 activate + neighbor 2001:db8:2:234::1 activate + neighbor 2001:db8:2:235::1 activate + neighbor 2001:db8:2:236::1 activate + neighbor 2001:db8:2:237::1 activate + neighbor 2001:db8:2:238::1 activate + neighbor 2001:db8:2:239::1 activate + neighbor 2001:db8:2:240::1 activate + neighbor 2001:db8:2:241::1 activate + neighbor 2001:db8:2:242::1 activate + neighbor 2001:db8:2:243::1 activate + neighbor 2001:db8:2:244::1 activate + neighbor 2001:db8:2:245::1 activate + neighbor 2001:db8:2:246::1 activate + neighbor 2001:db8:2:247::1 activate + neighbor 2001:db8:2:248::1 activate + neighbor 2001:db8:2:249::1 activate + neighbor 2001:db8:2:250::1 activate + neighbor 2001:db8:2:251::1 activate + neighbor 2001:db8:2:252::1 activate + neighbor 2001:db8:2:253::1 activate + neighbor 2001:db8:2:254::1 activate + neighbor 2001:db8:2:255::1 activate + neighbor 2001:db8:3:1::1 activate + neighbor 2001:db8:3:2::1 activate + neighbor 2001:db8:3:3::1 activate + neighbor 2001:db8:3:4::1 activate + exit-address-family + exit diff --git a/tests/topotests/high_ecmp/r2/frr_unnumbered_bgp.conf b/tests/topotests/high_ecmp/r2/frr_unnumbered_bgp.conf new file mode 100644 index 0000000000..23827789fb --- /dev/null +++ b/tests/topotests/high_ecmp/r2/frr_unnumbered_bgp.conf @@ -0,0 +1,520 @@ +router bgp 1002 + timers bgp 5 20 + no bgp ebgp-requires-policy + read-quanta 1 + neighbor r2-eth0 interface remote-as external + neighbor r2-eth1 interface remote-as external + neighbor r2-eth2 interface remote-as external + neighbor r2-eth3 interface remote-as external + neighbor r2-eth4 interface remote-as external + neighbor r2-eth5 interface remote-as external + neighbor r2-eth6 interface remote-as external + neighbor r2-eth7 interface remote-as external + neighbor r2-eth8 interface remote-as external + neighbor r2-eth9 interface remote-as external + neighbor r2-eth10 interface remote-as external + neighbor r2-eth11 interface remote-as external + neighbor r2-eth12 interface remote-as external + neighbor r2-eth13 interface remote-as external + neighbor r2-eth14 interface remote-as external + neighbor r2-eth15 interface remote-as external + neighbor r2-eth16 interface remote-as external + neighbor r2-eth17 interface remote-as external + neighbor r2-eth18 interface remote-as external + neighbor r2-eth19 interface remote-as external + neighbor r2-eth20 interface remote-as external + neighbor r2-eth21 interface remote-as external + neighbor r2-eth22 interface remote-as external + neighbor r2-eth23 interface remote-as external + neighbor r2-eth24 interface remote-as external + neighbor r2-eth25 interface remote-as external + neighbor r2-eth26 interface remote-as external + neighbor r2-eth27 interface remote-as external + neighbor r2-eth28 interface remote-as external + neighbor r2-eth29 interface remote-as external + neighbor r2-eth30 interface remote-as external + neighbor r2-eth31 interface remote-as external + neighbor r2-eth32 interface remote-as external + neighbor r2-eth33 interface remote-as external + neighbor r2-eth34 interface remote-as external + neighbor r2-eth35 interface remote-as external + neighbor r2-eth36 interface remote-as external + neighbor r2-eth37 interface remote-as external + neighbor r2-eth38 interface remote-as external + neighbor r2-eth39 interface remote-as external + neighbor r2-eth40 interface remote-as external + neighbor r2-eth41 interface remote-as external + neighbor r2-eth42 interface remote-as external + neighbor r2-eth43 interface remote-as external + neighbor r2-eth44 interface remote-as external + neighbor r2-eth45 interface remote-as external + neighbor r2-eth46 interface remote-as external + neighbor r2-eth47 interface remote-as external + neighbor r2-eth48 interface remote-as external + neighbor r2-eth49 interface remote-as external + neighbor r2-eth50 interface remote-as external + neighbor r2-eth51 interface remote-as external + neighbor r2-eth52 interface remote-as external + neighbor r2-eth53 interface remote-as external + neighbor r2-eth54 interface remote-as external + neighbor r2-eth55 interface remote-as external + neighbor r2-eth56 interface remote-as external + neighbor r2-eth57 interface remote-as external + neighbor r2-eth58 interface remote-as external + neighbor r2-eth59 interface remote-as external + neighbor r2-eth60 interface remote-as external + neighbor r2-eth61 interface remote-as external + neighbor r2-eth62 interface remote-as external + neighbor r2-eth63 interface remote-as external + neighbor r2-eth64 interface remote-as external + neighbor r2-eth65 interface remote-as external + neighbor r2-eth66 interface remote-as external + neighbor r2-eth67 interface remote-as external + neighbor r2-eth68 interface remote-as external + neighbor r2-eth69 interface remote-as external + neighbor r2-eth70 interface remote-as external + neighbor r2-eth71 interface remote-as external + neighbor r2-eth72 interface remote-as external + neighbor r2-eth73 interface remote-as external + neighbor r2-eth74 interface remote-as external + neighbor r2-eth75 interface remote-as external + neighbor r2-eth76 interface remote-as external + neighbor r2-eth77 interface remote-as external + neighbor r2-eth78 interface remote-as external + neighbor r2-eth79 interface remote-as external + neighbor r2-eth80 interface remote-as external + neighbor r2-eth81 interface remote-as external + neighbor r2-eth82 interface remote-as external + neighbor r2-eth83 interface remote-as external + neighbor r2-eth84 interface remote-as external + neighbor r2-eth85 interface remote-as external + neighbor r2-eth86 interface remote-as external + neighbor r2-eth87 interface remote-as external + neighbor r2-eth88 interface remote-as external + neighbor r2-eth89 interface remote-as external + neighbor r2-eth90 interface remote-as external + neighbor r2-eth91 interface remote-as external + neighbor r2-eth92 interface remote-as external + neighbor r2-eth93 interface remote-as external + neighbor r2-eth94 interface remote-as external + neighbor r2-eth95 interface remote-as external + neighbor r2-eth96 interface remote-as external + neighbor r2-eth97 interface remote-as external + neighbor r2-eth98 interface remote-as external + neighbor r2-eth99 interface remote-as external + neighbor r2-eth100 interface remote-as external + neighbor r2-eth101 interface remote-as external + neighbor r2-eth102 interface remote-as external + neighbor r2-eth103 interface remote-as external + neighbor r2-eth104 interface remote-as external + neighbor r2-eth105 interface remote-as external + neighbor r2-eth106 interface remote-as external + neighbor r2-eth107 interface remote-as external + neighbor r2-eth108 interface remote-as external + neighbor r2-eth109 interface remote-as external + neighbor r2-eth110 interface remote-as external + neighbor r2-eth111 interface remote-as external + neighbor r2-eth112 interface remote-as external + neighbor r2-eth113 interface remote-as external + neighbor r2-eth114 interface remote-as external + neighbor r2-eth115 interface remote-as external + neighbor r2-eth116 interface remote-as external + neighbor r2-eth117 interface remote-as external + neighbor r2-eth118 interface remote-as external + neighbor r2-eth119 interface remote-as external + neighbor r2-eth120 interface remote-as external + neighbor r2-eth121 interface remote-as external + neighbor r2-eth122 interface remote-as external + neighbor r2-eth123 interface remote-as external + neighbor r2-eth124 interface remote-as external + neighbor r2-eth125 interface remote-as external + neighbor r2-eth126 interface remote-as external + neighbor r2-eth127 interface remote-as external + neighbor r2-eth128 interface remote-as external + neighbor r2-eth129 interface remote-as external + neighbor r2-eth130 interface remote-as external + neighbor r2-eth131 interface remote-as external + neighbor r2-eth132 interface remote-as external + neighbor r2-eth133 interface remote-as external + neighbor r2-eth134 interface remote-as external + neighbor r2-eth135 interface remote-as external + neighbor r2-eth136 interface remote-as external + neighbor r2-eth137 interface remote-as external + neighbor r2-eth138 interface remote-as external + neighbor r2-eth139 interface remote-as external + neighbor r2-eth140 interface remote-as external + neighbor r2-eth141 interface remote-as external + neighbor r2-eth142 interface remote-as external + neighbor r2-eth143 interface remote-as external + neighbor r2-eth144 interface remote-as external + neighbor r2-eth145 interface remote-as external + neighbor r2-eth146 interface remote-as external + neighbor r2-eth147 interface remote-as external + neighbor r2-eth148 interface remote-as external + neighbor r2-eth149 interface remote-as external + neighbor r2-eth150 interface remote-as external + neighbor r2-eth151 interface remote-as external + neighbor r2-eth152 interface remote-as external + neighbor r2-eth153 interface remote-as external + neighbor r2-eth154 interface remote-as external + neighbor r2-eth155 interface remote-as external + neighbor r2-eth156 interface remote-as external + neighbor r2-eth157 interface remote-as external + neighbor r2-eth158 interface remote-as external + neighbor r2-eth159 interface remote-as external + neighbor r2-eth160 interface remote-as external + neighbor r2-eth161 interface remote-as external + neighbor r2-eth162 interface remote-as external + neighbor r2-eth163 interface remote-as external + neighbor r2-eth164 interface remote-as external + neighbor r2-eth165 interface remote-as external + neighbor r2-eth166 interface remote-as external + neighbor r2-eth167 interface remote-as external + neighbor r2-eth168 interface remote-as external + neighbor r2-eth169 interface remote-as external + neighbor r2-eth170 interface remote-as external + neighbor r2-eth171 interface remote-as external + neighbor r2-eth172 interface remote-as external + neighbor r2-eth173 interface remote-as external + neighbor r2-eth174 interface remote-as external + neighbor r2-eth175 interface remote-as external + neighbor r2-eth176 interface remote-as external + neighbor r2-eth177 interface remote-as external + neighbor r2-eth178 interface remote-as external + neighbor r2-eth179 interface remote-as external + neighbor r2-eth180 interface remote-as external + neighbor r2-eth181 interface remote-as external + neighbor r2-eth182 interface remote-as external + neighbor r2-eth183 interface remote-as external + neighbor r2-eth184 interface remote-as external + neighbor r2-eth185 interface remote-as external + neighbor r2-eth186 interface remote-as external + neighbor r2-eth187 interface remote-as external + neighbor r2-eth188 interface remote-as external + neighbor r2-eth189 interface remote-as external + neighbor r2-eth190 interface remote-as external + neighbor r2-eth191 interface remote-as external + neighbor r2-eth192 interface remote-as external + neighbor r2-eth193 interface remote-as external + neighbor r2-eth194 interface remote-as external + neighbor r2-eth195 interface remote-as external + neighbor r2-eth196 interface remote-as external + neighbor r2-eth197 interface remote-as external + neighbor r2-eth198 interface remote-as external + neighbor r2-eth199 interface remote-as external + neighbor r2-eth200 interface remote-as external + neighbor r2-eth201 interface remote-as external + neighbor r2-eth202 interface remote-as external + neighbor r2-eth203 interface remote-as external + neighbor r2-eth204 interface remote-as external + neighbor r2-eth205 interface remote-as external + neighbor r2-eth206 interface remote-as external + neighbor r2-eth207 interface remote-as external + neighbor r2-eth208 interface remote-as external + neighbor r2-eth209 interface remote-as external + neighbor r2-eth210 interface remote-as external + neighbor r2-eth211 interface remote-as external + neighbor r2-eth212 interface remote-as external + neighbor r2-eth213 interface remote-as external + neighbor r2-eth214 interface remote-as external + neighbor r2-eth215 interface remote-as external + neighbor r2-eth216 interface remote-as external + neighbor r2-eth217 interface remote-as external + neighbor r2-eth218 interface remote-as external + neighbor r2-eth219 interface remote-as external + neighbor r2-eth220 interface remote-as external + neighbor r2-eth221 interface remote-as external + neighbor r2-eth222 interface remote-as external + neighbor r2-eth223 interface remote-as external + neighbor r2-eth224 interface remote-as external + neighbor r2-eth225 interface remote-as external + neighbor r2-eth226 interface remote-as external + neighbor r2-eth227 interface remote-as external + neighbor r2-eth228 interface remote-as external + neighbor r2-eth229 interface remote-as external + neighbor r2-eth230 interface remote-as external + neighbor r2-eth231 interface remote-as external + neighbor r2-eth232 interface remote-as external + neighbor r2-eth233 interface remote-as external + neighbor r2-eth234 interface remote-as external + neighbor r2-eth235 interface remote-as external + neighbor r2-eth236 interface remote-as external + neighbor r2-eth237 interface remote-as external + neighbor r2-eth238 interface remote-as external + neighbor r2-eth239 interface remote-as external + neighbor r2-eth240 interface remote-as external + neighbor r2-eth241 interface remote-as external + neighbor r2-eth242 interface remote-as external + neighbor r2-eth243 interface remote-as external + neighbor r2-eth244 interface remote-as external + neighbor r2-eth245 interface remote-as external + neighbor r2-eth246 interface remote-as external + neighbor r2-eth247 interface remote-as external + neighbor r2-eth248 interface remote-as external + neighbor r2-eth249 interface remote-as external + neighbor r2-eth250 interface remote-as external + neighbor r2-eth251 interface remote-as external + neighbor r2-eth252 interface remote-as external + neighbor r2-eth253 interface remote-as external + neighbor r2-eth254 interface remote-as external + neighbor r2-eth255 interface remote-as external + neighbor r2-eth256 interface remote-as external + neighbor r2-eth257 interface remote-as external + neighbor r2-eth258 interface remote-as external + neighbor r2-eth259 interface remote-as external + neighbor r2-eth260 interface remote-as external + neighbor r2-eth261 interface remote-as external + neighbor r2-eth262 interface remote-as external + neighbor r2-eth263 interface remote-as external + neighbor r2-eth264 interface remote-as external + neighbor r2-eth265 interface remote-as external + neighbor r2-eth266 interface remote-as external + neighbor r2-eth267 interface remote-as external + neighbor r2-eth268 interface remote-as external + neighbor r2-eth269 interface remote-as external + neighbor r2-eth270 interface remote-as external + neighbor r2-eth271 interface remote-as external + neighbor r2-eth272 interface remote-as external + neighbor r2-eth273 interface remote-as external + neighbor r2-eth274 interface remote-as external + neighbor r2-eth275 interface remote-as external + neighbor r2-eth276 interface remote-as external + neighbor r2-eth277 interface remote-as external + neighbor r2-eth278 interface remote-as external + neighbor r2-eth279 interface remote-as external + neighbor r2-eth280 interface remote-as external + neighbor r2-eth281 interface remote-as external + neighbor r2-eth282 interface remote-as external + neighbor r2-eth283 interface remote-as external + neighbor r2-eth284 interface remote-as external + neighbor r2-eth285 interface remote-as external + neighbor r2-eth286 interface remote-as external + neighbor r2-eth287 interface remote-as external + neighbor r2-eth288 interface remote-as external + neighbor r2-eth289 interface remote-as external + neighbor r2-eth290 interface remote-as external + neighbor r2-eth291 interface remote-as external + neighbor r2-eth292 interface remote-as external + neighbor r2-eth293 interface remote-as external + neighbor r2-eth294 interface remote-as external + neighbor r2-eth295 interface remote-as external + neighbor r2-eth296 interface remote-as external + neighbor r2-eth297 interface remote-as external + neighbor r2-eth298 interface remote-as external + neighbor r2-eth299 interface remote-as external + neighbor r2-eth300 interface remote-as external + neighbor r2-eth301 interface remote-as external + neighbor r2-eth302 interface remote-as external + neighbor r2-eth303 interface remote-as external + neighbor r2-eth304 interface remote-as external + neighbor r2-eth305 interface remote-as external + neighbor r2-eth306 interface remote-as external + neighbor r2-eth307 interface remote-as external + neighbor r2-eth308 interface remote-as external + neighbor r2-eth309 interface remote-as external + neighbor r2-eth310 interface remote-as external + neighbor r2-eth311 interface remote-as external + neighbor r2-eth312 interface remote-as external + neighbor r2-eth313 interface remote-as external + neighbor r2-eth314 interface remote-as external + neighbor r2-eth315 interface remote-as external + neighbor r2-eth316 interface remote-as external + neighbor r2-eth317 interface remote-as external + neighbor r2-eth318 interface remote-as external + neighbor r2-eth319 interface remote-as external + neighbor r2-eth320 interface remote-as external + neighbor r2-eth321 interface remote-as external + neighbor r2-eth322 interface remote-as external + neighbor r2-eth323 interface remote-as external + neighbor r2-eth324 interface remote-as external + neighbor r2-eth325 interface remote-as external + neighbor r2-eth326 interface remote-as external + neighbor r2-eth327 interface remote-as external + neighbor r2-eth328 interface remote-as external + neighbor r2-eth329 interface remote-as external + neighbor r2-eth330 interface remote-as external + neighbor r2-eth331 interface remote-as external + neighbor r2-eth332 interface remote-as external + neighbor r2-eth333 interface remote-as external + neighbor r2-eth334 interface remote-as external + neighbor r2-eth335 interface remote-as external + neighbor r2-eth336 interface remote-as external + neighbor r2-eth337 interface remote-as external + neighbor r2-eth338 interface remote-as external + neighbor r2-eth339 interface remote-as external + neighbor r2-eth340 interface remote-as external + neighbor r2-eth341 interface remote-as external + neighbor r2-eth342 interface remote-as external + neighbor r2-eth343 interface remote-as external + neighbor r2-eth344 interface remote-as external + neighbor r2-eth345 interface remote-as external + neighbor r2-eth346 interface remote-as external + neighbor r2-eth347 interface remote-as external + neighbor r2-eth348 interface remote-as external + neighbor r2-eth349 interface remote-as external + neighbor r2-eth350 interface remote-as external + neighbor r2-eth351 interface remote-as external + neighbor r2-eth352 interface remote-as external + neighbor r2-eth353 interface remote-as external + neighbor r2-eth354 interface remote-as external + neighbor r2-eth355 interface remote-as external + neighbor r2-eth356 interface remote-as external + neighbor r2-eth357 interface remote-as external + neighbor r2-eth358 interface remote-as external + neighbor r2-eth359 interface remote-as external + neighbor r2-eth360 interface remote-as external + neighbor r2-eth361 interface remote-as external + neighbor r2-eth362 interface remote-as external + neighbor r2-eth363 interface remote-as external + neighbor r2-eth364 interface remote-as external + neighbor r2-eth365 interface remote-as external + neighbor r2-eth366 interface remote-as external + neighbor r2-eth367 interface remote-as external + neighbor r2-eth368 interface remote-as external + neighbor r2-eth369 interface remote-as external + neighbor r2-eth370 interface remote-as external + neighbor r2-eth371 interface remote-as external + neighbor r2-eth372 interface remote-as external + neighbor r2-eth373 interface remote-as external + neighbor r2-eth374 interface remote-as external + neighbor r2-eth375 interface remote-as external + neighbor r2-eth376 interface remote-as external + neighbor r2-eth377 interface remote-as external + neighbor r2-eth378 interface remote-as external + neighbor r2-eth379 interface remote-as external + neighbor r2-eth380 interface remote-as external + neighbor r2-eth381 interface remote-as external + neighbor r2-eth382 interface remote-as external + neighbor r2-eth383 interface remote-as external + neighbor r2-eth384 interface remote-as external + neighbor r2-eth385 interface remote-as external + neighbor r2-eth386 interface remote-as external + neighbor r2-eth387 interface remote-as external + neighbor r2-eth388 interface remote-as external + neighbor r2-eth389 interface remote-as external + neighbor r2-eth390 interface remote-as external + neighbor r2-eth391 interface remote-as external + neighbor r2-eth392 interface remote-as external + neighbor r2-eth393 interface remote-as external + neighbor r2-eth394 interface remote-as external + neighbor r2-eth395 interface remote-as external + neighbor r2-eth396 interface remote-as external + neighbor r2-eth397 interface remote-as external + neighbor r2-eth398 interface remote-as external + neighbor r2-eth399 interface remote-as external + neighbor r2-eth400 interface remote-as external + neighbor r2-eth401 interface remote-as external + neighbor r2-eth402 interface remote-as external + neighbor r2-eth403 interface remote-as external + neighbor r2-eth404 interface remote-as external + neighbor r2-eth405 interface remote-as external + neighbor r2-eth406 interface remote-as external + neighbor r2-eth407 interface remote-as external + neighbor r2-eth408 interface remote-as external + neighbor r2-eth409 interface remote-as external + neighbor r2-eth410 interface remote-as external + neighbor r2-eth411 interface remote-as external + neighbor r2-eth412 interface remote-as external + neighbor r2-eth413 interface remote-as external + neighbor r2-eth414 interface remote-as external + neighbor r2-eth415 interface remote-as external + neighbor r2-eth416 interface remote-as external + neighbor r2-eth417 interface remote-as external + neighbor r2-eth418 interface remote-as external + neighbor r2-eth419 interface remote-as external + neighbor r2-eth420 interface remote-as external + neighbor r2-eth421 interface remote-as external + neighbor r2-eth422 interface remote-as external + neighbor r2-eth423 interface remote-as external + neighbor r2-eth424 interface remote-as external + neighbor r2-eth425 interface remote-as external + neighbor r2-eth426 interface remote-as external + neighbor r2-eth427 interface remote-as external + neighbor r2-eth428 interface remote-as external + neighbor r2-eth429 interface remote-as external + neighbor r2-eth430 interface remote-as external + neighbor r2-eth431 interface remote-as external + neighbor r2-eth432 interface remote-as external + neighbor r2-eth433 interface remote-as external + neighbor r2-eth434 interface remote-as external + neighbor r2-eth435 interface remote-as external + neighbor r2-eth436 interface remote-as external + neighbor r2-eth437 interface remote-as external + neighbor r2-eth438 interface remote-as external + neighbor r2-eth439 interface remote-as external + neighbor r2-eth440 interface remote-as external + neighbor r2-eth441 interface remote-as external + neighbor r2-eth442 interface remote-as external + neighbor r2-eth443 interface remote-as external + neighbor r2-eth444 interface remote-as external + neighbor r2-eth445 interface remote-as external + neighbor r2-eth446 interface remote-as external + neighbor r2-eth447 interface remote-as external + neighbor r2-eth448 interface remote-as external + neighbor r2-eth449 interface remote-as external + neighbor r2-eth450 interface remote-as external + neighbor r2-eth451 interface remote-as external + neighbor r2-eth452 interface remote-as external + neighbor r2-eth453 interface remote-as external + neighbor r2-eth454 interface remote-as external + neighbor r2-eth455 interface remote-as external + neighbor r2-eth456 interface remote-as external + neighbor r2-eth457 interface remote-as external + neighbor r2-eth458 interface remote-as external + neighbor r2-eth459 interface remote-as external + neighbor r2-eth460 interface remote-as external + neighbor r2-eth461 interface remote-as external + neighbor r2-eth462 interface remote-as external + neighbor r2-eth463 interface remote-as external + neighbor r2-eth464 interface remote-as external + neighbor r2-eth465 interface remote-as external + neighbor r2-eth466 interface remote-as external + neighbor r2-eth467 interface remote-as external + neighbor r2-eth468 interface remote-as external + neighbor r2-eth469 interface remote-as external + neighbor r2-eth470 interface remote-as external + neighbor r2-eth471 interface remote-as external + neighbor r2-eth472 interface remote-as external + neighbor r2-eth473 interface remote-as external + neighbor r2-eth474 interface remote-as external + neighbor r2-eth475 interface remote-as external + neighbor r2-eth476 interface remote-as external + neighbor r2-eth477 interface remote-as external + neighbor r2-eth478 interface remote-as external + neighbor r2-eth479 interface remote-as external + neighbor r2-eth480 interface remote-as external + neighbor r2-eth481 interface remote-as external + neighbor r2-eth482 interface remote-as external + neighbor r2-eth483 interface remote-as external + neighbor r2-eth484 interface remote-as external + neighbor r2-eth485 interface remote-as external + neighbor r2-eth486 interface remote-as external + neighbor r2-eth487 interface remote-as external + neighbor r2-eth488 interface remote-as external + neighbor r2-eth489 interface remote-as external + neighbor r2-eth490 interface remote-as external + neighbor r2-eth491 interface remote-as external + neighbor r2-eth492 interface remote-as external + neighbor r2-eth493 interface remote-as external + neighbor r2-eth494 interface remote-as external + neighbor r2-eth495 interface remote-as external + neighbor r2-eth496 interface remote-as external + neighbor r2-eth497 interface remote-as external + neighbor r2-eth498 interface remote-as external + neighbor r2-eth499 interface remote-as external + neighbor r2-eth500 interface remote-as external + neighbor r2-eth501 interface remote-as external + neighbor r2-eth502 interface remote-as external + neighbor r2-eth503 interface remote-as external + neighbor r2-eth504 interface remote-as external + neighbor r2-eth505 interface remote-as external + neighbor r2-eth506 interface remote-as external + neighbor r2-eth507 interface remote-as external + neighbor r2-eth508 interface remote-as external + neighbor r2-eth509 interface remote-as external + neighbor r2-eth510 interface remote-as external + neighbor r2-eth511 interface remote-as external + neighbor r2-eth512 interface remote-as external + neighbor r2-eth513 interface remote-as external + neighbor r2-eth514 interface remote-as external + diff --git a/tests/topotests/high_ecmp/test_high_ecmp_unnumbered.py b/tests/topotests/high_ecmp/test_high_ecmp_unnumbered.py new file mode 100644 index 0000000000..1a65a44a55 --- /dev/null +++ b/tests/topotests/high_ecmp/test_high_ecmp_unnumbered.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: ISC + +# +# test_high_ecmp.py +# +# Copyright (c) 2024 by +# Nvidia Corporation +# Donald Sharp +# +# Copyright (c) 2025 by Soumya Roy, <souroy@nvidia.com> + +""" +test_high_ecmp.py: Testing two routers with 256 interfaces and BGP setup + on it. + +""" + +import os +import re +import sys +import pytest +import json + +pytestmark = [pytest.mark.bgpd] + +# Save the Current Working Directory to find configuration files. +CWD = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(os.path.join(CWD, "../")) + +# pylint: disable=C0413 +# Import topogen and topotest helpers +from lib import topotest +from lib.topogen import Topogen, TopoRouter, get_topogen +from lib.topolog import logger + +# Required to instantiate the topology builder class. + +##################################################### +## +## Network Topology Definition +## +##################################################### + + +def build_topo(tgen): + tgen.add_router("r1") + tgen.add_router("r2") + + r1 = tgen.gears["r1"] + r2 = tgen.gears["r2"] + + # Let's create 257 interfaces between the two switches + for switch in range(1, 516): + switch = tgen.add_switch("sw{}".format(switch)) + switch.add_link(r1) + switch.add_link(r2) + + +##################################################### +## +## Tests starting +## +##################################################### + + +def setup_module(module): + "Setup topology" + tgen = Topogen(build_topo, module.__name__) + tgen.start_topology() + + # This is a sample of configuration loading. + router_list = tgen.routers() + for rname, router in router_list.items(): + router.load_frr_config( + os.path.join(CWD, "{}/frr.conf".format(rname)), + [ + (TopoRouter.RD_ZEBRA, "-s 180000000"), + (TopoRouter.RD_BGP, None), + (TopoRouter.RD_SHARP, None), + ], + ) + + tgen.start_router() + + for rname, router in router_list.items(): + router.cmd("vtysh -f {}/{}/frr_unnumbered_bgp.conf".format(CWD, rname)) + +def teardown_module(_mod): + "Teardown the pytest environment" + tgen = get_topogen() + + # This function tears down the whole topology. + tgen.stop_topology() + + +def test_nothing(): + "Do Nothing" + tgen = get_topogen() + # Don't run this test if we have any failure. + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args)) diff --git a/tests/topotests/high_ecmp/test_high_ecmp.py b/tests/topotests/high_ecmp/test_high_ecmp_v4.py index d28a1ee069..c1fbb9e878 100644 --- a/tests/topotests/high_ecmp/test_high_ecmp.py +++ b/tests/topotests/high_ecmp/test_high_ecmp_v4.py @@ -8,6 +8,7 @@ # Nvidia Corporation # Donald Sharp # +# Copyright (c) 2025 by Soumya Roy, <souroy@nvidia.com> """ test_high_ecmp.py: Testing two routers with 256 interfaces and BGP setup @@ -43,7 +44,6 @@ from lib.topolog import logger def build_topo(tgen): - tgen.add_router("r1") tgen.add_router("r2") @@ -51,7 +51,7 @@ def build_topo(tgen): r2 = tgen.gears["r2"] # Let's create 257 interfaces between the two switches - for switch in range(1, 257): + for switch in range(1, 516): switch = tgen.add_switch("sw{}".format(switch)) switch.add_link(r1) switch.add_link(r2) @@ -80,9 +80,11 @@ def setup_module(module): (TopoRouter.RD_SHARP, None), ], ) - + tgen.start_router() - + + for rname, router in router_list.items(): + router.cmd("vtysh -f {}/{}/frr_ipv4_bgp.conf".format(CWD, rname)) def teardown_module(_mod): "Teardown the pytest environment" @@ -94,7 +96,6 @@ def teardown_module(_mod): def test_nothing(): "Do Nothing" - tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): diff --git a/tests/topotests/high_ecmp/test_high_ecmp_v6.py b/tests/topotests/high_ecmp/test_high_ecmp_v6.py new file mode 100644 index 0000000000..a63444f0f0 --- /dev/null +++ b/tests/topotests/high_ecmp/test_high_ecmp_v6.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: ISC + +# +# test_high_ecmp.py +# +# Copyright (c) 2024 by +# Nvidia Corporation +# Donald Sharp +# +# Copyright (c) 2025 by Soumya Roy, <souroy@nvidia.com> + +""" +test_high_ecmp.py: Testing two routers with 256 interfaces and BGP setup + on it. + +""" + +import os +import re +import sys +import pytest +import json + +pytestmark = [pytest.mark.bgpd] + +# Save the Current Working Directory to find configuration files. +CWD = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(os.path.join(CWD, "../")) + +# pylint: disable=C0413 +# Import topogen and topotest helpers +from lib import topotest +from lib.topogen import Topogen, TopoRouter, get_topogen +from lib.topolog import logger + +# Required to instantiate the topology builder class. + +##################################################### +## +## Network Topology Definition +## +##################################################### + + +def build_topo(tgen): + tgen.add_router("r1") + tgen.add_router("r2") + + r1 = tgen.gears["r1"] + r2 = tgen.gears["r2"] + + # Let's create 257 interfaces between the two switches + for switch in range(1, 516): + switch = tgen.add_switch("sw{}".format(switch)) + switch.add_link(r1) + switch.add_link(r2) + + +##################################################### +## +## Tests starting +## +##################################################### + + +def setup_module(module): + "Setup topology" + tgen = Topogen(build_topo, module.__name__) + tgen.start_topology() + + # This is a sample of configuration loading. + router_list = tgen.routers() + for rname, router in router_list.items(): + router.load_frr_config( + os.path.join(CWD, "{}/frr.conf".format(rname)), + [ + (TopoRouter.RD_ZEBRA, "-s 180000000"), + (TopoRouter.RD_BGP, None), + (TopoRouter.RD_SHARP, None), + ], + ) + + tgen.start_router() + + for rname, router in router_list.items(): + router.cmd("vtysh -f {}/{}/frr_ipv6_bgp.conf".format(CWD, rname)) + +def teardown_module(_mod): + "Teardown the pytest environment" + tgen = get_topogen() + + # This function tears down the whole topology. + tgen.stop_topology() + + +def test_nothing(): + "Do Nothing" + tgen = get_topogen() + # Don't run this test if we have any failure. + if tgen.routers_have_failure(): + pytest.skip(tgen.errors) + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args)) diff --git a/tests/topotests/lib/bmp_collector/bmpserver.py b/tests/topotests/lib/bmp_collector/bmpserver.py index c42c387563..f19f63bd8a 100755 --- a/tests/topotests/lib/bmp_collector/bmpserver.py +++ b/tests/topotests/lib/bmp_collector/bmpserver.py @@ -73,7 +73,7 @@ def savepid(): pid = open(pid_file, "r").readline().strip() if check_pid(int(pid)): timestamp_print( - "PID file already exists and program still running %s\n" % pid_file + f"PID file already exists and program still running {pid_file}\n" ) return False else: @@ -81,8 +81,7 @@ def savepid(): fd = os.open(pid_file, flags ^ os.O_EXCL, mode) except (OSError, IOError, ValueError): timestamp_print( - "issue accessing PID file %s (most likely permission or ownership)\n" - % pid_file + f"issue accessing PID file {pid_file} (most likely permission or ownership)\n" ) return False @@ -93,9 +92,9 @@ def savepid(): f.close() saved_pid = True except IOError: - timestamp_print("Can not create PID file %s\n" % pid_file) + timestamp_print(f"Can not create PID file {pid_file}\n") return False - timestamp_print("Created PID file %s with value %d\n" % (pid_file, ownid)) + timestamp_print(f"Created PID file {pid_file} with value {ownid}\n") return True @@ -106,9 +105,9 @@ def removepid(): if exc.errno == errno.ENOENT: pass else: - timestamp_print("Can not remove PID file %s\n" % pid_file) + timestamp_print(f"Can not remove PID file {pid_file}\n") return - timestamp_print("Removed PID file %s\n" % pid_file) + timestamp_print(f"Removed PID file {pid_file}\n") def main(): @@ -168,7 +167,7 @@ def main(): timestamp_print(f"TCP session closed with {client_address}") connection.close() except socket.error as sock_err: - timestamp_print(f"Socket error: {e}") + timestamp_print(f"Socket error: {sock_err}") except Exception as e: timestamp_print(f"{e}") finally: diff --git a/tests/topotests/lib/topotest.py b/tests/topotests/lib/topotest.py index e2c70cdccd..07033698d0 100644 --- a/tests/topotests/lib/topotest.py +++ b/tests/topotests/lib/topotest.py @@ -1960,7 +1960,13 @@ class Router(Node): ) else: binary = os.path.join(self.daemondir, daemon) - check_daemon_files.extend([runbase + ".pid", runbase + ".vty"]) + if daemon == "zebra": + zapi_base = "/var/run/{}/zserv.api".format(self.routertype) + check_daemon_files.extend( + [runbase + ".pid", runbase + ".vty", zapi_base] + ) + else: + check_daemon_files.extend([runbase + ".pid", runbase + ".vty"]) cmdenv = "ASAN_OPTIONS=" if asan_abort: @@ -2244,17 +2250,39 @@ class Router(Node): else: logger.debug("%s: %s %s started", self, self.routertype, daemon) + # Check if the daemons are running + def _check_daemons_running(check_daemon_files): + wait_time = 30 if (gdb_routers or gdb_daemons) else 10 + timeout = Timeout(wait_time) + for remaining in timeout: + if not check_daemon_files: + break + check = check_daemon_files[0] + if self.path_exists(check): + check_daemon_files.pop(0) + continue + self.logger.debug( + "Waiting {}s for {} to appear".format(remaining, check) + ) + time.sleep(0.5) + # Start mgmtd first if "mgmtd" in daemons_list: start_daemon("mgmtd") while "mgmtd" in daemons_list: daemons_list.remove("mgmtd") + # Wait till mgmtd is up and running to some + # very small extent before moving on + _check_daemons_running(check_daemon_files) # Start Zebra after mgmtd if "zebra" in daemons_list: start_daemon("zebra") while "zebra" in daemons_list: daemons_list.remove("zebra") + # Wait till zebra is up and running to some + # very small extent before moving on + _check_daemons_running(check_daemon_files) # Start staticd next if required if "staticd" in daemons_list: @@ -2290,17 +2318,7 @@ class Router(Node): start_daemon(daemon) # Check if daemons are running. - wait_time = 30 if (gdb_routers or gdb_daemons) else 10 - timeout = Timeout(wait_time) - for remaining in timeout: - if not check_daemon_files: - break - check = check_daemon_files[0] - if self.path_exists(check): - check_daemon_files.pop(0) - continue - self.logger.debug("Waiting {}s for {} to appear".format(remaining, check)) - time.sleep(0.5) + _check_daemons_running(check_daemon_files) if check_daemon_files: assert False, "Timeout({}) waiting for {} to appear on {}".format( diff --git a/tests/topotests/zebra_rib/r1/import_mrib_table_2.json b/tests/topotests/zebra_rib/r1/import_mrib_table_2.json index 61aaaede6e..03e4163269 100644 --- a/tests/topotests/zebra_rib/r1/import_mrib_table_2.json +++ b/tests/topotests/zebra_rib/r1/import_mrib_table_2.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/import_mrib_table_3.json b/tests/topotests/zebra_rib/r1/import_mrib_table_3.json index 27a0b9f264..dd1774cd84 100644 --- a/tests/topotests/zebra_rib/r1/import_mrib_table_3.json +++ b/tests/topotests/zebra_rib/r1/import_mrib_table_3.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -238,7 +238,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/import_mrib_table_4.json b/tests/topotests/zebra_rib/r1/import_mrib_table_4.json index 5a8f0eecd5..9a318f9f00 100644 --- a/tests/topotests/zebra_rib/r1/import_mrib_table_4.json +++ b/tests/topotests/zebra_rib/r1/import_mrib_table_4.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/import_table_2.json b/tests/topotests/zebra_rib/r1/import_table_2.json index 61aaaede6e..03e4163269 100644 --- a/tests/topotests/zebra_rib/r1/import_table_2.json +++ b/tests/topotests/zebra_rib/r1/import_table_2.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/import_table_3.json b/tests/topotests/zebra_rib/r1/import_table_3.json index 27a0b9f264..dd1774cd84 100644 --- a/tests/topotests/zebra_rib/r1/import_table_3.json +++ b/tests/topotests/zebra_rib/r1/import_table_3.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -238,7 +238,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/import_table_4.json b/tests/topotests/zebra_rib/r1/import_table_4.json index 5a8f0eecd5..9a318f9f00 100644 --- a/tests/topotests/zebra_rib/r1/import_table_4.json +++ b/tests/topotests/zebra_rib/r1/import_table_4.json @@ -68,7 +68,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -97,7 +97,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -126,7 +126,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, @@ -155,7 +155,7 @@ "installed": true, "table": 254, "internalStatus": 16, - "internalFlags": 9, + "internalFlags": 2057, "nexthops": [ { "flags": 3, diff --git a/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.json b/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.json new file mode 100644 index 0000000000..70398d80b1 --- /dev/null +++ b/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.json @@ -0,0 +1,54 @@ +{ + "0.0.0.0/0": [ + { + "protocol": "kernel", + "vrfName": "default", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "unreachable": true, + "blackhole": true, + "active": true + } + ] + } + ], + "10.0.0.0/24": [ + { + "protocol": "static", + "vrfName": "default", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "unreachable": true, + "blackhole": true, + "active": true + } + ] + } + ], + "10.1.0.0/24": [ + { + "protocol": "static", + "vrfName": "default", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "ip": "192.168.211.254", + "interfaceName": "r1-eth1", + "active": true + } + ] + } + ], + "10.2.0.0/24": null, + "10.3.0.0/24": null, + "192.168.210.0/24": null, + "192.168.210.1/32": null +} diff --git a/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.txt b/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.txt new file mode 100644 index 0000000000..f0fcb73d4d --- /dev/null +++ b/tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.txt @@ -0,0 +1,3 @@ +blackhole default +blackhole 10.0.0.0/24 proto XXXX metric 20 +10.1.0.0/24 via 192.168.211.254 dev r1-eth1 proto XXXX metric 20 diff --git a/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.json b/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.json new file mode 100644 index 0000000000..5949a69a73 --- /dev/null +++ b/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.json @@ -0,0 +1,115 @@ +{ + "0.0.0.0/0": [ + { + "protocol": "kernel", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "unreachable": true, + "blackhole": true, + "active": true + } + ] + } + ], + "10.0.0.0/24": [ + { + "protocol": "static", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "unreachable": true, + "blackhole": true, + "active": true + } + ] + } + ], + "10.1.0.0/24": [ + { + "protocol": "static", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "ip": "192.168.211.254", + "interfaceName": "r1-eth1", + "vrf": "default", + "active": true + } + ] + } + ], + "10.2.0.0/24": [ + { + "protocol": "static", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "ip": "192.168.210.254", + "interfaceName": "r1-eth0", + "active": true + } + ] + } + ], + "10.3.0.0/24": [ + { + "protocol": "static", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "ip": "192.168.212.254", + "interfaceName": "r1-eth2", + "vrf": "default", + "active": true + } + ] + } + ], + "192.168.210.0/24": [ + { + "protocol": "connected", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "directlyConnected": true, + "interfaceName": "r1-eth0", + "active": true + } + ] + } + ], + "192.168.210.1/32": [ + { + "protocol": "local", + "vrfName": "RED", + "installed": true, + "table": 1, + "nexthops": [ + { + "fib": true, + "interfaceName": "r1-eth0", + "active": true + } + ] + } + ] +} diff --git a/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.txt b/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.txt new file mode 100644 index 0000000000..fb3d034689 --- /dev/null +++ b/tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.txt @@ -0,0 +1,6 @@ +blackhole default +blackhole 10.0.0.0/24 proto XXXX metric 20 +10.1.0.0/24 via 192.168.211.254 dev r1-eth1 proto XXXX metric 20 +10.2.0.0/24 via 192.168.210.254 dev r1-eth0 proto XXXX metric 20 +10.3.0.0/24 via 192.168.212.254 dev r1-eth2 proto XXXX metric 20 +192.168.210.0/24 dev r1-eth0 proto XXXX scope link src 192.168.210.1 diff --git a/tests/topotests/zebra_rib/test_zebra_rib.py b/tests/topotests/zebra_rib/test_zebra_rib.py index d1aee46b40..6dc316752a 100644 --- a/tests/topotests/zebra_rib/test_zebra_rib.py +++ b/tests/topotests/zebra_rib/test_zebra_rib.py @@ -27,12 +27,13 @@ sys.path.append(os.path.join(CWD, "../")) # pylint: disable=C0413 # Import topogen and topotest helpers from lib import topotest +from lib.common_config import step from lib.topogen import Topogen, TopoRouter, get_topogen from lib.topolog import logger from time import sleep -pytestmark = [pytest.mark.sharpd] +pytestmark = [pytest.mark.sharpd, pytest.mark.staticd] krel = platform.release() @@ -64,6 +65,7 @@ def setup_module(mod): router.load_config( TopoRouter.RD_SHARP, os.path.join(CWD, "{}/sharpd.conf".format(rname)) ) + router.load_config(TopoRouter.RD_STATIC, "/dev/null") # Macvlan interface for protodown func test */ config_macvlan(tgen, "r1", "r1-eth0", "r1-eth0-macvlan") @@ -77,14 +79,54 @@ def teardown_module(): tgen.stop_topology() +def check_routes_installed(expected, table=None): + tgen = get_topogen() + r1 = tgen.gears["r1"] + + cmd = "ip route show" + if table: + cmd += " table {}".format(table) + actual = r1.run(cmd) + actual = ("\n".join(actual.splitlines()) + "\n").rstrip() + actual = re.sub(r" nhid [0-9][0-9]", "", actual) + actual = re.sub(r" proto sharp", " proto XXXX", actual) + actual = re.sub(r" proto static", " proto XXXX", actual) + actual = re.sub(r" proto 194", " proto XXXX", actual) + actual = re.sub(r" proto 196", " proto XXXX", actual) + actual = re.sub(r" proto kernel", " proto XXXX", actual) + actual = re.sub(r" proto 2", " proto XXXX", actual) + # Some platforms have double spaces? Why?????? + actual = re.sub(r" proto XXXX ", " proto XXXX ", actual) + actual = re.sub(r" metric", " metric", actual) + actual = re.sub(r" link ", " link ", actual) + actual = actual.splitlines() + actual = [ + line.rstrip() + for line in actual + if not line.startswith("broadcast") and not line.startswith("local") + ] + + expected = ("\n".join(expected.splitlines()) + "\n").rstrip() + expected = expected.splitlines() + expected = [line.rstrip() for line in expected] + + return topotest.get_textdiff( + actual, + expected, + title1="Actual ip route show", + title2="Expected ip route show", + ) + + def test_zebra_kernel_route_vrf(): "Test kernel routes should be removed after interface changes vrf" logger.info("Test kernel routes should be removed after interface changes vrf") vrf = "RED" + table_id = 1 tgen = get_topogen() r1 = tgen.gears["r1"] - # Add kernel routes, the interface is initially in default vrf + step("Add kernel routes, the interface is initially in default vrf") r1.run("ip route add 3.5.1.0/24 via 192.168.210.1 dev r1-eth0") json_file = "{}/r1/v4_route_1_vrf_before.json".format(CWD) expected = json.loads(open(json_file).read()) @@ -94,11 +136,69 @@ def test_zebra_kernel_route_vrf(): _, result = topotest.run_and_expect(test_func, None, count=5, wait=1) assert result is None, '"r1" JSON output mismatches' - # Change the interface's vrf - r1.run("ip link add {} type vrf table 1".format(vrf)) + step("Add routes in table 1") + r1.run("ip route add blackhole default table {}".format(table_id)) + + r1.vtysh_cmd( + """ +configure terminal + ip route 10.0.0.0/24 blackhole table {} + ip route 10.1.0.0/24 192.168.211.254 nexthop-vrf default table {} +""".format( + table_id, table_id + ) + ) + + json_file = "{}/r1/v4_route_table_1_no_vrf.json".format(CWD) + expected = json.loads(open(json_file).read()) + test_func = partial( + topotest.router_json_cmp, r1, "show ip route table 1 json", expected + ) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, '"r1" JSON output mismatches' + + ipfile = "{}/r1/v4_route_table_1_no_vrf.txt".format(CWD) + expected = open(ipfile).read().rstrip() + expected = ("\n".join(expected.splitlines()) + "\n").rstrip() + + test_func = partial(check_routes_installed, expected, table=1) + ok, result = topotest.run_and_expect(test_func, "", count=60, wait=0.5) + assert ok, result + + step("Add VRF {} and assign it r1-eth0 interface".format(vrf)) + r1.run("ip link add {} type vrf table {}".format(vrf, table_id)) r1.run("ip link set {} up".format(vrf)) r1.run("ip link set dev r1-eth0 master {}".format(vrf)) + step("Add static routes to VRF {}".format(vrf)) + r1.vtysh_cmd( + """ +configure terminal + vrf {} + ip route 10.2.0.0/24 192.168.210.254 + ip route 10.3.0.0/24 192.168.212.254 nexthop-vrf default +""".format( + vrf + ) + ) + + json_file = "{}/r1/v4_route_table_1_vrf_red.json".format(CWD) + expected = json.loads(open(json_file).read()) + test_func = partial( + topotest.router_json_cmp, r1, "show ip route table 1 json", expected + ) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, '"r1" JSON output mismatches' + + ipfile = "{}/r1/v4_route_table_1_vrf_red.txt".format(CWD) + expected = open(ipfile).read().rstrip() + expected = ("\n".join(expected.splitlines()) + "\n").rstrip() + + test_func = partial(check_routes_installed, expected, table=1) + ok, result = topotest.run_and_expect(test_func, "", count=60, wait=0.5) + assert ok, result + + step("check 3.5.1.0/24 absence on VRF default") expected = "{}" test_func = partial( topotest.router_output_cmp, r1, "show ip route 3.5.1.0/24 json", expected @@ -107,10 +207,26 @@ def test_zebra_kernel_route_vrf(): assertmsg = "{} should not have the kernel route.\n{}".format('"r1"', diff) assert result, assertmsg - # Clean up + step("Remove VRF {}".format(vrf)) r1.run("ip link set dev r1-eth0 nomaster") r1.run("ip link del dev {}".format(vrf)) + json_file = "{}/r1/v4_route_table_1_no_vrf.json".format(CWD) + expected = json.loads(open(json_file).read()) + test_func = partial( + topotest.router_json_cmp, r1, "show ip route table 1 json", expected + ) + _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) + assert result is None, '"r1" JSON output mismatches' + + ipfile = "{}/r1/v4_route_table_1_no_vrf.txt".format(CWD) + expected = open(ipfile).read().rstrip() + expected = ("\n".join(expected.splitlines()) + "\n").rstrip() + + test_func = partial(check_routes_installed, expected, table=1) + ok, result = topotest.run_and_expect(test_func, "", count=60, wait=0.5) + assert ok, result + def test_zebra_kernel_admin_distance(): "Test some basic kernel routes added that should be accepted" @@ -295,28 +411,8 @@ def test_route_map_usage(): expected = open(sharp_ipfile).read().rstrip() expected = ("\n".join(expected.splitlines()) + "\n").rstrip() - def check_routes_installed(): - actual = r1.run("ip route show") - actual = ("\n".join(actual.splitlines()) + "\n").rstrip() - actual = re.sub(r" nhid [0-9][0-9]", "", actual) - actual = re.sub(r" proto sharp", " proto XXXX", actual) - actual = re.sub(r" proto static", " proto XXXX", actual) - actual = re.sub(r" proto 194", " proto XXXX", actual) - actual = re.sub(r" proto 196", " proto XXXX", actual) - actual = re.sub(r" proto kernel", " proto XXXX", actual) - actual = re.sub(r" proto 2", " proto XXXX", actual) - # Some platforms have double spaces? Why?????? - actual = re.sub(r" proto XXXX ", " proto XXXX ", actual) - actual = re.sub(r" metric", " metric", actual) - actual = re.sub(r" link ", " link ", actual) - return topotest.get_textdiff( - actual, - expected, - title1="Actual ip route show", - title2="Expected ip route show", - ) - - ok, result = topotest.run_and_expect(check_routes_installed, "", count=5, wait=1) + test_func = partial(check_routes_installed, expected) + ok, result = topotest.run_and_expect(test_func, "", count=60, wait=0.5) assert ok, result diff --git a/yang/frr-affinity-map.yang b/yang/frr-affinity-map.yang index f1d9e44738..b53309661b 100644 --- a/yang/frr-affinity-map.yang +++ b/yang/frr-affinity-map.yang @@ -3,18 +3,6 @@ module frr-affinity-map { namespace "http://frrouting.org/yang/affinity-map"; prefix frr-affinity-map; - import ietf-inet-types { - prefix inet; - } - - import frr-filter { - prefix filter; - } - - import frr-interface { - prefix frr-interface; - } - organization "FRRouting"; contact @@ -51,6 +39,7 @@ module frr-affinity-map { revision 2022-11-03 { description "Initial revision"; + reference "FRRouting"; } typedef affinity-map-ref { @@ -63,6 +52,7 @@ module frr-affinity-map { } container lib { + description "Affinity map library"; container affinity-maps { description "Affinity Mapping Table"; @@ -79,10 +69,10 @@ module frr-affinity-map { "Affinity Name"; } leaf value { - mandatory true; type uint16 { range "0..1023"; } + mandatory true; description "Bit position"; } diff --git a/yang/frr-bfdd.yang b/yang/frr-bfdd.yang index 7fa8f6cd48..75af799acc 100644 --- a/yang/frr-bfdd.yang +++ b/yang/frr-bfdd.yang @@ -24,7 +24,7 @@ module frr-bfdd { description "This module defines a model for managing FRR bfdd daemon. - Copyright 2020 FRRouting + Copyright 2025 FRRouting Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -58,6 +58,14 @@ module frr-bfdd { RFC 5883: Bidirectional Forwarding Detection (BFD) for Multihop Paths."; } + revision 2025-03-03 { + description "Add log-sessio-changes leaf"; + reference + "RFC 5880: Bidirectional Forwarding Detection (BFD). + RFC 5881: Bidirectional Forwarding Detection (BFD) + for IPv4 and IPv6 (Single Hop). + RFC 5883: Bidirectional Forwarding Detection (BFD) for Multihop Paths."; + } /* * BFD types declaration. @@ -197,6 +205,13 @@ module frr-bfdd { description "Don't attempt to start session establishment."; } + + leaf log-session-changes { + type boolean; + default false; + description "Log session changes from/to Up state to/from Down state"; + } + } grouping session-echo { diff --git a/yang/frr-bgp-common.yang b/yang/frr-bgp-common.yang index 9d21597304..bb78c475d1 100644 --- a/yang/frr-bgp-common.yang +++ b/yang/frr-bgp-common.yang @@ -73,65 +73,116 @@ submodule frr-bgp-common { revision 2019-12-03 { description "Initial revision."; + reference "FRRouting"; } grouping rmap-policy-import { + description + "Grouping for route map policy import configuration"; + leaf rmap-import { type frr-route-map:route-map-ref; + description + "Reference to route map for import policy"; } } grouping rmap-policy-export { + description + "Grouping for route map policy export configuration"; + leaf rmap-export { type frr-route-map:route-map-ref; + description + "Reference to route map for export policy"; } } grouping unsuppress-map-policy-import { + description + "Grouping for unsuppress map policy import configuration"; + leaf unsuppress-map-import { type frr-route-map:route-map-ref; + description + "Reference to unsuppress map for import policy"; } } grouping unsuppress-map-policy-export { + description + "Grouping for unsuppress map policy export configuration"; + leaf unsuppress-map-export { type frr-route-map:route-map-ref; + description + "Reference to unsuppress map for export policy"; } } grouping plist-policy-import { + description + "Grouping for prefix list policy import configuration"; + leaf plist-import { type frr-bt:plist-ref; + description + "Reference to prefix list for import policy"; } } grouping plist-policy-export { + description + "Grouping for prefix list policy export configuration"; + leaf plist-export { type frr-bt:plist-ref; + description + "Reference to prefix list for export policy"; } } grouping access-list-policy-import { + description + "Grouping for access list policy import configuration"; + leaf access-list-import { type frr-bt:access-list-ref; + description + "Reference to access list for import policy"; } } grouping access-list-policy-export { + description + "Grouping for access list policy export configuration"; + leaf access-list-export { type frr-bt:access-list-ref; + description + "Reference to access list for export policy"; } } grouping as-path-filter-list-policy-import { + description + "Grouping for AS path filter list policy import configuration"; + leaf as-path-filter-list-import { type frr-bt:as-path-filter-ref; + description + "Reference to AS path filter list for import policy"; } } grouping as-path-filter-list-policy-export { + description + "Grouping for AS path filter list policy export configuration"; + leaf as-path-filter-list-export { type frr-bt:as-path-filter-ref; + description + "Reference to AS path filter list for export policy"; } } @@ -227,6 +278,9 @@ submodule frr-bgp-common { description "Configuration relating to MED."; container med-config { + description + "Container for MED configuration"; + leaf enable-med-admin { type boolean; default "false"; @@ -312,6 +366,9 @@ submodule frr-bgp-common { } grouping global-bgp-config { + description + "Grouping for global BGP configuration"; + leaf instance-type-view { type boolean; default "false"; @@ -322,15 +379,21 @@ submodule frr-bgp-common { leaf as-notation { type enumeration { - enum "plain" { value 0; } - enum "dot" { value 1; } - enum "dot+" { value 2; } + enum "plain" { + value 0; + description "Use plain format for all AS values"; + } + enum "dot" { + value 1; + description "Use 'AA.BB' format for AS 4 byte values"; + } + enum "dot+" { + value 2; + description "Use 'AA.BB' format for all AS values"; + } } description - "The as-notation type: - - plain: use plain format for all AS values - - dot: use 'AA.BB' format for AS 4 byte values. - - dot+: use 'AA.BB' format for all AS values."; + "The as-notation type"; } leaf ebgp-multihop-connected-route-check { @@ -403,7 +466,13 @@ submodule frr-bgp-common { } grouping global-neighbor-config { + description + "Grouping for global neighbor configuration"; + container global-neighbor-config { + description + "Container for global neighbor configuration"; + leaf dynamic-neighbors-limit { type uint32 { range "1..65535"; @@ -421,6 +490,9 @@ submodule frr-bgp-common { } container packet-quanta-config { + description + "Container for packet quanta configuration"; + leaf wpkt-quanta { type uint32 { range "1..64"; @@ -443,7 +515,13 @@ submodule frr-bgp-common { } grouping global-update-group-config { + description + "Grouping for global update group configuration"; + container global-update-group-config { + description + "Container for global update group configuration"; + leaf subgroup-pkt-queue-size { type uint32 { range "20..100"; @@ -466,6 +544,9 @@ submodule frr-bgp-common { } grouping global-network-config { + description + "Grouping for global network configuration"; + leaf import-check { type boolean; default "true"; @@ -480,6 +561,9 @@ submodule frr-bgp-common { } grouping neighbor-timers { + description + "Grouping for neighbor timers configuration"; + leaf hold-time { type uint16 { range "0 | 3..65535"; @@ -539,7 +623,13 @@ submodule frr-bgp-common { } grouping global-config-timers { + description + "Grouping for global configuration timers."; + container global-config-timers { + description + "Container for global configuration timers."; + leaf rmap-delay-time { type uint16 { range "0..600"; @@ -590,6 +680,9 @@ submodule frr-bgp-common { description "Configuration parameters relating to BGP graceful restart."; choice mode { + description + "Choice for graceful restart mode."; + case graceful-restart-mode { leaf enabled { type boolean; @@ -732,6 +825,9 @@ submodule frr-bgp-common { "List of route redistribution per AFI."; list redistribution-list { key "route-type route-instance"; + description + "List of route types to be redistributed."; + leaf route-type { type frr-rt-type:frr-route-types; description @@ -763,6 +859,9 @@ submodule frr-bgp-common { } grouping mp-afi-safi-network-config { + description + "Grouping for AFI/SAFI network configuration."; + leaf label-index { type rt-types:mpls-label; description @@ -778,6 +877,9 @@ submodule frr-bgp-common { } grouping mp-afi-safi-agg-route-config { + description + "Grouping for AFI/SAFI aggregate route configuration."; + leaf as-set { type boolean; default "false"; @@ -847,6 +949,9 @@ submodule frr-bgp-common { } grouping admin-distance { + description + "Grouping for administrative distance configuration."; + container admin-distance { description "Administrative distance (or preference) assigned to @@ -885,6 +990,9 @@ submodule frr-bgp-common { } grouping distance-per-route-config { + description + "Grouping for administrative distance configuration per route."; + leaf distance { type uint8 { range "1..255"; @@ -902,6 +1010,9 @@ submodule frr-bgp-common { } grouping route-flap-dampening { + description + "Grouping for route flap dampening configuration."; + container route-flap-dampening { description "Dampening feature"; @@ -973,6 +1084,9 @@ submodule frr-bgp-common { } grouping flow-spec-config { + description + "Grouping for flow spec configuration."; + container flow-spec-config { description "Flow spec feature."; @@ -1027,6 +1141,9 @@ submodule frr-bgp-common { description "Label value for VRF."; choice label-allocation-mode { + description + "Choice for label allocation mode (manual or auto)."; + case manual { leaf label { type rt-types:mpls-label; @@ -1082,6 +1199,9 @@ submodule frr-bgp-common { } choice rt-direction { + description + "Choice for route target direction (import, export, or both)."; + case import-export { uses rt-list; } @@ -1132,7 +1252,13 @@ submodule frr-bgp-common { } grouping global-afi-safi-vpn-config { + description + "Grouping for global AFI/SAFI VPN configuration."; + container vpn-config { + description + "VPN configuration container."; + leaf rd { type string; description @@ -1150,6 +1276,9 @@ submodule frr-bgp-common { } grouping global-afi-safi-vpn-network-config { + description + "Grouping for global AFI/SAFI VPN network configuration."; + list network-config { key "rd"; description diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index 5f1b711b97..c9fa612b75 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -2859,24 +2859,8 @@ module frr-zebra { "IP forwarding status."; } leaf ipv6-forwarding { - type enumeration { - enum unknown { - value -1; - description - "Unknown state."; - } - enum off { - value 0; - description - "IPv6 forwarding disabled."; - } - enum on { - value 1; - description - "IPv6 forwarding enabled."; - } - } - description + type boolean; + description "IPv6 forwarding status."; } leaf workqueue-hold-timer { @@ -2968,6 +2952,16 @@ module frr-zebra { config false; description "Operational data."; + leaf ip-forwarding { + type boolean; + description + "IP forwarding status."; + } + leaf ipv6-forwarding { + type boolean; + description + "IPv6 forwarding status."; + } } // End of operational / state container } diff --git a/zebra/interface.c b/zebra/interface.c index b7a790382d..8080ba01de 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -1728,7 +1728,7 @@ interface_bridge_vxlan_vlan_vni_map_update(struct zebra_dplane_ctx *ctx, dplane_ctx_get_ifp_vxlan_vni_array(ctx); struct zebra_vxlan_vni vni_start, vni_end; struct hash *vni_table = NULL; - struct zebra_vxlan_vni vni, *vnip; + struct zebra_vxlan_vni vni; vni_t vni_id; vlanid_t vid; int i; @@ -1762,11 +1762,8 @@ interface_bridge_vxlan_vlan_vni_map_update(struct zebra_dplane_ctx *ctx, vni_start.vni, vni_end.vni, ifp->name, ifp->ifindex); - if (!vni_table) { + if (!vni_table) vni_table = zebra_vxlan_vni_table_create(); - if (!vni_table) - return; - } for (vid = vni_start.access_vlan, vni_id = vni_start.vni; vid <= vni_end.access_vlan; vid++, vni_id++) { @@ -1774,9 +1771,7 @@ interface_bridge_vxlan_vlan_vni_map_update(struct zebra_dplane_ctx *ctx, memset(&vni, 0, sizeof(vni)); vni.vni = vni_id; vni.access_vlan = vid; - vnip = hash_get(vni_table, &vni, zebra_vxlan_vni_alloc); - if (!vnip) - return; + (void)hash_get(vni_table, &vni, zebra_vxlan_vni_alloc); } memset(&vni_start, 0, sizeof(vni_start)); diff --git a/zebra/interface.h b/zebra/interface.h index 34e57088a7..0f5c997403 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -100,6 +100,9 @@ struct zebra_if { /* back pointer to the interface */ struct interface *ifp; + /* Event timer to batch ICMPv6 join requests */ + struct event *icmpv6_join_timer; + enum zebra_if_flags flags; /* Shutdown configuration. */ diff --git a/zebra/rtadv.c b/zebra/rtadv.c index 2641831bcd..467bcb6b16 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -21,6 +21,8 @@ #include "vrf.h" #include "ns.h" #include "lib_errors.h" +#include "wheel.h" +#include "network.h" #include "zebra/interface.h" #include "zebra/rtadv.h" @@ -36,6 +38,19 @@ extern struct zebra_privs_t zserv_privs; static uint32_t interfaces_configured_for_ra_from_bgp; #define RTADV_ADATA_SIZE 1024 +#define PROC_IGMP6 "/proc/net/igmp6" + +/* 32 hex chars + * say for 2001:db8:85a3::8a2e:370:7334 + * hex string is 20010db885a3000000008a2e03707334, + * which is 32 chars long +*/ +#define MAX_V6ADDR_LEN 32 + +#define MAX_INTERFACE_NAME_LEN 25 + +#define MAX_CHARS_PER_LINE 1024 + #if defined(HAVE_RTADV) #include "zebra/rtadv_clippy.c" @@ -50,6 +65,12 @@ DEFINE_MTYPE_STATIC(ZEBRA, ADV_IF, "Advertised Interface"); #define ALLNODE "ff02::1" #define ALLROUTER "ff02::2" +static bool is_interface_in_group(const char *ifname_in, const char *mcast_addr_in); + +#ifdef __linux__ +static bool v6_addr_hex_str_to_in6_addr(const char *hex_str, struct in6_addr *addr); +#endif + /* adv list node */ struct adv_if { char name[IFNAMSIZ]; @@ -454,6 +475,60 @@ no_more_opts: zif->ra_sent++; } +static void start_icmpv6_join_timer(struct event *thread) +{ + struct interface *ifp = EVENT_ARG(thread); + struct zebra_if *zif = ifp->info; + struct zebra_vrf *zvrf = rtadv_interface_get_zvrf(ifp); + + if (if_join_all_router(zvrf->rtadv.sock, ifp)) { + /*Wait random amount of time between 1 ms to ICMPV6_JOIN_TIMER_EXP_MS ms*/ + int random_ms = (frr_weak_random() % ICMPV6_JOIN_TIMER_EXP_MS) + 1; + event_add_timer_msec(zrouter.master, start_icmpv6_join_timer, ifp, random_ms, + &zif->icmpv6_join_timer); + } + + if (IS_ZEBRA_DEBUG_EVENT) + zlog_debug("Processing ICMPv6 join on interface %s(%s:%u)", ifp->name, + ifp->vrf->name, ifp->ifindex); +} + +void process_rtadv(void *arg) +{ + struct interface *ifp = arg; + struct zebra_if *zif = ifp->info; + struct zebra_vrf *zvrf = rtadv_interface_get_zvrf(ifp); + + if (zif->rtadv.inFastRexmit && zif->rtadv.UseFastRexmit) { + if (--zif->rtadv.NumFastReXmitsRemain <= 0) + zif->rtadv.inFastRexmit = 0; + + if (IS_ZEBRA_DEBUG_SEND) + zlog_debug("Doing fast RA Rexmit on interface %s(%s:%u)", ifp->name, + ifp->vrf->name, ifp->ifindex); + + rtadv_send_packet(zvrf->rtadv.sock, ifp, RA_ENABLE); + } else { + zif->rtadv.AdvIntervalTimer -= RTADV_TIMER_WHEEL_PERIOD_MS; + /* Wait atleast AdvIntervalTimer time before sending next RA + * AdvIntervalTimer can go negative, when ra_wheel timer expiry + * interval is not a multiple of AdvIntervalTimer. Say ra_wheel + * expiry time is 10 ms and, AdvIntervalTimer == 1005 ms. Allowing + * AdvIntervalTimer to go negative and checking, gurantees that + * we have waited Wait atleast AdvIntervalTimer, so RA can be + * sent now. + */ + if (zif->rtadv.AdvIntervalTimer <= 0) { + zif->rtadv.AdvIntervalTimer = zif->rtadv.MaxRtrAdvInterval; + if (IS_ZEBRA_DEBUG_SEND) + zlog_debug("Doing regular RA Rexmit on interface %s(%s:%u)", + ifp->name, ifp->vrf->name, ifp->ifindex); + + rtadv_send_packet(zvrf->rtadv.sock, ifp, RA_ENABLE); + } + } +} + static void rtadv_timer(struct event *thread) { struct zebra_vrf *zvrf = EVENT_ARG(thread); @@ -1253,7 +1328,13 @@ static void rtadv_start_interface_events(struct zebra_vrf *zvrf, if (adv_if != NULL) return; /* Already added */ - if_join_all_router(zvrf->rtadv.sock, zif->ifp); + if (if_join_all_router(zvrf->rtadv.sock, zif->ifp)) { + /*Failed to join on 1st attempt, wait random amount of time between 1 ms + to ICMPV6_JOIN_TIMER_EXP_MS ms*/ + int random_ms = (frr_weak_random() % ICMPV6_JOIN_TIMER_EXP_MS) + 1; + event_add_timer_msec(zrouter.master, start_icmpv6_join_timer, zif->ifp, random_ms, + &zif->icmpv6_join_timer); + } if (adv_if_list_count(&zvrf->rtadv.adv_if) == 1) rtadv_event(zvrf, RTADV_START, 0); @@ -1273,6 +1354,8 @@ void ipv6_nd_suppress_ra_set(struct interface *ifp, if (status == RA_SUPPRESS) { /* RA is currently enabled */ if (zif->rtadv.AdvSendAdvertisements) { + /* Try to delete from the ra wheel */ + wheel_remove_item(zrouter.ra_wheel, ifp); rtadv_send_packet(zvrf->rtadv.sock, ifp, RA_SUPPRESS); zif->rtadv.AdvSendAdvertisements = 0; zif->rtadv.AdvIntervalTimer = 0; @@ -1303,6 +1386,7 @@ void ipv6_nd_suppress_ra_set(struct interface *ifp, RTADV_NUM_FAST_REXMITS; } + wheel_add_item(zrouter.ra_wheel, ifp); rtadv_start_interface_events(zvrf, zif); } } @@ -1430,6 +1514,12 @@ void rtadv_stop_ra(struct interface *ifp) zif = ifp->info; zvrf = rtadv_interface_get_zvrf(ifp); + /*Try to delete from ra wheels */ + wheel_remove_item(zrouter.ra_wheel, ifp); + + /*Turn off event for ICMPv6 join*/ + EVENT_OFF(zif->icmpv6_join_timer); + if (zif->rtadv.AdvSendAdvertisements) rtadv_send_packet(zvrf->rtadv.sock, ifp, RA_SUPPRESS); } @@ -1722,8 +1812,7 @@ static void rtadv_event(struct zebra_vrf *zvrf, enum rtadv_event event, int val) case RTADV_START: event_add_read(zrouter.master, rtadv_read, zvrf, rtadv->sock, &rtadv->ra_read); - event_add_event(zrouter.master, rtadv_timer, zvrf, 0, - &rtadv->ra_timer); + break; case RTADV_STOP: EVENT_OFF(rtadv->ra_timer); @@ -1854,24 +1943,114 @@ void rtadv_cmd_init(void) install_element(VIEW_NODE, &show_ipv6_nd_ra_if_cmd); } +#ifdef __linux__ +static bool v6_addr_hex_str_to_in6_addr(const char *hex_str, struct in6_addr *addr) +{ + size_t str_len = strlen(hex_str); + + if (str_len != MAX_V6ADDR_LEN) { + flog_err_sys(EC_LIB_SYSTEM_CALL, "Invalid V6 addr hex len %zu", str_len); + return false; + } + + for (int i = 0; i < 16; i++) { + char byte_str[3] = { hex_str[i * 2], hex_str[i * 2 + 1], '\0' }; + addr->s6_addr[i] = (uint8_t)strtol(byte_str, NULL, 16); + } + + return true; +} +#endif + +/* Checks if an interface is part of a multicast group, no null check for input strings */ +static bool is_interface_in_group(const char *ifname_in, const char *mcast_addr_in) +{ +#ifdef __linux__ + char line[MAX_CHARS_PER_LINE]; + char ifname_found[MAX_INTERFACE_NAME_LEN]; + char mcast_addr_found_hex_str[MAX_V6ADDR_LEN + 5]; + struct in6_addr mcast_addr_in_bin; + struct in6_addr mcast_addr_found_bin; + int if_index = -1; + int ifname_in_len = 0; + int ifname_found_len = 0; + + FILE *fp = fopen(PROC_IGMP6, "r"); + + if (!fp) { + flog_err_sys(EC_LIB_SYSTEM_CALL, "Failed to open %s", PROC_IGMP6); + return false; + } + + /* Convert input IPv6 address to binary */ + if (inet_pton(AF_INET6, mcast_addr_in, &mcast_addr_in_bin) != 1) { + flog_err_sys(EC_LIB_SYSTEM_CALL, "Invalid IPv6 address format %s", mcast_addr_in); + fclose(fp); + return false; + } + + /* Convert binary to hex format */ + while (fgets(line, sizeof(line), fp)) { + sscanf(line, "%d %s %s", &if_index, ifname_found, mcast_addr_found_hex_str); + + ifname_in_len = strlen(ifname_in); + ifname_found_len = strlen(ifname_found); + if (ifname_in_len != ifname_found_len) + continue; + + /* Locate 'x' if "0x" is present or not, if present go past that */ + const char *clean_mcast_addr_hex_str = strchr(mcast_addr_found_hex_str, 'x'); + if (clean_mcast_addr_hex_str) { + clean_mcast_addr_hex_str++; + } else { + clean_mcast_addr_hex_str = mcast_addr_found_hex_str; + } + + if (!v6_addr_hex_str_to_in6_addr(clean_mcast_addr_hex_str, &mcast_addr_found_bin)) + continue; + + if ((!strncmp(ifname_in, ifname_found, ifname_in_len)) && + (!IPV6_ADDR_CMP(&mcast_addr_in_bin, &mcast_addr_found_bin))) { + fclose(fp); + /* Already joined */ + return true; + } + } + + fclose(fp); + +#endif + + /* Not joined */ + return false; +} + static int if_join_all_router(int sock, struct interface *ifp) { int ret; struct ipv6_mreq mreq; + if (is_interface_in_group(ifp->name, ALLROUTER)) + /* Interface is already part of the group, so return sucess */ + return 0; + memset(&mreq, 0, sizeof(mreq)); inet_pton(AF_INET6, ALLROUTER, &mreq.ipv6mr_multiaddr); mreq.ipv6mr_interface = ifp->ifindex; ret = setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq)); - if (ret < 0) + + if (ret < 0) { flog_err_sys(EC_LIB_SOCKET, "%s(%u): Failed to join group, socket %u error %s", ifp->name, ifp->ifindex, sock, safe_strerror(errno)); + return ret; + } + if (IS_ZEBRA_DEBUG_EVENT) zlog_debug( "%s(%s:%u): Join All-Routers multicast group, socket %u", diff --git a/zebra/rtadv.h b/zebra/rtadv.h index 0983ea578f..73d737ce41 100644 --- a/zebra/rtadv.h +++ b/zebra/rtadv.h @@ -460,6 +460,7 @@ extern void zebra_interface_radv_enable(ZAPI_HANDLER_ARGS); extern uint32_t rtadv_get_interfaces_configured_from_bgp(void); extern bool rtadv_compiled_in(void); extern void rtadv_init(void); +extern void process_rtadv(void *arg); #ifdef __cplusplus } diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index 81fe2ab6a0..f45ce03956 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -39,6 +39,12 @@ const struct frr_yang_module_info frr_zebra_info = { } }, { + .xpath = "/frr-zebra:zebra/state/ip-forwarding", + .cbs = { + .get_elem = zebra_ip_forwarding_get_elem, + } + }, + { .xpath = "/frr-zebra:zebra/ipv6-forwarding", .cbs = { .modify = zebra_ipv6_forwarding_modify, @@ -46,6 +52,12 @@ const struct frr_yang_module_info frr_zebra_info = { } }, { + .xpath = "/frr-zebra:zebra/state/ipv6-forwarding", + .cbs = { + .get_elem = zebra_ipv6_forwarding_get_elem, + } + }, + { .xpath = "/frr-zebra:zebra/workqueue-hold-timer", .cbs = { .modify = zebra_workqueue_hold_timer_modify, diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index 426ad4b7de..7b0205058e 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -32,9 +32,11 @@ int get_debugs_rpc(struct nb_cb_rpc_args *args); int zebra_mcast_rpf_lookup_modify(struct nb_cb_modify_args *args); int zebra_ip_forwarding_modify(struct nb_cb_modify_args *args); int zebra_ip_forwarding_destroy(struct nb_cb_destroy_args *args); +struct yang_data *zebra_ip_forwarding_get_elem(struct nb_cb_get_elem_args *args); int zebra_ipv6_forwarding_modify(struct nb_cb_modify_args *args); int zebra_ipv6_forwarding_destroy(struct nb_cb_destroy_args *args); int zebra_workqueue_hold_timer_modify(struct nb_cb_modify_args *args); +struct yang_data *zebra_ipv6_forwarding_get_elem(struct nb_cb_get_elem_args *args); int zebra_zapi_packets_modify(struct nb_cb_modify_args *args); int zebra_import_kernel_table_table_id_modify(struct nb_cb_modify_args *args); int zebra_import_kernel_table_table_id_destroy(struct nb_cb_destroy_args *args); diff --git a/zebra/zebra_nb_state.c b/zebra/zebra_nb_state.c index bbed4535e1..8f072d302d 100644 --- a/zebra/zebra_nb_state.c +++ b/zebra/zebra_nb_state.c @@ -14,6 +14,7 @@ #include "printfrr.h" #include "zebra/zebra_vxlan.h" #include "zebra/zebra_vxlan_if.h" +#include "zebra/ipforward.h" /* * XPath: /frr-interface:lib/interface/frr-zebra:zebra/state/up-count @@ -1169,3 +1170,22 @@ struct yang_data *zebra_max_multipath_get_elem(struct nb_cb_get_elem_args *args) { return yang_data_new_uint16(args->xpath, zrouter.multipath_num); } + +/* + * XPath: + * /frr-zebra:zebra/ip_forwarding + */ +struct yang_data *zebra_ip_forwarding_get_elem(struct nb_cb_get_elem_args *args) +{ + return yang_data_new_bool(args->xpath, ipforward()); +} + + +/* + * XPath: + * /frr-zebra:zebra/ipv6_forwarding + */ +struct yang_data *zebra_ipv6_forwarding_get_elem(struct nb_cb_get_elem_args *args) +{ + return yang_data_new_bool(args->xpath, ipforward_ipv6()); +} diff --git a/zebra/zebra_neigh.c b/zebra/zebra_neigh.c index a222e7f6e8..8a91f2719b 100644 --- a/zebra/zebra_neigh.c +++ b/zebra/zebra_neigh.c @@ -153,14 +153,18 @@ void zebra_neigh_del(struct interface *ifp, struct ipaddr *ip) /* kernel neigh delete all for a given interface */ void zebra_neigh_del_all(struct interface *ifp) { - struct zebra_neigh_ent *n, *nn; + struct zebra_neigh_ent *n, *next; if (IS_ZEBRA_DEBUG_NEIGH) zlog_debug("zebra neigh delete all for interface %s/%d", ifp->name, ifp->ifindex); - RB_FOREACH_SAFE (n, zebra_neigh_rb_head, &zneigh_info->neigh_rb_tree, nn) - zebra_neigh_del(ifp, &n->ip); + RB_FOREACH_SAFE (n, zebra_neigh_rb_head, &zneigh_info->neigh_rb_tree, next) { + if (n->ifindex == ifp->ifindex) { + /* Free the neighbor directly instead of looking it up again */ + zebra_neigh_free(n); + } + } } /* kernel neigh add */ diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index f5141c8f23..5b7452a79e 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -2930,6 +2930,68 @@ static uint32_t proto_nhg_nexthop_active_update(struct nexthop_group *nhg) return curr_active; } +void nexthop_vrf_update(struct route_node *rn, struct route_entry *re, vrf_id_t vrf_id) +{ + struct nhg_hash_entry *curr_nhe, *new_nhe; + afi_t rt_afi = family2afi(rn->p.family); + struct nexthop *nexthop; + + re->vrf_id = vrf_id; + + /* Make a local copy of the existing nhe, so we don't work on/modify + * the shared nhe. + */ + curr_nhe = zebra_nhe_copy(re->nhe, re->nhe->id); + + if (IS_ZEBRA_DEBUG_NHG_DETAIL) + zlog_debug("%s: re %p nhe %p (%pNG), curr_nhe %p", __func__, re, re->nhe, re->nhe, + curr_nhe); + + /* Clear the existing id, if any: this will avoid any confusion + * if the id exists, and will also force the creation + * of a new nhe reflecting the changes we may make in this local copy. + */ + curr_nhe->id = 0; + + curr_nhe->vrf_id = vrf_id; + for (ALL_NEXTHOPS(curr_nhe->nhg, nexthop)) { + if (!nexthop->ifindex) + /* change VRF ID of nexthop without interfaces + * (eg. blackhole) + */ + nexthop->vrf_id = vrf_id; + } + + if (zebra_nhg_get_backup_nhg(curr_nhe)) { + for (ALL_NEXTHOPS(curr_nhe->backup_info->nhe->nhg, nexthop)) { + if (!nexthop->ifindex) + /* change VRF ID of nexthop without interfaces + * (eg. blackhole) + */ + nexthop->vrf_id = vrf_id; + } + } + + /* + * Ref or create an nhe that matches the current state of the + * nexthop(s). + */ + new_nhe = zebra_nhg_rib_find_nhe(curr_nhe, rt_afi); + + if (IS_ZEBRA_DEBUG_NHG_DETAIL) + zlog_debug("%s: re %p CHANGED: nhe %p (%pNG) => new_nhe %p (%pNG)", __func__, re, + re->nhe, re->nhe, new_nhe, new_nhe); + + route_entry_update_nhe(re, new_nhe); + + /* + * Do not need the old / copied nhe anymore since it + * was either copied over into a new nhe or not + * used at all. + */ + zebra_nhg_free(curr_nhe); +} + /* * This function takes the start of two comparable nexthops from two different * nexthop groups and walks them to see if they can be considered the same diff --git a/zebra/zebra_nhg.h b/zebra/zebra_nhg.h index 0f90627a0d..de6f6123aa 100644 --- a/zebra/zebra_nhg.h +++ b/zebra/zebra_nhg.h @@ -401,6 +401,7 @@ extern void zebra_nhg_mark_keep(void); /* Nexthop resolution processing */ struct route_entry; /* Forward ref to avoid circular includes */ +extern void nexthop_vrf_update(struct route_node *rn, struct route_entry *re, vrf_id_t vrf_id); extern int nexthop_active_update(struct route_node *rn, struct route_entry *re, struct route_entry *old_re); diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 8cea605f41..20ec25a431 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -903,6 +903,11 @@ void zebra_rtable_node_cleanup(struct route_table *table, rib_unlink(node, re); } + zebra_node_info_cleanup(node); +} + +void zebra_node_info_cleanup(struct route_node *node) +{ if (node->info) { rib_dest_t *dest = node->info; @@ -4498,6 +4503,12 @@ rib_update_handle_kernel_route_down_possibility(struct route_node *rn, bool alive = false; for (ALL_NEXTHOPS(re->nhe->nhg, nexthop)) { + if (!nexthop->ifindex) { + /* blackhole nexthops have no interfaces */ + alive = true; + break; + } + struct interface *ifp = if_lookup_by_index(nexthop->ifindex, nexthop->vrf_id); diff --git a/zebra/zebra_router.c b/zebra/zebra_router.c index ae2910af41..15b7e317c9 100644 --- a/zebra/zebra_router.c +++ b/zebra/zebra_router.c @@ -17,6 +17,7 @@ #include "zebra/zebra_tc.h" #include "debug.h" #include "zebra_script.h" +#include "wheel.h" DEFINE_MTYPE_STATIC(ZEBRA, RIB_TABLE_INFO, "RIB table info"); DEFINE_MTYPE_STATIC(ZEBRA, ZEBRA_RT_TABLE, "Zebra VRF table"); @@ -220,10 +221,22 @@ uint32_t zebra_router_get_next_sequence(void) memory_order_relaxed); } +static inline unsigned int interface_hash_key(const void *arg) +{ + const struct interface *ifp = arg; + + return ifp->ifindex; +} + void zebra_router_terminate(void) { struct zebra_router_table *zrt, *tmp; + if (zrouter.ra_wheel) { + wheel_delete(zrouter.ra_wheel); + zrouter.ra_wheel = NULL; + } + EVENT_OFF(zrouter.t_rib_sweep); RB_FOREACH_SAFE (zrt, zebra_router_table_head, &zrouter.tables, tmp) @@ -278,6 +291,11 @@ void zebra_router_init(bool asic_offload, bool notify_on_ack, zrouter.nhg_keep = ZEBRA_DEFAULT_NHG_KEEP_TIMER; + /*Init V6 RA batching stuffs*/ + zrouter.ra_wheel = wheel_init(zrouter.master, RTADV_TIMER_WHEEL_PERIOD_MS, + RTADV_TIMER_WHEEL_SLOTS_NO, interface_hash_key, process_rtadv, + NULL); + zebra_vxlan_init(); zebra_mlag_init(); zebra_neigh_init(); diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h index 28c4cf0790..d357994ec2 100644 --- a/zebra/zebra_router.h +++ b/zebra/zebra_router.h @@ -112,12 +112,19 @@ struct zebra_mlag_info { struct event *t_write; }; +#define RTADV_TIMER_WHEEL_PERIOD_MS 1000 +#define RTADV_TIMER_WHEEL_SLOTS_NO 100 +#define ICMPV6_JOIN_TIMER_EXP_MS 100 + struct zebra_router { atomic_bool in_shutdown; /* Thread master */ struct event_loop *master; + /* Wheel to process V6 RA update */ + struct timer_wheel *ra_wheel; + /* Lists of clients who have connected to us */ struct list *client_list; diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c index 7bfe07b4cf..d652c57388 100644 --- a/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c @@ -162,6 +162,69 @@ static int zebra_vrf_enable(struct vrf *vrf) return 0; } +/* update the VRF ID of a routing table and their routing entries */ +static void zebra_vrf_disable_update_vrfid(struct zebra_vrf *zvrf, afi_t afi, safi_t safi) +{ + struct rib_table_info *info; + struct route_entry *re, *nre; + struct route_node *rn, *nrn; + bool empty_table = true; + bool rn_delete; + + /* Assign the table to the default VRF. + * Although the table is not technically owned by the default VRF, + * the code assumes that unassigned routing tables are + * associated with the default VRF. + */ + info = route_table_get_info(zvrf->table[afi][safi]); + info->zvrf = vrf_info_lookup(VRF_DEFAULT); + + rn = route_top(zvrf->table[afi][safi]); + if (rn) + empty_table = false; + while (rn) { + if (!rn->info) { + rn = route_next(rn); + continue; + } + + /* Assign the kernel route entries to the default VRF, + * even though they are not actually owned by it. + * + * Remove route nodes that were created by FRR daemons, + * unless they are associated with the table rather than the VRF. + * Routes associated with the VRF are not needed once the VRF is + * disabled. + */ + rn_delete = true; + RNODE_FOREACH_RE_SAFE (rn, re, nre) { + if (re->type == ZEBRA_ROUTE_KERNEL || + CHECK_FLAG(re->flags, ZEBRA_FLAG_TABLEID)) { + nexthop_vrf_update(rn, re, VRF_DEFAULT); + if (CHECK_FLAG(re->flags, ZEBRA_FLAG_TABLEID)) + /* reinstall routes */ + rib_install_kernel(rn, re, NULL); + rn_delete = false; + } else + rib_unlink(rn, re); + } + if (rn_delete) { + nrn = route_next(rn); + zebra_node_info_cleanup(rn); + rn->info = NULL; + route_unlock_node(rn); + rn = nrn; + } else { + empty_table = false; + rn = route_next(rn); + } + } + + if (empty_table) + zebra_router_release_table(zvrf, zvrf->table_id, afi, safi); + zvrf->table[afi][safi] = NULL; +} + /* Callback upon disabling a VRF. */ static int zebra_vrf_disable(struct vrf *vrf) { @@ -224,9 +287,13 @@ static int zebra_vrf_disable(struct vrf *vrf) * we no-longer need this pointer. */ for (safi = SAFI_UNICAST; safi <= SAFI_MULTICAST; safi++) { - zebra_router_release_table(zvrf, zvrf->table_id, afi, - safi); - zvrf->table[afi][safi] = NULL; + if (!zvrf->table[afi][safi] || vrf->vrf_id == VRF_DEFAULT) { + zebra_router_release_table(zvrf, zvrf->table_id, afi, safi); + zvrf->table[afi][safi] = NULL; + continue; + } + + zebra_vrf_disable_update_vrfid(zvrf, afi, safi); } } @@ -357,19 +424,50 @@ static void zebra_rnhtable_node_cleanup(struct route_table *table, static void zebra_vrf_table_create(struct zebra_vrf *zvrf, afi_t afi, safi_t safi) { + vrf_id_t vrf_id = zvrf->vrf->vrf_id; + struct rib_table_info *info; + struct route_entry *re; struct route_node *rn; struct prefix p; assert(!zvrf->table[afi][safi]); + /* Attempt to retrieve the Linux routing table using zvrf->table_id. + * If the table was created before the VRF, it will already exist. + * Otherwise, create a new table. + */ zvrf->table[afi][safi] = zebra_router_get_table(zvrf, zvrf->table_id, afi, safi); + /* If the table existed before the VRF was created, info->zvrf was + * referring to the default VRF. + * Assign the table to the new VRF. + * Note: FRR does not allow multiple VRF interfaces to be created with the + * same table ID. + */ + info = route_table_get_info(zvrf->table[afi][safi]); + info->zvrf = zvrf; + + /* If the table existed before the VRF was created, their routing entries + * was owned by the default VRF. + * Re-assign all the routing entries to the new VRF. + */ + for (rn = route_top(zvrf->table[afi][safi]); rn; rn = route_next(rn)) { + if (!rn->info) + continue; + + RNODE_FOREACH_RE (rn, re) + nexthop_vrf_update(rn, re, vrf_id); + } + memset(&p, 0, sizeof(p)); p.family = afi2family(afi); + /* create a fake default route or get the existing one */ rn = srcdest_rnode_get(zvrf->table[afi][safi], &p, NULL); - zebra_rib_create_dest(rn); + if (!rn->info) + /* do not override the existing default route */ + zebra_rib_create_dest(rn); } /* Allocate new zebra VRF. */ diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h index 334bb93684..289a8fcc47 100644 --- a/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h @@ -263,6 +263,8 @@ extern void zebra_vrf_init(void); extern void zebra_rtable_node_cleanup(struct route_table *table, struct route_node *node); +extern void zebra_node_info_cleanup(struct route_node *node); + #ifdef __cplusplus } diff --git a/zebra/zebra_vxlan_if.c b/zebra/zebra_vxlan_if.c index ea0be2f644..4fd9cb6587 100644 --- a/zebra/zebra_vxlan_if.c +++ b/zebra/zebra_vxlan_if.c @@ -54,6 +54,8 @@ #include "zebra/zebra_evpn_vxlan.h" #include "zebra/zebra_router.h" +DEFINE_MTYPE_STATIC(ZEBRA, L2_VNI, "L2 VNI"); + static unsigned int zebra_vxlan_vni_hash_keymake(const void *p) { const struct zebra_vxlan_vni *vni; @@ -527,11 +529,7 @@ static int zebra_vxlan_if_add_update_vni(struct zebra_if *zif, old_vni->access_vlan, vni->vni, vni->access_vlan); - zebra_evpn_vl_vxl_deref(old_vni->access_vlan, old_vni->vni, - zif); - zebra_evpn_vl_vxl_ref(vni->access_vlan, vni->vni, zif); - zebra_vxlan_if_update_vni(zif->ifp, vni, ctx); - zebra_vxlan_vni_free(old_vni); + } else { int ret; @@ -544,19 +542,20 @@ static int zebra_vxlan_if_add_update_vni(struct zebra_if *zif, if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug("%s vxlan %s vni %u has error accessing bridge table.", __func__, zif->ifp->name, vni->vni); + + return 0; } else if (ret == 0) { if (IS_ZEBRA_DEBUG_VXLAN) zlog_debug("%s vxlan %s vni (%u, %u) not present in bridge table", - __func__, zif->ifp->name, vni->vni, - vni->access_vlan); - zebra_evpn_vl_vxl_deref(old_vni->access_vlan, - old_vni->vni, zif); - zebra_evpn_vl_vxl_ref(vni->access_vlan, vni->vni, zif); - zebra_vxlan_if_update_vni(zif->ifp, vni, ctx); - zebra_vxlan_vni_free(old_vni); + __func__, zif->ifp->name, vni->vni, vni->access_vlan); } } + zebra_evpn_vl_vxl_deref(old_vni->access_vlan, old_vni->vni, zif); + zebra_evpn_vl_vxl_ref(vni->access_vlan, vni->vni, zif); + zebra_vxlan_if_update_vni(zif->ifp, vni, ctx); + zebra_vxlan_vni_free(old_vni); + return 0; } @@ -608,7 +607,7 @@ void zebra_vxlan_vni_free(void *arg) vni = (struct zebra_vxlan_vni *)arg; - XFREE(MTYPE_TMP, vni); + XFREE(MTYPE_L2_VNI, vni); } void *zebra_vxlan_vni_alloc(void *p) @@ -617,7 +616,7 @@ void *zebra_vxlan_vni_alloc(void *p) const struct zebra_vxlan_vni *vnip; vnip = (const struct zebra_vxlan_vni *)p; - vni = XCALLOC(MTYPE_TMP, sizeof(*vni)); + vni = XCALLOC(MTYPE_L2_VNI, sizeof(*vni)); vni->vni = vnip->vni; vni->access_vlan = vnip->access_vlan; vni->mcast_grp = vnip->mcast_grp; @@ -659,8 +658,6 @@ int zebra_vxlan_if_vni_table_create(struct zebra_if *zif) vni_info = VNI_INFO_FROM_ZEBRA_IF(zif); vni_info->vni_table = zebra_vxlan_vni_table_create(); - if (!vni_info->vni_table) - return -ENOMEM; return 0; } |
