* 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;
}
}
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);
+ }
}
}
/* 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");
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;
}
return CMD_WARNING_CONFIG_FAILED;
}
+ peer_notify_unconfig(peer);
ret = peer_delete(peer);
return bgp_vty_return(vty, ret);
return 0;
}
+int peer_notify_unconfig(struct peer *peer)
+{
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ bgp_notify_send(peer, BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_PEER_UNCONFIG);
+ return 0;
+}
+
+int peer_group_notify_unconfig(struct peer_group *group)
+{
+ struct peer *peer, *other;
+ struct listnode *node, *nnode;
+
+ for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
+ other = peer->doppelganger;
+ if (other && other->status != Deleted) {
+ other->group = NULL;
+ peer_notify_unconfig(other);
+ } else
+ peer_notify_unconfig(peer);
+ }
+ return 0;
+}
+
int peer_group_delete(struct peer_group *group)
{
struct bgp *bgp;
int, afi_t, safi_t);
extern int peer_group_remote_as(struct bgp *, const char *, as_t *, int);
extern int peer_delete(struct peer *peer);
+extern int peer_notify_unconfig(struct peer *peer);
extern int peer_group_delete(struct peer_group *);
extern int peer_group_remote_as_delete(struct peer_group *);
extern int peer_group_listen_range_add(struct peer_group *, struct prefix *);
+extern int peer_group_notify_unconfig(struct peer_group *group);
extern int peer_activate(struct peer *, afi_t, safi_t);
extern int peer_deactivate(struct peer *, afi_t, safi_t);