Upgrade packet requests to use flow objectives API.
Addressed a few issues found while using the flow objectives across a cluster:
* Flow objectives should be installable from any node, not just the master.
Therefore we need to ensure all nodes initialize a driver for each switch.
* We no longer store a list of objectives that are waiting for the switch
to arrive. If the we don't know about the switch yet we'll try a few times
over a few seconds to find it, but after that we'll give up and report an
error to the client.
* Default drivers need to be available when the FlowObjectiveManager starts
up, otherwise it is common to get flow objective requests before any
drivers have been loaded.
Change-Id: I1c2ea6a223232402c31e8139729e4b6251ab8b0f
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 9dd0634..a64b678 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -27,12 +27,17 @@
import org.onosproject.net.device.DeviceEvent;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultFlowRule;
import org.onosproject.net.flow.DefaultTrafficTreatment;
import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.net.flowobjective.ObjectiveContext;
+import org.onosproject.net.flowobjective.ObjectiveError;
import org.onosproject.net.packet.DefaultPacketRequest;
import org.onosproject.net.packet.OutboundPacket;
import org.onosproject.net.packet.PacketContext;
@@ -73,6 +78,9 @@
private CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ private FlowObjectiveService objectiveService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private DeviceService deviceService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -169,12 +177,28 @@
return;
}
- TrafficTreatment treatment = DefaultTrafficTreatment.builder().punt().build();
- FlowRule flow = new DefaultFlowRule(device.id(), request.selector(), treatment,
- request.priority().priorityValue(),
- appId, 0, true, request.tableType());
+ TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+ .punt()
+ .build();
- flowService.applyFlowRules(flow);
+ ForwardingObjective forwarding = DefaultForwardingObjective.builder()
+ .withPriority(request.priority().priorityValue())
+ .withSelector(request.selector())
+ .fromApp(appId)
+ .withFlag(ForwardingObjective.Flag.VERSATILE)
+ .withTreatment(treatment)
+ .makePermanent()
+ .add(new ObjectiveContext() {
+ @Override
+ public void onSuccess(Objective objective) { }
+
+ @Override
+ public void onError(Objective objective, ObjectiveError error) {
+ log.warn("Failed to install packet request flow: {}", error);
+ }
+ });
+
+ objectiveService.forward(device.id(), forwarding);
}
@Override