summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_packet.c')
-rw-r--r--bgpd/bgp_packet.c93
1 files changed, 34 insertions, 59 deletions
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index 71779567..62d76c60 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -764,35 +764,6 @@ bgp_open_send (struct peer *peer)
}
#endif
-/* Send BGP notify packet with data portion. */
-void
-bgp_notify_send_with_data (struct peer *peer, u_char code, u_char sub_code,
- u_char *data, size_t datalen)
-{
- bgp_notify notification;
- notification = bgp_notify_new_with_data(code, sub_code, data, datalen);
-
- /* peer reset cause */
- if (sub_code != BGP_NOTIFY_CEASE_CONFIG_CHANGE)
- {
- if (sub_code == BGP_NOTIFY_CEASE_ADMIN_RESET)
- peer->last_reset = PEER_DOWN_USER_RESET;
- else if (sub_code == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN)
- peer->last_reset = PEER_DOWN_USER_SHUTDOWN;
- else
- peer->last_reset = PEER_DOWN_NOTIFY_SEND;
- }
-
- bgp_peer_disable(peer, notification);
-}
-
-/* Send BGP notify packet. */
-void
-bgp_notify_send (struct peer *peer, u_char code, u_char sub_code)
-{
- bgp_notify_send_with_data (peer, code, sub_code, NULL, 0);
-}
-
/* Send route refresh message to the peer. */
void
@@ -1449,11 +1420,11 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
char attrstr[BUFSIZ] = "";
/* Status must be Established. */
- if (peer->state != bgp_peer_sEstablished)
+ if (peer->state != bgp_peer_pEstablished)
{
zlog_err ("%s [FSM] Update packet received under status %s",
peer->host, LOOKUP (bgp_peer_status_msg, peer->state));
- bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
+ bgp_peer_down_error (peer, BGP_NOTIFY_FSM_ERR, 0);
return -1;
}
@@ -1476,8 +1447,8 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
zlog_err ("%s [Error] Update packet error"
" (packet length is short for unfeasible length)",
peer->host);
- bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
- BGP_NOTIFY_UPDATE_MAL_ATTR);
+ bgp_peer_down_error (peer, BGP_NOTIFY_UPDATE_ERR,
+ BGP_NOTIFY_UPDATE_MAL_ATTR);
return -1;
}
@@ -1490,8 +1461,8 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
zlog_err ("%s [Error] Update packet error"
" (packet unfeasible length overflow %d)",
peer->host, withdraw_len);
- bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
- BGP_NOTIFY_UPDATE_MAL_ATTR);
+ bgp_peer_down_error (peer, BGP_NOTIFY_UPDATE_ERR,
+ BGP_NOTIFY_UPDATE_MAL_ATTR);
return -1;
}
@@ -1518,8 +1489,8 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
zlog_warn ("%s [Error] Packet Error"
" (update packet is short for attribute length)",
peer->host);
- bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
- BGP_NOTIFY_UPDATE_MAL_ATTR);
+ bgp_peer_down_error (peer, BGP_NOTIFY_UPDATE_ERR,
+ BGP_NOTIFY_UPDATE_MAL_ATTR);
return -1;
}
@@ -1532,8 +1503,8 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
zlog_warn ("%s [Error] Packet Error"
" (update packet attribute length overflow %d)",
peer->host, attribute_len);
- bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR,
- BGP_NOTIFY_UPDATE_MAL_ATTR);
+ bgp_peer_down_error (peer, BGP_NOTIFY_UPDATE_ERR,
+ BGP_NOTIFY_UPDATE_MAL_ATTR);
return -1;
}
@@ -1754,7 +1725,7 @@ bgp_update_receive (struct peer *peer, bgp_size_t size)
/* If peering is stopped due to some reason, do not generate BGP
event. */
- if (peer->state != bgp_peer_sEstablished)
+ if (peer->state != bgp_peer_pEstablished)
return 0;
/* Generate BGP event. */
@@ -1949,9 +1920,8 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
{
plog_err (peer->log, "%s [Error] BGP route refresh is not enabled",
peer->host);
- bgp_notify_send (peer,
- BGP_NOTIFY_HEADER_ERR,
- BGP_NOTIFY_HEADER_BAD_MESTYPE);
+ bgp_peer_down_error (peer, BGP_NOTIFY_HEADER_ERR,
+ BGP_NOTIFY_HEADER_BAD_MESTYPE);
return;
}
@@ -1961,7 +1931,7 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
plog_err (peer->log,
"%s [Error] Route refresh packet received under status %s",
peer->host, LOOKUP (bgp_status_msg, peer->status));
- bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
+ bgp_peer_down_error (peer, BGP_NOTIFY_FSM_ERR, 0);
return;
}
@@ -2003,7 +1973,7 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
if (size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE) < 5)
{
zlog_info ("%s ORF route refresh length error", peer->host);
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
+ bgp_peer_down_error (peer, BGP_NOTIFY_CEASE, 0);
return;
}
@@ -2130,7 +2100,8 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
if (pnt + 3 > end)
{
zlog_info ("%s Capability length error", peer->host);
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
+ /* TODO: Is this the right notification ?? */
+ bgp_peer_down_error (peer, BGP_NOTIFY_CEASE, 0);
return -1;
}
action = *pnt;
@@ -2142,7 +2113,8 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
{
zlog_info ("%s Capability Action Value error %d",
peer->host, action);
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
+ /* TODO: Is this the right notification ?? */
+ bgp_peer_down_error (peer, BGP_NOTIFY_CEASE, 0);
return -1;
}
@@ -2154,7 +2126,8 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
if ((pnt + hdr->length + 3) > end)
{
zlog_info ("%s Capability length error", peer->host);
- bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
+ /* TODO: Is this the right notification ?? */
+ bgp_peer_down_error (peer, BGP_NOTIFY_CEASE, 0);
return -1;
}
@@ -2200,16 +2173,20 @@ bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
{
peer->afc_recv[afi][safi] = 0;
peer->afc_nego[afi][safi] = 0;
+ bool completed ;
if (peer_active_nego (peer))
- bgp_clear_route_normal (peer, afi, safi);
+ completed = bgp_clear_routes (peer, afi, safi, false);
else
{
+ completed = true ;
/* TODO: only used for unit tests. Test will need fixing */
#if 0
BGP_EVENT_ADD (peer, BGP_Stop);
#endif
- }
+ } ;
+ /* if bgp_clear_routes does not complete. what do we do ? */
+ passert(completed) ;
}
}
else
@@ -2242,19 +2219,18 @@ bgp_capability_receive (struct peer *peer, bgp_size_t size)
{
plog_err (peer->log, "%s [Error] BGP dynamic capability is not enabled",
peer->host);
- bgp_notify_send (peer,
- BGP_NOTIFY_HEADER_ERR,
- BGP_NOTIFY_HEADER_BAD_MESTYPE);
+ bgp_peer_down_error (peer, BGP_NOTIFY_HEADER_ERR,
+ BGP_NOTIFY_HEADER_BAD_MESTYPE);
return -1;
}
/* Status must be Established. */
- if (peer->state != bgp_peer_sEstablished)
+ if (peer->state != bgp_peer_pEstablished)
{
plog_err (peer->log,
"%s [Error] Dynamic capability packet received under status %s",
peer->host, LOOKUP (bgp_status_msg, peer->state));
- bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
+ bgp_peer_down_error (peer, BGP_NOTIFY_FSM_ERR, 0);
return -1;
}
@@ -2405,9 +2381,8 @@ bgp_read (struct thread *thread)
if (((type == BGP_MSG_OPEN) || (type == BGP_MSG_KEEPALIVE))
&& ! bgp_marker_all_one (peer->ibuf, BGP_MARKER_SIZE))
{
- bgp_notify_send (peer,
- BGP_NOTIFY_HEADER_ERR,
- BGP_NOTIFY_HEADER_NOT_SYNC);
+ bgp_peer_down_error (peer, BGP_NOTIFY_HEADER_ERR,
+ BGP_NOTIFY_HEADER_NOT_SYNC);
goto done;
}
@@ -2508,7 +2483,7 @@ bgp_read (struct thread *thread)
{
if (BGP_DEBUG (events, EVENTS))
zlog_debug ("%s [Event] Accepting BGP peer delete", peer->host);
- peer_delete (peer);
+ bgp_peer_delete (peer);
}
return 0;
}