From d470e49c21c31cede22c6c13fc0f331d01240290 Mon Sep 17 00:00:00 2001 From: Alon Kochba Date: Thu, 6 Apr 2017 16:57:39 +0300 Subject: [PATCH] Bug 8025: Correct non-NAPT to NAPT tunnel ID As part of the vni-based-l2-l3-nat changes, the tunnel used was changed but the packet out sent should use the same tunnel ID for NAPT to work from a VM on a non-NAPT switch. Change-Id: I7ee2b526531beb84ececd78acf79a42d6177f7ab Signed-off-by: Alon Kochba --- .../natservice/internal/NaptEventHandler.java | 19 +++++++++++++++---- .../org/opendaylight/blueprint/natservice.xml | 2 ++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java index 29b95e34e6..718bb967ae 100644 --- a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java +++ b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java @@ -55,9 +55,11 @@ import org.opendaylight.genius.mdsalutil.packet.Ethernet; import org.opendaylight.genius.mdsalutil.packet.IPv4; import org.opendaylight.genius.mdsalutil.packet.TCP; import org.opendaylight.genius.mdsalutil.packet.UDP; +import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; 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.rev160406.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetInterfaceFromIfIndexInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetInterfaceFromIfIndexInputBuilder; @@ -78,19 +80,25 @@ public class NaptEventHandler { private final PacketProcessingService pktService; private final OdlInterfaceRpcService interfaceManagerRpc; private final NaptManager naptManager; + private final INeutronVpnManager nvpnManager; + private final IdManagerService idManager; private IInterfaceManager interfaceManager; public NaptEventHandler(final DataBroker dataBroker, final IMdsalApiManager mdsalManager, final NaptManager naptManager, final PacketProcessingService pktService, final OdlInterfaceRpcService interfaceManagerRpc, - final IInterfaceManager interfaceManager) { + final IInterfaceManager interfaceManager, + final INeutronVpnManager nvpnManager, + final IdManagerService idManager) { this.dataBroker = dataBroker; NaptEventHandler.mdsalManager = mdsalManager; this.naptManager = naptManager; this.pktService = pktService; this.interfaceManagerRpc = interfaceManagerRpc; this.interfaceManager = interfaceManager; + this.nvpnManager = nvpnManager; + this.idManager = idManager; } // TODO Clean up the exception handling @@ -259,7 +267,10 @@ public class NaptEventHandler { } } if (pktOut != null) { - sendNaptPacketOut(pktOut, infInfo, actionInfos, routerId); + String routerName = NatUtil.getRouterName(dataBroker, routerId); + long tunId = NatUtil.getTunnelIdForNonNaptToNaptFlow(dataBroker, + nvpnManager, idManager, routerId, routerName); + sendNaptPacketOut(pktOut, infInfo, actionInfos, tunId); } else { LOG.warn("NAT Service : Unable to send Packet Out"); } @@ -459,10 +470,10 @@ public class NaptEventHandler { return null; } - private void sendNaptPacketOut(byte[] pktOut, InterfaceInfo infInfo, List actionInfos, Long routerId) { + private void sendNaptPacketOut(byte[] pktOut, InterfaceInfo infInfo, List actionInfos, Long tunId) { LOG.trace("NAT Service: Sending packet out DpId {}, interfaceInfo {}", infInfo.getDpId(), infInfo); // set inPort, and action as OFPP_TABLE so that it starts from table 0 (lowest table as per spec) - actionInfos.add(new ActionSetFieldTunnelId(2, BigInteger.valueOf(routerId))); + actionInfos.add(new ActionSetFieldTunnelId(2, BigInteger.valueOf(tunId))); actionInfos.add(new ActionOutput(3, new Uri("0xfffffff9"))); NodeConnectorRef inPort = MDSALUtil.getNodeConnRef(infInfo.getDpId(), String.valueOf(infInfo.getPortNo())); LOG.debug("NAT Service : inPort for packetout is being set to {}", String.valueOf(infInfo.getPortNo())); diff --git a/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml b/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml index b90d6f6eba..f9ad267711 100644 --- a/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml +++ b/vpnservice/natservice/natservice-impl/src/main/resources/org/opendaylight/blueprint/natservice.xml @@ -86,6 +86,8 @@ + +