implemented a distributed default flow registration mechanism to avoid duplicate requests from other onos instances

Change-Id: Ib2abb483456538e3e08e9790c4b4b0d50db8b384

implemented a distributed default flow registration mechanism to avoid
duplicate requests from other onos instances

Change-Id: I620cc51ac29cddaffa73cdbb20e9a9acbdd9ea69
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 8908601..9177d3a 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -23,7 +23,6 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.Device;
-import org.onosproject.net.MastershipRole;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -33,6 +32,7 @@
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.packet.DefaultPacketRequest;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketEvent;
@@ -41,6 +41,7 @@
 import org.onosproject.net.packet.PacketProvider;
 import org.onosproject.net.packet.PacketProviderRegistry;
 import org.onosproject.net.packet.PacketProviderService;
+import org.onosproject.net.packet.PacketRequest;
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.net.packet.PacketStore;
 import org.onosproject.net.packet.PacketStoreDelegate;
@@ -48,9 +49,7 @@
 import org.onosproject.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
 
-import java.util.Collections;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -82,68 +81,6 @@
 
     private final Map<Integer, PacketProcessor> processors = new ConcurrentHashMap<>();
 
-    private Set<PacketRequest> packetRequests =
-            Collections.newSetFromMap(new ConcurrentHashMap<>());
-
-    private final class PacketRequest {
-        private final TrafficSelector selector;
-        private final PacketPriority priority;
-        private final ApplicationId appId;
-        private final FlowRule.Type tableType;
-
-        public PacketRequest(TrafficSelector selector, PacketPriority priority,
-                             ApplicationId appId, FlowRule.Type tableType) {
-            this.selector = selector;
-            this.priority = priority;
-            this.appId = appId;
-            this.tableType = tableType;
-        }
-
-        public TrafficSelector selector() {
-            return selector;
-        }
-
-        public PacketPriority priority() {
-            return priority;
-        }
-
-        public ApplicationId appId() {
-            return appId;
-        }
-
-        public FlowRule.Type tableType() {
-            return tableType;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-
-            PacketRequest that = (PacketRequest) o;
-
-            if (priority != that.priority) {
-                return false;
-            }
-            if (!selector.equals(that.selector)) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result = selector.hashCode();
-            result = 31 * result + priority.hashCode();
-            return result;
-        }
-    }
-
     @Activate
     public void activate() {
         store.setDelegate(delegate);
@@ -177,10 +114,11 @@
         checkNotNull(appId, "Application ID cannot be null");
 
         PacketRequest request =
-                new PacketRequest(selector, priority, appId, FlowRule.Type.DEFAULT);
+                new DefaultPacketRequest(selector, priority, appId, FlowRule.Type.DEFAULT);
 
-        packetRequests.add(request);
-        pushToAllDevices(request);
+        if (store.requestPackets(request)) {
+            pushToAllDevices(request);
+        }
     }
 
     @Override
@@ -192,11 +130,12 @@
                 + "without table hints, use other methods in the packetService API");
 
         PacketRequest request =
-                new PacketRequest(selector, priority, appId, tableType);
+                new DefaultPacketRequest(selector, priority, appId, tableType);
 
-        if (packetRequests.add(request)) {
+        if (store.requestPackets(request)) {
             pushToAllDevices(request);
         }
+
     }
 
     /**
@@ -206,9 +145,7 @@
      */
     private void pushToAllDevices(PacketRequest request) {
         for (Device device : deviceService.getDevices()) {
-            if (deviceService.getRole(device.id()) == MastershipRole.MASTER) {
-                pushRule(device, request);
-            }
+            pushRule(device, request);
         }
     }
 
@@ -303,7 +240,7 @@
         public void event(DeviceEvent event) {
             Device device = event.subject();
             if (event.type() == DeviceEvent.Type.DEVICE_ADDED) {
-                for (PacketRequest request : packetRequests) {
+                for (PacketRequest request : store.existingRequests()) {
                     pushRule(device, request);
                 }
             }