X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Frib-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Frib%2Fimpl%2FRIBImpl.java;h=6171ac441a411f0f4de94088f9f2d011c075e2e5;hb=a397aa4828919cc643647c96f5c916ee211f597f;hp=c99241b67818ac40b022dec70d2e40134bc4f00d;hpb=32079f48689f299fb23abb4ca948d0a55d1fb062;p=bgpcep.git diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index c99241b678..6171ac441a 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -7,6 +7,14 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.JdkFutureAdapters; + import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; @@ -22,7 +30,6 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; import org.opendaylight.protocol.bgp.rib.spi.AdjRIBsIn; import org.opendaylight.protocol.bgp.rib.spi.Peer; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; -import org.opendaylight.protocol.framework.ReconnectStrategy; import org.opendaylight.protocol.framework.ReconnectStrategyFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; @@ -57,237 +64,228 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.JdkFutureAdapters; - @ThreadSafe public final class RIBImpl extends DefaultRibReference implements AutoCloseable, RIB { - private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class); - private static final Update EOR = new UpdateBuilder().build(); - private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - private final ReconnectStrategyFactory tcpStrategyFactory; - private final ReconnectStrategy sessionStrategy; - private final BGPDispatcher dispatcher; - private final DataProviderService dps; - private final AsNumber localAs; - private final Ipv4Address bgpIdentifier; - private final List localTables; - private final RIBTables tables; - - public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions, - final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, final ReconnectStrategy sessionStrategy, - final DataProviderService dps, final List localTables) { - super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance()); - this.dps = Preconditions.checkNotNull(dps); - this.localAs = Preconditions.checkNotNull(localAs); - this.bgpIdentifier = Preconditions.checkNotNull(localBgpId); - this.dispatcher = Preconditions.checkNotNull(dispatcher); - this.sessionStrategy = Preconditions.checkNotNull(sessionStrategy); - this.tcpStrategyFactory = Preconditions.checkNotNull(tcpStrategyFactory); - this.localTables = ImmutableList.copyOf(localTables); - this.tables = new RIBTables(extensions); - - LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier()); - - final DataModificationTransaction trans = dps.beginTransaction(); - final Object o = trans.readOperationalData(getInstanceIdentifier()); - Preconditions.checkState(o == null, "Data provider conflict detected on object {}", getInstanceIdentifier()); - - trans.putOperationalData( - getInstanceIdentifier(), - new RibBuilder().setKey(new RibKey(ribId)).setId(ribId).setLocRib( - new LocRibBuilder().setTables(Collections. emptyList()).build()).build()); - - for (BgpTableType t : localTables) { - final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); - if (tables.create(trans, this, key) == null) { - LOG.debug("Did not create local table for unhandled table type {}", t); - } - } - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.trace("Change committed successfully"); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to initiate RIB {}", getInstanceIdentifier()); - } - }); - } - - synchronized void initTables(final byte[] remoteBgpId) { - } - - @Override - public synchronized void updateTables(final Peer peer, final Update message) { - final DataModificationTransaction trans = this.dps.beginTransaction(); - - if (!EOR.equals(message)) { - final WithdrawnRoutes wr = message.getWithdrawnRoutes(); - if (wr != null) { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - ari.removeRoutes( - trans, - peer, - new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setWithdrawnRoutes( - new WithdrawnRoutesBuilder().setDestinationType( - new DestinationIpv4CaseBuilder().setDestinationIpv4( - new DestinationIpv4Builder().setIpv4Prefixes(wr.getWithdrawnRoutes()).build()).build()).build()).build()); - } else { - LOG.debug("Not removing objects from unhandled IPv4 Unicast"); - } - } - - final PathAttributes attrs = message.getPathAttributes(); - if (attrs != null) { - final PathAttributes2 mpu = attrs.getAugmentation(PathAttributes2.class); - if (mpu != null) { - final MpUnreachNlri nlri = mpu.getMpUnreachNlri(); - - final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); - if (ari != null) { - ari.removeRoutes(trans, peer, nlri); - } else { - LOG.debug("Not removing objects from unhandled NLRI {}", nlri); - } - } - } - - final Nlri ar = message.getNlri(); - if (ar != null) { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - final MpReachNlriBuilder b = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setAdvertizedRoutes( - new AdvertizedRoutesBuilder().setDestinationType( - new DestinationIpv4CaseBuilder().setDestinationIpv4( - new DestinationIpv4Builder().setIpv4Prefixes(ar.getNlri()).build()).build()).build()); - if (attrs != null) { - b.setCNextHop(attrs.getCNextHop()); - } - - ari.addRoutes(trans, peer, b.build(), attrs); - } else { - LOG.debug("Not adding objects from unhandled IPv4 Unicast"); - } - } - - if (attrs != null) { - final PathAttributes1 mpr = attrs.getAugmentation(PathAttributes1.class); - if (mpr != null) { - final MpReachNlri nlri = mpr.getMpReachNlri(); - - final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); - if (ari != null) { - if (message.equals(ari.endOfRib())) { - ari.markUptodate(trans, peer); - } else { - ari.addRoutes(trans, peer, nlri, attrs); - } - } else { - LOG.debug("Not adding objects from unhandled NLRI {}", nlri); - } - } - } - } else { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - ari.markUptodate(trans, peer); - } else { - LOG.debug("End-of-RIB for IPv4 Unicast ignored"); - } - } - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.debug("RIB modification successfully committed."); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to commit RIB modification", t); - } - }); - } - - @Override - public synchronized void clearTable(final Peer peer, final TablesKey key) { - final AdjRIBsIn ari = this.tables.get(key); - if (ari != null) { - final DataModificationTransaction trans = this.dps.beginTransaction(); - ari.clear(trans, peer); - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - // Nothing to do - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to commit RIB modification", t); - } - }); - } - } - - @Override - public final String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); - } - - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper; - } - - @Override - public void close() throws InterruptedException, ExecutionException { - final DataModificationTransaction t = this.dps.beginTransaction(); - t.removeOperationalData(getInstanceIdentifier()); - t.commit().get(); - } - - @Override - public AsNumber getLocalAs() { - return localAs; - } - - @Override - public Ipv4Address getBgpIdentifier() { - return bgpIdentifier; - } - - @Override - public List getLocalTables() { - return localTables; - } - - @Override - public ReconnectStrategyFactory getTcpStrategyFactory() { - return tcpStrategyFactory; - } - - @Override - public ReconnectStrategy getSessionStrategy() { - return sessionStrategy; - } - - @Override - public BGPDispatcher getDispatcher() { - return dispatcher; - } - - @Override - public void initTable(final Peer bgpPeer, final TablesKey key) { - // FIXME: BUG-196: support graceful restart - } + private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class); + private static final Update EOR = new UpdateBuilder().build(); + private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + private final ReconnectStrategyFactory tcpStrategyFactory; + private final ReconnectStrategyFactory sessionStrategyFactory; + private final BGPDispatcher dispatcher; + private final DataProviderService dps; + private final AsNumber localAs; + private final Ipv4Address bgpIdentifier; + private final List localTables; + private final RIBTables tables; + + public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions, + final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, + final ReconnectStrategyFactory sessionStrategyFactory, final DataProviderService dps, final List localTables) { + super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance()); + this.dps = Preconditions.checkNotNull(dps); + this.localAs = Preconditions.checkNotNull(localAs); + this.bgpIdentifier = Preconditions.checkNotNull(localBgpId); + this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.sessionStrategyFactory = Preconditions.checkNotNull(sessionStrategyFactory); + this.tcpStrategyFactory = Preconditions.checkNotNull(tcpStrategyFactory); + this.localTables = ImmutableList.copyOf(localTables); + this.tables = new RIBTables(extensions); + + LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier()); + + final DataModificationTransaction trans = dps.beginTransaction(); + final Object o = trans.readOperationalData(getInstanceIdentifier()); + Preconditions.checkState(o == null, "Data provider conflict detected on object {}", getInstanceIdentifier()); + + trans.putOperationalData(getInstanceIdentifier(), new RibBuilder().setKey(new RibKey(ribId)).setId(ribId).setLocRib( + new LocRibBuilder().setTables(Collections. emptyList()).build()).build()); + + for (BgpTableType t : localTables) { + final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); + if (this.tables.create(trans, this, key) == null) { + LOG.debug("Did not create local table for unhandled table type {}", t); + } + } + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.trace("Change committed successfully"); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to initiate RIB {}", getInstanceIdentifier()); + } + }); + } + + synchronized void initTables(final byte[] remoteBgpId) { + } + + @Override + public synchronized void updateTables(final Peer peer, final Update message) { + final DataModificationTransaction trans = this.dps.beginTransaction(); + + if (!EOR.equals(message)) { + final WithdrawnRoutes wr = message.getWithdrawnRoutes(); + if (wr != null) { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + ari.removeRoutes( + trans, + peer, + new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setWithdrawnRoutes( + new WithdrawnRoutesBuilder().setDestinationType( + new DestinationIpv4CaseBuilder().setDestinationIpv4( + new DestinationIpv4Builder().setIpv4Prefixes(wr.getWithdrawnRoutes()).build()).build()).build()).build()); + } else { + LOG.debug("Not removing objects from unhandled IPv4 Unicast"); + } + } + + final PathAttributes attrs = message.getPathAttributes(); + if (attrs != null) { + final PathAttributes2 mpu = attrs.getAugmentation(PathAttributes2.class); + if (mpu != null) { + final MpUnreachNlri nlri = mpu.getMpUnreachNlri(); + + final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); + if (ari != null) { + ari.removeRoutes(trans, peer, nlri); + } else { + LOG.debug("Not removing objects from unhandled NLRI {}", nlri); + } + } + } + + final Nlri ar = message.getNlri(); + if (ar != null) { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + final MpReachNlriBuilder b = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi( + UnicastSubsequentAddressFamily.class).setAdvertizedRoutes( + new AdvertizedRoutesBuilder().setDestinationType( + new DestinationIpv4CaseBuilder().setDestinationIpv4( + new DestinationIpv4Builder().setIpv4Prefixes(ar.getNlri()).build()).build()).build()); + if (attrs != null) { + b.setCNextHop(attrs.getCNextHop()); + } + + ari.addRoutes(trans, peer, b.build(), attrs); + } else { + LOG.debug("Not adding objects from unhandled IPv4 Unicast"); + } + } + + if (attrs != null) { + final PathAttributes1 mpr = attrs.getAugmentation(PathAttributes1.class); + if (mpr != null) { + final MpReachNlri nlri = mpr.getMpReachNlri(); + + final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); + if (ari != null) { + if (message.equals(ari.endOfRib())) { + ari.markUptodate(trans, peer); + } else { + ari.addRoutes(trans, peer, nlri, attrs); + } + } else { + LOG.debug("Not adding objects from unhandled NLRI {}", nlri); + } + } + } + } else { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + ari.markUptodate(trans, peer); + } else { + LOG.debug("End-of-RIB for IPv4 Unicast ignored"); + } + } + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.debug("RIB modification successfully committed."); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to commit RIB modification", t); + } + }); + } + + @Override + public synchronized void clearTable(final Peer peer, final TablesKey key) { + final AdjRIBsIn ari = this.tables.get(key); + if (ari != null) { + final DataModificationTransaction trans = this.dps.beginTransaction(); + ari.clear(trans, peer); + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + // Nothing to do + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to commit RIB modification", t); + } + }); + } + } + + @Override + public String toString() { + return addToStringAttributes(Objects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + return toStringHelper; + } + + @Override + public void close() throws InterruptedException, ExecutionException { + final DataModificationTransaction t = this.dps.beginTransaction(); + t.removeOperationalData(getInstanceIdentifier()); + t.commit().get(); + } + + @Override + public AsNumber getLocalAs() { + return this.localAs; + } + + @Override + public Ipv4Address getBgpIdentifier() { + return this.bgpIdentifier; + } + + @Override + public List getLocalTables() { + return this.localTables; + } + + @Override + public ReconnectStrategyFactory getTcpStrategyFactory() { + return this.tcpStrategyFactory; + } + + @Override + public ReconnectStrategyFactory getSessionStrategyFactory() { + return this.sessionStrategyFactory; + } + + @Override + public BGPDispatcher getDispatcher() { + return this.dispatcher; + } + + @Override + public void initTable(final Peer bgpPeer, final TablesKey key) { + // FIXME: BUG-196: support graceful restart + } }