Define new type of group CLONE
Used to distinguish between multicast groups and clone sessions in
P4Runtime.
Change-Id: I21a2411c759a1d9524b4a69354c8b343100f8f05
diff --git a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
index 6986103..4b3d64f 100644
--- a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
+++ b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
@@ -153,6 +153,20 @@
null);
}
+ /**
+ * Creates clone group bucket.
+ *
+ * @param treatment traffic treatment associated with group bucket
+ * @return clone group bucket object
+ */
+ public static GroupBucket createCloneGroupBucket(TrafficTreatment treatment) {
+ return new DefaultGroupBucket(GroupDescription.Type.CLONE,
+ treatment,
+ (short) -1,
+ null,
+ null);
+ }
+
@Override
public GroupDescription.Type type() {
return this.type;
diff --git a/core/api/src/main/java/org/onosproject/net/group/GroupDescription.java b/core/api/src/main/java/org/onosproject/net/group/GroupDescription.java
index 3ae93d5..69ebe8d 100644
--- a/core/api/src/main/java/org/onosproject/net/group/GroupDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/group/GroupDescription.java
@@ -41,6 +41,12 @@
*/
ALL,
/**
+ * Similar to {@link Type#ALL} but used for cloning of packets
+ * independently of the egress decision (singleton treatment or other
+ * group).
+ */
+ CLONE,
+ /**
* Uses the first live bucket in a group.
*/
FAILOVER
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/GroupCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/GroupCodec.java
index 36df2f6..37c0319 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/GroupCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/GroupCodec.java
@@ -146,6 +146,9 @@
case "ALL":
groupType = Group.Type.ALL;
break;
+ case "CLONE":
+ groupType = Group.Type.CLONE;
+ break;
case "FAILOVER":
groupType = Group.Type.FAILOVER;
break;
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
index 433cfb6..9661d03 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
@@ -200,6 +200,21 @@
log.error("SW {} is not found", dpid);
return;
}
+
+ switch (groupOperation.groupType()) {
+ case SELECT:
+ case INDIRECT:
+ case ALL:
+ case FAILOVER:
+ break;
+ case CLONE:
+ default:
+ log.warn("Group type {} not supported, ignoring operation [{}]",
+ groupOperation.groupType(), groupOperation);
+ // Next groupOperation.
+ continue;
+ }
+
final Long groupModXid = XID_COUNTER.getAndIncrement();
GroupModBuilder builder = null;
if (driverService == null) {