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 org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
+import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
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.genius.itm.rpcs.rev160406.GetTunnelInterfaceNameOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.routers.ExternalIps;
import org.opendaylight.yangtools.yang.common.RpcResult;
protected final OdlInterfaceRpcService odlInterfaceRpcService;
protected final IInterfaceManager interfaceManager;
protected final IVpnFootprintService vpnFootprintService;
+ protected final IFibManager fibManager;
protected AbstractSnatService(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
final ItmRpcService itmManager, final OdlInterfaceRpcService odlInterfaceRpcService,
final IdManagerService idManager, final NAPTSwitchSelector naptSwitchSelector,
final IInterfaceManager interfaceManager,
- final IVpnFootprintService vpnFootprintService) {
+ final IVpnFootprintService vpnFootprintService,
+ final IFibManager fibManager) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.itmManager = itmManager;
this.naptSwitchSelector = naptSwitchSelector;
this.odlInterfaceRpcService = odlInterfaceRpcService;
this.vpnFootprintService = vpnFootprintService;
+ this.fibManager = fibManager;
}
protected DataBroker getDataBroker() {
}
//The logic now handle only one external IP per router, others if present will be ignored.
String externalIp = externalIps.get(0).getIpAddress();
+ String externalGwMac = routers.getExtGwMacAddress();
Uuid externalSubnetId = externalIps.get(0).getSubnetId();
long extSubnetId = NatConstants.INVALID_ID;
if (addOrRemove == NwConstants.ADD_FLOW) {
extSubnetId = NatUtil.getExternalSubnetVpnId(dataBroker,externalSubnetId);
}
- installInboundFibEntry(dpnId, externalIp, routerId, extSubnetId, addOrRemove);
+ installInboundFibEntry(dpnId, externalIp, routerId, extSubnetId, routers.getNetworkId()
+ .getValue(), externalSubnetId.getValue(), externalGwMac, addOrRemove);
installInboundTerminatingServiceTblEntry(dpnId, routerId, extSubnetId, addOrRemove);
}
BigInteger dpnId, int addOrRemove) {
String routerName = routers.getRouterName();
Long routerId = NatUtil.getVpnId(dataBroker, routerName);
- List<ExternalIps> externalIps = routers.getExternalIps();
- if (externalIps.isEmpty()) {
- LOG.error("AbstractSnatService: installSnatCommonEntriesForNaptSwitch no externalIP present"
- + " for routerId {}",
- routerId);
- return;
- }
- String externalIp = externalIps.get(0).getIpAddress();
- Uuid externalSubnetId = externalIps.get(0).getSubnetId();
- long extSubnetId = NatConstants.INVALID_ID;
- if (addOrRemove == NwConstants.ADD_FLOW) {
- extSubnetId = NatUtil.getExternalSubnetVpnId(dataBroker,externalSubnetId);
- }
-
installDefaultFibRouteForSNAT(dpnId, routerId, addOrRemove);
- installSnatMissEntry(dpnId, routerId, routerName, primarySwitchId, externalIp, extSubnetId, addOrRemove);
+ installSnatMissEntry(dpnId, routerId, routerName, primarySwitchId, addOrRemove);
}
protected abstract void installSnatSpecificEntriesForNaptSwitch(Routers routers, BigInteger dpnId,
int addOrRemove);
protected void installInboundFibEntry(BigInteger dpnId, String externalIp, Long routerId,
- long extSubnetId, int addOrRemove) {
+ long extSubnetId, String externalNetId, String subNetId, String routerMac, int addOrRemove) {
List<MatchInfo> matches = new ArrayList<>();
matches.add(MatchEthernetType.IPV4);
if (addOrRemove == NwConstants.ADD_FLOW) {
flowRef = flowRef + "inbound" + externalIp;
syncFlow(dpnId, NwConstants.L3_FIB_TABLE, flowRef, NatConstants.SNAT_FIB_FLOW_PRIORITY, flowRef,
NwConstants.COOKIE_SNAT_TABLE, matches, instructionInfo, addOrRemove);
+ String rd = NatUtil.getVpnRd(dataBroker, subNetId);
+ String nextHopIp = NatUtil.getEndpointIpAddressForDPN(dataBroker, dpnId);
+ String ipPrefix = externalIp + "/32";
+ if (addOrRemove == NwConstants.ADD_FLOW) {
+ NatUtil.addPrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, subNetId),
+ null, ipPrefix, dpnId, new Uuid(subNetId), Prefixes.PrefixCue.Nat);
+
+ fibManager.addOrUpdateFibEntry(rd, routerMac, ipPrefix,
+ Collections.singletonList(nextHopIp), VrfEntry.EncapType.Mplsgre, extSubnetId,
+ 0, null, externalNetId, RouteOrigin.STATIC, null);
+ } else {
+ fibManager.removeFibEntry(rd, ipPrefix, null);
+ NatUtil.deletePrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, subNetId), ipPrefix);
+ }
}
protected void installSnatMissEntry(BigInteger dpnId, Long routerId, String routerName, BigInteger primarySwitchId,
- String externalIp, long extSubnetId, int addOrRemove) {
+ int addOrRemove) {
LOG.debug("installSnatMissEntry : Installing SNAT miss entry in switch {}", dpnId);
List<ActionInfo> listActionInfoPrimary = new ArrayList<>();
String ifNamePrimary = getTunnelInterfaceName(dpnId, primarySwitchId);
String flowRef = getFlowRef(dpnId, NwConstants.PSNAT_TABLE, routerId);
syncFlow(dpnId, NwConstants.PSNAT_TABLE, flowRef, NatConstants.DEFAULT_PSNAT_FLOW_PRIORITY, flowRef,
NwConstants.COOKIE_SNAT_TABLE, matches, instructions, addOrRemove);
- //Install the FIB entry for traffic destined to SNAT IP in Non-NAPT switch.
- matches = new ArrayList<>();
- actionsInfo = new ArrayList<>();
- matches.add(new MatchEthernetType(0x0800L));
- if (addOrRemove == NwConstants.ADD_FLOW) {
- if (extSubnetId == NatConstants.INVALID_ID) {
- LOG.error("installSnatMissEntry : external subnet id is invalid.");
- return;
- }
- actionsInfo.add(new ActionSetFieldTunnelId(BigInteger.valueOf(extSubnetId)));
- matches.add(new MatchMetadata(MetaDataUtil.getVpnIdMetadata(extSubnetId),
- MetaDataUtil.METADATA_MASK_VRFID));
- }
- matches.add(new MatchIpv4Destination(externalIp, "32"));
- LOG.debug("installSnatMissEntry : Setting the tunnel to the list of action infos {}", actionsInfo);
- actionsInfo.add(new ActionGroup(groupId));
- instructions = new ArrayList<>();
- instructions.add(new InstructionApplyActions(actionsInfo));
- flowRef = getFlowRef(dpnId, NwConstants.L3_FIB_TABLE, routerId);
- flowRef = flowRef + "inboundmiss" + externalIp;
- syncFlow(dpnId, NwConstants.L3_FIB_TABLE, flowRef, NatConstants.SNAT_FIB_FLOW_PRIORITY, flowRef,
- NwConstants.COOKIE_SNAT_TABLE, matches, instructions, addOrRemove);
}
protected void installInboundTerminatingServiceTblEntry(BigInteger dpnId, Long routerId,
static int mostSignificantBit(int value) {
return 31 - Integer.numberOfLeadingZeros(value);
}
-}
+}
\ No newline at end of file
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.infrautils.inject.AbstractLifecycle;
import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
private final IElanService elanManager;
private final IInterfaceManager interfaceManager;
private final IVpnFootprintService vpnFootprintService;
+ protected final IFibManager fibManager;
@Inject
public SnatServiceImplFactory(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
final ExternalRoutersListener externalRouterListener,
final IElanService elanManager,
final IInterfaceManager interfaceManager,
- final IVpnFootprintService vpnFootprintService) {
+ final IVpnFootprintService vpnFootprintService,
+ final IFibManager fibManager) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.itmManager = itmManager;
this.elanManager = elanManager;
this.interfaceManager = interfaceManager;
this.vpnFootprintService = vpnFootprintService;
+ this.fibManager = fibManager;
}
@Override
if (natMode == NatMode.Conntrack) {
return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
- idManager, naptSwitchSelector, interfaceManager, vpnFootprintService);
+ idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager);
}
return null;
}
NatConstants.ODL_VNI_POOL_NAME);
return new VxlanGreConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager,
- vpnFootprintService);
+ vpnFootprintService, fibManager);
}
return null;
}