Add OCh signal type to optical path intent.
Revert changes to LINC-OE specialized flowmod handling.

Change-Id: Ic4f333a44b7cd8a3111bfcba87ea909943eec56d
diff --git a/core/api/src/main/java/org/onosproject/net/OchSignalType.java b/core/api/src/main/java/org/onosproject/net/OchSignalType.java
index d9dd786..9caf3f3 100644
--- a/core/api/src/main/java/org/onosproject/net/OchSignalType.java
+++ b/core/api/src/main/java/org/onosproject/net/OchSignalType.java
@@ -21,9 +21,9 @@
  */
 public enum OchSignalType {
     /**
-     * Represents fix grid.
+     * Represents fixed grid.
      */
-    FIX_GRID,
+    FIXED_GRID,
 
     /**
      * Represents flex grid.
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
index 33f30ef..a163cea 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/Criteria.java
@@ -389,6 +389,7 @@
      * @param sigType optical signal type (8 bits unsigned integer)
      * @return match criterion
      */
+    @Deprecated
     public static Criterion matchOpticalSignalType(short sigType) {
         return new OpticalSignalTypeCriterion(sigType, Type.OCH_SIGTYPE);
     }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/OpticalSignalTypeCriterion.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/OpticalSignalTypeCriterion.java
index d6e8ebf..ecf605f 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/OpticalSignalTypeCriterion.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/OpticalSignalTypeCriterion.java
@@ -23,6 +23,7 @@
  * Implementation of optical signal type criterion (8 bits unsigned
  * integer).
  */
+@Deprecated
 public final class OpticalSignalTypeCriterion implements Criterion {
     private static final short MASK = 0xff;
     private final short signalType;         // Signal type value: 8 bits
diff --git a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
index 5e1eacc..1290a34 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/OpticalPathIntent.java
@@ -18,6 +18,7 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.OchSignalType;
 import org.onosproject.net.Path;
 
 import com.google.common.base.MoreObjects;
@@ -31,6 +32,7 @@
     private final ConnectPoint dst;
     private final Path path;
     private final OchSignal lambda;
+    private final OchSignalType signalType;
 
     private OpticalPathIntent(ApplicationId appId,
                               Key key,
@@ -38,12 +40,14 @@
                               ConnectPoint dst,
                               Path path,
                               OchSignal lambda,
+                              OchSignalType signalType,
                               int priority) {
         super(appId, key, ImmutableSet.copyOf(path.links()), priority);
         this.src = checkNotNull(src);
         this.dst = checkNotNull(dst);
         this.path = checkNotNull(path);
         this.lambda = checkNotNull(lambda);
+        this.signalType = checkNotNull(signalType);
     }
 
     protected OpticalPathIntent() {
@@ -51,6 +55,7 @@
         this.dst = null;
         this.path = null;
         this.lambda = null;
+        this.signalType = null;
     }
 
     /**
@@ -71,6 +76,7 @@
         private ConnectPoint dst;
         private Path path;
         private OchSignal lambda;
+        private OchSignalType signalType;
         Key key;
 
         @Override
@@ -133,6 +139,17 @@
         }
 
         /**
+         * Sets the optical signal type for the intent that will be built.
+         *
+         * @param signalType the optical signal type
+         * @return this builder
+         */
+        public Builder signalType(OchSignalType signalType) {
+            this.signalType = signalType;
+            return this;
+        }
+
+        /**
          * Builds an optical path intent from the accumulated parameters.
          *
          * @return optical path intent
@@ -146,6 +163,7 @@
                     dst,
                     path,
                     lambda,
+                    signalType,
                     priority
             );
         }
@@ -168,6 +186,10 @@
         return lambda;
     }
 
+    public OchSignalType signalType() {
+        return signalType;
+    }
+
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
@@ -179,6 +201,7 @@
                 .add("egressPort", dst)
                 .add("path", path)
                 .add("lambda", lambda)
+                .add("signalType", signalType)
                 .toString();
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
index a705e12..bad60a0 100644
--- a/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
+++ b/core/api/src/test/java/org/onosproject/net/flow/criteria/CriteriaTest.java
@@ -221,8 +221,8 @@
     Criterion sameAsMatchLambda1 = Criteria.matchLambda(lambda1);
     Criterion matchLambda2 = Criteria.matchLambda(lambda2);
 
-    Criterion matchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIX_GRID);
-    Criterion sameAsMatchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIX_GRID);
+    Criterion matchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIXED_GRID);
+    Criterion sameAsMatchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIXED_GRID);
     Criterion matchOchSignalType2 = Criteria.matchOchSignalType(OchSignalType.FLEX_GRID);
 
     Criterion matchIndexedLambda1 = Criteria.matchLambda(Lambda.indexedLambda(1));
diff --git a/core/api/src/test/java/org/onosproject/net/intent/OpticalPathIntentTest.java b/core/api/src/test/java/org/onosproject/net/intent/OpticalPathIntentTest.java
index 3296336..36e018a 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/OpticalPathIntentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/OpticalPathIntentTest.java
@@ -18,7 +18,7 @@
 import org.hamcrest.Matchers;
 import org.junit.Before;
 import org.junit.Test;
-import org.onosproject.net.OchSignal;
+import org.onosproject.net.OchSignalType;
 import org.onosproject.net.Path;
 
 import com.google.common.testing.EqualsTester;
@@ -39,7 +39,6 @@
     OpticalPathIntent intent1;
     OpticalPathIntent intent2;
     Path defaultPath;
-    OchSignal lambda;
 
     @Before
     public void opticalPathIntentTestSetUp() {
@@ -50,6 +49,7 @@
                 .dst(connectPoint("two", 2))
                 .path(defaultPath)
                 .lambda(createLambda())
+                .signalType(OchSignalType.FIXED_GRID)
                 .priority(PRIORITY)
                 .build();
 
@@ -59,6 +59,7 @@
                 .dst(connectPoint("one", 2))
                 .path(defaultPath)
                 .lambda(createLambda())
+                .signalType(OchSignalType.FIXED_GRID)
                 .priority(PRIORITY)
                 .build();
     }
@@ -83,7 +84,7 @@
     }
 
     /**
-     * Checks that the optical path ntent objects are created correctly.
+     * Checks that the optical path intent objects are created correctly.
      */
     @Test
     public void testContents() {
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 4f8527e..e99b56b 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -31,6 +31,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.OchPort;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.OchSignalType;
 import org.onosproject.net.OmsPort;
 import org.onosproject.net.Path;
 import org.onosproject.net.Port;
@@ -127,6 +128,8 @@
             // Create installable optical path intent
             LambdaResourceAllocation lambdaAlloc = getWavelength(path, linkAllocs);
             OchSignal ochSignal = getOchSignal(lambdaAlloc, omsPort.minFrequency(), omsPort.grid());
+            // Only support fixed grid for now
+            OchSignalType signalType = OchSignalType.FIXED_GRID;
 
             Intent newIntent = OpticalPathIntent.builder()
                     .appId(intent.appId())
@@ -134,6 +137,7 @@
                     .dst(intent.getDst())
                     .path(path)
                     .lambda(ochSignal)
+                    .signalType(signalType)
                     .build();
 
             return ImmutableList.of(newIntent);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompiler.java
index f4b11db..274b98d 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompiler.java
@@ -103,6 +103,7 @@
             current = link.dst();
             selectorBuilder.matchInPort(link.dst().port());
             selectorBuilder.add(Criteria.matchLambda(intent.lambda()));
+            selectorBuilder.add(Criteria.matchOchSignalType(intent.signalType()));
         }
 
         // Build the egress ROADM rule
diff --git a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompilerTest.java b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompilerTest.java
index a18f2c5..b773f0f 100644
--- a/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompilerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/intent/impl/compiler/OpticalPathIntentCompilerTest.java
@@ -26,6 +26,7 @@
 import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DefaultPath;
 import org.onosproject.net.Link;
+import org.onosproject.net.OchSignalType;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
@@ -95,6 +96,7 @@
                 .dst(d3p1)
                 .path(new DefaultPath(PID, links, hops))
                 .lambda(createLambda())
+                .signalType(OchSignalType.FIXED_GRID)
                 .build();
         intentExtensionService = createMock(IntentExtensionService.class);
         intentExtensionService.registerCompiler(OpticalPathIntent.class, sut);
diff --git a/drivers/src/main/java/org/onosproject/driver/handshaker/OFOpticalSwitchImplLINC13.java b/drivers/src/main/java/org/onosproject/driver/handshaker/OFOpticalSwitchImplLINC13.java
index 8b27e8c..ec449b7 100644
--- a/drivers/src/main/java/org/onosproject/driver/handshaker/OFOpticalSwitchImplLINC13.java
+++ b/drivers/src/main/java/org/onosproject/driver/handshaker/OFOpticalSwitchImplLINC13.java
@@ -24,62 +24,30 @@
 import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
 import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
 import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
-import org.projectfloodlight.openflow.protocol.OFFactories;
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFFlowMod;
-import org.projectfloodlight.openflow.protocol.OFFlowModCommand;
-import org.projectfloodlight.openflow.protocol.OFInstructionType;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFObject;
 import org.projectfloodlight.openflow.protocol.OFPortDesc;
 import org.projectfloodlight.openflow.protocol.OFStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsType;
-import org.projectfloodlight.openflow.protocol.OFType;
-import org.projectfloodlight.openflow.protocol.OFVersion;
-import org.projectfloodlight.openflow.protocol.action.OFAction;
-import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
-import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
-import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions;
-import org.projectfloodlight.openflow.protocol.match.Match;
-import org.projectfloodlight.openflow.protocol.match.MatchField;
-import org.projectfloodlight.openflow.protocol.OFActionType;
-import org.projectfloodlight.openflow.types.CircuitSignalID;
-import org.projectfloodlight.openflow.types.OFPort;
-import org.projectfloodlight.openflow.types.U8;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.ArrayList;
 import java.util.Set;
-import java.util.BitSet;
-import java.util.stream.Collectors;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ConcurrentHashMap;
-
-import static org.projectfloodlight.openflow.protocol.OFFlowMod.Builder;
 
 /**
  * LINC-OE Optical Emulator switch class.
  */
 public class OFOpticalSwitchImplLINC13
  extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch {
-    // default number of lambdas, assuming 50GHz channels.
-    private static final int NUM_CHLS = 80;
-    private final OFFactory factory = OFFactories.getFactory(OFVersion.OF_13);
 
     private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false);
     private long barrierXidToWaitFor = -1;
 
     private OFCircuitPortsReply wPorts;
-    // book-keeping maps for allocated Linc-OE lambdas
-    protected final ConcurrentMap<OFPort, BitSet> portChannelMap = new ConcurrentHashMap<>();
-    protected final ConcurrentMap<Match, Integer> matchMap = new ConcurrentHashMap<>();
 
     @Override
     public void startDriverHandshake() {
@@ -201,139 +169,4 @@
     public Set<PortDescPropertyType> getPortTypes() {
         return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT);
     }
-
-    @Override
-    public OFMessage prepareMessage(OFMessage msg) {
-        if (OFVersion.OF_13 != msg.getVersion() || msg.getType() != OFType.FLOW_MOD) {
-            return msg;
-        }
-        OFFlowMod fm = (OFFlowMod) msg;
-        Match match = fm.getMatch();
-        // Don't touch FlowMods that aren't Optical-related.
-        if (match.get(MatchField.OCH_SIGTYPE) == null) {
-            return msg;
-        }
-
-        OFMessage newFM;
-        Builder builder = null;
-        List<OFAction> actions = new ArrayList<>();
-        if (fm.getCommand() == OFFlowModCommand.ADD) {
-            builder = factory.buildFlowAdd();
-            int lambda = allocateLambda(match.get(MatchField.IN_PORT), match);
-            CircuitSignalID sigid = new CircuitSignalID((byte) 1, (byte) 2, (short) lambda, (short) 1);
-            List<OFInstruction> instructions = fm.getInstructions();
-
-            newFM = buildFlowMod(builder, fm, buildMatch(match, sigid), buildActions(instructions, sigid));
-        } else if (fm.getCommand() == OFFlowModCommand.DELETE) {
-            builder = factory.buildFlowDelete();
-            int lambda = freeLambda(match.get(MatchField.IN_PORT), match);
-            CircuitSignalID sigid = new CircuitSignalID((byte) 1, (byte) 2, (short) lambda, (short) 1);
-
-            newFM = buildFlowMod(builder, fm, buildMatch(match, sigid), actions);
-        } else {
-            newFM = msg;
-        }
-        log.debug("new FM = {}", newFM);
-        return newFM;
-    }
-
-    // fetch the next available channel as the flat lambda value, or the lambda
-    // associated with a port/match combination
-    private int allocateLambda(OFPort port, Match match) {
-        Integer lambda = null;
-        synchronized (this) {
-            BitSet channels = portChannelMap.getOrDefault(port, new BitSet(NUM_CHLS + 1));
-            lambda = matchMap.get(match);
-            if (lambda == null) {
-                // TODO : double check behavior when bitset is full
-                // Linc lambdas start at 1.
-                lambda = channels.nextClearBit(1);
-                channels.set(lambda);
-                portChannelMap.put(port, channels);
-                matchMap.put(match, lambda);
-            }
-        }
-        return lambda;
-    }
-
-    // free lambda that was mapped to Port/Match combination and return its
-    // value to caller.
-    private int freeLambda(OFPort port, Match match) {
-        synchronized (this) {
-            Integer lambda = matchMap.get(match);
-            if (lambda != null) {
-                portChannelMap.get(port).clear(lambda);
-                return lambda;
-            }
-            // 1 is a sane-ish default for Linc.
-            return 1;
-        }
-    }
-
-    // build matches - *tons of assumptions are made here based on Linc-OE's behavior.*
-    // gridType = 1 (DWDM)
-    // channelSpacing = 2 (50GHz)
-    // spectralWidth = 1 (fixed grid default value)
-    private Match buildMatch(Match original, CircuitSignalID sigid) {
-        Match.Builder mBuilder = factory.buildMatch();
-
-        original.getMatchFields().forEach(mf -> {
-            String name = mf.getName();
-            if (MatchField.OCH_SIGID.getName().equals(name)) {
-                mBuilder.setExact(MatchField.OCH_SIGID, sigid);
-            } else if (MatchField.OCH_SIGTYPE.getName().equals(name)) {
-                mBuilder.setExact(MatchField.OCH_SIGTYPE, U8.of((short) 1));
-            } else if (MatchField.IN_PORT.getName().equals(name)) {
-                mBuilder.setExact(MatchField.IN_PORT, original.get(MatchField.IN_PORT));
-            }
-        });
-
-        return mBuilder.build();
-    }
-
-    private List<OFAction> buildActions(List<OFInstruction> iList, CircuitSignalID sigid) {
-        Map<OFInstructionType, OFInstruction> instructions = iList.stream()
-                .collect(Collectors.toMap(OFInstruction::getType, inst -> inst));
-
-        OFInstruction inst = instructions.get(OFInstructionType.APPLY_ACTIONS);
-        if (inst == null) {
-            return Collections.emptyList();
-        }
-
-        List<OFAction> actions = new ArrayList<>();
-        OFInstructionApplyActions iaa = (OFInstructionApplyActions) inst;
-        if (iaa.getActions() == null) {
-            return actions;
-        }
-        iaa.getActions().forEach(action -> {
-            if (OFActionType.EXPERIMENTER == action.getType()) {
-                OFActionCircuit.Builder cBuilder = factory.actions().buildCircuit()
-                        .setField(factory.oxms()
-                                .buildOchSigid()
-                                .setValue(sigid)
-                                .build());
-                actions.add(cBuilder.build());
-            } else {
-                actions.add(action);
-            }
-        });
-        return actions;
-    }
-
-    private OFMessage buildFlowMod(Builder builder, OFFlowMod fm, Match m, List<OFAction> act) {
-        return builder
-                .setXid(fm.getXid())
-                .setCookie(fm.getCookie())
-                .setCookieMask(fm.getCookieMask())
-                .setTableId(fm.getTableId())
-                .setIdleTimeout(fm.getIdleTimeout())
-                .setHardTimeout(fm.getHardTimeout())
-                .setBufferId(fm.getBufferId())
-                .setOutPort(fm.getOutPort())
-                .setOutGroup(fm.getOutGroup())
-                .setFlags(fm.getFlags())
-                .setMatch(m)
-                .setActions(act)
-                .build();
-    }
 }
diff --git a/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java b/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
index 0d2dc3a..49ca5a8 100644
--- a/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
+++ b/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
@@ -148,16 +148,4 @@
      * @return string representation of the connection to the device
      */
     String channelId();
-
-    /**
-     * Prepares a message to be sent, if necessary. Default is to do nothing,
-     * since most Devices do not need to pre-process a message that's about to
-     * be sent.
-     *
-     * @param msg The message to prepare for sending
-     * @return the prepared OFMessage
-     */
-    default OFMessage prepareMessage(OFMessage msg) {
-        return msg;
-    }
 }
diff --git a/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java b/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
index 94e82a2..43f3d68 100644
--- a/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -97,7 +97,7 @@
     @Override
     public final void sendMsg(OFMessage m) {
         if (role == RoleState.MASTER && channel.isWritable()) {
-            channel.write(Collections.singletonList(prepareMessage(m)));
+            channel.write(Collections.singletonList(m));
         }
     }
 
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
index 9d949c6..ddccd2a 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
@@ -40,7 +40,7 @@
 import org.onosproject.net.flow.criteria.MetadataCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
 import org.onosproject.net.flow.criteria.OchSignalCriterion;
-import org.onosproject.net.flow.criteria.OpticalSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.criteria.SctpPortCriterion;
 import org.onosproject.net.flow.criteria.TcpPortCriterion;
@@ -388,10 +388,9 @@
                 }
                 break;
             case OCH_SIGTYPE:
-                OpticalSignalTypeCriterion sc =
-                        (OpticalSignalTypeCriterion) c;
-                mBuilder.setExact(MatchField.OCH_SIGTYPE,
-                                  U8.of(sc.signalType()));
+                OchSignalTypeCriterion sc = (OchSignalTypeCriterion) c;
+                byte signalType = FlowModBuilderHelper.convertOchSignalType(sc.signalType());
+                mBuilder.setExact(MatchField.OCH_SIGTYPE, U8.of(signalType));
                 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 fd9cac4..5baba8f 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
@@ -17,6 +17,7 @@
 
 import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.GridType;
+import org.onosproject.net.OchSignalType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -87,4 +88,22 @@
                 throw new UnsupportedChannelSpacingException(spacing);
         }
     }
+
+    /**
+     * Converts a {@link OchSignalType} to the corresponding byte value.
+     *
+     * @param signalType optical signal type
+     * @return byte value corresponding to the specified OCh signal type
+     */
+    static byte convertOchSignalType(OchSignalType signalType) {
+        switch (signalType) {
+            case FIXED_GRID:
+                return (byte) 1;
+            case FLEX_GRID:
+                return (byte) 2;
+            default:
+                log.info("OchSignalType {} is not supported", signalType);
+                return (byte) 0;
+        }
+    }
 }
diff --git a/tools/test/topos/opticalUtils.py b/tools/test/topos/opticalUtils.py
index f1559b4..52a54b2 100644
--- a/tools/test/topos/opticalUtils.py
+++ b/tools/test/topos/opticalUtils.py
@@ -67,7 +67,7 @@
 from mininet.cli import CLI
 
 # Sleep time and timeout values in seconds
-SLEEP_TIME = .5
+SLEEP_TIME = 2
 TIMEOUT = 60
 
 class OpticalSwitch(Switch):