Saurav Das
Committed by Ray Milkey

Changes to the Pica8 pipeline to accomodate single-table operation.

Change-Id: Ic221b091be24036f6bceea97190119dfa5b7e579
...@@ -17,7 +17,6 @@ package org.onosproject.driver.pipeline; ...@@ -17,7 +17,6 @@ package org.onosproject.driver.pipeline;
17 17
18 import org.onlab.osgi.ServiceDirectory; 18 import org.onlab.osgi.ServiceDirectory;
19 import org.onlab.packet.Ethernet; 19 import org.onlab.packet.Ethernet;
20 -import org.onlab.packet.IPv4;
21 import org.onlab.packet.MacAddress; 20 import org.onlab.packet.MacAddress;
22 import org.onlab.packet.VlanId; 21 import org.onlab.packet.VlanId;
23 import org.onlab.util.KryoNamespace; 22 import org.onlab.util.KryoNamespace;
...@@ -43,7 +42,6 @@ import org.onosproject.net.flow.criteria.Criterion; ...@@ -43,7 +42,6 @@ import org.onosproject.net.flow.criteria.Criterion;
43 import org.onosproject.net.flow.criteria.EthCriterion; 42 import org.onosproject.net.flow.criteria.EthCriterion;
44 import org.onosproject.net.flow.criteria.EthTypeCriterion; 43 import org.onosproject.net.flow.criteria.EthTypeCriterion;
45 import org.onosproject.net.flow.criteria.IPCriterion; 44 import org.onosproject.net.flow.criteria.IPCriterion;
46 -import org.onosproject.net.flow.criteria.IPProtocolCriterion;
47 import org.onosproject.net.flow.criteria.PortCriterion; 45 import org.onosproject.net.flow.criteria.PortCriterion;
48 import org.onosproject.net.flow.criteria.VlanIdCriterion; 46 import org.onosproject.net.flow.criteria.VlanIdCriterion;
49 import org.onosproject.net.flow.instructions.Instruction; 47 import org.onosproject.net.flow.instructions.Instruction;
...@@ -234,59 +232,40 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner ...@@ -234,59 +232,40 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner
234 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) { 232 private Collection<FlowRule> processVersatile(ForwardingObjective fwd) {
235 log.debug("Processing versatile forwarding objective"); 233 log.debug("Processing versatile forwarding objective");
236 TrafficSelector selector = fwd.selector(); 234 TrafficSelector selector = fwd.selector();
235 + TrafficTreatment treatment = fwd.treatment();
236 + Collection<FlowRule> flowrules = new ArrayList<FlowRule>();
237 +
238 + // first add this rule for basic single-table operation
239 + // or non-ARP related multi-table operation
240 + FlowRule rule = DefaultFlowRule.builder()
241 + .forDevice(deviceId)
242 + .withSelector(selector)
243 + .withTreatment(treatment)
244 + .withPriority(fwd.priority())
245 + .fromApp(fwd.appId())
246 + .makePermanent()
247 + .forTable(ACL_TABLE).build();
248 + flowrules.add(rule);
237 249
238 EthTypeCriterion ethType = 250 EthTypeCriterion ethType =
239 (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE); 251 (EthTypeCriterion) selector.getCriterion(Criterion.Type.ETH_TYPE);
240 if (ethType == null) { 252 if (ethType == null) {
241 - log.error("Versatile forwarding objective must include ethType"); 253 + log.warn("No ethType in versatile forwarding obj. Not processing further.");
242 - fail(fwd, ObjectiveError.UNKNOWN); 254 + return flowrules;
243 - return Collections.emptySet();
244 } 255 }
245 256
257 + // now deal with possible mix of ARP with filtering objectives
258 + // in multi-table scenarios
246 if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) { 259 if (ethType.ethType().toShort() == Ethernet.TYPE_ARP) {
247 if (filters.isEmpty()) { 260 if (filters.isEmpty()) {
248 pendingVersatiles.add(fwd); 261 pendingVersatiles.add(fwd);
249 - return Collections.emptySet(); 262 + return flowrules;
250 } 263 }
251 - Collection<FlowRule> flowrules = new ArrayList<FlowRule>();
252 for (Filter filter : filters) { 264 for (Filter filter : filters) {
253 flowrules.addAll(processVersatilesWithFilters(filter, fwd)); 265 flowrules.addAll(processVersatilesWithFilters(filter, fwd));
254 } 266 }
255 - return flowrules;
256 - } else if (ethType.ethType().toShort() == Ethernet.TYPE_LLDP ||
257 - ethType.ethType().toShort() == Ethernet.TYPE_BSN) {
258 - log.warn("Driver currently does not currently handle LLDP packets");
259 - fail(fwd, ObjectiveError.UNSUPPORTED);
260 - return Collections.emptySet();
261 - } else if (ethType.ethType().toShort() == Ethernet.TYPE_IPV4) {
262 - IPCriterion ipSrc = (IPCriterion) selector
263 - .getCriterion(Criterion.Type.IPV4_SRC);
264 - IPCriterion ipDst = (IPCriterion) selector
265 - .getCriterion(Criterion.Type.IPV4_DST);
266 - IPProtocolCriterion ipProto = (IPProtocolCriterion) selector
267 - .getCriterion(Criterion.Type.IP_PROTO);
268 - if (ipSrc != null) {
269 - log.warn("Driver does not currently handle matching Src IP");
270 - fail(fwd, ObjectiveError.UNSUPPORTED);
271 - return Collections.emptySet();
272 - }
273 - if (ipDst != null) {
274 - log.error("Driver handles Dst IP matching as specific forwarding "
275 - + "objective, not versatile");
276 - fail(fwd, ObjectiveError.UNSUPPORTED);
277 - return Collections.emptySet();
278 - }
279 - if (ipProto != null && ipProto.protocol() == IPv4.PROTOCOL_TCP) {
280 - log.warn("Driver automatically punts all packets reaching the "
281 - + "ACL table to the controller");
282 - pass(fwd);
283 - return Collections.emptySet();
284 - }
285 } 267 }
286 - 268 + return flowrules;
287 - log.warn("Driver does not support given versatile forwarding objective");
288 - fail(fwd, ObjectiveError.UNSUPPORTED);
289 - return Collections.emptySet();
290 } 269 }
291 270
292 private Collection<FlowRule> processVersatilesWithFilters( 271 private Collection<FlowRule> processVersatilesWithFilters(
...@@ -560,6 +539,5 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner ...@@ -560,6 +539,5 @@ public class PicaPipeline extends AbstractHandlerBehaviour implements Pipeliner
560 public byte[] data() { 539 public byte[] data() {
561 return appKryo.serialize(nextActions); 540 return appKryo.serialize(nextActions);
562 } 541 }
563 -
564 } 542 }
565 } 543 }
......