Search in sources :

Example 41 with TablesKey

use of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey in project bgpcep by opendaylight.

the class BmpRibInWriter method checkEndOfRib.

/**
 * For each received Update message, the upd sync variable needs to be updated to true, for particular AFI/SAFI
 * combination. Currently we only assume Unicast SAFI. From the Update message we have to extract the AFI. Each
 * Update message can contain BGP Object with one type of AFI. If the object is BGP Link, BGP Node or a BGPPrefix
 * the AFI is Linkstate. In case of BGPRoute, the AFI depends on the IP Address of the prefix.
 *
 * @param msg received Update message
 */
private boolean checkEndOfRib(final UpdateMessage msg) {
    TablesKey type = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
    boolean isEOR = false;
    if (msg.getNlri() == null && msg.getWithdrawnRoutes() == null) {
        if (msg.getAttributes() != null) {
            if (msg.getAttributes().augmentation(AttributesReach.class) != null) {
                final AttributesReach pa = msg.getAttributes().augmentation(AttributesReach.class);
                if (pa.getMpReachNlri() != null) {
                    type = new TablesKey(pa.getMpReachNlri().getAfi(), pa.getMpReachNlri().getSafi());
                }
            } else if (msg.getAttributes().augmentation(AttributesUnreach.class) != null) {
                final AttributesUnreach pa = msg.getAttributes().augmentation(AttributesUnreach.class);
                if (pa.getMpUnreachNlri() != null) {
                    type = new TablesKey(pa.getMpUnreachNlri().getAfi(), pa.getMpUnreachNlri().getSafi());
                }
                if (pa.getMpUnreachNlri().getWithdrawnRoutes() == null) {
                    // EOR message contains only MPUnreach attribute and no NLRI
                    isEOR = true;
                }
            }
        } else {
            // true for empty Update Message
            isEOR = true;
        }
    }
    if (isEOR) {
        markTableUptodated(type);
        LOG.debug("BMP Synchronization finished for table {} ", type);
    }
    return isEOR;
}
Also used : TablesKey(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey) AttributesReach(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesReach) AttributesUnreach(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.AttributesUnreach)

Example 42 with TablesKey

use of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey in project bgpcep by opendaylight.

the class BGPPeer method onUpdateMessage.

/**
 * Process Update message received.
 * Calls {@link #checkMandatoryAttributesPresence(Update)} to check for presence of mandatory attributes.
 *
 * @param message Update message
 */
private synchronized void onUpdateMessage(final Update message) throws BGPDocumentedException {
    checkMandatoryAttributesPresence(message);
    // update AdjRibs
    final Attributes attrs = message.getAttributes();
    MpReachNlri mpReach;
    final boolean isAnyNlriAnnounced = message.getNlri() != null;
    if (isAnyNlriAnnounced) {
        mpReach = prefixesToMpReach(message);
    } else {
        mpReach = MessageUtil.getMpReachNlri(attrs);
    }
    if (mpReach != null) {
        this.ribWriter.updateRoutes(mpReach, nextHopToAttribute(attrs, mpReach));
    }
    final MpUnreachNlri mpUnreach;
    if (message.getWithdrawnRoutes() != null) {
        mpUnreach = prefixesToMpUnreach(message, isAnyNlriAnnounced);
    } else {
        mpUnreach = MessageUtil.getMpUnreachNlri(attrs);
    }
    final boolean endOfRib = BgpPeerUtil.isEndOfRib(message);
    if (mpUnreach != null) {
        if (endOfRib) {
            final TablesKey tablesKey = new TablesKey(mpUnreach.getAfi(), mpUnreach.getSafi());
            this.ribWriter.removeStaleRoutes(tablesKey);
            this.missingEOT.remove(tablesKey);
            handleGracefulEndOfRib();
        } else {
            this.ribWriter.removeRoutes(mpUnreach);
        }
    } else if (endOfRib) {
        this.ribWriter.removeStaleRoutes(IPV4_UCAST_TABLE_KEY);
        this.missingEOT.remove(IPV4_UCAST_TABLE_KEY);
        handleGracefulEndOfRib();
    }
}
Also used : TablesKey(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey) MpUnreachNlri(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.unreach.MpUnreachNlri) Attributes(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.Attributes) MpReachNlri(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.attributes.reach.MpReachNlri)

Example 43 with TablesKey

use of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey in project bgpcep by opendaylight.

the class BGPPeer method handleGracefulEndOfRib.

@Holding("this")
private void handleGracefulEndOfRib() {
    if (isLocalRestarting()) {
        if (this.missingEOT.isEmpty()) {
            createEffRibInWriter();
            this.effRibInWriter.init();
            registerPrefixesCounters(this.effRibInWriter, this.effRibInWriter);
            for (final TablesKey key : getAfiSafisAdvertized()) {
                createAdjRibOutListener(key, true);
            }
            setLocalRestartingState(false);
            setGracefulPreferences(false, Collections.emptySet());
        }
    }
}
Also used : TablesKey(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey) Holding(org.checkerframework.checker.lock.qual.Holding)

Example 44 with TablesKey

use of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey in project bgpcep by opendaylight.

the class BGPPeer method onRouteRefreshMessage.

private void onRouteRefreshMessage(final RouteRefresh message) {
    final Class<? extends AddressFamily> rrAfi = message.getAfi();
    final Class<? extends SubsequentAddressFamily> rrSafi = message.getSafi();
    final TablesKey key = new TablesKey(rrAfi, rrSafi);
    synchronized (this) {
        final AdjRibOutListener listener = this.adjRibOutListenerSet.remove(key);
        if (listener != null) {
            listener.close();
            createAdjRibOutListener(key, listener.isMpSupported());
        } else {
            LOG.info("Ignoring RouteRefresh message. Afi/Safi is not supported: {}, {}.", rrAfi, rrSafi);
        }
    }
}
Also used : TablesKey(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey)

Example 45 with TablesKey

use of org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesKey in project bgpcep by opendaylight.

the class GracefulRestartUtil method getGracefulBgpParameters.

public static BgpParameters getGracefulBgpParameters(final List<OptionalCapabilities> fixedCapabilities, final Set<TablesKey> gracefulTables, final Set<TablesKey> preservedTables, final int gracefulRestartTimer, final boolean localRestarting, final Set<BgpPeerUtil.LlGracefulRestartDTO> llGracefulDTOs) {
    final List<OptionalCapabilities> capabilities = new ArrayList<>(fixedCapabilities);
    capabilities.add(new OptionalCapabilitiesBuilder().setCParameters(getGracefulCapability(Maps.asMap(gracefulTables, preservedTables::contains), gracefulRestartTimer, localRestarting)).build());
    capabilities.add(new OptionalCapabilitiesBuilder().setCParameters(getLlGracefulCapability(llGracefulDTOs)).build());
    return new BgpParametersBuilder().setOptionalCapabilities(capabilities).build();
}
Also used : OptionalCapabilitiesBuilder(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilitiesBuilder) ArrayList(java.util.ArrayList) BgpParametersBuilder(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParametersBuilder) OptionalCapabilities(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilities)

Aggregations

TablesKey (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey)40 TablesKey (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey)15 RIBSupport (org.opendaylight.protocol.bgp.rib.spi.RIBSupport)11 KeyedInstanceIdentifier (org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier)11 YangInstanceIdentifier (org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier)9 Before (org.junit.Before)8 Test (org.junit.Test)8 PathSelectionMode (org.opendaylight.protocol.bgp.mode.api.PathSelectionMode)8 InstanceIdentifier (org.opendaylight.yangtools.yang.binding.InstanceIdentifier)8 ArrayList (java.util.ArrayList)7 CommitInfo (org.opendaylight.mdsal.common.api.CommitInfo)7 Peer (org.opendaylight.protocol.bgp.rib.spi.Peer)6 Identifier (org.opendaylight.yangtools.yang.binding.Identifier)6 DOMDataTreeWriteTransaction (org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction)5 RibId (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.RibId)5 ChannelFuture (io.netty.channel.ChannelFuture)4 InetSocketAddress (java.net.InetSocketAddress)4 HashMap (java.util.HashMap)4 BGPRouteEntryExportParametersImpl (org.opendaylight.protocol.bgp.mode.impl.BGPRouteEntryExportParametersImpl)4 BGPRouteEntryExportParameters (org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters)4