import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
+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.idmanager.rev160406.AllocateIdInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
routerId);
return;
}
+ //The logic now handle only one external IP per router, others if present will be ignored.
String externalIp = externalIps.get(0).getIpAddress();
- installInboundFibEntry(dpnId, externalIp, routerName, routerId, addOrRemove);
- installInboundTerminatingServiceTblEntry(dpnId, routerId, externalIp, addOrRemove);
+ Uuid externalSubnetId = externalIps.get(0).getSubnetId();
+ long extSubnetId = NatConstants.INVALID_ID;
+ if (addOrRemove == NwConstants.ADD_FLOW) {
+ extSubnetId = NatUtil.getExternalSubnetVpnId(dataBroker,externalSubnetId);
+ }
+ installInboundFibEntry(dpnId, externalIp, routerName, routerId, extSubnetId, addOrRemove);
+ installInboundTerminatingServiceTblEntry(dpnId, routerId, routerName, externalIp, extSubnetId, addOrRemove);
}
protected void installSnatCommonEntriesForNonNaptSwitch(Routers routers, BigInteger primarySwitchId,
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, addOrRemove);
+ installSnatMissEntry(dpnId, routerId, routerName, primarySwitchId, externalIp, extSubnetId, addOrRemove);
}
protected abstract void installSnatSpecificEntriesForNaptSwitch(Routers routers, BigInteger dpnId,
int addOrRemove);
protected void installInboundFibEntry(BigInteger dpnId, String externalIp, String routerName, Long routerId,
- int addOrRemove) {
+ long extSubnetId, int addOrRemove) {
List<MatchInfo> matches = new ArrayList<>();
matches.add(MatchEthernetType.IPV4);
if (addOrRemove == NwConstants.ADD_FLOW) {
- Long extSubnetId = NatUtil.getVpnIdFromExternalSubnet(dataBroker, routerName, externalIp);
if (extSubnetId == NatConstants.INVALID_ID) {
LOG.error("ConntrackBasedSnatService : installInboundFibEntry : external subnet id is invalid.");
return;
}
protected void installSnatMissEntry(BigInteger dpnId, Long routerId, String routerName, BigInteger primarySwitchId,
- String externalIp, int addOrRemove) {
+ String externalIp, long extSubnetId, int addOrRemove) {
LOG.debug("installSnatMissEntry : Installing SNAT miss entry in switch {}", dpnId);
List<ActionInfo> listActionInfoPrimary = new ArrayList<>();
String ifNamePrimary = getTunnelInterfaceName(dpnId, primarySwitchId);
actionsInfo = new ArrayList<>();
matches.add(new MatchEthernetType(0x0800L));
if (addOrRemove == NwConstants.ADD_FLOW) {
- Long extSubnetId = NatUtil.getVpnIdFromExternalSubnet(dataBroker, routerName, externalIp);
if (extSubnetId == NatConstants.INVALID_ID) {
LOG.error("installSnatMissEntry : external subnet id is invalid.");
return;
NwConstants.COOKIE_SNAT_TABLE, matches, instructions, addOrRemove);
}
- protected void installInboundTerminatingServiceTblEntry(BigInteger dpnId, Long routerId, String externalIp,
- int addOrRemove) {
+ protected void installInboundTerminatingServiceTblEntry(BigInteger dpnId, Long routerId, String routerName,
+ String externalIp, long extSubnetId, int addOrRemove) {
//Install the tunnel table entry in NAPT switch for inbound traffic to SNAP IP from a non a NAPT switch.
LOG.info("installInboundTerminatingServiceTblEntry : creating entry for Terminating Service Table "
+ "for switch {}, routerId {}", dpnId, routerId);
matches.add(MatchEthernetType.IPV4);
List<ActionInfo> actionsInfos = new ArrayList<>();
if (addOrRemove == NwConstants.ADD_FLOW) {
- String routerName = NatUtil.getRouterName(dataBroker, routerId);
- long extSubnetId = NatUtil.getVpnIdFromExternalSubnet(dataBroker, routerName, externalIp);
if (extSubnetId == NatConstants.INVALID_ID) {
LOG.error("installInboundTerminatingServiceTblEntry : external subnet id is invalid.");
return;
import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+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.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
installSnatMissEntryForPrimrySwch(dpnId, routerId, elanId, addOrRemove);
installTerminatingServiceTblEntry(dpnId, routerId, elanId, addOrRemove);
- List<ExternalIps> externalIps = routers.getExternalIps();
+
String extGwMacAddress = NatUtil.getExtGwMacAddFromRouterName(getDataBroker(), routerName);
createOutboundTblTrackEntry(dpnId, routerId, extGwMacAddress, addOrRemove);
- createOutboundTblEntry(dpnId, routerId, externalIps, elanId, extGwMacAddress, addOrRemove);
- installNaptPfibFlow(routers, dpnId, routerId, externalIps, routerName, addOrRemove);
+ List<ExternalIps> externalIps = routers.getExternalIps();
+ if (externalIps.isEmpty()) {
+ LOG.error("AbstractSnatService: installSnatCommonEntriesForNaptSwitch no externalIP present"
+ + " for routerId {}",
+ routerId);
+ return;
+ }
+ //The logic now handle only one external IP per router, others if present will be ignored.
+ 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(getDataBroker(),externalSubnetId);
+ }
+ createOutboundTblEntry(dpnId, routerId, externalIp, elanId, extGwMacAddress, addOrRemove);
+ installNaptPfibFlow(routers, dpnId, routerId, routerName, extSubnetId, addOrRemove);
//Install Inbound NAT entries
Long extNetId = NatUtil.getVpnId(getDataBroker(), routers.getNetworkId().getValue());
- installInboundEntry(dpnId, routerId, extNetId, externalIps, elanId, addOrRemove);
+ installInboundEntry(dpnId, routerId, routerName, extNetId, externalIp, elanId, extSubnetId, addOrRemove);
installNaptPfibEntry(dpnId, routerId, addOrRemove);
}
}
- protected void createOutboundTblEntry(BigInteger dpnId, long routerId, List<ExternalIps> externalIps,
+ protected void createOutboundTblEntry(BigInteger dpnId, long routerId, String externalIp,
int elanId, String extGwMacAddress, int addOrRemove) {
LOG.info("createOutboundTblEntry : dpId {} and routerId {}", dpnId, routerId);
List<MatchInfoBase> matches = new ArrayList<>();
matches.add(MatchEthernetType.IPV4);
matches.add(new NxMatchCtState(TRACKED_NEW_CT_STATE, TRACKED_NEW_CT_MASK));
matches.add(new MatchMetadata(MetaDataUtil.getVpnIdMetadata(routerId), MetaDataUtil.METADATA_MASK_VRFID));
- if (externalIps.isEmpty()) {
- LOG.error("createOutboundTblEntry : no externalIP present for routerId {}", routerId);
- return;
- }
- //The logic now handle only one external IP per router, others if present will be ignored.
- String externalIp = externalIps.get(0).getIpAddress();
List<ActionInfo> actionsInfos = new ArrayList<>();
if (addOrRemove == NwConstants.ADD_FLOW) {
actionsInfos.add(new ActionSetFieldEthernetSource(new MacAddress(extGwMacAddress)));
flowRef, NwConstants.COOKIE_SNAT_TABLE, matches, instructions, addOrRemove);
}
- protected void installNaptPfibFlow(Routers routers, BigInteger dpnId, long routerId, List<ExternalIps> externalIps,
- String routerName, int addOrRemove) {
+ protected void installNaptPfibFlow(Routers routers, BigInteger dpnId, long routerId,
+ String routerName, long extSubnetId, int addOrRemove) {
Long extNetId = NatUtil.getVpnId(getDataBroker(), routers.getNetworkId().getValue());
- LOG.info("installNaptPfibFlow : dpId {}, extNetId {}, srcIp {}", dpnId, extNetId, externalIps);
+ LOG.info("installNaptPfibFlow : dpId {}, extNetId {}", dpnId, extNetId);
List<MatchInfoBase> matches = new ArrayList<>();
matches.add(MatchEthernetType.IPV4);
matches.add(new NxMatchCtState(SNAT_CT_STATE, SNAT_CT_STATE_MASK));
matches.add(new MatchMetadata(MetaDataUtil.getVpnIdMetadata(routerId), MetaDataUtil.METADATA_MASK_VRFID));
List<ActionInfo> listActionInfo = new ArrayList<>();
if (addOrRemove == NwConstants.ADD_FLOW) {
- //The logic now handle only one external IP per router, others if present will be ignored.
- String externalIp = externalIps.get(0).getIpAddress();
- long extSubnetId = NatUtil.getVpnIdFromExternalSubnet(getDataBroker(), routerName, externalIp);
if (extSubnetId == NatConstants.INVALID_ID) {
LOG.error("installNaptPfibFlow : external subnet id is invalid.");
return;
flowRef, NwConstants.COOKIE_SNAT_TABLE, matches, instructions, addOrRemove);
}
- protected void installInboundEntry(BigInteger dpnId, long routerId, Long extNetId, List<ExternalIps> externalIps,
- int elanId, int addOrRemove) {
+ protected void installInboundEntry(BigInteger dpnId, long routerId, String routerName, Long extNetId,
+ String externalIp, int elanId, long extSubnetId, int addOrRemove) {
LOG.info("installInboundEntry : dpId {} and routerId {}", dpnId, routerId);
List<MatchInfoBase> matches = new ArrayList<>();
matches.add(MatchEthernetType.IPV4);
- if (externalIps.isEmpty()) {
- LOG.error("installInboundEntry : no externalIP present for routerId {}", routerId);
- return;
- }
- String externalIp = externalIps.get(0).getIpAddress();
matches.add(new MatchIpv4Destination(externalIp,"32"));
- String routerName = NatUtil.getRouterName(getDataBroker(), routerId);
if (addOrRemove == NwConstants.ADD_FLOW) {
- long extSubnetId = NatUtil.getVpnIdFromExternalSubnet(getDataBroker(), routerName, externalIp);
if (extSubnetId == NatConstants.INVALID_ID) {
LOG.error("installInboundEntry : external subnet id is invalid.");
return;