sample app launched
diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
new file mode 100644
index 0000000..24cfe6f
--- /dev/null
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactiveForwarding.java
@@ -0,0 +1,35 @@
+package org.onlab.onos.fwd;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.onos.net.packet.PacketProcessor;
+import org.onlab.onos.net.packet.PacketService;
+import org.onlab.onos.net.topology.TopologyService;
+
+@Component
+public class ReactiveForwarding {
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected TopologyService topologyService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected PacketService packetService;
+
+ private ReactivePacketProcessor processor;
+
+ @Activate
+ public void activate() {
+ processor = new ReactivePacketProcessor(topologyService);
+ packetService.addProcessor(processor, PacketProcessor.ADVISOR_MAX + 1);
+ }
+
+ @Deactivate
+ public void deactivate() {
+ packetService.removeProcessor(processor);
+ processor = null;
+ }
+}
+
diff --git a/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java
new file mode 100644
index 0000000..f4102ec
--- /dev/null
+++ b/apps/fwd/src/main/java/org/onlab/onos/fwd/ReactivePacketProcessor.java
@@ -0,0 +1,37 @@
+package org.onlab.onos.fwd;
+
+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.onlab.onos.net.topology.TopologyService;
+import org.slf4j.Logger;
+
+public class ReactivePacketProcessor implements PacketProcessor {
+
+ private final Logger log = getLogger(getClass());
+ private final TopologyService topologyService;
+
+
+ public ReactivePacketProcessor(TopologyService topologyService) {
+ this.topologyService = topologyService;
+ }
+
+
+ @Override
+ public void process(PacketContext context) {
+ boolean canBcast = topologyService.isBroadcastPoint(topologyService.currentTopology(),
+ context.inPacket().receivedFrom());
+
+ if (canBcast) {
+ context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD));
+ context.send();
+ } else {
+ context.block();
+ }
+
+ }
+
+}
diff --git a/apps/pom.xml b/apps/pom.xml
index 860c4dd..078a92d 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -18,6 +18,7 @@
<modules>
<module>tvue</module>
+ <module>fwd</module>
</modules>
<properties>
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
index d206c97..6eaa2c3 100644
--- 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
@@ -6,7 +6,6 @@
import java.util.LinkedList;
import java.util.List;
-import org.onlab.onos.net.PortNumber;
import org.slf4j.Logger;
@SuppressWarnings("rawtypes")
@@ -33,29 +32,33 @@
private final Logger log = getLogger(getClass());
- List<Instruction<PortNumber>> outputs = new LinkedList<>();
+ boolean drop = false;
+
+ List<Instruction> outputs = new LinkedList<>();
// TODO: should be a list of instructions based on group objects
- List<Instruction<Object>> groups = new LinkedList<>();
+ List<Instruction> groups = new LinkedList<>();
// TODO: should be a list of instructions based on modification objects
- List<Instruction<Object>> modifications = new LinkedList<>();
+ List<Instruction> 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.
+ drop = true;
+ break;
+ case OUTPUT:
outputs.add(instruction);
break;
case MODIFICATION:
// TODO: enforce modification order if any
modifications.add(instruction);
+ break;
case GROUP:
groups.add(instruction);
+ break;
default:
log.warn("Unknown instruction type {}", instruction.type());
}
@@ -64,10 +67,14 @@
@Override
public TrafficTreatment build() {
+
+ //If we are dropping should we just return an emptry list?
List<Instruction> instructions = new LinkedList<Instruction>();
instructions.addAll(modifications);
instructions.addAll(groups);
- instructions.addAll(outputs);
+ if (!drop) {
+ 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 e9ea35b..0888d9b 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
@@ -4,7 +4,7 @@
* Abstraction of a single traffic treatment step.
* @param <T> the type parameter for the instruction
*/
-public interface Instruction<T> {
+public interface Instruction {
/**
* Represents the type of traffic treatment.
@@ -41,10 +41,4 @@
*/
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 f72b07e..9681076 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
@@ -1,7 +1,8 @@
package org.onlab.onos.net.flow;
-import org.onlab.onos.net.PortNumber;
+import static com.google.common.base.Preconditions.checkNotNull;
+import org.onlab.onos.net.PortNumber;
/**
* Factory class for creating various traffic treatment instructions.
*/
@@ -17,22 +18,44 @@
* @param number port number
* @return output instruction
*/
- public static Instruction<PortNumber> createOutput(final PortNumber number) {
- return new Instruction<PortNumber>() {
+ public static OutputInstruction createOutput(final PortNumber number) {
+ checkNotNull(number, "PortNumber cannot be null");
+ return new OutputInstruction(number);
+ }
- @Override
- public Instruction.Type type() {
- return Type.OUTPUT;
- }
-
- @Override
- public PortNumber instruction() {
- return number;
- }
-
- };
+ public static DropInstruction createDrop() {
+ return new DropInstruction();
}
// TODO: add create methods
+ public static final class DropInstruction implements Instruction {
+
+ @Override
+ public Type type() {
+ return Type.DROP;
+ }
+ }
+
+
+ public static final class OutputInstruction implements Instruction {
+
+ private final PortNumber port;
+
+ private OutputInstruction(PortNumber port) {
+ this.port = port;
+ }
+
+ public PortNumber port() {
+ return port;
+ }
+
+ @Override
+ public Type type() {
+ return Type.OUTPUT;
+ }
+
+
+ }
+
}
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 3c2b0ea..6f1b708 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
@@ -51,7 +51,7 @@
public abstract void send();
@Override
- public boolean blocked() {
+ public boolean block() {
return this.block.getAndSet(true);
}
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java b/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
index ce08fde..48cb084 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/PacketContext.java
@@ -45,7 +45,7 @@
* Blocks the outbound packet from being sent from this point onward.
* @return whether the outbound packet is blocked.
*/
- boolean blocked();
+ boolean block();
/**
* Check whether the outbound packet is blocked.
diff --git a/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java b/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java
index c0cce92..9e561bf 100644
--- a/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java
+++ b/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java
@@ -1,13 +1,15 @@
package org.onlab.onos.event;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.onlab.junit.TestTools.delay;
+import static org.onlab.onos.event.TestEvent.Type.FOO;
import java.util.List;
import java.util.Timer;
-import static org.junit.Assert.*;
-import static org.onlab.junit.TestTools.delay;
-import static org.onlab.onos.event.TestEvent.Type.FOO;
+import org.junit.Test;
/**
* Tests the operation of the accumulator.
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
deleted file mode 100644
index bc5d30a..0000000
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/ReactivePacketProcessor.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.onlab.onos.net.trivial.packet.impl;
-
-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;
-
-public class ReactivePacketProcessor implements PacketProcessor {
-
- private final Logger log = getLogger(getClass());
-
- @Override
- public void process(PacketContext context) {
- context.treatmentBuilder().add(Instructions.createOutput(PortNumber.FLOOD));
- context.send();
- }
-
-}
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/SimplePacketManager.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/SimplePacketManager.java
index 95d3664..637ada8 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/SimplePacketManager.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/packet/impl/SimplePacketManager.java
@@ -1,5 +1,6 @@
package org.onlab.onos.net.trivial.packet.impl;
+import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Map;
@@ -42,22 +43,20 @@
private final Map<Integer, PacketProcessor> processors = new TreeMap<>();
- private final PacketProcessor reactiveProcessor = new ReactivePacketProcessor();
@Activate
public void activate() {
- addProcessor(reactiveProcessor, PacketProcessor.ADVISOR_MAX + 1);
log.info("Started");
}
@Deactivate
public void deactivate() {
- removeProcessor(reactiveProcessor);
log.info("Stopped");
}
@Override
public void addProcessor(PacketProcessor processor, int priority) {
+ checkNotNull(processor, "Processor cannot be null");
processors.put(priority, processor);
}
diff --git a/features/features.xml b/features/features.xml
index 72493c0..10f63bd 100644
--- a/features/features.xml
+++ b/features/features.xml
@@ -78,5 +78,12 @@
<feature>onos-thirdparty-web</feature>
<bundle>mvn:org.onlab.onos/onos-app-tvue/1.0.0-SNAPSHOT</bundle>
</feature>
+
+ <feature name="onos-app-fwd" version="1.0.0"
+ description="ONOS sample forwarding application">
+ <feature>onos-core</feature>
+ <bundle>mvn:org.onlab.onos/onos-app-fwd/1.0.0-SNAPSHOT</bundle>
+ </feature>
+
</features>
diff --git a/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java b/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
index 55476d0..0330bc6 100644
--- a/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
+++ b/providers/of/packet/src/main/java/org/onlab/onos/provider/of/packet/impl/OpenFlowCorePacketContext.java
@@ -7,6 +7,7 @@
import org.onlab.onos.net.PortNumber;
import org.onlab.onos.net.flow.Instruction;
import org.onlab.onos.net.flow.Instruction.Type;
+import org.onlab.onos.net.flow.Instructions.OutputInstruction;
import org.onlab.onos.net.packet.DefaultPacketContext;
import org.onlab.onos.net.packet.InboundPacket;
import org.onlab.onos.net.packet.OutboundPacket;
@@ -29,7 +30,7 @@
@Override
public void send() {
- if (!this.blocked()) {
+ if (!this.block()) {
if (outPacket() == null) {
sendBufferedPacket();
} else {
@@ -42,14 +43,13 @@
}
}
- @SuppressWarnings({ "rawtypes", "unchecked" })
private void sendBufferedPacket() {
List<Instruction> ins = treatmentBuilder().build().instructions();
OFPort p = null;
//TODO: support arbitrary list of treatments
for (Instruction i : ins) {
if (i.type() == Type.OUTPUT) {
- p = buildPort(((Instruction<PortNumber>) i).instruction());
+ p = buildPort(((OutputInstruction) i).port());
break; //for now...
}
}