From: Karthikeyan Krishnan Date: Mon, 31 Dec 2018 08:19:34 +0000 (+0530) Subject: Dual Stack feature support for router interface X-Git-Tag: release/neon~26 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=996361f90e881a2f5163d34857ac5e5206cf05a7;p=netvirt.git Dual Stack feature support for router interface We create a dual-stack neutron port and attach this port to the router. This single neutron port is then responsible for handling both IPv4 and IPv6 subnets in that network. The advantage of this approach is that it reduces the number of Neutron router ports. Issue: NETVIRT-1543 Change-Id: I043cd7683a8dc434f5d61886101915dfc01727c7 Signed-off-by: Karthikeyan Krishnan --- diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java index 4822b94845..e8584cd78e 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/IfMgr.java @@ -8,6 +8,7 @@ package org.opendaylight.netvirt.ipv6service; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.net.InetAddresses; @@ -236,6 +237,17 @@ public class IfMgr implements ElementCache, AutoCloseable { String deviceOwner) { LOG.debug("addRouterIntf portId {}, rtrId {}, snetId {}, networkId {}, ip {}, mac {}", portId, rtrId, snetId, networkId, fixedIp, macAddress); + /* Added the below logic for supporting neutron router interface creation. + * Since when neutron port is created with fixed Ipv6 address, that time it will be + * treated as a host port and it will be added into the vintfs map through + * NeutronPortChangeListener ADD() event. + * Later the same neutron port is added to router this time it will be treated as + * a router_interface through NeutronPortChangeListener UPDATE() event. + */ + VirtualPort virInterface = vintfs.get(portId); + if (virInterface != null && Strings.isNullOrEmpty(virInterface.getDeviceOwner())) { + vintfs.remove(portId); + } //Save the interface ipv6 address in its fully expanded format Ipv6Address addr = new Ipv6Address(InetAddresses .forString(fixedIp.getIpv6Address().getValue()).getHostAddress()); diff --git a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java index 5ba8456c38..33d2a20656 100644 --- a/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java +++ b/ipv6service/impl/src/main/java/org/opendaylight/netvirt/ipv6service/NeutronPortChangeListener.java @@ -9,6 +9,8 @@ package org.opendaylight.netvirt.ipv6service; import static org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceUtils.nullToEmpty; +import com.google.common.base.Strings; + import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -132,6 +134,16 @@ public class NeutronPortChangeListener extends AsyncClusteredDataTreeChangeListe ifMgr.updateHostIntf(update.getUuid(), portIncludesV6Address); } } + //Neutron Port update with proper device owner information + if ((Strings.isNullOrEmpty(original.getDeviceOwner()) || Strings.isNullOrEmpty(original.getDeviceId())) + && !Strings.isNullOrEmpty(update.getDeviceOwner()) && !Strings.isNullOrEmpty(update.getDeviceId())) { + for (FixedIps fixedip : nullToEmpty(update.getFixedIps())) { + if (fixedip.getIpAddress().getIpv4Address() != null) { + continue; + } + addInterfaceInfo(update, fixedip); + } + } } protected void addInterfaceInfo(Port port, FixedIps fixedip) { diff --git a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java index cb943282bd..65713f693d 100644 --- a/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java +++ b/neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java @@ -827,10 +827,11 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even for (FixedIps ip : requireNonNullElse(port.getFixedIps(), Collections.emptyList())) { String ipValue = ip.getIpAddress().stringValue(); String ipPrefix = ip.getIpAddress().getIpv4Address() != null ? ipValue + "/32" : ipValue + "/128"; - if (sn != null && !FibHelper.doesPrefixBelongToSubnet(ipPrefix, sn.getSubnetIp(), false)) { + Subnetmap snTemp = neutronvpnUtils.getSubnetmap(ip.getSubnetId()); + if (snTemp != null && !FibHelper.doesPrefixBelongToSubnet(ipPrefix, + snTemp.getSubnetIp(), false)) { continue; } - Subnetmap snTemp = sn != null ? sn : neutronvpnUtils.getSubnetmap(ip.getSubnetId()); Uuid vpnId = snTemp != null ? snTemp.getVpnId() : null; if (vpnId != null) { neutronvpnUtils.createVpnPortFixedIpToPort(vpnId.getValue(), ipValue, diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java index b332d69632..1070411cb7 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java @@ -2121,12 +2121,12 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase