summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c1
-rw-r--r--bgpd/bgp_packet.c29
-rw-r--r--bgpd/bgp_route.c5
-rw-r--r--bgpd/bgp_updgrp.c13
4 files changed, 35 insertions, 13 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 02dddadf99..5586be710f 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -174,6 +174,7 @@ peer_xfer_conn(struct peer *from_peer)
peer->afc_nego[afi][safi] = from_peer->afc_nego[afi][safi];
peer->afc_adv[afi][safi] = from_peer->afc_adv[afi][safi];
peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi];
+ peer->orf_plist[afi][safi] = from_peer->orf_plist[afi][safi];
}
if (bgp_getsockname(peer) < 0)
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index efac3bbbbe..f7336ea2f1 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -1780,6 +1780,8 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
safi_t safi;
struct stream *s;
struct peer_af *paf;
+ struct update_group *updgrp;
+ struct peer *updgrp_peer;
/* If peer does not have the capability, send notification. */
if (! CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_ADV))
@@ -1956,8 +1958,8 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
break;
}
}
- peer->orf_plist[afi][safi] =
- prefix_list_lookup (afi, name);
+
+ peer->orf_plist[afi][safi] = prefix_bgp_orf_lookup (afi, name);
}
stream_forward_getp (s, orf_len);
}
@@ -1972,14 +1974,23 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
- /* If the peer is configured for default-originate clear the
- * SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will re-advertise the
- * default
- */
paf = peer_af_find (peer, afi, safi);
- if (paf && paf->subgroup &&
- CHECK_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
- UNSET_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE);
+ if (paf && paf->subgroup)
+ {
+ if (peer->orf_plist[afi][safi])
+ {
+ updgrp = PAF_UPDGRP(paf);
+ updgrp_peer = UPDGRP_PEER(updgrp);
+ updgrp_peer->orf_plist[afi][safi] = peer->orf_plist[afi][safi];
+ }
+
+ /* If the peer is configured for default-originate clear the
+ * SUBGRP_STATUS_DEFAULT_ORIGINATE flag so that we will re-advertise the
+ * default
+ */
+ if (CHECK_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
+ UNSET_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE);
+ }
/* Perform route refreshment to the peer */
bgp_announce_route (peer, afi, safi);
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 59dd04a933..820c3cfd9a 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1296,6 +1296,11 @@ subgroup_announce_check (struct bgp_info *ri, struct update_subgroup *subgrp,
{
if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
{
+ if (bgp_debug_update(NULL, p, subgrp->update_group, 0))
+ zlog_debug ("%s [Update:SEND] %s/%d is filtered via ORF",
+ peer->host,
+ inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
+ p->prefixlen);
return 0;
}
}
diff --git a/bgpd/bgp_updgrp.c b/bgpd/bgp_updgrp.c
index a280b55c11..c39c687823 100644
--- a/bgpd/bgp_updgrp.c
+++ b/bgpd/bgp_updgrp.c
@@ -151,6 +151,7 @@ conf_copy (struct peer *dst, struct peer *src, afi_t afi, safi_t safi)
dst->cap = src->cap;
dst->af_cap[afi][safi] = src->af_cap[afi][safi];
dst->afc_nego[afi][safi] = src->afc_nego[afi][safi];
+ dst->orf_plist[afi][safi] = src->orf_plist[afi][safi];
dst->local_as = src->local_as;
dst->change_local_as = src->change_local_as;
dst->shared_network = src->shared_network;
@@ -372,12 +373,14 @@ updgrp_hash_key_make (void *p)
key);
/*
- * Every peer configured to be a lonesoul gets its own update group.
- *
- * Every route server client gets its own update group as well. Optimize
- * later.
+ * There are certain peers that must get their own update-group:
+ * - lonesoul peers
+ * - route server clients
+ * - peers that negotiated ORF
*/
if (CHECK_FLAG (peer->flags, PEER_FLAG_LONESOUL) ||
+ CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) ||
+ CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV) ||
CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
key = jhash_1word (jhash (peer->host, strlen (peer->host), SEED2), key);
@@ -488,6 +491,8 @@ updgrp_hash_cmp (const void *p1, const void *p2)
return 0;
if ((CHECK_FLAG (pe1->flags, PEER_FLAG_LONESOUL) ||
+ CHECK_FLAG (pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV) ||
+ CHECK_FLAG (pe1->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV) ||
CHECK_FLAG (pe1->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)) &&
!sockunion_same (&pe1->su, &pe2->su))
return 0;