summaryrefslogtreecommitdiff
path: root/bgpd/bgp_vty.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_vty.c')
-rw-r--r--bgpd/bgp_vty.c60
1 files changed, 55 insertions, 5 deletions
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 9e81831ac7..3116e7cad0 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -3146,14 +3146,16 @@ DEFUN (no_neighbor,
* interface. */
if (peer->ifp)
bgp_zebra_terminate_radv(peer->bgp, peer);
+ peer_notify_unconfig(peer);
peer_delete(peer);
return CMD_SUCCESS;
}
group = peer_group_lookup(bgp, argv[idx_peer]->arg);
- if (group)
+ if (group) {
+ peer_group_notify_unconfig(group);
peer_group_delete(group);
- else {
+ } else {
vty_out(vty, "%% Create the peer-group first\n");
return CMD_WARNING_CONFIG_FAILED;
}
@@ -3167,9 +3169,12 @@ DEFUN (no_neighbor,
}
other = peer->doppelganger;
+ peer_notify_unconfig(peer);
peer_delete(peer);
- if (other && other->status != Deleted)
+ if (other && other->status != Deleted) {
+ peer_notify_unconfig(other);
peer_delete(other);
+ }
}
}
@@ -3201,6 +3206,7 @@ DEFUN (no_neighbor_interface_config,
/* Request zebra to terminate IPv6 RAs on this interface. */
if (peer->ifp)
bgp_zebra_terminate_radv(peer->bgp, peer);
+ peer_notify_unconfig(peer);
peer_delete(peer);
} else {
vty_out(vty, "%% Create the bgp interface first\n");
@@ -3222,9 +3228,10 @@ DEFUN (no_neighbor_peer_group,
struct peer_group *group;
group = peer_group_lookup(bgp, argv[idx_word]->arg);
- if (group)
+ if (group) {
+ peer_group_notify_unconfig(group);
peer_group_delete(group);
- else {
+ } else {
vty_out(vty, "%% Create the peer-group first\n");
return CMD_WARNING_CONFIG_FAILED;
}
@@ -3582,6 +3589,7 @@ DEFUN (no_neighbor_set_peer_group,
return CMD_WARNING_CONFIG_FAILED;
}
+ peer_notify_unconfig(peer);
ret = peer_delete(peer);
return bgp_vty_return(vty, ret);
@@ -6381,6 +6389,44 @@ ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as,
NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
"Use addpath to advertise the bestpath per each neighboring AS\n")
+DEFPY(
+ neighbor_aspath_loop_detection, neighbor_aspath_loop_detection_cmd,
+ "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Detect AS loops before sending to neighbor\n")
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty(vty, neighbor);
+ if (!peer)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ peer->as_path_loop_detection = true;
+
+ return CMD_SUCCESS;
+}
+
+DEFPY(
+ no_neighbor_aspath_loop_detection,
+ no_neighbor_aspath_loop_detection_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Detect AS loops before sending to neighbor\n")
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty(vty, neighbor);
+ if (!peer)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ peer->as_path_loop_detection = false;
+
+ return CMD_SUCCESS;
+}
+
static int set_ecom_list(struct vty *vty, int argc, struct cmd_token **argv,
struct ecommunity **list)
{
@@ -13678,6 +13724,10 @@ void bgp_vty_init(void)
install_element(BGP_VPNV6_NODE,
&no_neighbor_addpath_tx_bestpath_per_as_cmd);
+ /* "neighbor sender-as-path-loop-detection" commands. */
+ install_element(BGP_NODE, &neighbor_aspath_loop_detection_cmd);
+ install_element(BGP_NODE, &no_neighbor_aspath_loop_detection_cmd);
+
/* "neighbor passive" commands. */
install_element(BGP_NODE, &neighbor_passive_cmd);
install_element(BGP_NODE, &no_neighbor_passive_cmd);