summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfdd/bfd.c41
-rw-r--r--bfdd/bfd.h34
-rw-r--r--bfdd/bfdd_cli.c20
-rw-r--r--bfdd/bfdd_nb.c35
-rw-r--r--bfdd/bfdd_nb.h4
-rw-r--r--bfdd/bfdd_nb_config.c49
-rw-r--r--bfdd/bfdd_vty.c6
-rw-r--r--bfdd/dplane.c7
-rw-r--r--bgpd/bgp_aspath.c42
-rw-r--r--bgpd/bgp_aspath.h1
-rw-r--r--bgpd/bgp_fsm.c197
-rw-r--r--bgpd/bgp_keepalives.c2
-rw-r--r--bgpd/bgp_mplsvpn.c11
-rw-r--r--bgpd/bgp_network.c199
-rw-r--r--bgpd/bgp_nht.c40
-rw-r--r--bgpd/bgp_packet.c10
-rw-r--r--bgpd/bgp_packet.h2
-rw-r--r--bgpd/bgp_route.c105
-rw-r--r--bgpd/bgpd.c17
-rw-r--r--bgpd/bgpd.h21
-rw-r--r--configure.ac2
-rw-r--r--doc/developer/building.rst2
-rw-r--r--doc/developer/index.rst1
-rw-r--r--doc/developer/lists.rst11
-rw-r--r--doc/user/bfd.rst5
-rw-r--r--doc/user/bgp.rst7
-rw-r--r--doc/user/protocols.rst1
-rw-r--r--doc/user/subdir.am10
-rw-r--r--isisd/isisd.h4
-rw-r--r--lib/bitfield.h3
-rw-r--r--lib/command.h1
-rw-r--r--lib/darr.h17
-rw-r--r--lib/libfrr.c1
-rw-r--r--lib/northbound_oper.c1
-rw-r--r--lib/vrf.c9
-rw-r--r--lib/zclient.c7
-rw-r--r--lib/zclient.h6
-rw-r--r--ospfd/ospf_dump.c14
-rw-r--r--pimd/pim6_mld.c27
-rw-r--r--staticd/static_routes.c30
-rw-r--r--staticd/static_routes.h1
-rw-r--r--staticd/static_zebra.c6
-rw-r--r--tests/lib/test_darr.c4
-rw-r--r--tests/topotests/bfd_topo1/r1/bfdd.conf1
-rw-r--r--tests/topotests/bfd_topo1/r2/bfdd.conf5
-rw-r--r--tests/topotests/bgp_comm_list_match/test_bgp_comm_list_match.py41
-rw-r--r--tests/topotests/bgp_ecomm_list_match/test_bgp_ecomm_list_match.py43
-rw-r--r--tests/topotests/bgp_evpn_route_map_match/test_bgp_evpn_route_map_match.py2
-rw-r--r--tests/topotests/bgp_reject_as_sets/r2/bgpd.conf3
-rw-r--r--tests/topotests/bgp_reject_as_sets/r2/zebra.conf3
-rw-r--r--tests/topotests/bgp_reject_as_sets/r4/bgpd.conf6
-rw-r--r--tests/topotests/bgp_reject_as_sets/r4/zebra.conf6
-rw-r--r--tests/topotests/bgp_reject_as_sets/test_bgp_reject_as_sets.py109
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r1/bgpd.conf2
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r1/show_bgp_ipv4_172_31_1_0.json52
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r1/zebra.conf4
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r100/bgpd.conf6
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r100/show_bgp_ipv4.json147
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/r100/zebra.conf4
-rw-r--r--tests/topotests/bgp_vpnv4_ebgp/test_bgp_vpnv4_ebgp.py118
-rw-r--r--tests/topotests/high_ecmp/r1/frr.conf2837
-rw-r--r--tests/topotests/high_ecmp/r1/frr_ipv4_bgp.conf520
-rw-r--r--tests/topotests/high_ecmp/r1/frr_ipv6_bgp.conf1037
-rw-r--r--tests/topotests/high_ecmp/r1/frr_unnumbered_bgp.conf522
-rw-r--r--tests/topotests/high_ecmp/r2/frr.conf2836
-rw-r--r--tests/topotests/high_ecmp/r2/frr_ipv4_bgp.conf519
-rw-r--r--tests/topotests/high_ecmp/r2/frr_ipv6_bgp.conf1035
-rw-r--r--tests/topotests/high_ecmp/r2/frr_unnumbered_bgp.conf520
-rw-r--r--tests/topotests/high_ecmp/test_high_ecmp_unnumbered.py107
-rw-r--r--tests/topotests/high_ecmp/test_high_ecmp_v4.py (renamed from tests/topotests/high_ecmp/test_high_ecmp.py)11
-rw-r--r--tests/topotests/high_ecmp/test_high_ecmp_v6.py107
-rwxr-xr-xtests/topotests/lib/bmp_collector/bmpserver.py15
-rw-r--r--tests/topotests/lib/topotest.py42
-rw-r--r--tests/topotests/zebra_rib/r1/import_mrib_table_2.json8
-rw-r--r--tests/topotests/zebra_rib/r1/import_mrib_table_3.json10
-rw-r--r--tests/topotests/zebra_rib/r1/import_mrib_table_4.json8
-rw-r--r--tests/topotests/zebra_rib/r1/import_table_2.json8
-rw-r--r--tests/topotests/zebra_rib/r1/import_table_3.json10
-rw-r--r--tests/topotests/zebra_rib/r1/import_table_4.json8
-rw-r--r--tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.json54
-rw-r--r--tests/topotests/zebra_rib/r1/v4_route_table_1_no_vrf.txt3
-rw-r--r--tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.json115
-rw-r--r--tests/topotests/zebra_rib/r1/v4_route_table_1_vrf_red.txt6
-rw-r--r--tests/topotests/zebra_rib/test_zebra_rib.py150
-rw-r--r--yang/frr-affinity-map.yang16
-rw-r--r--yang/frr-bfdd.yang17
-rw-r--r--yang/frr-bgp-common.yang143
-rw-r--r--yang/frr-zebra.yang30
-rw-r--r--zebra/interface.c11
-rw-r--r--zebra/interface.h3
-rw-r--r--zebra/rtadv.c187
-rw-r--r--zebra/rtadv.h1
-rw-r--r--zebra/zebra_nb.c12
-rw-r--r--zebra/zebra_nb.h2
-rw-r--r--zebra/zebra_nb_state.c20
-rw-r--r--zebra/zebra_neigh.c10
-rw-r--r--zebra/zebra_nhg.c62
-rw-r--r--zebra/zebra_nhg.h1
-rw-r--r--zebra/zebra_rib.c11
-rw-r--r--zebra/zebra_router.c18
-rw-r--r--zebra/zebra_router.h7
-rw-r--r--zebra/zebra_vrf.c106
-rw-r--r--zebra/zebra_vrf.h2
-rw-r--r--zebra/zebra_vxlan_if.c29
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;
diff --git a/lib/vrf.c b/lib/vrf.c
index 0b39d93602..997926fd9a 100644
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -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;
}