From e0701b7955b883c5437269a382e1afc76ee71e5c Mon Sep 17 00:00:00 2001 From: hasso Date: Thu, 20 May 2004 09:19:34 +0000 Subject: Merge bgpd changeset 1176 from Zebra repository by Rivo Nurges. --- bgpd/bgp_route.c | 86 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 32 deletions(-) (limited to 'bgpd/bgp_route.c') diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 97636eff..b8af869b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -875,38 +875,61 @@ bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi) } int -bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, safi_t safi) +bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, safi_t safi, int always) { - if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) + if (!CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) + return 0; + + if (peer->pcount[afi][safi] > peer->pmax[afi][safi]) { - if (peer->pcount[afi][safi] > peer->pmax[afi][safi]) - { - zlog (peer->log, LOG_INFO, - "MAXPFXEXCEED: No. of prefix received from %s (afi %d): %ld exceed limit %ld", peer->host, afi, peer->pcount[afi][safi], peer->pmax[afi][safi]); - if (! CHECK_FLAG (peer->af_flags[afi][safi], - PEER_FLAG_MAX_PREFIX_WARNING)) - { - char ndata[7]; - - ndata[0] = (u_char)(afi >> 8); - ndata[1] = (u_char) afi; - ndata[3] = (u_char)(peer->pmax[afi][safi] >> 24); - ndata[4] = (u_char)(peer->pmax[afi][safi] >> 16); - ndata[5] = (u_char)(peer->pmax[afi][safi] >> 8); - ndata[6] = (u_char)(peer->pmax[afi][safi]); - - if (safi == SAFI_MPLS_VPN) - safi = BGP_SAFI_VPNV4; - ndata[2] = (u_char) safi; - - SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW); - bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE, - BGP_NOTIFY_CEASE_MAX_PREFIX, - ndata, 7); - return 1; - } - } + if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT) + && ! always) + return 0; + + zlog (peer->log, LOG_INFO, + "%%MAXPFXEXCEED: No. of prefix received from %s (afi %d): %ld exceed limit %ld", + peer->host, afi, peer->pcount[afi][safi], peer->pmax[afi][safi]); + SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT); + + if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)) + return 0; + + { + char ndata[7]; + + ndata[0] = (u_char)(afi >> 8); + ndata[1] = (u_char) afi; + ndata[3] = (u_char)(peer->pmax[afi][safi] >> 24); + ndata[4] = (u_char)(peer->pmax[afi][safi] >> 16); + ndata[5] = (u_char)(peer->pmax[afi][safi] >> 8); + ndata[6] = (u_char)(peer->pmax[afi][safi]); + + if (safi == SAFI_MPLS_VPN) + safi = BGP_SAFI_VPNV4; + ndata[2] = (u_char) safi; + + SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW); + bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE, + BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7); + } + return 1; } + else + UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT); + + if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100)) + { + if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD) + && ! always) + return 0; + + zlog (peer->log, LOG_INFO, + "%%MAXPFX: No. of prefix received from %s (afi %d) reaches %ld, max %ld", + peer->host, afi, peer->pcount[afi][safi], peer->pmax[afi][safi]); + SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD); + } + else + UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD); return 0; } @@ -1232,9 +1255,8 @@ bgp_update (struct peer *peer, struct prefix *p, struct attr *attr, /* If maximum prefix count is configured and current prefix count exeed it. */ - if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)) - if (bgp_maximum_prefix_overflow (peer, afi, safi)) - return -1; + if (bgp_maximum_prefix_overflow (peer, afi, safi, 0)) + return -1; /* Process change. */ bgp_process (bgp, rn, afi, safi); -- cgit v1.2.1