summaryrefslogtreecommitdiffstats
path: root/bgpd/bgpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgpd.c')
-rw-r--r--bgpd/bgpd.c292
1 files changed, 83 insertions, 209 deletions
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index f2e33a46..060f850b 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -292,15 +292,9 @@ bgp_confederation_id_set (struct bgp *bgp, as_t as)
if (peer_sort (peer) == BGP_PEER_EBGP)
{
peer->local_as = as;
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
-
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
}
else
@@ -312,14 +306,9 @@ bgp_confederation_id_set (struct bgp *bgp, as_t as)
/* Reset the local_as to be our EBGP one */
if (peer_sort (peer) == BGP_PEER_EBGP)
peer->local_as = as;
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
}
}
@@ -341,15 +330,9 @@ bgp_confederation_id_unset (struct bgp *bgp)
if (peer_sort (peer) != BGP_PEER_IBGP)
{
peer->local_as = bgp->as;
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
-
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
}
return 0;
@@ -405,14 +388,9 @@ bgp_confederation_peers_add (struct bgp *bgp, as_t as)
if (peer->as == as)
{
peer->local_as = bgp->as;
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
}
}
@@ -461,14 +439,9 @@ bgp_confederation_peers_remove (struct bgp *bgp, as_t as)
if (peer->as == as)
{
peer->local_as = bgp->confed_id;
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
}
}
@@ -750,14 +723,9 @@ peer_as_change (struct peer *peer, as_t as)
/* Stop peer. */
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
type = peer_sort (peer);
peer->as = as;
@@ -892,9 +860,11 @@ peer_activate (struct peer *peer, afi_t afi, safi_t safi)
peer->afc[afi][safi] = 1;
if (! active && peer_active (peer))
- bgp_timer_set (peer);
+ bgp_peer_enable (peer);
else
- {
+#if 0
+ /* TODO: Dynamic capability */
+ {
if (peer->status == Established)
{
if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
@@ -910,13 +880,16 @@ peer_activate (struct peer *peer, afi_t afi, safi_t safi)
}
}
else
+#endif
{
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
+#if 0
}
}
+#endif
}
return 0;
}
@@ -1154,8 +1127,6 @@ peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
else
peer->password = NULL;
- bgp_md5_set (peer);
-
/* maximum-prefix */
peer->pmax[afi][safi] = conf->pmax[afi][safi];
peer->pmax_threshold[afi][safi] = conf->pmax_threshold[afi][safi];
@@ -1546,14 +1517,9 @@ peer_group_bind (struct bgp *bgp, union sockunion *su,
peer_group2peer_config_copy (group, peer, afi, safi);
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_RMAP_BIND;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_RMAP_BIND;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -1589,15 +1555,9 @@ peer_group_unbind (struct bgp *bgp, struct peer *peer,
peer_global_config_reset (peer);
}
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_RMAP_UNBIND;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
-
+ peer->last_reset = PEER_DOWN_RMAP_UNBIND;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -1732,13 +1692,6 @@ bgp_get (struct bgp **bgp_val, as_t *as, const char *name)
}
}
- /* Create BGP server socket, if first instance. */
- if (list_isempty(bm->bgp))
- {
- if (bgp_socket (bm->port, bm->address) < 0)
- return BGP_ERR_INVALID_VALUE;
- }
-
bgp = bgp_create (as, name);
listnode_add (bm->bgp, bgp);
bgp_router_id_set(bgp, &router_id_zebra);
@@ -1784,8 +1737,6 @@ bgp_delete (struct bgp *bgp)
* routes to be processed still referencing the struct bgp.
*/
listnode_delete (bm->bgp, bgp);
- if (list_isempty(bm->bgp))
- bgp_close ();
bgp_unlock(bgp); /* initial reference */
@@ -2076,22 +2027,19 @@ peer_flag_modify_action (struct peer *peer, u_int32_t flag)
peer->host);
}
- if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
- peer_nsf_stop (peer);
+ if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
+ peer_nsf_stop (peer);
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ bgp_peer_disable(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, 0));
}
else
{
peer->v_start = BGP_INIT_START_TIMER;
- BGP_EVENT_ADD (peer, BGP_Stop);
+ bgp_peer_disable(peer, NULL);
}
}
- else if (peer->status == Established)
+ else
{
if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
@@ -2100,11 +2048,9 @@ peer_flag_modify_action (struct peer *peer, u_int32_t flag)
else if (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)
peer->last_reset = PEER_DOWN_MULTIHOP_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
}
/* Change specified peer flag. */
@@ -2471,14 +2417,9 @@ peer_update_source_if_set (struct peer *peer, const char *ifname)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -2503,14 +2444,9 @@ peer_update_source_if_set (struct peer *peer, const char *ifname)
peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return 0;
}
@@ -2540,14 +2476,9 @@ peer_update_source_addr_set (struct peer *peer, union sockunion *su)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -2571,14 +2502,9 @@ peer_update_source_addr_set (struct peer *peer, union sockunion *su)
peer->update_source = sockunion_dup (su);
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return 0;
}
@@ -2622,14 +2548,9 @@ peer_update_source_unset (struct peer *peer)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -2652,14 +2573,9 @@ peer_update_source_unset (struct peer *peer)
peer->update_if = NULL;
}
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return 0;
}
@@ -3081,15 +2997,9 @@ peer_local_as_set (struct peer *peer, as_t as, int no_prepend)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
-
+ peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -3102,14 +3012,9 @@ peer_local_as_set (struct peer *peer, as_t as, int no_prepend)
else
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return 0;
@@ -3132,15 +3037,9 @@ peer_local_as_unset (struct peer *peer)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
-
+ peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
return 0;
}
@@ -3150,14 +3049,9 @@ peer_local_as_unset (struct peer *peer)
peer->change_local_as = 0;
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
- if (peer->status == Established)
- {
- peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- }
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return 0;
}
@@ -3184,12 +3078,9 @@ peer_password_set (struct peer *peer, const char *password)
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
-
- return (bgp_md5_set (peer) >= 0) ? BGP_SUCCESS : BGP_ERR_TCPSIG_FAILED;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
+ return BGP_SUCCESS;
}
for (ALL_LIST_ELEMENTS (peer->group->peer, nn, nnode, peer))
@@ -3202,13 +3093,8 @@ peer_password_set (struct peer *peer, const char *password)
peer->password = XSTRDUP(MTYPE_PEER_PASSWORD, password);
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
-
- if (bgp_md5_set (peer) < 0)
- ret = BGP_ERR_TCPSIG_FAILED;
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
}
return ret;
@@ -3230,18 +3116,13 @@ peer_password_unset (struct peer *peer)
&& strcmp (peer->group->conf->password, peer->password) == 0)
return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
if (peer->password)
XFREE (MTYPE_PEER_PASSWORD, peer->password);
peer->password = NULL;
-
- bgp_md5_set (peer);
-
return 0;
}
@@ -3253,15 +3134,11 @@ peer_password_unset (struct peer *peer)
if (!peer->password)
continue;
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE, 0));
XFREE (MTYPE_PEER_PASSWORD, peer->password);
peer->password = NULL;
-
- bgp_md5_set (peer);
}
return 0;
@@ -3984,7 +3861,7 @@ peer_clear (struct peer *peer)
{
BGP_TIMER_OFF (peer->t_pmax_restart);
if (BGP_DEBUG (events, EVENTS))
- zlog_debug ("%s Maximum-prefix restart timer canceled",
+ zlog_debug ("%s Maximum-prefix restart timer cancelled",
peer->host);
}
BGP_EVENT_ADD (peer, BGP_Start);
@@ -3992,11 +3869,8 @@ peer_clear (struct peer *peer)
}
peer->v_start = BGP_INIT_START_TIMER;
- if (peer->status == Established)
- bgp_notify_send (peer, BGP_NOTIFY_CEASE,
- BGP_NOTIFY_CEASE_ADMIN_RESET);
- else
- BGP_EVENT_ADD (peer, BGP_Stop);
+ bgp_peer_config_change(peer, bgp_notify_new(BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_ADMIN_RESET, 0));
}
return 0;
}