Bug 4927 - Rules added by MacResolverServices in br-ex are not removed
authorFlavio Fernandes <ffernand@redhat.com>
Tue, 12 Jan 2016 01:58:58 +0000 (20:58 -0500)
committerFlavio Fernandes <ffernand@redhat.com>
Tue, 12 Jan 2016 02:21:51 +0000 (21:21 -0500)
This bug can be reproduced by using an external router address
that is not owned by any system in the external neutron subnet.

Made the flow remove call idem-potent and in a common function.

Added missing flow remove calls in the following 2 missing places:
  * Entry removal (non periodic and periodic)
  * Time period restart

Change-Id: Idf481d3a13c1728bf400f185de296cbada7d920b
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
(cherry picked from commit b1cf5de78228b23a4c6aae1613df925acfa798c9)

openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/services/arp/GatewayMacResolverService.java

index be01ac5a0cb6668a369d0890575fac2e958ef27a..78b64699d8370d3f17d1e06c731793008eef41cc 100644 (file)
@@ -151,7 +151,8 @@ public class GatewayMacResolverService extends AbstractServiceInstance
                         for(final Entry<Ipv4Address, ArpResolverMetadata> gatewayToArpMetadataEntry : gatewayToArpMetadataMap.entrySet()){
                             final Ipv4Address gatewayIp = gatewayToArpMetadataEntry.getKey();
                             final ArpResolverMetadata gatewayMetaData =
-                                    checkAndGetExternalBridgeDpid(gatewayToArpMetadataEntry.getValue());
+                                    checkAndGetExternalBridgeDpid(
+                                            resetFlowToRemove(gatewayIp, gatewayToArpMetadataEntry.getValue()));
                             gatewayMacRefresherPool.schedule(new Runnable(){
 
                                 @Override
@@ -370,6 +371,7 @@ public class GatewayMacResolverService extends AbstractServiceInstance
                     ArpResolverMetadata arpResolverMetadata = gatewayToArpMetadataMap.get(gatewayIp);
                     if(arpResolverMetadata != null && arpResolverMetadata.getGatewayMacAddress() != null){
                         if(!arpResolverMetadata.isPeriodicRefresh()){
+                            resetFlowToRemove(gatewayIp, arpResolverMetadata);
                             return gatewayToArpMetadataMap.remove(gatewayIp).getGatewayMacAddress();
                         }
                         return arpResolverMetadata.getGatewayMacAddress();
@@ -453,7 +455,7 @@ public class GatewayMacResolverService extends AbstractServiceInstance
             if(candidateGatewayIp != null){
                 LOG.debug("Resolved MAC for Gateway Ip {} is {}",gatewayIpAddress.getValue(),gatewayMacAddress.getValue());
                 candidateGatewayIp.setGatewayMacAddress(gatewayMacAddress);
-                flowService.removeFlow(candidateGatewayIp.getFlowToRemove());
+                resetFlowToRemove(gatewayIpAddress, candidateGatewayIp);
             }
         }
     }
@@ -477,7 +479,25 @@ public class GatewayMacResolverService extends AbstractServiceInstance
     @Override
     public void stopPeriodicRefresh(Ipv4Address gatewayIp) {
         init();
+        resetFlowToRemove(gatewayIp, null);
         gatewayToArpMetadataMap.remove(gatewayIp);
     }
 
+    private ArpResolverMetadata resetFlowToRemove(
+            final Ipv4Address gatewayIp, ArpResolverMetadata gatewayArpMetadata) {
+        checkNotNull(gatewayIp);
+
+        // If gatewayArpMetadata was not provided, look it up
+        if (gatewayArpMetadata == null) {
+            gatewayArpMetadata = gatewayToArpMetadataMap.get(gatewayIp);
+        }
+        if (gatewayArpMetadata != null && gatewayArpMetadata.getFlowToRemove() != null) {
+            LOG.debug("Flow to route ARP Reply to Controller from {} being removed from node {}",
+                    gatewayIp, gatewayArpMetadata.getFlowToRemove().getNode());
+            flowService.removeFlow(gatewayArpMetadata.getFlowToRemove());
+            gatewayArpMetadata.setFlowToRemove(null);
+        }
+        return gatewayArpMetadata;
+    }
+
 }