Merge remote-tracking branch 'origin/master'
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
index 9678dc1..906e505 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/TrafficSelector.java
@@ -2,6 +2,8 @@
import java.util.List;
+import org.onlab.onos.net.flow.criteria.Criterion;
+
/**
* Abstraction of a slice of network traffic.
*/
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
similarity index 95%
rename from core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
rename to core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index 4717cc4..ff1ac25 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.flow;
+package org.onlab.onos.net.flow.criteria;
/**
* Factory class to create various traffic selection criteria.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
similarity index 98%
rename from core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
rename to core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
index 0b55a42..d105f7c 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Criterion.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criterion.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.flow;
+package org.onlab.onos.net.flow.criteria;
/**
* Representation of a single header field selection.
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
index 5d34fc2..8c41a04 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instruction.java
@@ -5,6 +5,12 @@
*/
public interface Instruction {
+ interface SubType { }
+
+ public enum NoneSubType implements SubType {
+ NONE;
+ }
+
/**
* Represents the type of traffic treatment.
*/
@@ -39,4 +45,10 @@
*/
public Type type();
+ /**
+ * Returns the subtype of the modification instruction.
+ * @return type of instruction
+ */
+ public SubType subtype();
+
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
index 2365bf0..5acac3e 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
@@ -3,8 +3,12 @@
import static com.google.common.base.Preconditions.checkNotNull;
import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.L2SubType;
import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
-import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.SubType;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.L3SubType;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
+import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPProtoInstruction;
+import org.onlab.packet.IPAddress;
import org.onlab.packet.MACAddress;
/**
* Factory class for creating various traffic treatment instructions.
@@ -42,7 +46,7 @@
*/
public static L2ModificationInstruction modL2Src(MACAddress addr) {
checkNotNull(addr, "Src l2 address cannot be null");
- return new ModEtherInstruction(SubType.L2_SRC, addr);
+ return new ModEtherInstruction(L2SubType.L2_SRC, addr);
}
/**
@@ -52,7 +56,7 @@
*/
public static L2ModificationInstruction modL2Dst(MACAddress addr) {
checkNotNull(addr, "Dst l2 address cannot be null");
- return new L2ModificationInstruction.ModEtherInstruction(SubType.L2_DST, addr);
+ return new L2ModificationInstruction.ModEtherInstruction(L2SubType.L2_DST, addr);
}
/**
@@ -65,11 +69,56 @@
return new L2ModificationInstruction.ModEtherTypeInstruction(l2Type);
}
+ /**
+ * Creates a Vlan id modification.
+ * @param vlanId the vlan id to modify to.
+ * @return a L2 modification
+ */
public static L2ModificationInstruction modVlanId(Short vlanId) {
checkNotNull(vlanId, "VLAN id cannot be null");
return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
}
+ /**
+ * Creates a Vlan pcp modification.
+ * @param vlanPcp the pcp to modify to.
+ * @return a L2 modification
+ */
+ public static L2ModificationInstruction modVlanPcp(Byte vlanPcp) {
+ checkNotNull(vlanPcp, "VLAN Pcp cannot be null");
+ return new L2ModificationInstruction.ModVlanPcpInstruction(vlanPcp);
+ }
+
+ /**
+ * Creates a L3 src modification.
+ * @param addr the ip address to modify to.
+ * @return a L3 modification
+ */
+ public static L3ModificationInstruction modL3Src(IPAddress addr) {
+ checkNotNull(addr, "Src l3 address cannot be null");
+ return new ModIPInstruction(L3SubType.L3_SRC, addr);
+ }
+
+ /**
+ * Creates a L3 dst modification.
+ * @param addr the ip address to modify to.
+ * @return a L3 modification
+ */
+ public static L3ModificationInstruction modL3Dst(IPAddress addr) {
+ checkNotNull(addr, "Dst l3 address cannot be null");
+ return new ModIPInstruction(L3SubType.L3_DST, addr);
+ }
+
+ /**
+ * Creates an L3 protocol modification.
+ * @param proto the protocol to change to
+ * @return a L3 modification
+ */
+ public static L3ModificationInstruction modIPProto(Byte proto) {
+ checkNotNull(proto, "IP protocol cannot be null");
+ return new ModIPProtoInstruction(proto);
+ }
+
/*
* Output instructions
*/
@@ -79,6 +128,11 @@
public Type type() {
return Type.DROP;
}
+
+ @Override
+ public SubType subtype() {
+ return NoneSubType.NONE;
+ }
}
@@ -97,6 +151,11 @@
public Type type() {
return Type.OUTPUT;
}
+
+ @Override
+ public SubType subtype() {
+ return NoneSubType.NONE;
+ }
}
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
index f71ad2e..348c30f 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
@@ -11,7 +11,7 @@
/**
* Represents the type of traffic treatment.
*/
- public enum SubType {
+ public enum L2SubType implements SubType {
/**
* Ether src modification.
*/
@@ -41,10 +41,7 @@
// TODO: Create factory class 'Instructions' that will have various factory
// to create specific instructions.
- /**
- * Returns the subtype of the modification instruction.
- * @return type of instruction
- */
+ @Override
public abstract SubType subtype();
@Override
@@ -89,7 +86,7 @@
@Override
public SubType subtype() {
- return SubType.L2_TYPE;
+ return L2SubType.L2_TYPE;
}
public short l2Type() {
@@ -111,7 +108,7 @@
@Override
public SubType subtype() {
- return SubType.VLAN_ID;
+ return L2SubType.VLAN_ID;
}
public Short vlanId() {
@@ -120,5 +117,27 @@
}
+ /**
+ * Represents a VLAN PCP modification instruction.
+ */
+ public static final class ModVlanPcpInstruction extends L2ModificationInstruction {
+
+ public final Byte vlanPcp;
+
+ public ModVlanPcpInstruction(Byte vlanPcp) {
+ this.vlanPcp = vlanPcp;
+ }
+
+ @Override
+ public SubType subtype() {
+ return L2SubType.VLAN_PCP;
+ }
+
+ public Byte vlanPcp() {
+ return this.vlanPcp;
+ }
+
+ }
+
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
new file mode 100644
index 0000000..eb4d3b6
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
@@ -0,0 +1,89 @@
+package org.onlab.onos.net.flow.instructions;
+
+import org.onlab.packet.IPAddress;
+
+/**
+ * Abstraction of a single traffic treatment step.
+ * @param <T> the type parameter for the instruction
+ */
+public abstract class L3ModificationInstruction implements Instruction {
+
+ /**
+ * Represents the type of traffic treatment.
+ */
+ public enum L3SubType implements SubType {
+ /**
+ * Ether src modification.
+ */
+ L3_SRC,
+
+ /**
+ * Ether dst modification.
+ */
+ L3_DST,
+
+ /**
+ * Ethertype modification.
+ */
+ L3_PROTO,
+
+ //TODO: remaining types
+ }
+
+ /**
+ * Returns the subtype of the modification instruction.
+ * @return type of instruction
+ */
+ public abstract SubType subtype();
+
+ @Override
+ public Type type() {
+ return Type.MODIFICATION;
+ }
+
+ /**
+ * Represents a L3 src/dst modification instruction.
+ */
+ public static final class ModIPInstruction extends L3ModificationInstruction {
+
+ private final SubType subtype;
+ private final IPAddress ip;
+
+ public ModIPInstruction(SubType subType, IPAddress addr) {
+ this.subtype = subType;
+ this.ip = addr;
+ }
+
+ @Override
+ public SubType subtype() {
+ return this.subtype;
+ }
+
+ public IPAddress ip() {
+ return this.ip;
+ }
+
+ }
+
+ /**
+ * Represents a L3 proto modification instruction.
+ */
+ public static final class ModIPProtoInstruction extends L3ModificationInstruction {
+
+ public final Byte proto;
+
+ public ModIPProtoInstruction(Byte proto) {
+ this.proto = proto;
+ }
+
+ @Override
+ public SubType subtype() {
+ return L3SubType.L3_PROTO;
+ }
+
+ public short proto() {
+ return this.proto;
+ }
+
+ }
+}