Fixed a defect where packet requests issued from different instances resulted in 'redundant' packet requests due to different order of criteria serialization.

Change-Id: Ice8a0fea11b993fd4fc50b8093e02203fd76c772
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
index f88c6bc..3ad67b2 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficSelector.java
@@ -29,16 +29,21 @@
 import org.onosproject.net.flow.criteria.Criterion;
 
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Default traffic selector implementation.
  */
 public final class DefaultTrafficSelector implements TrafficSelector {
 
+    private static final Comparator<? super Criterion> TYPE_COMPARATOR =
+            (c1, c2) -> c1.type().compareTo(c2.type());
+
     private final Set<Criterion> criteria;
 
     private static final TrafficSelector EMPTY
@@ -50,7 +55,9 @@
      * @param criteria criteria
      */
     private DefaultTrafficSelector(Set<Criterion> criteria) {
-        this.criteria = ImmutableSet.copyOf(criteria);
+        TreeSet<Criterion> elements = new TreeSet<>(TYPE_COMPARATOR);
+        elements.addAll(criteria);
+        this.criteria = ImmutableSet.copyOf(elements);
     }
 
     @Override