import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.CreateFibEntryInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.CreateFibEntryInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
private final IFibManager fibManager;
private final FibRpcService fibService;
private final IVpnManager vpnManager;
+ private final IdManagerService idManager;
private static final BigInteger COOKIE_TUNNEL = new BigInteger("9000000", 16);
@Inject
final IBgpManager bgpManager,
final IFibManager fibManager,
final FibRpcService fibService,
- final IVpnManager vpnManager) {
+ final IVpnManager vpnManager,
+ final IdManagerService idManager) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.bgpManager = bgpManager;
this.fibManager = fibManager;
this.fibService = fibService;
this.vpnManager = vpnManager;
+ this.idManager = idManager;
}
public void onAddFloatingIp(final BigInteger dpnId, final String routerName, final String vpnName,
* (DC-GW is responding back to FIP VM) {DNAT Reverse traffic})
*
*/
- long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
- if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Unable to retrieve L3VNI value for Floating IP {} ", externalIp);
- return;
- }
long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
if (vpnId == NatConstants.INVALID_ID) {
- LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+ LOG.error("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+ return;
+ }
+ long routerId = NatUtil.getVpnId(dataBroker, routerName);
+ if (routerId == NatConstants.INVALID_ID) {
+ LOG.error("Unable to get RouterId from RouterName {}", routerName);
return;
}
+ long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+ if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+ + "DNAT flows for FloatingIp {}", vpnName, rd, externalIp);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+ }
FloatingIPListener.updateOperationalDS(dataBroker, routerName, interfaceName, NatConstants.DEFAULT_LABEL_VALUE,
internalIp, externalIp);
//Inform to FIB and BGP
Collections.singleton(externalIp),
floatingIpPortMacAddress, dpnId, networkId, writeTx, NwConstants.ADD_FLOW);
}
-
+ final long finalL3Vni = l3Vni;
Futures.addCallback(futureVxlan, new FutureCallback<RpcResult<Void>>() {
@Override
/* Install the Flow table INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25) for SNAT to DNAT
* reverse traffic for Non-FIP VM on DPN1 to FIP VM on DPN2
*/
- makeTunnelTableEntry(dpnId, l3Vni, instructions);
+ makeTunnelTableEntry(dpnId, finalL3Vni, instructions);
/* Install the flow L3_GW_MAC_TABLE (table=19)-> PDNAT_TABLE (table=25)
* (DNAT reverse traffic: If the traffic is Initiated from DC-GW to FIP VM (DNAT forward traffic))
}
public void onRemoveFloatingIp(final BigInteger dpnId, final String vpnName, final String externalIp,
- final String floatingIpInterface, final String floatingIpPortMacAddress) {
+ final String floatingIpInterface, final String floatingIpPortMacAddress,
+ final String routerName) {
/*
* 1) Remove the flow INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25) (SNAT VM on DPN1 is
* responding back to FIP VM on DPN2) {SNAT to DNAT traffic on different Hypervisor}
LOG.error("NAT Service : Could not retrieve RD value from VPN Name {} ", vpnName);
return;
}
- long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
- if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} in ", rd);
- return;
- }
long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
if (vpnId == NatConstants.INVALID_ID) {
- LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+ LOG.error("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
return;
}
+ long routerId = NatUtil.getVpnId(dataBroker, routerName);
+ if (routerId == NatConstants.INVALID_ID) {
+ LOG.error("Unable to get RouterId from RouterName {}", routerName);
+ return;
+ }
+ long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+ if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+ + "DNAT flows for FloatingIp {}", vpnName, rd, externalIp);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+ }
//Remove Prefix from BGP
NatUtil.removePrefixFromBGP(dataBroker, bgpManager, fibManager, rd, externalIp + "/32", vpnName, LOG);
.setSourceDpid(dpnId).setIpAddress(externalIp + "/32").setServiceId(l3Vni).build();
Future<RpcResult<Void>> future = fibService.removeFibEntry(input);
ListenableFuture<RpcResult<Void>> futureVxlan = JdkFutureAdapters.listenInPoolThread(future);
+ final long finalL3Vni = l3Vni;
Futures.addCallback(futureVxlan, new FutureCallback<RpcResult<Void>>() {
@Override
*/
if (!NatUtil.isFloatingIpPresentForDpn(dataBroker, dpnId, rd, vpnName, externalIp)) {
//Remove the flow for INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25)
- removeTunnelTableEntry(dpnId, l3Vni);
+ removeTunnelTableEntry(dpnId, finalL3Vni);
}
//Remove the flow for L3_GW_MAC_TABLE (table=19)-> PDNAT_TABLE (table=25)
NatEvpnUtil.removeL3GwMacTableEntry(dpnId, vpnId, floatingIpPortMacAddress, mdsalManager);
}
long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} ", rd);
- return;
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ + "NAT flows", vpnName, rd);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
}
String gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
if (gwMacAddress == null) {
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final IMdsalApiManager mdsalManager;
private final IBgpManager bgpManager;
private final IFibManager fibManager;
+ private final IdManagerService idManager;
private static final BigInteger COOKIE_TUNNEL = new BigInteger("9000000", 16);
@Inject
public EvpnSnatFlowProgrammer(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
final IBgpManager bgpManager,
- final IFibManager fibManager) {
+ final IFibManager fibManager,
+ final IdManagerService idManager) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.bgpManager = bgpManager;
this.fibManager = fibManager;
+ this.idManager = idManager;
}
public void evpnAdvToBgpAndInstallFibAndTsFlows(final BigInteger dpnId, final short tableId,
//get l3Vni value for external VPN
long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Unable to retrieve L3VNI value for External IP {}", externalIp);
- return;
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+ + "SNAT flows for External Fixed IP {}", vpnName, rd, externalIp);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
}
/* As of now neither SNAT nor DNAT will use macaddress while advertising to FIB and BGP instead
* use only gwMacAddress. Hence default value of macAddress is null
LOG.error("NAT Service : Could not retrieve RD value from VPN Name {} ", vpnName);
return;
}
- long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
- if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} in ", rd);
+ long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
+ if (vpnId == NatConstants.INVALID_ID) {
+ LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
return;
}
String gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
LOG.error("NAT Service : Unable to Get External Gateway MAC address for External Router ID {} ", routerId);
return;
}
- long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
- if (vpnId == NatConstants.INVALID_ID) {
- LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+ long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+ if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+ + "SNAT flows for External Fixed IP {}", vpnName, rd, externalIp);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
}
//remove INTERNAL_TUNNEL_TABLE (table=36)-> INBOUND_NAPT_TABLE (table=44) flow
removeTunnelTableEntry(dpnId, l3Vni);
primarySwitchId, routerName);
return primarySwitchId;
}
-
// Validating and creating VNI pool during when NAPT switch is selected.
// With Assumption this might be the first NAT service comes up.
- if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
- NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
- idManager, NatConstants.ODL_VNI_POOL_NAME);
- }
+ NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
+ idManager, NatConstants.ODL_VNI_POOL_NAME);
primarySwitchId = naptSwitchSelector.selectNewNAPTSwitch(routerName);
LOG.debug("NAT Service : Primary NAPT switch DPN ID {}", primarySwitchId);
if (primarySwitchId == null || primarySwitchId.equals(BigInteger.ZERO)) {
handleRouterGwFlows(router, primarySwitchId, NwConstants.DEL_FLOW);
List<String> externalIps = NatUtil.getExternalIpsForRouter(dataBroker, routerId);
handleDisableSnat(router, networkUuid, externalIps, true, null, primarySwitchId);
- if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
- NatOverVxlanUtil.releaseVNI(routerName, idManager);
- }
+ NatOverVxlanUtil.releaseVNI(routerName, idManager);
}
}
}
public static BigInteger getInternetVpnVni(IdManagerService idManager, String vpnUuid, long vpnid) {
BigInteger internetVpnVni = getVNI(vpnUuid, idManager);
if (internetVpnVni.longValue() == -1) {
- LOG.warn("NAT Service : Unable to obtain Router VNI from VNI POOL for router {}."
- + "Router ID will be used as tun_id", vpnUuid);
+ LOG.warn("NAT Service : Unable to obtain Internet Vpn VNI from VNI POOL for Vpn {}."
+ + "Will use tunnel_id {} as Internet VNI", vpnUuid, vpnid);
return BigInteger.valueOf(vpnid);
}
return internetVpnVni;
return BigInteger.valueOf(rpcResult.getResult().getIdValue());
}
} catch (NullPointerException | InterruptedException | ExecutionException e) {
- LOG.error("NAT Service : getVNI Exception {}", e);
+ LOG.error("NAT Service : Exception in get VNI for key {}", vniKey, e);
}
return BigInteger.valueOf(-1);
}
vniKey, rpcResult.getErrors());
}
} catch (NullPointerException | InterruptedException | ExecutionException e) {
- LOG.error("NAT Service : getVNI Exception {}", e);
+ LOG.error("NAT Service : Exception in release VNI for Key {}", vniKey, e);
}
}
gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
//get l3Vni value for external VPN
l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+ if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ + "NAT flows", vpnName, rd);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, routerId).longValue();
+ }
//Create writeTx Object
writeTx = dataBroker.newWriteOnlyTransaction();
}
gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
//get l3Vni value for external VPN
l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+ if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ + "NAT flows", vpnName, rd);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+ }
//Create writeTx Object
writeTx = dataBroker.newWriteOnlyTransaction();
}
private void hndlTepDelForDnatInEachRtr(RoutersList router, BigInteger tepDeletedDpnId) {
//DNAT : Withdraw the routes from the BGP
String routerName = router.getRouter();
+ long routerId = NatUtil.getVpnId(dataBroker, routerName);
+ if (routerId == NatConstants.INVALID_ID) {
+ LOG.warn("Unable to get RouterId from RouterName {}", routerName);
+ return;
+ }
LOG.debug("NAT Service : DNAT -> Trying to clear routes to the Floating IP associated to the router {}",
routerName);
//get l3Vni value for external VPN
l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
- LOG.error("NAT Service : Unable to retrieve L3VNI value for RD {}", rd);
- return;
+ LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+ + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+ + "NAT flows", vpnName, rd);
+ l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
}
}
List<Ports> interfaces = routerPorts.getPorts();
if (provType == null) {
return;
}
+ NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager, idManager,
+ NatConstants.ODL_VNI_POOL_NAME);
if (provType == ProviderTypes.VXLAN) {
Uuid floatingIpInterface = NatEvpnUtil.getFloatingIpInterfaceIdFromFloatingIpId(dataBroker, floatingIpId);
evpnDnatFlowProgrammer.onAddFloatingIp(dpnId, routerId, vpnName, internalIp, externalIp, networkId,
}
return;
}
-
- if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
- NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
- idManager, NatConstants.ODL_VNI_POOL_NAME);
- }
-
GenerateVpnLabelInput labelInput = new GenerateVpnLabelInputBuilder().setVpnName(vpnName)
.setIpPrefix(externalIp).build();
Future<RpcResult<GenerateVpnLabelOutput>> labelFuture = vpnService.generateVpnLabel(labelInput);
if (provType == ProviderTypes.VXLAN) {
Uuid floatingIpInterface = NatEvpnUtil.getFloatingIpInterfaceIdFromFloatingIpId(dataBroker, floatingIpId);
evpnDnatFlowProgrammer.onRemoveFloatingIp(dpnId, vpnName, externalIp, floatingIpInterface.getValue(),
- floatingIpPortMacAddress);
+ floatingIpPortMacAddress, routerId);
return;
}
cleanupFibEntries(dpnId, vpnName, externalIp, label);