import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
+import java.util.stream.Collectors;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.vrfentry.RoutePaths;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnIdToVpnInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
// TODO Clean up the exception handling
@SuppressWarnings("checkstyle:IllegalCatch")
public static void addOrUpdateFibEntry(DataBroker broker, String rd, String macAddress, String prefix,
- List<String> nextHopList, VrfEntry.EncapType encapType, int label,
+ List<String> nextHopList, VrfEntry.EncapType encapType, long label,
long l3vni, String gwMacAddress, RouteOrigin origin,
WriteTransaction writeConfigTxn) {
if (rd == null || rd.isEmpty()) {
InstanceIdentifier.builder(FibEntries.class)
.child(VrfTables.class, new VrfTablesKey(rd))
.child(VrfEntry.class, new VrfEntryKey(prefix)).build();
- Optional<VrfEntry> entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
-
- if (! entry.isPresent()) {
- writeFibEntryToDs(vrfEntryId, prefix, nextHopList, label, l3vni, encapType, origin, macAddress,
- gwMacAddress, writeConfigTxn, broker);
- LOG.debug("Created vrfEntry for {} nexthop {} label {}", prefix, nextHopList, label);
- } else { // Found in MDSAL database
- List<String> nh = entry.get().getNextHopAddressList();
- for (String nextHop : nextHopList) {
- if (!nh.contains(nextHop)) {
- nh.add(nextHop);
- }
- }
- writeFibEntryToDs(vrfEntryId, prefix, nh, label, l3vni, encapType, origin, macAddress,
- gwMacAddress, writeConfigTxn, broker);
- LOG.debug("Updated vrfEntry for {} nexthop {} label {}", prefix, nh, label);
- }
+
+ writeFibEntryToDs(vrfEntryId, prefix, nextHopList, label, l3vni, encapType, origin, macAddress,
+ gwMacAddress, writeConfigTxn, broker);
+ LOG.debug("Created/Updated vrfEntry for {} nexthop {} label {}", prefix, nextHopList, label);
} catch (Exception e) {
LOG.error("addFibEntryToDS: error ", e);
}
VrfEntry.EncapType encapType, RouteOrigin origin, String macAddress,
String gatewayMacAddress, WriteTransaction writeConfigTxn,
DataBroker broker) {
- VrfEntryBuilder vrfEntryBuilder = new VrfEntryBuilder().setDestPrefix(prefix).setNextHopAddressList(nextHopList)
- .setOrigin(origin.getValue());
- buildVpnEncapSpecificInfo(vrfEntryBuilder, encapType, label, l3vni, macAddress, gatewayMacAddress);
+ VrfEntryBuilder vrfEntryBuilder = new VrfEntryBuilder().setDestPrefix(prefix).setOrigin(origin.getValue());
+ buildVpnEncapSpecificInfo(vrfEntryBuilder, encapType, label, l3vni, macAddress, gatewayMacAddress, nextHopList);
if (writeConfigTxn != null) {
writeConfigTxn.merge(LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntryBuilder.build(), true);
} else {
.child(VrfTables.class, new VrfTablesKey(rd))
.child(VrfEntry.class, new VrfEntryKey(prefix)).build();
- VrfEntry vrfEntry = new VrfEntryBuilder().setKey(new VrfEntryKey(prefix)).setDestPrefix(prefix)
- .setNextHopAddressList(Collections.singletonList(""))
- .setLabel(label)
- .setOrigin(RouteOrigin.LOCAL.getValue())
+ // Filling the nextHop with dummy nextHopAddress
+ VrfEntry vrfEntry = FibHelper.getVrfEntryBuilder(prefix, label,
+ FibConstants.DEFAULT_NEXTHOP_IP, RouteOrigin.LOCAL)
.addAugmentation(RouterInterface.class, routerInterface).build();
if (writeConfigTxn != null) {
}
private static void buildVpnEncapSpecificInfo(VrfEntryBuilder builder, VrfEntry.EncapType encapType, long label,
- long l3vni, String macAddress, String gatewayMac) {
- if (encapType.equals(VrfEntry.EncapType.Mplsgre)) {
- builder.setLabel(label);
- } else {
- builder.setL3vni(l3vni).setGatewayMacAddress(gatewayMac);
+ long l3vni, String macAddress, String gatewayMac, List<String> nextHopList) {
+ if (!encapType.equals(VrfEntry.EncapType.Mplsgre)) {
+ builder.setL3vni(l3vni);
}
builder.setEncapType(encapType);
+ builder.setGatewayMacAddress(gatewayMac);
+ Long lbl = encapType.equals(VrfEntry.EncapType.Mplsgre) ? label : null;
+ List<RoutePaths> routePaths = nextHopList.stream()
+ .filter(nextHop -> nextHop != null && !nextHop.isEmpty())
+ .map(nextHop -> {
+ return FibHelper.buildRoutePath(nextHop, lbl);
+ }).collect(Collectors.toList());
+ builder.setRoutePaths(routePaths);
}
public static void removeFibEntry(DataBroker broker, String rd, String prefix, WriteTransaction writeConfigTxn) {
Optional<VrfEntry> entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
if (entry.isPresent()) {
- List<String> nhListRead = new ArrayList<>();
- if (nextHopToRemove != null && !nextHopToRemove.isEmpty()) {
- nhListRead = entry.get().getNextHopAddressList();
- if (nhListRead.contains(nextHopToRemove)) {
- nhListRead.remove(nextHopToRemove);
- }
+ final List<RoutePaths> routePaths = entry.get().getRoutePaths();
+ if (routePaths == null || routePaths.isEmpty()) {
+ LOG.warn("routePaths is null/empty for given rd {}, prefix {}", rd, prefix);
+ return;
}
-
- if (nhListRead.isEmpty()) {
+ java.util.Optional<RoutePaths> optRoutePath =
+ routePaths.stream()
+ .filter(routePath -> routePath.getNexthopAddress().equals(
+ nextHopToRemove)).findFirst();
+ if (!optRoutePath.isPresent()) {
+ LOG.error("Unable to find a routePath that contains the given nextHop to remove {}", nextHopToRemove);
+ return;
+ }
+ RoutePaths routePath = optRoutePath.get();
+ if (routePaths.size() == 1) {
// Remove the whole entry
if (writeConfigTxn != null) {
writeConfigTxn.delete(LogicalDatastoreType.CONFIGURATION, vrfEntryId);
}
LOG.info("Removed Fib Entry rd {} prefix {}", rd, prefix);
} else {
- // An update must be done, not including the current next hop
- VrfEntry vrfEntry =
- new VrfEntryBuilder(entry.get()).setDestPrefix(prefix).setNextHopAddressList(nhListRead)
- .setKey(new VrfEntryKey(prefix)).build();
+ InstanceIdentifier<RoutePaths> routePathsId =
+ FibHelper.buildRoutePathId(rd, prefix, routePath.getNexthopAddress());
+ // Remove route
if (writeConfigTxn != null) {
- writeConfigTxn.merge(LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntry, true);
+ writeConfigTxn.delete(LogicalDatastoreType.CONFIGURATION, routePathsId);
} else {
- MDSALUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntry);
+ MDSALUtil.syncDelete(broker, LogicalDatastoreType.CONFIGURATION, routePathsId);
}
- LOG.info("Removed Nexthop {} from Fib Entry rd {} prefix {}", nextHopToRemove, rd, prefix);
+ LOG.info("Removed Route Path rd {} prefix {}, nextHop {}, label {}", rd, prefix,
+ routePath.getNexthopAddress(), routePath.getLabel());
}
} else {
LOG.warn("Could not find VrfEntry for Route-Distinguisher={} and prefix={}", rd, prefix);
}
public static void updateFibEntry(DataBroker broker, String rd, String prefix, List<String> nextHopList,
- String gwMacAddress, WriteTransaction writeConfigTxn) {
+ String gwMacAddress, long label, WriteTransaction writeConfigTxn) {
LOG.debug("Updating fib entry for prefix {} with nextHopList {} for rd {}", prefix, nextHopList, rd);
Optional<VrfEntry> entry = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
if (entry.isPresent()) {
+ RouteOrigin routeOrigin = RouteOrigin.value(entry.get().getOrigin());
// Update the VRF entry with nextHopList
- VrfEntry vrfEntry =
- new VrfEntryBuilder(entry.get()).setDestPrefix(prefix).setNextHopAddressList(nextHopList)
- .setGatewayMacAddress(gwMacAddress).setKey(new VrfEntryKey(prefix)).build();
+ VrfEntry vrfEntry = FibHelper.getVrfEntryBuilder(entry.get(), label, nextHopList, routeOrigin)
+ .setGatewayMacAddress(gwMacAddress).build();
+
if (nextHopList.isEmpty()) {
if (writeConfigTxn != null) {
writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntry, true);
|| routeOrigin == RouteOrigin.CONNECTED
|| routeOrigin == RouteOrigin.LOCAL;
}
+
+ public static List<String> getNextHopListFromRoutePaths(final VrfEntry vrfEntry) {
+ List<RoutePaths> routePaths = vrfEntry.getRoutePaths();
+ if (routePaths == null || routePaths.isEmpty()) {
+ return Collections.EMPTY_LIST;
+ }
+ return routePaths.stream()
+ .map(routePath -> routePath.getNexthopAddress())
+ .collect(Collectors.toList());
+ }
+
+ public static java.util.Optional<Long> getLabelFromRoutePaths(final VrfEntry vrfEntry) {
+ List<RoutePaths> routePaths = vrfEntry.getRoutePaths();
+ if (routePaths == null || routePaths.isEmpty()) {
+ return java.util.Optional.empty();
+ }
+ return java.util.Optional.of(vrfEntry.getRoutePaths().get(0).getLabel());
+ }
+
+ public static java.util.Optional<String> getFirstNextHopAddress(final VrfEntry vrfEntry) {
+ List<RoutePaths> routePaths = vrfEntry.getRoutePaths();
+ if (routePaths == null || routePaths.isEmpty()) {
+ return java.util.Optional.empty();
+ }
+ return java.util.Optional.of(vrfEntry.getRoutePaths().get(0).getNexthopAddress());
+ }
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.genius.utils.batching.SubTransaction;
import org.opendaylight.genius.utils.batching.SubTransactionImpl;
import org.opendaylight.netvirt.fibmanager.NexthopManager.AdjacencyResult;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.IVpnLinkService;
import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.vrfentry.RoutePaths;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthop;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthopBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
protected void add(final InstanceIdentifier<VrfEntry> identifier, final VrfEntry vrfEntry) {
Preconditions.checkNotNull(vrfEntry, "VrfEntry should not be null or empty.");
String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
- LOG.debug("ADD: Adding Fib Entry rd {} prefix {} nexthop {} label {}",
- rd, vrfEntry.getDestPrefix(), vrfEntry.getNextHopAddressList(), vrfEntry.getLabel());
+ LOG.debug("ADD: Adding Fib Entry rd {} prefix {} route-paths {}",
+ rd, vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths());
if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.BGP) {
createFibEntries(identifier, vrfEntry);
} else {
vrfEntryBufferQ.add(actResource);
}
leakRouteIfNeeded(identifier, vrfEntry, NwConstants.ADD_FLOW);
- LOG.info("ADD: Added Fib Entry rd {} prefix {} nexthop {} label {}",
- rd, vrfEntry.getDestPrefix(), vrfEntry.getNextHopAddressList(), vrfEntry.getLabel());
+ LOG.info("ADD: Added Fib Entry rd {} prefix {} route-paths {}",
+ rd, vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths());
}
@Override
protected void remove(InstanceIdentifier<VrfEntry> identifier, VrfEntry vrfEntry) {
Preconditions.checkNotNull(vrfEntry, "VrfEntry should not be null or empty.");
String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
- LOG.debug("REMOVE: Removing Fib Entry rd {} prefix {} nexthop {} label {}",
- rd, vrfEntry.getDestPrefix(), vrfEntry.getNextHopAddressList(), vrfEntry.getLabel());
+ LOG.debug("REMOVE: Removing Fib Entry rd {} prefix {} route-paths {}",
+ rd, vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths());
if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.BGP) {
deleteFibEntries(identifier, vrfEntry);
} else {
vrfEntryBufferQ.add(actResource);
}
leakRouteIfNeeded(identifier, vrfEntry, NwConstants.DEL_FLOW);
- LOG.info("REMOVE: Removed Fib Entry rd {} prefix {} nexthop {} label {}",
- rd, vrfEntry.getDestPrefix(), vrfEntry.getNextHopAddressList(), vrfEntry.getLabel());
+ LOG.info("REMOVE: Removed Fib Entry rd {} prefix {} route-paths {}",
+ rd, vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths());
}
@Override
final String rd = identifier.firstKeyOf(VrfTables.class).getRouteDistinguisher();
final VrfTablesKey vrfTableKey = identifier.firstKeyOf(VrfTables.class);
- LOG.debug("UPDATE: Updating Fib Entries to rd {} prefix {} nexthop {} label {}",
- rd, update.getDestPrefix(), update.getNextHopAddressList(), update.getLabel());
+ LOG.debug("UPDATE: Updating Fib Entries to rd {} prefix {} route-paths {}",
+ rd, update.getDestPrefix(), update.getRoutePaths());
// Handle BGP Routes first
if (RouteOrigin.value(update.getOrigin()) == RouteOrigin.BGP) {
ActionableResource actResource = new ActionableResourceImpl(rd + update.getDestPrefix());
actResource.setInstance(update);
actResource.setOldInstance(original);
vrfEntryBufferQ.add(actResource);
- LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} nexthop {} label {}",
- rd, update.getDestPrefix(), update.getNextHopAddressList(), update.getLabel());
+ LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} route-paths {}",
+ rd, update.getDestPrefix(), update.getRoutePaths());
return;
}
SubnetRoute subnetRoute = update.getAugmentation(SubnetRoute.class);
/* Ignore SubnetRoute entry, as it will be driven by createFibEntries call down below */
if (subnetRoute == null) {
- List<String> origNhList = original.getNextHopAddressList();
- List<String> updateNhList = update.getNextHopAddressList();
+ List<RoutePaths> originalRoutePath = original.getRoutePaths();
+ List<RoutePaths> updateRoutePath = update.getRoutePaths();
//final SubnetRoute subnetRoute = update.getAugmentation(SubnetRoute.class);
- LOG.info("UPDATE: Original nexthop {} updateNextHop {} ", origNhList, updateNhList);
+ LOG.info("UPDATE: Original route-path {} update route-path {} ", originalRoutePath, updateRoutePath);
// If original VRF Entry had nexthop null , but update VRF Entry
// has nexthop , route needs to be created on remote Dpns
- if (((origNhList == null) || (origNhList.isEmpty())
- && (updateNhList != null) && (!updateNhList.isEmpty()))) {
+ if (((originalRoutePath == null) || (originalRoutePath.isEmpty())
+ && (updateRoutePath != null) && (!updateRoutePath.isEmpty()))) {
// TODO(vivek): Though ugly, Not handling this code now, as each
// tep add event will invoke flow addition
LOG.trace("Original VRF entry NH is null for destprefix {}. This event is IGNORED here.",
// If original VRF Entry had valid nexthop , but update VRF Entry
// has nexthop empty'ed out, route needs to be removed from remote Dpns
- if (((updateNhList == null) || (updateNhList.isEmpty())
- && (origNhList != null) && (!origNhList.isEmpty()))) {
+ if (((updateRoutePath == null) || (updateRoutePath.isEmpty())
+ && (originalRoutePath != null) && (!originalRoutePath.isEmpty()))) {
LOG.trace("Original VRF entry had valid NH for destprefix {}. This event is IGNORED here.",
update.getDestPrefix());
return;
}
}
createFibEntries(identifier, update);
- LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} nexthop {} label {}",
- rd, update.getDestPrefix(), update.getNextHopAddressList(), update.getLabel());
+ LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} route-paths {}",
+ rd, update.getDestPrefix(), update.getRoutePaths());
return;
}
/* Handl all other route origins */
createFibEntries(identifier, update);
- LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} nexthop {} label {}",
- rd, update.getDestPrefix(), update.getNextHopAddressList(), update.getLabel());
+ LOG.info("UPDATE: Updated Fib Entries to rd {} prefix {} route-paths {}",
+ rd, update.getDestPrefix(), update.getRoutePaths());
}
@Override
if (optInterVpnLink.isPresent()) {
InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get();
String vpnUuid = optVpnUuid.get();
- String routeNexthop = vrfEntry.getNextHopAddressList().get(0);
- if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) {
- // This is an static route that points to the other endpoint of an InterVpnLink
- // In that case, we should add another entry in FIB table pointing to LPortDispatcher table.
- installIVpnLinkSwitchingFlows(interVpnLink, vpnUuid, vrfEntry, vpnId);
- installInterVpnRouteInLFib(rd, vrfEntry);
- }
+ FibUtil.getFirstNextHopAddress(vrfEntry).ifPresent(routeNexthop -> {
+ if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) {
+ // This is an static route that points to the other endpoint of an InterVpnLink
+ // In that case, we should add another entry in FIB table pointing to LPortDispatcher table.
+ installIVpnLinkSwitchingFlows(interVpnLink, vpnUuid, vrfEntry, vpnId);
+ installInterVpnRouteInLFib(rd, vrfEntry);
+ }
+ });
}
}
}
final VrfTablesKey vrfTableKey = vrfEntryIid.firstKeyOf(VrfTables.class);
String prefix = vrfEntry.getDestPrefix();
- List<String> nextHopsList = vrfEntry.getNextHopAddressList();
- Long label = vrfEntry.getLabel();
+ List<String> nextHopsList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ // Label is used only for logging in subsequent method calls.
+ //TODO : This label is not needed here. Can be removed. Hence using a default value.
+ Long label = FibUtil.getLabelFromRoutePaths(vrfEntry).orElse(0L);
String rd = vrfTableKey.getRouteDistinguisher();
LOG.trace("leakRouteIfNeeded: srcVpnRd={} prefix={} nhList={} label={}", rd, prefix, nextHopsList, label);
wrTxPresent = false;
tx = dataBroker.newWriteOnlyTransaction();
}
- synchronized (vrfEntry.getLabel().toString().intern()) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
+ FibUtil.getLabelFromRoutePaths(vrfEntry).ifPresent(label -> {
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ synchronized (label.toString().intern()) {
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) {
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) {
- Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
- FibUtil.getVpnInstanceOpData(dataBroker, rd);
- if (vpnInstanceOpDataEntryOptional.isPresent()) {
- String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
- if (!lri.getVpnInstanceList().contains(vpnInstanceName)) {
- updateVpnReferencesInLri(lri, vpnInstanceName, false);
+ if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) {
+ Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
+ FibUtil.getVpnInstanceOpData(dataBroker, rd);
+ if (vpnInstanceOpDataEntryOptional.isPresent()) {
+ String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
+ if (!lri.getVpnInstanceList().contains(vpnInstanceName)) {
+ updateVpnReferencesInLri(lri, vpnInstanceName, false);
+ }
}
}
+ LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
+ label, lri.getVpnInterfaceName(), lri.getDpnId());
}
- LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
- vrfEntry.getLabel(), lri.getVpnInterfaceName(), lri.getDpnId());
}
- }
+ });
final List<InstructionInfo> instructions = new ArrayList<>();
BigInteger subnetRouteMeta = ((BigInteger.valueOf(elanTag)).shiftLeft(32))
.or((BigInteger.valueOf(vpnId).shiftLeft(1)));
instructions.add(new InstructionGotoTable(NwConstants.L3_SUBNET_ROUTE_TABLE));
makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, instructions, NwConstants.ADD_FLOW, tx);
- if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
- List<ActionInfo> actionsInfos = new ArrayList<>();
- // reinitialize instructions list for LFIB Table
- final List<InstructionInfo> LFIBinstructions = new ArrayList<>();
-
- actionsInfos.add(new ActionPopMpls());
- LFIBinstructions.add(new InstructionApplyActions(actionsInfos));
- LFIBinstructions.add(new InstructionWriteMetadata(subnetRouteMeta,
- MetaDataUtil.METADATA_MASK_SUBNET_ROUTE));
- LFIBinstructions.add(new InstructionGotoTable(NwConstants.L3_SUBNET_ROUTE_TABLE));
-
- makeLFibTableEntry(dpnId, vrfEntry.getLabel(), LFIBinstructions, DEFAULT_FIB_FLOW_PRIORITY,
- NwConstants.ADD_FLOW, tx);
+ for (RoutePaths routePath : vrfEntry.getRoutePaths()) {
+ if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
+ List<ActionInfo> actionsInfos = new ArrayList<>();
+ // reinitialize instructions list for LFIB Table
+ final List<InstructionInfo> LFIBinstructions = new ArrayList<>();
+
+ actionsInfos.add(new ActionPopMpls());
+ LFIBinstructions.add(new InstructionApplyActions(actionsInfos));
+ LFIBinstructions.add(new InstructionWriteMetadata(subnetRouteMeta,
+ MetaDataUtil.METADATA_MASK_SUBNET_ROUTE));
+ LFIBinstructions.add(new InstructionGotoTable(NwConstants.L3_SUBNET_ROUTE_TABLE));
+
+ makeLFibTableEntry(dpnId, routePath.getLabel(), LFIBinstructions, DEFAULT_FIB_FLOW_PRIORITY,
+ NwConstants.ADD_FLOW, tx);
+ }
}
if (!wrTxPresent) {
tx.submit();
MetaDataUtil.getMetaDataMaskForLPortDispatcher()),
new InstructionGotoTable(NwConstants.L3_INTERFACE_TABLE));
- LOG.debug("Installing flow: VrfEntry=[prefix={} label={} nexthop={}] dpn {} for "
- + "InterVpnLink {} in LFIB",
- vrfEntry.getDestPrefix(), vrfEntry.getLabel(), vrfEntry.getNextHopAddressList(),
- dpId, interVpnLink.getName());
+ FibUtil.getLabelFromRoutePaths(vrfEntry).ifPresent(interVpnRoutePathLabel -> {
+ List<String> interVpnNextHopList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ LOG.debug("Installing flow: VrfEntry=[prefix={} label={} nexthop={}] dpn {} for "
+ + "InterVpnLink {} in LFIB",
+ vrfEntry.getDestPrefix(), interVpnRoutePathLabel, interVpnNextHopList,
+ dpId, interVpnLink.getName());
- makeLFibTableEntry(dpId, vrfEntry.getLabel(), instructions, LFIB_INTERVPN_PRIORITY,
- NwConstants.ADD_FLOW, null);
+ makeLFibTableEntry(dpId, interVpnRoutePathLabel, instructions, LFIB_INTERVPN_PRIORITY,
+ NwConstants.ADD_FLOW, null);
+ });
}
break;
}
if (!interVpnLinkFound) {
- LOG.warn("VrfEntry=[prefix={} label={} nexthop={}] for VPN {} has origin INTERVPN but "
+ LOG.warn("VrfEntry=[prefix={} route-paths={}] for VPN {} has origin INTERVPN but "
+ "no InterVpnLink could be found",
- vrfEntry.getDestPrefix(), vrfEntry.getLabel(), vrfEntry.getNextHopAddressList(), rd);
+ vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), rd);
}
}
private void installIVpnLinkSwitchingFlows(final InterVpnLinkDataComposite interVpnLink, final String vpnUuid,
final VrfEntry vrfEntry, long vpnTag) {
Preconditions.checkNotNull(interVpnLink, "InterVpnLink cannot be null");
- Preconditions.checkArgument(vrfEntry.getNextHopAddressList() != null
- && vrfEntry.getNextHopAddressList().size() == 1);
+ Preconditions.checkArgument(vrfEntry.getRoutePaths() != null
+ && vrfEntry.getRoutePaths().size() == 1);
String destination = vrfEntry.getDestPrefix();
- String nextHop = vrfEntry.getNextHopAddressList().get(0);
+ String nextHop = vrfEntry.getRoutePaths().get(0).getNexthopAddress();
String interVpnLinkName = interVpnLink.getInterVpnLinkName();
// After having received a static route, we should check if the vpn is part of an inter-vpn-link.
for (BigInteger dpId : targetDpns) {
- LOG.debug("Installing flow: VrfEntry=[prefix={} label={} nextHop={}] dpn {} for InterVpnLink {} in FIB",
- vrfEntry.getDestPrefix(), vrfEntry.getLabel(), vrfEntry.getNextHopAddressList(),
+ LOG.debug("Installing flow: VrfEntry=[prefix={} route-paths={}] dpn {} for InterVpnLink {} in FIB",
+ vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(),
dpId, interVpnLink.getInterVpnLinkName());
mdsalManager.installFlow(dpId, flowEntity);
}
if (localNextHopInfo == null) {
/* imported routes case */
- synchronized (vrfEntry.getLabel().toString().intern()) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) {
- Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
- FibUtil.getVpnInstanceOpData(dataBroker, rd);
- if (vpnInstanceOpDataEntryOptional.isPresent()) {
- String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
- if (lri.getVpnInstanceList().contains(vpnInstanceName)) {
- localNextHopInfo = updateVpnReferencesInLri(lri, vpnInstanceName, true);
- localNextHopIP = lri.getPrefix();
- } else {
- localNextHopInfo = updateVpnReferencesInLri(lri, vpnInstanceName, false);
- localNextHopIP = lri.getPrefix();
+ if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) {
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (optionalLabel.isPresent()) {
+ Long label = optionalLabel.get();
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ synchronized (label.toString().intern()) {
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) {
+ Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
+ FibUtil.getVpnInstanceOpData(dataBroker, rd);
+ if (vpnInstanceOpDataEntryOptional.isPresent()) {
+ String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
+ if (lri.getVpnInstanceList().contains(vpnInstanceName)) {
+ localNextHopInfo = updateVpnReferencesInLri(lri, vpnInstanceName, true);
+ localNextHopIP = lri.getPrefix();
+ } else {
+ localNextHopInfo = updateVpnReferencesInLri(lri, vpnInstanceName, false);
+ localNextHopIP = lri.getPrefix();
+ }
+ }
+ if (localNextHopInfo != null) {
+ LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
+ label, localNextHopInfo.getVpnInterfaceName(), lri.getDpnId());
+ BigInteger dpnId = checkCreateLocalFibEntry(localNextHopInfo, localNextHopIP,
+ vpnId, rd, vrfEntry, lri.getParentVpnid());
+ returnLocalDpnId.add(dpnId);
}
- }
- if (localNextHopInfo != null) {
- LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
- vrfEntry.getLabel(), localNextHopInfo.getVpnInterfaceName(), lri.getDpnId());
- BigInteger dpnId = checkCreateLocalFibEntry(localNextHopInfo, localNextHopIP,
- vpnId, rd, vrfEntry, lri.getParentVpnid());
- returnLocalDpnId.add(dpnId);
}
}
}
final List<InstructionInfo> lfibinstructions = Collections.singletonList(
new InstructionApplyActions(
Arrays.asList(new ActionPopMpls(), new ActionGroup(groupId))));
+ java.util.Optional<Long> optLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
LOG.debug("Installing tunnel table entry on dpn {} for interface {} with label {}",
- dpnId, localNextHopInfo.getVpnInterfaceName(), vrfEntry.getLabel());
+ dpnId, localNextHopInfo.getVpnInterfaceName(), optLabel);
} else {
LOG.debug("Route with rd {} prefix {} label {} nexthop {} for vpn {} is an imported route. "
+ "LFib and Terminating table entries will not be created.",
- rd, vrfEntry.getDestPrefix(), vrfEntry.getLabel(), vrfEntry.getNextHopAddressList(), vpnId);
+ rd, vrfEntry.getDestPrefix(), optLabel, nextHopAddressList, vpnId);
}
DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
dataStoreCoordinator.enqueueJob("FIB-" + vpnId.toString()
- + "-" + dpnId.toString() + "-" + vrfEntry.getDestPrefix(),
- () -> {
+ + "-" + dpnId.toString() + "-" + vrfEntry.getDestPrefix(), () -> {
WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, instructions, NwConstants.ADD_FLOW, tx);
- if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
- makeLFibTableEntry(dpnId, vrfEntry.getLabel(), lfibinstructions,
- DEFAULT_FIB_FLOW_PRIORITY, NwConstants.ADD_FLOW, tx);
- makeTunnelTableEntry(dpnId, vrfEntry.getLabel(), groupId, tx);
- }
+ optLabel.ifPresent(label -> {
+ if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
+ makeLFibTableEntry(dpnId, label, lfibinstructions,
+ DEFAULT_FIB_FLOW_PRIORITY, NwConstants.ADD_FLOW, tx);
+ makeTunnelTableEntry(dpnId, label, groupId, tx);
+ }
+ });
List<ListenableFuture<Void>> futures = new ArrayList<>();
futures.add(tx.submit());
return futures;
}
if (localNextHopInfo == null) {
- /* Imported VRF entry */
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- VpnNexthopBuilder vpnNexthopBuilder = new VpnNexthopBuilder();
- vpnNexthopBuilder.setDpnId(lri.getDpnId());
- BigInteger dpnId = checkDeleteLocalFibEntry(vpnNexthopBuilder.build(), localNextHopIP,
- vpnId, rd, vrfEntry, false /*isExtraRoute*/);
- if (!dpnId.equals(BigInteger.ZERO)) {
- returnLocalDpnId.add(dpnId);
+ /* Imported VRF entry */
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (optionalLabel.isPresent()) {
+ Long label = optionalLabel.get();
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) {
+ VpnNexthopBuilder vpnNexthopBuilder = new VpnNexthopBuilder();
+ vpnNexthopBuilder.setDpnId(lri.getDpnId());
+ BigInteger dpnId = checkDeleteLocalFibEntry(vpnNexthopBuilder.build(), localNextHopIP,
+ vpnId, rd, vrfEntry, false /*isExtraRoute*/);
+ if (!dpnId.equals(BigInteger.ZERO)) {
+ returnLocalDpnId.add(dpnId);
+ }
}
}
}
makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, null /* instructions */,
NwConstants.DEL_FLOW, tx);
if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
- makeLFibTableEntry(dpnId, vrfEntry.getLabel(), null /* instructions */,
- DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx);
- removeTunnelTableEntry(dpnId, vrfEntry.getLabel(), tx);
+ FibUtil.getLabelFromRoutePaths(vrfEntry).ifPresent(label -> {
+ makeLFibTableEntry(dpnId, label, null /* instructions */,
+ DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx);
+ removeTunnelTableEntry(dpnId, label, tx);
+ });
}
List<ListenableFuture<Void>> futures = new ArrayList<>();
futures.add(tx.submit());
List<AdjacencyResult> adjacencyResults = resolveAdjacency(remoteDpnId, vpnId, vrfEntry, rd);
if (adjacencyResults.isEmpty()) {
- LOG.error("Could not get interface for nexthop: {} in vpn {}",
- vrfEntry.getNextHopAddressList(), rd);
+ LOG.error("Could not get interface for route-paths: {} in vpn {}",
+ vrfEntry.getRoutePaths(), rd);
LOG.warn("Failed to add Route: {} in vpn: {}",
vrfEntry.getDestPrefix(), rd);
return;
List<ActionInfo> egressActions = nextHopManager.getEgressActionsForInterface(egressInterface,
actionInfos.size());
if (egressActions.isEmpty()) {
- LOG.error("Failed to retrieve egress action for prefix {} nextHop {} interface {}. "
+ LOG.error("Failed to retrieve egress action for prefix {} route-paths {} interface {}. "
+ "Aborting remote FIB entry creation.",
- vrfEntry.getDestPrefix(), vrfEntry.getNextHopAddressList(), egressInterface);
+ vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), egressInterface);
return;
}
actionInfos.addAll(egressActions);
private void addTunnelInterfaceActions(String tunnelInterface, long vpnId, VrfEntry vrfEntry,
List<ActionInfo> actionInfos) {
Class<? extends TunnelTypeBase> tunnelType = getTunnelType(tunnelInterface);
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (!optionalLabel.isPresent()) {
+ LOG.warn("RoutePaths not available");
+ return;
+ }
+ long label = optionalLabel.get();
if (tunnelType.equals(TunnelTypeMplsOverGre.class)) {
LOG.debug("Push label action for prefix {}", vrfEntry.getDestPrefix());
actionInfos.add(new ActionPushMpls());
- actionInfos.add(new ActionSetFieldMplsLabel(vrfEntry.getLabel()));
+ actionInfos.add(new ActionSetFieldMplsLabel(label));
actionInfos.add(new ActionNxLoadInPort(BigInteger.ZERO));
} else {
- int label = vrfEntry.getLabel().intValue();
BigInteger tunnelId;
// FIXME vxlan vni bit set is not working properly with OVS.need to
// revisit
}
}
if (prefixInfo == null) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- PrefixesBuilder prefixBuilder = new PrefixesBuilder();
- prefixBuilder.setDpnId(lri.getDpnId());
- prefixBuilder.setVpnInterfaceName(lri.getVpnInterfaceName());
- prefixBuilder.setIpAddress(lri.getPrefix());
- prefixInfo = prefixBuilder.build();
- LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
- vrfEntry.getLabel(), prefixInfo.getVpnInterfaceName(), lri.getDpnId());
- checkCleanUpOpDataForFib(prefixInfo, vpnId, rd, vrfEntry, extraRoute);
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (optionalLabel.isPresent()) {
+ Long label = optionalLabel.get();
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) {
+ PrefixesBuilder prefixBuilder = new PrefixesBuilder();
+ prefixBuilder.setDpnId(lri.getDpnId());
+ prefixBuilder.setVpnInterfaceName(lri.getVpnInterfaceName());
+ prefixBuilder.setIpAddress(lri.getPrefix());
+ prefixInfo = prefixBuilder.build();
+ LOG.debug("Fetched labelRouteInfo for label {} interface {} and got dpn {}",
+ label, prefixInfo.getVpnInterfaceName(), lri.getDpnId());
+ checkCleanUpOpDataForFib(prefixInfo, vpnId, rd, vrfEntry, extraRoute);
+ }
}
}
} else {
WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
//First Cleanup LabelRouteInfo
- synchronized (vrfEntry.getLabel().toString().intern()) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
- FibUtil.getVpnInstanceOpData(dataBroker, rd);
- String vpnInstanceName = "";
- if (vpnInstanceOpDataEntryOptional.isPresent()) {
- vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
- }
- boolean lriRemoved = deleteLabelRouteInfo(lri, vpnInstanceName, writeOperTxn);
- if (lriRemoved) {
- String parentRd = lri.getParentVpnRd();
+ FibUtil.getLabelFromRoutePaths(vrfEntry).ifPresent(label -> {
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ synchronized (label.toString().intern()) {
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
+ && nextHopAddressList.contains(lri.getNextHopIpList().get(0))) {
+ Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
+ FibUtil.getVpnInstanceOpData(dataBroker, rd);
+ String vpnInstanceName = "";
+ if (vpnInstanceOpDataEntryOptional.isPresent()) {
+ vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
+ }
+ boolean lriRemoved = deleteLabelRouteInfo(lri, vpnInstanceName, writeOperTxn);
+ if (lriRemoved) {
+ String parentRd = lri.getParentVpnRd();
+ FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
+ FibUtil.getNextHopLabelKey(parentRd, vrfEntry.getDestPrefix()));
+ }
+ } else {
FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
- FibUtil.getNextHopLabelKey(parentRd, vrfEntry.getDestPrefix()));
+ FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
}
- } else {
- FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
- FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
}
- }
+ });
String ifName = prefixInfo.getVpnInterfaceName();
Optional<VpnInterface> optvpnInterface = FibUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
FibUtil.getVpnInterfaceIdentifier(ifName));
final Collection<VpnToDpnList> vpnToDpnList = vpnInstance.getVpnToDpnList();
long elanTag = 0L;
SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
+ final java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ List<String> nextHopAddressList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
if (subnetRoute != null) {
elanTag = subnetRoute.getElantag();
LOG.trace("SubnetRoute augmented vrfentry found for rd {} prefix {} with elantag {}",
makeConnectedRoute(curDpn.getDpnId(), vpnInstance.getVpnId(), vrfEntry,
vrfTableKey.getRouteDistinguisher(), null, NwConstants.DEL_FLOW, tx);
if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.SELF_IMPORTED) {
- makeLFibTableEntry(curDpn.getDpnId(), vrfEntry.getLabel(), null,
- DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx);
+ optionalLabel.ifPresent(label -> {
+ makeLFibTableEntry(curDpn.getDpnId(), label, null,
+ DEFAULT_FIB_FLOW_PRIORITY, NwConstants.DEL_FLOW, tx);
+ });
}
}
List<ListenableFuture<Void>> futures = new ArrayList<>();
return futures;
});
}
- synchronized (vrfEntry.getLabel().toString().intern()) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
- FibUtil.getVpnInstanceOpData(dataBroker, rd);
- String vpnInstanceName = "";
- if (vpnInstanceOpDataEntryOptional.isPresent()) {
- vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
- }
- boolean lriRemoved = this.deleteLabelRouteInfo(lri, vpnInstanceName, null);
- if (lriRemoved) {
- String parentRd = lri.getParentVpnRd();
+ optionalLabel.ifPresent(label -> {
+ synchronized (label.toString().intern()) {
+ LabelRouteInfo lri = getLabelRouteInfo(label);
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) {
+ Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
+ FibUtil.getVpnInstanceOpData(dataBroker, rd);
+ String vpnInstanceName = "";
+ if (vpnInstanceOpDataEntryOptional.isPresent()) {
+ vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
+ }
+ boolean lriRemoved = this.deleteLabelRouteInfo(lri, vpnInstanceName, null);
+ if (lriRemoved) {
+ String parentRd = lri.getParentVpnRd();
+ FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
+ FibUtil.getNextHopLabelKey(parentRd, vrfEntry.getDestPrefix()));
+ LOG.trace("deleteFibEntries: Released subnetroute label {} for rd {} prefix {} as "
+ + "labelRouteInfo cleared", label, rd,
+ vrfEntry.getDestPrefix());
+ }
+ } else {
FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
- FibUtil.getNextHopLabelKey(parentRd, vrfEntry.getDestPrefix()));
- LOG.trace("deleteFibEntries: Released subnetroute label {} for rd {} prefix {} as "
- + "labelRouteInfo cleared", vrfEntry.getLabel(), rd,
- vrfEntry.getDestPrefix());
+ FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
+ LOG.trace("deleteFibEntries: Released subnetroute label {} for rd {} prefix {}",
+ label, rd, vrfEntry.getDestPrefix());
}
- } else {
- FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
- FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
- LOG.trace("deleteFibEntries: Released subnetroute label {} for rd {} prefix {}",
- vrfEntry.getLabel(), rd, vrfEntry.getDestPrefix());
}
- }
+ });
return;
}
if (installRouterFibEntries(vrfEntry, vpnToDpnList, vpnInstance.getVpnId(), NwConstants.DEL_FLOW)) {
Optional<String> optVpnUuid = FibUtil.getVpnNameFromRd(this.dataBroker, rd);
if (optVpnUuid.isPresent()) {
String vpnUuid = optVpnUuid.get();
- List<String> routeNexthoplist = vrfEntry.getNextHopAddressList();
- if (routeNexthoplist.isEmpty()) {
- LOG.trace("NextHopList is empty for VrfEntry {}", vrfEntry);
- return;
- }
- String routeNexthop = routeNexthoplist.get(0);
- Optional<InterVpnLinkDataComposite> optInterVpnLink = InterVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid);
- if (optInterVpnLink.isPresent()) {
- InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get();
- if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) {
- // This is route that points to the other endpoint of an InterVpnLink
- // In that case, we should look for the FIB table pointing to LPortDispatcher table and remove it.
- removeInterVPNLinkRouteFlows(interVpnLink.getInterVpnLinkName(),
- interVpnLink.isFirstEndpointVpnName(rd),
- vrfEntry);
+ FibUtil.getFirstNextHopAddress(vrfEntry).ifPresent(routeNexthop -> {
+ Optional<InterVpnLinkDataComposite> optInterVpnLink =
+ InterVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid);
+ if (optInterVpnLink.isPresent()) {
+ InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get();
+ if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) {
+ // This is route that points to the other endpoint of an InterVpnLink
+ // In that case, we should look for the FIB table pointing to
+ // LPortDispatcher table and remove it.
+ removeInterVPNLinkRouteFlows(interVpnLink.getInterVpnLinkName(),
+ interVpnLink.isFirstEndpointVpnName(rd),
+ vrfEntry);
+ }
}
- }
+ });
}
}
}
//Handle local flow creation for imports
if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) {
- LabelRouteInfo lri = getLabelRouteInfo(vrfEntry.getLabel());
- if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
- && vrfEntry.getNextHopAddressList().contains(lri.getNextHopIpList().get(0))) {
- if (lri.getDpnId().equals(dpnId)) {
- createLocalFibEntry(vpnId, rd, vrfEntry);
- continue;
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (optionalLabel.isPresent()) {
+ List<String> nextHopList = FibUtil.getNextHopListFromRoutePaths(vrfEntry);
+ LabelRouteInfo lri = getLabelRouteInfo(optionalLabel.get());
+ if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopList, lri)) {
+ if (lri.getDpnId().equals(dpnId)) {
+ createLocalFibEntry(vpnId, rd, vrfEntry);
+ continue;
+ }
}
}
}
List<ListenableFuture<Void>> futures = new ArrayList<>();
synchronized (vpnInstance.getVpnInstanceName().intern()) {
WriteTransaction writeCfgTxn = dataBroker.newWriteOnlyTransaction();
- for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
- if (!vrfEntry.getNextHopAddressList().isEmpty()) {
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) {
- if (remoteNextHopIp.trim()
- .equals(vrfEntry.getNextHopAddressList().get(0).trim())) {
- LOG.trace(" creating remote FIB entry for prefix {} rd {}",
- vrfEntry.getDestPrefix(), rd);
- createRemoteFibEntry(dpnId, vpnId, vrfTable.get().getKey(),
- vrfEntry, writeCfgTxn);
- }
- }
- }
- }
+ vrfTable.get().getVrfEntry().stream()
+ .filter(vrfEntry -> RouteOrigin.BGP == RouteOrigin.value(vrfEntry.getOrigin()))
+ .forEach(
+ getConsumerForCreatingRemoteFib(dpnId, vpnId,
+ rd, remoteNextHopIp, vrfTable,
+ writeCfgTxn));
futures.add(writeCfgTxn.submit());
}
return futures;
List<ListenableFuture<Void>> futures = new ArrayList<>();
synchronized (vpnInstance.getVpnInstanceName().intern()) {
WriteTransaction writeCfgTxn = dataBroker.newWriteOnlyTransaction();
- for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
- // Handle Internal Routes only (i.e., STATIC for now)
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.STATIC) {
- SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
- /* Ignore SubnetRoute entry */
- if (subnetRoute == null) {
- if (!vrfEntry.getNextHopAddressList().isEmpty()) {
- if (remoteNextHopIp.trim()
- .equals(vrfEntry.getNextHopAddressList().get(0).trim())) {
- LOG.trace(" creating remote FIB entry for prefix {} rd {} on Dpn {}",
- vrfEntry.getDestPrefix(), rd, dpnId);
- createRemoteFibEntry(dpnId, vpnId, vrfTable.get().getKey(), vrfEntry,
- writeCfgTxn);
- }
- }
- }
- }
- }
+ // Handle Internal Routes only (i.e., STATIC for now)
+ vrfTable.get().getVrfEntry().stream()
+ .filter(vrfEntry -> {
+ SubnetRoute subnetRoute =
+ vrfEntry.getAugmentation(SubnetRoute.class);
+ /* Ignore SubnetRoute entry */
+ return (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.STATIC)
+ && (subnetRoute == null);
+ })
+ .forEach(getConsumerForCreatingRemoteFib(dpnId, vpnId,
+ rd, remoteNextHopIp, vrfTable,
+ writeCfgTxn));
futures.add(writeCfgTxn.submit());
}
return futures;
final long vpnId,
final String rd,
final String destPrefix,
- final String destTepIp) {
+ final String destTepIp,
+ final long label) {
final VpnInstanceOpDataEntry vpnInstance = getVpnInstance(rd);
if (vpnInstance == null) {
}
LOG.trace("manageRemoteRouteOnDPN :: action {}, DpnId {}, vpnId {}, rd {}, destPfx {}",
action, localDpnId, vpnId, rd, destPrefix);
- List<String> nextHopAddressList = vrfEntry.getNextHopAddressList();
+ List<RoutePaths> routePathList = vrfEntry.getRoutePaths();
VrfEntry modVrfEntry;
- if (nextHopAddressList == null || (nextHopAddressList.isEmpty())) {
- List<String> nhList = Collections.singletonList(destTepIp);
- modVrfEntry = new VrfEntryBuilder(vrfEntry).setNextHopAddressList(nhList).build();
+ if (routePathList == null || (routePathList.isEmpty())) {
+ modVrfEntry = FibHelper.getVrfEntryBuilder(vrfEntry, label,
+ Collections.singletonList(destTepIp),
+ RouteOrigin.value(vrfEntry.getOrigin()))
+ .build();
} else {
modVrfEntry = vrfEntry;
}
SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
if (subnetRoute != null) {
LOG.trace("Cleaning subnetroute {} on dpn {} for vpn {} : cleanUpDpnForVpn",
- vrfEntry.getDestPrefix(),
- dpnId, rd);
+ vrfEntry.getDestPrefix(),
+ dpnId, rd);
makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, null, NwConstants.DEL_FLOW, tx);
- makeLFibTableEntry(dpnId, vrfEntry.getLabel(), null, DEFAULT_FIB_FLOW_PRIORITY,
- NwConstants.DEL_FLOW, tx);
- LOG.trace("cleanUpDpnForVpn: Released subnetroute label {} for rd {} prefix {}",
- vrfEntry.getLabel(), rd,
- vrfEntry.getDestPrefix());
+ java.util.Optional.ofNullable(vrfEntry.getRoutePaths()).ifPresent(routePaths -> {
+ routePaths.stream().forEach(routePath -> {
+ makeLFibTableEntry(dpnId, routePath.getLabel(), null, DEFAULT_FIB_FLOW_PRIORITY,
+ NwConstants.DEL_FLOW, tx);
+ LOG.trace("cleanUpDpnForVpn: Released subnetroute label {} for rd {} prefix {}",
+ routePath.getLabel(), rd,
+ vrfEntry.getDestPrefix());
+ });
+ });
continue;
}
// ping responder for router interfaces
() -> {
List<ListenableFuture<Void>> futures = new ArrayList<>();
synchronized (vpnInstance.getVpnInstanceName().intern()) {
- WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
- for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
- if (!vrfEntry.getNextHopAddressList().isEmpty()) {
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) {
- if (remoteNextHopIp.trim()
- .equals(vrfEntry.getNextHopAddressList().get(0).trim())) {
- LOG.trace(" deleting remote FIB entry {}", vrfEntry);
- deleteRemoteRoute(null, dpnId, vpnId, vrfTable.get().getKey(),
- vrfEntry, writeTransaction);
- }
- }
- }
- }
- futures.add(writeTransaction.submit());
+ WriteTransaction writeCfgTxn = dataBroker.newWriteOnlyTransaction();
+ vrfTable.get().getVrfEntry().stream()
+ .filter(vrfEntry -> RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP)
+ .forEach(getConsumerForDeletingRemoteFib(dpnId, vpnId, rd,
+ remoteNextHopIp, vrfTable, writeCfgTxn));
+ futures.add(writeCfgTxn.submit());
}
return futures;
});
() -> {
List<ListenableFuture<Void>> futures = new ArrayList<>();
synchronized (vpnInstance.getVpnInstanceName().intern()) {
- WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
- for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
- // Handle Internal Routes only (i.e, STATIC for now)
- if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.STATIC) {
+ WriteTransaction writeCfgTxn = dataBroker.newWriteOnlyTransaction();
+ vrfTable.get().getVrfEntry().stream()
+ .filter(vrfEntry -> {
SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
- /* Ignore SubnetRoute entry */
- if (subnetRoute == null) {
- if (!vrfEntry.getNextHopAddressList().isEmpty()) {
- if (remoteNextHopIp.trim()
- .equals(vrfEntry.getNextHopAddressList().get(0).trim())) {
- LOG.trace(" deleting remote FIB entry {}", vrfEntry);
- deleteRemoteRoute(null, dpnId, vpnId, vrfTable.get().getKey(),
- vrfEntry, writeTransaction);
- }
- }
- }
- }
- }
- futures.add(writeTransaction.submit());
+ /* Ignore SubnetRoute entry */
+ return (subnetRoute == null)
+ && (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.STATIC);
+ })
+ .forEach(getConsumerForDeletingRemoteFib(dpnId, vpnId,
+ rd, remoteNextHopIp, vrfTable, writeCfgTxn));
+ futures.add(writeCfgTxn.submit());
}
return futures;
});
}
for (String prefixIp : prefixIpList) {
- for (String nextHopIp : vrfEntry.getNextHopAddressList()) {
- LOG.debug("NextHop IP for destination {} is {}", prefixIp, nextHopIp);
- AdjacencyResult adjacencyResult = nextHopManager.getRemoteNextHopPointer(remoteDpnId, vpnId,
- prefixIp, nextHopIp);
- if (adjacencyResult != null && !adjacencyList.contains(adjacencyResult)) {
- adjacencyList.add(adjacencyResult);
- }
- }
+ adjacencyList.addAll(vrfEntry.getRoutePaths().stream()
+ .map(routePath -> {
+ LOG.debug("NextHop IP for destination {} is {}", prefixIp,
+ routePath.getNexthopAddress());
+ return nextHopManager.getRemoteNextHopPointer(remoteDpnId, vpnId,
+ prefixIp, routePath.getNexthopAddress());
+ })
+ .filter(adjacencyResult -> adjacencyResult != null && !adjacencyList.contains(adjacencyResult))
+ .distinct()
+ .collect(Collectors.toList()));
}
} catch (NullPointerException e) {
LOG.trace("", e);
List<VrfTables> vrfTables = fibEntries.get().getVrfTables();
for (VrfTables vrfTable : vrfTables) {
for (VrfEntry vrfEntry : vrfTable.getVrfEntry()) {
- for (String nextHop : vrfEntry.getNextHopAddressList()) {
+ List<RoutePaths> routePaths = vrfEntry.getRoutePaths();
+ for (RoutePaths routePath : routePaths) {
result.add(String.format(" %-7s %-20s %-20s %-7s %-7s",
vrfTable.getRouteDistinguisher(),
- vrfEntry.getDestPrefix(), nextHop, vrfEntry.getLabel(), vrfEntry.getOrigin()));
+ vrfEntry.getDestPrefix(), routePath.getNexthopAddress(),
+ routePath.getLabel(), vrfEntry.getOrigin()));
}
- if (vrfEntry.getNextHopAddressList().isEmpty()) {
- result.add(String.format(" %-7s %-20s %-20s %-7s %-7s",
+ if (routePaths.isEmpty()) {
+ result.add(String.format(" %-7s %-20s %-20s %-7s",
vrfTable.getRouteDistinguisher(),
- vrfEntry.getDestPrefix(), "local", vrfEntry.getLabel(), vrfEntry.getOrigin()));
+ vrfEntry.getDestPrefix(), "local", vrfEntry.getOrigin()));
}
}
}
return;
}
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
+ if (!optionalLabel.isPresent()) {
+ LOG.warn("Routes paths not present. Exiting installRouterFibEntry");
+ return;
+ }
String addRemoveStr = (addOrRemove == NwConstants.ADD_FLOW) ? "ADD_FLOW" : "DELETE_FLOW";
LOG.trace("{}: bulding Echo Flow entity for dpid:{}, router_ip:{}, vpnId:{}, subSplit:{} ", addRemoveStr,
dpnId, routerInternalIp, vpnId, subSplit[0]);
instructions.add(new InstructionApplyActions(actionsInfos));
int priority = FibConstants.DEFAULT_FIB_FLOW_PRIORITY + FibConstants.DEFAULT_PREFIX_LENGTH;
- String flowRef = getFlowRef(dpnId, NwConstants.L3_FIB_TABLE, vrfEntry.getLabel(), priority);
+ String flowRef = getFlowRef(dpnId, NwConstants.L3_FIB_TABLE, optionalLabel.get(),
+ priority);
FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, NwConstants.L3_FIB_TABLE, flowRef, priority, flowRef,
0, 0, NwConstants.COOKIE_VM_FIB_TABLE, matches, instructions);
public void removeInterVPNLinkRouteFlows(final String interVpnLinkName,
final boolean isVpnFirstEndPoint,
final VrfEntry vrfEntry) {
- Preconditions.checkArgument(vrfEntry.getNextHopAddressList() != null
- && vrfEntry.getNextHopAddressList().size() == 1);
+ Preconditions.checkArgument(vrfEntry.getRoutePaths() != null
+ && vrfEntry.getRoutePaths().size() == 1);
Optional<InterVpnLinkState> interVpnLinkState = FibUtil.getInterVpnLinkState(dataBroker, interVpnLinkName);
if (!interVpnLinkState.isPresent()) {
isVpnFirstEndPoint ? interVpnLinkState.get().getFirstEndpointState().getDpId()
: interVpnLinkState.get().getSecondEndpointState().getDpId();
- String nextHop = vrfEntry.getNextHopAddressList().get(0);
+ java.util.Optional<String> optionalNextHop = FibUtil.getFirstNextHopAddress(vrfEntry);
+ java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
// delete from FIB
//
- String flowRef = getInterVpnFibFlowRef(interVpnLinkName, vrfEntry.getDestPrefix(), nextHop);
- FlowKey flowKey = new FlowKey(new FlowId(flowRef));
- Flow flow = new FlowBuilder().setKey(flowKey).setId(new FlowId(flowRef)).setTableId(NwConstants.L3_FIB_TABLE)
- .setFlowName(flowRef).build();
+ optionalNextHop.ifPresent(nextHop -> {
+ String flowRef = getInterVpnFibFlowRef(interVpnLinkName, vrfEntry.getDestPrefix(), nextHop);
+ FlowKey flowKey = new FlowKey(new FlowId(flowRef));
+ Flow flow = new FlowBuilder().setKey(flowKey).setId(new FlowId(flowRef))
+ .setTableId(NwConstants.L3_FIB_TABLE).setFlowName(flowRef).build();
- LOG.trace("Removing flow in FIB table for interVpnLink {} key {}",
- interVpnLinkName, flowRef);
+ LOG.trace("Removing flow in FIB table for interVpnLink {} key {}",
+ interVpnLinkName, flowRef);
- for (BigInteger dpId : targetDpns) {
- LOG.debug("Removing flow: VrfEntry=[prefix={} label={} nexthop={}] dpn {} for InterVpnLink {} in FIB",
- vrfEntry.getDestPrefix(), vrfEntry.getLabel(), nextHop,
- dpId, interVpnLinkName);
+ for (BigInteger dpId : targetDpns) {
+ LOG.debug("Removing flow: VrfEntry=[prefix={} nexthop={}] dpn {} for InterVpnLink {} in FIB",
+ vrfEntry.getDestPrefix(), nextHop,
+ dpId, interVpnLinkName);
- mdsalManager.removeFlow(dpId, flow);
- }
+ mdsalManager.removeFlow(dpId, flow);
+ }
+ });
// delete from LFIB
//
- LOG.trace("Removing flow in FIB table for interVpnLink {}", interVpnLinkName);
+ optionalLabel.ifPresent(label -> {
+ LOG.trace("Removing flow in FIB table for interVpnLink {}", interVpnLinkName);
+
+ WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
+ for (BigInteger dpId : targetDpns) {
+ LOG.debug("Removing flow: VrfEntry=[prefix={} label={}] dpn {} for InterVpnLink {} in LFIB",
+ vrfEntry.getDestPrefix(), label,
+ dpId, interVpnLinkName);
+ makeLFibTableEntry(dpId, label, null /* no instructions */,
+ LFIB_INTERVPN_PRIORITY, NwConstants.DEL_FLOW, tx);
+ }
+ tx.submit();
+ });
+ }
+
+ private Consumer<? super VrfEntry> getConsumerForCreatingRemoteFib(
+ final BigInteger dpnId, final long vpnId, final String rd,
+ final String remoteNextHopIp, final Optional<VrfTables> vrfTable,
+ WriteTransaction writeCfgTxn) {
+ return vrfEntry -> vrfEntry.getRoutePaths().stream()
+ .filter(routes -> !routes.getNexthopAddress().isEmpty()
+ && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim()))
+ .findFirst()
+ .ifPresent(routes -> {
+ LOG.trace("creating remote FIB entry for prefix {} rd {} on Dpn {}",
+ vrfEntry.getDestPrefix(), rd, dpnId);
+ createRemoteFibEntry(dpnId, vpnId, vrfTable.get().getKey(), vrfEntry, writeCfgTxn);
+ });
+ }
- WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
- for (BigInteger dpId : targetDpns) {
- LOG.debug("Removing flow: VrfEntry=[prefix={} label={} nexthop={}] dpn {} for InterVpnLink {} in LFIB",
- vrfEntry.getDestPrefix(), vrfEntry.getLabel(), nextHop,
- dpId, interVpnLinkName);
- makeLFibTableEntry(dpId, vrfEntry.getLabel(), null /* no instructions */,
- LFIB_INTERVPN_PRIORITY, NwConstants.DEL_FLOW, tx);
- }
- tx.submit();
+ private Consumer<? super VrfEntry> getConsumerForDeletingRemoteFib(
+ final BigInteger dpnId, final long vpnId, final String rd,
+ final String remoteNextHopIp, final Optional<VrfTables> vrfTable,
+ WriteTransaction writeCfgTxn) {
+ return vrfEntry -> vrfEntry.getRoutePaths().stream()
+ .filter(routes -> !routes.getNexthopAddress().isEmpty()
+ && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim()))
+ .findFirst()
+ .ifPresent(routes -> {
+ LOG.trace(" deleting remote FIB entry {}", vrfEntry);
+ deleteRemoteRoute(null, dpnId, vpnId, vrfTable.get().getKey(), vrfEntry, writeCfgTxn);
+ });
+ }
+
+ private boolean isPrefixAndNextHopPresentInLri(String prefix,
+ List<String> nextHopAddressList, LabelRouteInfo lri) {
+ return lri != null && lri.getPrefix().equals(prefix)
+ && nextHopAddressList.contains(lri.getNextHopIpList().get(0));
}
}