Fix cast error when building flow entries containging optical properties
Change-Id: I6e963143a22fcd57e2f1388941f7cb4fc51e52f6
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 61f669c..82a2bfa 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -26,6 +26,7 @@
import org.onlab.packet.VlanId;
import org.onosproject.core.DefaultGroupId;
import org.onosproject.net.DeviceId;
+import org.onosproject.net.Lambda;
import org.onosproject.net.PortNumber;
import org.onosproject.net.flow.DefaultFlowEntry;
import org.onosproject.net.flow.DefaultFlowRule;
@@ -63,17 +64,24 @@
import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic;
import org.projectfloodlight.openflow.protocol.ver13.OFFactoryVer13;
+import org.projectfloodlight.openflow.types.CircuitSignalID;
import org.projectfloodlight.openflow.types.EthType;
import org.projectfloodlight.openflow.types.IPv4Address;
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.Masked;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U8;
import org.projectfloodlight.openflow.types.VlanPcp;
import org.slf4j.Logger;
import java.util.List;
+import static org.onosproject.net.flow.criteria.Criteria.matchLambda;
+import static org.onosproject.net.flow.criteria.Criteria.matchOchSignalType;
+import static org.onosproject.provider.of.flow.impl.FlowModBuilderHelper.convertChannelSpacing;
+import static org.onosproject.provider.of.flow.impl.FlowModBuilderHelper.convertGridType;
+import static org.onosproject.provider.of.flow.impl.FlowModBuilderHelper.convertOchSignalType;
import static org.slf4j.LoggerFactory.getLogger;
public class FlowEntryBuilder {
@@ -633,11 +641,15 @@
.getValue());
break;
case OCH_SIGID:
- builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber());
+ CircuitSignalID sigId = match.get(MatchField.OCH_SIGID);
+ builder.add(matchLambda(Lambda.ochSignal(
+ convertGridType(sigId.getGridType()), convertChannelSpacing(sigId.getChannelSpacing()),
+ sigId.getChannelNumber(), sigId.getChannelSpacing())
+ ));
break;
case OCH_SIGTYPE:
- builder.matchOpticalSignalType(match.get(MatchField
- .OCH_SIGTYPE).getValue());
+ U8 sigType = match.get(MatchField.OCH_SIGTYPE);
+ builder.add(matchOchSignalType(convertOchSignalType((byte) sigType.getValue())));
break;
case ARP_OP:
case ARP_SHA:
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderHelper.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderHelper.java
index 5baba8f..19d27b5 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderHelper.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderHelper.java
@@ -24,6 +24,7 @@
/**
* Collection of helper methods to convert protocol agnostic models to values used in OpenFlow spec.
*/
+// TODO: Rename to a better name
final class FlowModBuilderHelper {
private static final Logger log = LoggerFactory.getLogger(FlowModBuilderHelper.class);
@@ -58,6 +59,28 @@
}
/**
+ * Converts a byte value for grid type
+ * defined in ONF "Optical Transport Protocol Extensions Version 1.0"
+ * to the corresponding {@link GridType} instance.
+ *
+ * @param type byte value as grid type defined the spec
+ * @return the corresponding GridType instance
+ */
+ static GridType convertGridType(byte type) {
+ switch (type) {
+ case 1:
+ return GridType.DWDM;
+ case 2:
+ return GridType.CWDM;
+ case 3:
+ return GridType.FLEX;
+ default:
+ log.info("The value {} for grid type is not supported");
+ return null;
+ }
+ }
+
+ /**
* Converts a {@link ChannelSpacing} to the corresponding byte value defined in
* ONF "Optical Transport Protocol Extensions Version 1.0".
*
@@ -90,6 +113,32 @@
}
/**
+ * Converts a byte value for channel spacing
+ * defined in ONF "Optical Transport Protocol Extensions Version 1.0"
+ * to the corresponding {@link ChannelSpacing} instance.
+ *
+ * @param spacing byte value as channel spacing defined the spec
+ * @return the corresponding ChannelSpacing instance
+ */
+ static ChannelSpacing convertChannelSpacing(byte spacing) {
+ switch (spacing) {
+ case 1:
+ return ChannelSpacing.CHL_100GHZ;
+ case 2:
+ return ChannelSpacing.CHL_50GHZ;
+ case 3:
+ return ChannelSpacing.CHL_25GHZ;
+ case 4:
+ return ChannelSpacing.CHL_12P5GHZ;
+ case 5:
+ return ChannelSpacing.CHL_6P25GHZ;
+ default:
+ log.info("The value {} for channel spacing is not supported");
+ return null;
+ }
+ }
+
+ /**
* Converts a {@link OchSignalType} to the corresponding byte value.
*
* @param signalType optical signal type
@@ -106,4 +155,24 @@
return (byte) 0;
}
}
+
+ /**
+ * Converts a byte value for Och signal type
+ * defined in ONF "Optical Transport Protocol Extensions Version 1.0"
+ * to the corresponding {@link OchSignalType} instance.
+ *
+ * @param signalType byte value as Och singal type defined the spec
+ * @return the corresponding OchSignalType instance
+ */
+ static OchSignalType convertOchSignalType(byte signalType) {
+ switch (signalType) {
+ case 1:
+ return OchSignalType.FIXED_GRID;
+ case 2:
+ return OchSignalType.FLEX_GRID;
+ default:
+ log.info("The value {} for Och signal type is not supported");
+ return null;
+ }
+ }
}