very basic broken reactive forwarding; nit yet using treatments, but rather defaulting to flood for everything
generates a ton of duplicates for now
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
new file mode 100644
index 0000000..d206c97
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/DefaultTrafficTreatment.java
@@ -0,0 +1,77 @@
+package org.onlab.onos.net.flow;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.onlab.onos.net.PortNumber;
+import org.slf4j.Logger;
+
+@SuppressWarnings("rawtypes")
+public class DefaultTrafficTreatment implements TrafficTreatment {
+
+ private final List<Instruction> instructions;
+
+ public DefaultTrafficTreatment(List<Instruction> instructions) {
+ this.instructions = Collections.unmodifiableList(instructions);
+ }
+
+ @Override
+ public List<Instruction> instructions() {
+ return instructions;
+ }
+
+ /**
+ * Builds a list of treatments following the following order.
+ * Modifications -> Group -> Output (including drop)
+ *
+ */
+
+ public static class Builder implements TrafficTreatment.Builder {
+
+ private final Logger log = getLogger(getClass());
+
+ List<Instruction<PortNumber>> outputs = new LinkedList<>();
+
+ // TODO: should be a list of instructions based on group objects
+ List<Instruction<Object>> groups = new LinkedList<>();
+
+ // TODO: should be a list of instructions based on modification objects
+ List<Instruction<Object>> modifications = new LinkedList<>();
+
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Builder add(Instruction instruction) {
+ switch (instruction.type()) {
+ case OUTPUT:
+ case DROP:
+ // TODO: should check that there is only one drop instruction.
+ outputs.add(instruction);
+ break;
+ case MODIFICATION:
+ // TODO: enforce modification order if any
+ modifications.add(instruction);
+ case GROUP:
+ groups.add(instruction);
+ default:
+ log.warn("Unknown instruction type {}", instruction.type());
+ }
+ return this;
+ }
+
+ @Override
+ public TrafficTreatment build() {
+ List<Instruction> instructions = new LinkedList<Instruction>();
+ instructions.addAll(modifications);
+ instructions.addAll(groups);
+ instructions.addAll(outputs);
+
+ return new DefaultTrafficTreatment(instructions);
+ }
+
+ }
+
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java
index 9fc1489..e9ea35b 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Instruction.java
@@ -2,8 +2,9 @@
/**
* Abstraction of a single traffic treatment step.
+ * @param <T> the type parameter for the instruction
*/
-public interface Instruction {
+public interface Instruction<T> {
/**
* Represents the type of traffic treatment.
@@ -33,4 +34,17 @@
// TODO: Create factory class 'Instructions' that will have various factory
// to create specific instructions.
+ /**
+ * Returns the type of instruction not to be confused
+ * with the instruction's java type.
+ * @return type of instruction
+ */
+ public Type type();
+
+ /**
+ * Returns the actual value of the instruction.
+ * @return the value for this instruction
+ */
+ public T instruction();
+
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java b/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java
index 13114c3..f72b07e 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/Instructions.java
@@ -8,8 +8,7 @@
public final class Instructions {
// Ban construction
- private Instructions() {
- }
+ private Instructions() {}
/**
* Creates an output instruction using the specified port number. This can
@@ -18,8 +17,20 @@
* @param number port number
* @return output instruction
*/
- public static Instruction createOutput(PortNumber number) {
- return null;
+ public static Instruction<PortNumber> createOutput(final PortNumber number) {
+ return new Instruction<PortNumber>() {
+
+ @Override
+ public Instruction.Type type() {
+ return Type.OUTPUT;
+ }
+
+ @Override
+ public PortNumber instruction() {
+ return number;
+ }
+
+ };
}
// TODO: add create methods
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
index 8c2495c..8f49602 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
@@ -1,10 +1,11 @@
package org.onlab.onos.net.packet;
-import com.google.common.base.MoreObjects;
+import java.nio.ByteBuffer;
+
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.flow.TrafficTreatment;
-import java.nio.ByteBuffer;
+import com.google.common.base.MoreObjects;
/**
* Default implementation of an immutable outbound packet.
@@ -22,7 +23,7 @@
* @param data raw packet data
*/
public DefaultOutboundPacket(DeviceId sendThrough,
- TrafficTreatment treatment, ByteBuffer data) {
+ TrafficTreatment treatment, ByteBuffer data) {
this.sendThrough = sendThrough;
this.treatment = treatment;
this.data = data;
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
index 6b77225..923f168 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultPacketContext.java
@@ -1,13 +1,20 @@
package org.onlab.onos.net.packet;
+import org.onlab.onos.net.flow.DefaultTrafficTreatment;
+import org.onlab.onos.net.flow.TrafficTreatment;
+import org.onlab.onos.net.flow.TrafficTreatment.Builder;
+
public abstract class DefaultPacketContext implements PacketContext {
private final long time;
private final InboundPacket inPkt;
private final OutboundPacket outPkt;
+ private final TrafficTreatment.Builder builder;
+
private boolean block = false;
+
protected DefaultPacketContext(long time, InboundPacket inPkt,
OutboundPacket outPkt, boolean block) {
super();
@@ -15,6 +22,7 @@
this.inPkt = inPkt;
this.outPkt = outPkt;
this.block = block;
+ this.builder = new DefaultTrafficTreatment.Builder();
}
@Override
@@ -33,6 +41,11 @@
}
@Override
+ public Builder treatmentBuilder() {
+ return builder;
+ }
+
+ @Override
public abstract void send();
@Override
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/ReactivePacketProcessor.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/ReactivePacketProcessor.java
index 5e0a39b..bc5d30a 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/ReactivePacketProcessor.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/ReactivePacketProcessor.java
@@ -2,6 +2,8 @@
import static org.slf4j.LoggerFactory.getLogger;
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.flow.Instructions;
import org.onlab.onos.net.packet.PacketContext;
import org.onlab.onos.net.packet.PacketProcessor;
import org.slf4j.Logger;
@@ -12,7 +14,8 @@
@Override
public void process(PacketContext context) {
- log.info("Packet reveived {}", context.inPacket());
+ context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD));
+ context.send();
}
}