import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
+import org.opendaylight.protocol.bgp.route.targetcontrain.spi.ClientRouteTargetContrainCache;
+import org.opendaylight.protocol.bgp.route.targetcontrain.spi.RouteTargetMembeshipUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.Route;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.Peer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.rib.PeerKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.tables.Routes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.route.target.constrain.routes.route.target.constrain.routes.RouteTargetConstrainRoute;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.MplsLabeledVpnSubsequentAddressFamily;
private final DataBroker databroker;
private final List<RouteTarget> rtMemberships;
private final RibOutRefresh vpnTableRefresher;
+ private final ClientRouteTargetContrainCache rtCache;
private ListenerRegistration<?> reg;
private BindingTransactionChain chain;
private final Map<TablesKey, LongAdder> prefixesReceived;
final KeyedInstanceIdentifier<Peer, PeerKey> peerIId,
final Set<TablesKey> tables,
final BGPTableTypeRegistryConsumer tableTypeRegistry,
- final List<RouteTarget> rtMemberships) {
+ final List<RouteTarget> rtMemberships,
+ final ClientRouteTargetContrainCache rtCache) {
this.registry = requireNonNull(rib.getRibSupportContext());
this.chain = requireNonNull(chain);
this.peerIId = requireNonNull(peerIId);
this.tableTypeRegistry = requireNonNull(tableTypeRegistry);
this.peerImportParameters = peer;
this.rtMemberships = rtMemberships;
+ this.rtCache = rtCache;
this.vpnTableRefresher = rib;
}
final WriteTransaction tx,
final TablesKey tableKey, final RIBSupport<C, S, R, I> ribSupport,
final KeyedInstanceIdentifier<Tables, TablesKey> tablePath,
- final Collection<DataObjectModification<? extends DataObject>> routeChanges) {
- for (final DataObjectModification<? extends DataObject> routeChanged : routeChanges) {
+ final Collection<DataObjectModification<R>> routeChanges) {
+ for (final DataObjectModification<R> routeChanged : routeChanges) {
final I routeKey
= ((InstanceIdentifier.IdentifiableItem<R, I>) routeChanged.getIdentifier()).getKey();
switch (routeChanged.getModificationType()) {
case SUBTREE_MODIFIED:
case WRITE:
- writeRoutes(tx, tableKey, ribSupport, tablePath, routeKey, (R) routeChanged.getDataAfter());
+ writeRoutes(tx, tableKey, ribSupport, tablePath, routeKey, routeChanged.getDataAfter());
break;
case DELETE:
final InstanceIdentifier<R> routeIID = ribSupport.createRouteIdentifier(tablePath, routeKey);
if (effAtt.isPresent()) {
final Optional<RouteTarget> rtMembership = RouteTargetMembeshipUtil.getRT(route);
if (rtMembership.isPresent()) {
- this.rtMemberships.add(rtMembership.get());
+ final RouteTarget rt = rtMembership.get();
+ if(PeerRole.Ibgp != this.peerImportParameters.getFromPeerRole()) {
+ this.rtCache.cacheRoute(route);
+ }
+ this.rtMemberships.add(rt);
this.rtMembershipsUpdated = true;
}
CountersUtil.increment(this.prefixesInstalled.get(tk), tk);
} else {
final Optional<RouteTarget> rtMembership = RouteTargetMembeshipUtil.getRT(route);
if (rtMembership.isPresent()) {
+ if(PeerRole.Ibgp != this.peerImportParameters.getFromPeerRole()) {
+ this.rtCache.uncacheRoute(route);
+ }
this.rtMemberships.remove(rtMembership.get());
this.rtMembershipsUpdated = true;
}