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)
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))
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);
}
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);
{
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;
}
}
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;
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);
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;