Bug 7168 - MAC Learning from ARP to be allowed on Ext-Interfaces 77/48377/1
authorVivekanandan Narasimhan <n.vivekanandan@ericsson.com>
Tue, 15 Nov 2016 03:56:16 +0000 (09:26 +0530)
committerSam Hague <shague@redhat.com>
Tue, 15 Nov 2016 20:36:53 +0000 (20:36 +0000)
An earlier fix to make sure that Neutron configured IPs are not
learned here https://git.opendaylight.org/gerrit/#/c/48054/, has
broken the ability to learn MAC Addresses on external network
via external interfaces.

With this fix, we open the gate to allow MAC learning on all
packets coming from external interface.  This is not the best
possible fix for the problem, but this tentatively allows
the openstack use-case of external network access to continue to
be functional.

Closes-Bug: 7168
Change-Id: Ief6f8bfe26111e07e280a9245a44032a8f32f09d
Signed-off-by: Vivekanandan Narasimhan <n.vivekanandan@ericsson.com>
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ArpNotificationHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml

index 97ef58cfb942aa80921db81b58aaa50a4406a57b..290f4298c8aea2d7190969732984b75928eeff45 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetKey;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.SendArpResponseInput;
@@ -68,10 +69,12 @@ public class ArpNotificationHandler implements OdlArputilListener {
     final IElanService elanService;
     ArpMonitoringHandler arpScheduler;
     OdlInterfaceRpcService ifaceMgrRpcService;
+    IInterfaceManager interfaceManager;
 
     public ArpNotificationHandler(DataBroker dataBroker, VpnInterfaceManager vpnIfMgr,
             final IElanService elanService, IdManagerService idManager, OdlArputilService arpManager,
-            ArpMonitoringHandler arpScheduler, OdlInterfaceRpcService ifaceMgrRpcService) {
+            ArpMonitoringHandler arpScheduler, OdlInterfaceRpcService ifaceMgrRpcService,
+                                  IInterfaceManager interfaceManager) {
         this.dataBroker = dataBroker;
         vpnIfManager = vpnIfMgr;
         this.elanService = elanService;
@@ -79,6 +82,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
         this.arpManager = arpManager;
         this.arpScheduler = arpScheduler;
         this.ifaceMgrRpcService = ifaceMgrRpcService;
+        this.interfaceManager = interfaceManager;
     }
 
     @Override
@@ -139,16 +143,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         }
                     }
                 } else {
-                    /* Is this srcInterface a neutron port with the matching fixed-ip */
-                    if (!VpnUtil.isNeutronPortConfigured(dataBroker, srcInterface, srcIP)) {
-                        /* Neutron Port with matching fixed-ip does not exist, so this is a learned IP */
-                        synchronized ((vpnName + ipToQuery).intern()) {
-                            VpnUtil.createVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery, srcInterface,
-                                    srcMac.getValue(), false, false, true);
-                            addMipAdjacency(vpnName, srcInterface, srcIP, srcMac.getValue());
-
-                        }
-                    }
+                    learnMacFromArpPackets(vpnName, srcInterface, srcIP, srcMac);
                 }
                 String targetIpToQuery = notification.getDstIpaddress().getIpv4Address().getValue();
                 VpnPortipToPort vpnTargetIpToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker,
@@ -260,20 +255,26 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         }
                     }
                 } else {
-                    /* Is this srcInterface a neutron port with the matching fixed-ip */
-                    if (!VpnUtil.isNeutronPortConfigured(dataBroker, srcInterface, srcIP)) {
-                        /* Neutron Port with matching fixed-ip does not exist, so this is a learned IP */
-                        synchronized ((vpnName + ipToQuery).intern()) {
-                            VpnUtil.createVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery, srcInterface,
-                                    srcMac.getValue(), false, false, true);
-                            addMipAdjacency(vpnName, srcInterface, srcIP, srcMac.getValue());
-                        }
-                    }
+                    learnMacFromArpPackets(vpnName, srcInterface, srcIP, srcMac);
                 }
             }
         }
     }
 
+    private void learnMacFromArpPackets(String vpnName, String srcInterface,
+                                        IpAddress srcIP, PhysAddress srcMac) {
+        String ipToQuery = srcIP.getIpv4Address().getValue();
+        /* Traffic coming from external interfaces should always be learnt */
+        if (interfaceManager.isExternalInterface(srcInterface) ||
+                !VpnUtil.isNeutronPortConfigured(dataBroker, srcInterface, srcIP)) {
+            synchronized ((vpnName + ipToQuery).intern()) {
+                VpnUtil.createVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery, srcInterface,
+                        srcMac.getValue(), false, false, true);
+                addMipAdjacency(vpnName, srcInterface, srcIP, srcMac.getValue());
+            }
+        }
+    }
+
     private void handleArpRequestFromExternalInterface(String srcInterface, IpAddress srcIP, PhysAddress srcMac,
             IpAddress targetIP) {
         Port port = VpnUtil.getNeutronPortForFloatingIp(dataBroker, targetIP);
index f76b87b479c9a103c83d6e10ccbbb5cd6eed9982..166c6cc153c76624915215402d6d21b6fa950091 100644 (file)
     <argument ref="odlArputilService" />
     <argument ref="arpMonitoringHandler" />
     <argument ref="odlInterfaceRpcService" />
+    <argument ref="interfaceManager"/>
   </bean>
   <service ref="arpNotificationHandler" odl:type="default"
            interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilListener" />