Adding support for writing metadata instruction.
Needed by Centec driver.
Change-Id: I705015c4d7ac881c273a01b36b05d39d9cd9ba87
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index 049f49a..31148ab 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -43,6 +43,7 @@
private final List<Instruction> deferred;
private final List<Instruction> all;
private final Instructions.TableTypeTransition table;
+ private final Instructions.MetadataInstruction meta;
private final boolean hasClear;
@@ -60,6 +61,7 @@
this.all = this.immediate;
this.hasClear = false;
this.table = null;
+ this.meta = null;
}
/**
@@ -73,13 +75,14 @@
private DefaultTrafficTreatment(List<Instruction> deferred,
List<Instruction> immediate,
Instructions.TableTypeTransition table,
- boolean clear) {
+ boolean clear,
+ Instructions.MetadataInstruction meta) {
this.immediate = ImmutableList.copyOf(checkNotNull(immediate));
this.deferred = ImmutableList.copyOf(checkNotNull(deferred));
this.all = ListUtils.union(this.immediate, this.deferred);
this.table = table;
+ this.meta = meta;
this.hasClear = clear;
-
}
@Override
@@ -107,6 +110,11 @@
return hasClear;
}
+ @Override
+ public Instructions.MetadataInstruction writeMetadata() {
+ return meta;
+ }
+
/**
* Returns a new traffic treatment builder.
*
@@ -139,7 +147,7 @@
//FIXME: Order of instructions may affect hashcode
@Override
public int hashCode() {
- return Objects.hash(immediate, deferred, table);
+ return Objects.hash(immediate, deferred, table, meta);
}
@Override
@@ -151,7 +159,8 @@
DefaultTrafficTreatment that = (DefaultTrafficTreatment) obj;
return Objects.equals(immediate, that.immediate) &&
Objects.equals(deferred, that.deferred) &&
- Objects.equals(table, that.table);
+ Objects.equals(table, that.table) &&
+ Objects.equals(meta, that.meta);
}
return false;
@@ -164,6 +173,7 @@
.add("deferred", deferred)
.add("transition", table == null ? "None" : table.toString())
.add("cleared", hasClear)
+ .add("metadata", meta)
.toString();
}
@@ -177,6 +187,8 @@
Instructions.TableTypeTransition table;
+ Instructions.MetadataInstruction meta;
+
List<Instruction> deferred = Lists.newLinkedList();
List<Instruction> immediate = Lists.newLinkedList();
@@ -213,6 +225,9 @@
case TABLE:
table = (Instructions.TableTypeTransition) instruction;
break;
+ case METADATA:
+ meta = (Instructions.MetadataInstruction) instruction;
+ break;
default:
throw new IllegalArgumentException("Unknown instruction type: " +
instruction.type());
@@ -355,6 +370,11 @@
}
@Override
+ public Builder writeMetadata(long metadata, long metadataMask) {
+ return add(Instructions.writeMetadata(metadata, metadataMask));
+ }
+
+ @Override
public TrafficTreatment build() {
//Don't add DROP instruction by default when instruction
//set is empty. This will be handled in DefaultSingleTablePipeline
@@ -364,7 +384,7 @@
// && table == null && !clear) {
// drop();
//}
- return new DefaultTrafficTreatment(deferred, immediate, table, clear);
+ return new DefaultTrafficTreatment(deferred, immediate, table, clear, meta);
}
}
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index 281e395..a82919f 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -67,6 +67,13 @@
boolean clearedDeferred();
/**
+ * Returns the metadata instruction if there is one.
+ *
+ * @return a metadata instruction that may be null
+ */
+ Instructions.MetadataInstruction writeMetadata();
+
+ /**
* Builder of traffic treatment entities.
*/
interface Builder {
@@ -276,6 +283,20 @@
Builder wipeDeferred();
/**
+ * Writes metadata to associate with a packet.
+ * <pre>
+ * {@code
+ * new_metadata = (old_metadata & ̃mask) | (value & mask)
+ * }
+ * </pre>
+ *
+ * @param value the metadata to write
+ * @param mask the masked bits for the value
+ * @return a treatment builder
+ */
+ Builder writeMetadata(long value, long mask);
+
+ /**
* Builds an immutable traffic treatment descriptor.
* <p>
* If the treatment is empty when build() is called, it will add a default
@@ -286,5 +307,7 @@
* @return traffic treatment
*/
TrafficTreatment build();
+
}
+
}
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
index e3fe3f3..16a9464 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instruction.java
@@ -35,7 +35,7 @@
OUTPUT,
/**
- * Signifies that.... (do we need this?)
+ * Signifies that traffic should be sent out of a group.
*/
GROUP,
@@ -57,7 +57,12 @@
/**
* Signifies that the traffic should be modified in L3 way.
*/
- L3MODIFICATION
+ L3MODIFICATION,
+
+ /**
+ * Signifies that metadata be attached to traffic.
+ */
+ METADATA
}
/**
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index c673ae0..53d0528 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -323,6 +323,17 @@
}
/**
+ * Writes metadata to associate with a packet.
+ *
+ * @param metadata the metadata value to write
+ * @param metadataMask the bits to mask for the metadata value
+ * @return metadata instruction
+ */
+ public static Instruction writeMetadata(long metadata, long metadataMask) {
+ return new MetadataInstruction(metadata, metadataMask);
+ }
+
+ /**
* Drop instruction.
*/
public static final class DropInstruction implements Instruction {
@@ -443,7 +454,9 @@
}
}
-
+ /**
+ * Transition instruction.
+ */
public static class TableTypeTransition implements Instruction {
private final Integer tableId;
@@ -483,7 +496,59 @@
}
return false;
}
+ }
+ /**
+ * Metadata instruction.
+ */
+ public static class MetadataInstruction implements Instruction {
+ private final long metadata;
+ private final long metadataMask;
+
+ MetadataInstruction(long metadata, long metadataMask) {
+ this.metadata = metadata;
+ this.metadataMask = metadataMask;
+ }
+
+ @Override
+ public Type type() {
+ return Type.METADATA;
+ }
+
+ public long metadata() {
+ return this.metadata;
+ }
+
+ public long metadataMask() {
+ return this.metadataMask;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(type().toString())
+ .add("metadata", Long.toHexString(this.metadata))
+ .add("metadata mask", Long.toHexString(this.metadataMask))
+ .toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type(), metadata, metadataMask);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof MetadataInstruction) {
+ MetadataInstruction that = (MetadataInstruction) obj;
+ return Objects.equals(metadata, that.metadata) &&
+ Objects.equals(metadataMask, that.metadataMask);
+
+ }
+ return false;
+ }
}
}