Committed by
Gerrit Code Review
Add OCh signal type to optical path intent.
Revert changes to LINC-OE specialized flowmod handling. Change-Id: Ic4f333a44b7cd8a3111bfcba87ea909943eec56d
Showing
15 changed files
with
65 additions
and
193 deletions
| ... | @@ -21,9 +21,9 @@ package org.onosproject.net; | ... | @@ -21,9 +21,9 @@ package org.onosproject.net; |
| 21 | */ | 21 | */ |
| 22 | public enum OchSignalType { | 22 | public enum OchSignalType { |
| 23 | /** | 23 | /** |
| 24 | - * Represents fix grid. | 24 | + * Represents fixed grid. |
| 25 | */ | 25 | */ |
| 26 | - FIX_GRID, | 26 | + FIXED_GRID, |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * Represents flex grid. | 29 | * Represents flex grid. | ... | ... |
| ... | @@ -389,6 +389,7 @@ public final class Criteria { | ... | @@ -389,6 +389,7 @@ public final class Criteria { |
| 389 | * @param sigType optical signal type (8 bits unsigned integer) | 389 | * @param sigType optical signal type (8 bits unsigned integer) |
| 390 | * @return match criterion | 390 | * @return match criterion |
| 391 | */ | 391 | */ |
| 392 | + @Deprecated | ||
| 392 | public static Criterion matchOpticalSignalType(short sigType) { | 393 | public static Criterion matchOpticalSignalType(short sigType) { |
| 393 | return new OpticalSignalTypeCriterion(sigType, Type.OCH_SIGTYPE); | 394 | return new OpticalSignalTypeCriterion(sigType, Type.OCH_SIGTYPE); |
| 394 | } | 395 | } | ... | ... |
| ... | @@ -23,6 +23,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; | ... | @@ -23,6 +23,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; |
| 23 | * Implementation of optical signal type criterion (8 bits unsigned | 23 | * Implementation of optical signal type criterion (8 bits unsigned |
| 24 | * integer). | 24 | * integer). |
| 25 | */ | 25 | */ |
| 26 | +@Deprecated | ||
| 26 | public final class OpticalSignalTypeCriterion implements Criterion { | 27 | public final class OpticalSignalTypeCriterion implements Criterion { |
| 27 | private static final short MASK = 0xff; | 28 | private static final short MASK = 0xff; |
| 28 | private final short signalType; // Signal type value: 8 bits | 29 | private final short signalType; // Signal type value: 8 bits | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.net.intent; | ... | @@ -18,6 +18,7 @@ package org.onosproject.net.intent; |
| 18 | import org.onosproject.core.ApplicationId; | 18 | import org.onosproject.core.ApplicationId; |
| 19 | import org.onosproject.net.ConnectPoint; | 19 | import org.onosproject.net.ConnectPoint; |
| 20 | import org.onosproject.net.OchSignal; | 20 | import org.onosproject.net.OchSignal; |
| 21 | +import org.onosproject.net.OchSignalType; | ||
| 21 | import org.onosproject.net.Path; | 22 | import org.onosproject.net.Path; |
| 22 | 23 | ||
| 23 | import com.google.common.base.MoreObjects; | 24 | import com.google.common.base.MoreObjects; |
| ... | @@ -31,6 +32,7 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -31,6 +32,7 @@ public final class OpticalPathIntent extends Intent { |
| 31 | private final ConnectPoint dst; | 32 | private final ConnectPoint dst; |
| 32 | private final Path path; | 33 | private final Path path; |
| 33 | private final OchSignal lambda; | 34 | private final OchSignal lambda; |
| 35 | + private final OchSignalType signalType; | ||
| 34 | 36 | ||
| 35 | private OpticalPathIntent(ApplicationId appId, | 37 | private OpticalPathIntent(ApplicationId appId, |
| 36 | Key key, | 38 | Key key, |
| ... | @@ -38,12 +40,14 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -38,12 +40,14 @@ public final class OpticalPathIntent extends Intent { |
| 38 | ConnectPoint dst, | 40 | ConnectPoint dst, |
| 39 | Path path, | 41 | Path path, |
| 40 | OchSignal lambda, | 42 | OchSignal lambda, |
| 43 | + OchSignalType signalType, | ||
| 41 | int priority) { | 44 | int priority) { |
| 42 | super(appId, key, ImmutableSet.copyOf(path.links()), priority); | 45 | super(appId, key, ImmutableSet.copyOf(path.links()), priority); |
| 43 | this.src = checkNotNull(src); | 46 | this.src = checkNotNull(src); |
| 44 | this.dst = checkNotNull(dst); | 47 | this.dst = checkNotNull(dst); |
| 45 | this.path = checkNotNull(path); | 48 | this.path = checkNotNull(path); |
| 46 | this.lambda = checkNotNull(lambda); | 49 | this.lambda = checkNotNull(lambda); |
| 50 | + this.signalType = checkNotNull(signalType); | ||
| 47 | } | 51 | } |
| 48 | 52 | ||
| 49 | protected OpticalPathIntent() { | 53 | protected OpticalPathIntent() { |
| ... | @@ -51,6 +55,7 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -51,6 +55,7 @@ public final class OpticalPathIntent extends Intent { |
| 51 | this.dst = null; | 55 | this.dst = null; |
| 52 | this.path = null; | 56 | this.path = null; |
| 53 | this.lambda = null; | 57 | this.lambda = null; |
| 58 | + this.signalType = null; | ||
| 54 | } | 59 | } |
| 55 | 60 | ||
| 56 | /** | 61 | /** |
| ... | @@ -71,6 +76,7 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -71,6 +76,7 @@ public final class OpticalPathIntent extends Intent { |
| 71 | private ConnectPoint dst; | 76 | private ConnectPoint dst; |
| 72 | private Path path; | 77 | private Path path; |
| 73 | private OchSignal lambda; | 78 | private OchSignal lambda; |
| 79 | + private OchSignalType signalType; | ||
| 74 | Key key; | 80 | Key key; |
| 75 | 81 | ||
| 76 | @Override | 82 | @Override |
| ... | @@ -133,6 +139,17 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -133,6 +139,17 @@ public final class OpticalPathIntent extends Intent { |
| 133 | } | 139 | } |
| 134 | 140 | ||
| 135 | /** | 141 | /** |
| 142 | + * Sets the optical signal type for the intent that will be built. | ||
| 143 | + * | ||
| 144 | + * @param signalType the optical signal type | ||
| 145 | + * @return this builder | ||
| 146 | + */ | ||
| 147 | + public Builder signalType(OchSignalType signalType) { | ||
| 148 | + this.signalType = signalType; | ||
| 149 | + return this; | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + /** | ||
| 136 | * Builds an optical path intent from the accumulated parameters. | 153 | * Builds an optical path intent from the accumulated parameters. |
| 137 | * | 154 | * |
| 138 | * @return optical path intent | 155 | * @return optical path intent |
| ... | @@ -146,6 +163,7 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -146,6 +163,7 @@ public final class OpticalPathIntent extends Intent { |
| 146 | dst, | 163 | dst, |
| 147 | path, | 164 | path, |
| 148 | lambda, | 165 | lambda, |
| 166 | + signalType, | ||
| 149 | priority | 167 | priority |
| 150 | ); | 168 | ); |
| 151 | } | 169 | } |
| ... | @@ -168,6 +186,10 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -168,6 +186,10 @@ public final class OpticalPathIntent extends Intent { |
| 168 | return lambda; | 186 | return lambda; |
| 169 | } | 187 | } |
| 170 | 188 | ||
| 189 | + public OchSignalType signalType() { | ||
| 190 | + return signalType; | ||
| 191 | + } | ||
| 192 | + | ||
| 171 | @Override | 193 | @Override |
| 172 | public String toString() { | 194 | public String toString() { |
| 173 | return MoreObjects.toStringHelper(getClass()) | 195 | return MoreObjects.toStringHelper(getClass()) |
| ... | @@ -179,6 +201,7 @@ public final class OpticalPathIntent extends Intent { | ... | @@ -179,6 +201,7 @@ public final class OpticalPathIntent extends Intent { |
| 179 | .add("egressPort", dst) | 201 | .add("egressPort", dst) |
| 180 | .add("path", path) | 202 | .add("path", path) |
| 181 | .add("lambda", lambda) | 203 | .add("lambda", lambda) |
| 204 | + .add("signalType", signalType) | ||
| 182 | .toString(); | 205 | .toString(); |
| 183 | } | 206 | } |
| 184 | } | 207 | } | ... | ... |
| ... | @@ -221,8 +221,8 @@ public class CriteriaTest { | ... | @@ -221,8 +221,8 @@ public class CriteriaTest { |
| 221 | Criterion sameAsMatchLambda1 = Criteria.matchLambda(lambda1); | 221 | Criterion sameAsMatchLambda1 = Criteria.matchLambda(lambda1); |
| 222 | Criterion matchLambda2 = Criteria.matchLambda(lambda2); | 222 | Criterion matchLambda2 = Criteria.matchLambda(lambda2); |
| 223 | 223 | ||
| 224 | - Criterion matchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIX_GRID); | 224 | + Criterion matchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIXED_GRID); |
| 225 | - Criterion sameAsMatchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIX_GRID); | 225 | + Criterion sameAsMatchOchSignalType1 = Criteria.matchOchSignalType(OchSignalType.FIXED_GRID); |
| 226 | Criterion matchOchSignalType2 = Criteria.matchOchSignalType(OchSignalType.FLEX_GRID); | 226 | Criterion matchOchSignalType2 = Criteria.matchOchSignalType(OchSignalType.FLEX_GRID); |
| 227 | 227 | ||
| 228 | Criterion matchIndexedLambda1 = Criteria.matchLambda(Lambda.indexedLambda(1)); | 228 | Criterion matchIndexedLambda1 = Criteria.matchLambda(Lambda.indexedLambda(1)); | ... | ... |
| ... | @@ -18,7 +18,7 @@ package org.onosproject.net.intent; | ... | @@ -18,7 +18,7 @@ package org.onosproject.net.intent; |
| 18 | import org.hamcrest.Matchers; | 18 | import org.hamcrest.Matchers; |
| 19 | import org.junit.Before; | 19 | import org.junit.Before; |
| 20 | import org.junit.Test; | 20 | import org.junit.Test; |
| 21 | -import org.onosproject.net.OchSignal; | 21 | +import org.onosproject.net.OchSignalType; |
| 22 | import org.onosproject.net.Path; | 22 | import org.onosproject.net.Path; |
| 23 | 23 | ||
| 24 | import com.google.common.testing.EqualsTester; | 24 | import com.google.common.testing.EqualsTester; |
| ... | @@ -39,7 +39,6 @@ public class OpticalPathIntentTest extends AbstractIntentTest { | ... | @@ -39,7 +39,6 @@ public class OpticalPathIntentTest extends AbstractIntentTest { |
| 39 | OpticalPathIntent intent1; | 39 | OpticalPathIntent intent1; |
| 40 | OpticalPathIntent intent2; | 40 | OpticalPathIntent intent2; |
| 41 | Path defaultPath; | 41 | Path defaultPath; |
| 42 | - OchSignal lambda; | ||
| 43 | 42 | ||
| 44 | @Before | 43 | @Before |
| 45 | public void opticalPathIntentTestSetUp() { | 44 | public void opticalPathIntentTestSetUp() { |
| ... | @@ -50,6 +49,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { | ... | @@ -50,6 +49,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { |
| 50 | .dst(connectPoint("two", 2)) | 49 | .dst(connectPoint("two", 2)) |
| 51 | .path(defaultPath) | 50 | .path(defaultPath) |
| 52 | .lambda(createLambda()) | 51 | .lambda(createLambda()) |
| 52 | + .signalType(OchSignalType.FIXED_GRID) | ||
| 53 | .priority(PRIORITY) | 53 | .priority(PRIORITY) |
| 54 | .build(); | 54 | .build(); |
| 55 | 55 | ||
| ... | @@ -59,6 +59,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { | ... | @@ -59,6 +59,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { |
| 59 | .dst(connectPoint("one", 2)) | 59 | .dst(connectPoint("one", 2)) |
| 60 | .path(defaultPath) | 60 | .path(defaultPath) |
| 61 | .lambda(createLambda()) | 61 | .lambda(createLambda()) |
| 62 | + .signalType(OchSignalType.FIXED_GRID) | ||
| 62 | .priority(PRIORITY) | 63 | .priority(PRIORITY) |
| 63 | .build(); | 64 | .build(); |
| 64 | } | 65 | } |
| ... | @@ -83,7 +84,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { | ... | @@ -83,7 +84,7 @@ public class OpticalPathIntentTest extends AbstractIntentTest { |
| 83 | } | 84 | } |
| 84 | 85 | ||
| 85 | /** | 86 | /** |
| 86 | - * Checks that the optical path ntent objects are created correctly. | 87 | + * Checks that the optical path intent objects are created correctly. |
| 87 | */ | 88 | */ |
| 88 | @Test | 89 | @Test |
| 89 | public void testContents() { | 90 | public void testContents() { | ... | ... |
| ... | @@ -31,6 +31,7 @@ import org.onosproject.net.GridType; | ... | @@ -31,6 +31,7 @@ import org.onosproject.net.GridType; |
| 31 | import org.onosproject.net.Link; | 31 | import org.onosproject.net.Link; |
| 32 | import org.onosproject.net.OchPort; | 32 | import org.onosproject.net.OchPort; |
| 33 | import org.onosproject.net.OchSignal; | 33 | import org.onosproject.net.OchSignal; |
| 34 | +import org.onosproject.net.OchSignalType; | ||
| 34 | import org.onosproject.net.OmsPort; | 35 | import org.onosproject.net.OmsPort; |
| 35 | import org.onosproject.net.Path; | 36 | import org.onosproject.net.Path; |
| 36 | import org.onosproject.net.Port; | 37 | import org.onosproject.net.Port; |
| ... | @@ -127,6 +128,8 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical | ... | @@ -127,6 +128,8 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical |
| 127 | // Create installable optical path intent | 128 | // Create installable optical path intent |
| 128 | LambdaResourceAllocation lambdaAlloc = getWavelength(path, linkAllocs); | 129 | LambdaResourceAllocation lambdaAlloc = getWavelength(path, linkAllocs); |
| 129 | OchSignal ochSignal = getOchSignal(lambdaAlloc, omsPort.minFrequency(), omsPort.grid()); | 130 | OchSignal ochSignal = getOchSignal(lambdaAlloc, omsPort.minFrequency(), omsPort.grid()); |
| 131 | + // Only support fixed grid for now | ||
| 132 | + OchSignalType signalType = OchSignalType.FIXED_GRID; | ||
| 130 | 133 | ||
| 131 | Intent newIntent = OpticalPathIntent.builder() | 134 | Intent newIntent = OpticalPathIntent.builder() |
| 132 | .appId(intent.appId()) | 135 | .appId(intent.appId()) |
| ... | @@ -134,6 +137,7 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical | ... | @@ -134,6 +137,7 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical |
| 134 | .dst(intent.getDst()) | 137 | .dst(intent.getDst()) |
| 135 | .path(path) | 138 | .path(path) |
| 136 | .lambda(ochSignal) | 139 | .lambda(ochSignal) |
| 140 | + .signalType(signalType) | ||
| 137 | .build(); | 141 | .build(); |
| 138 | 142 | ||
| 139 | return ImmutableList.of(newIntent); | 143 | return ImmutableList.of(newIntent); | ... | ... |
| ... | @@ -103,6 +103,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte | ... | @@ -103,6 +103,7 @@ public class OpticalPathIntentCompiler implements IntentCompiler<OpticalPathInte |
| 103 | current = link.dst(); | 103 | current = link.dst(); |
| 104 | selectorBuilder.matchInPort(link.dst().port()); | 104 | selectorBuilder.matchInPort(link.dst().port()); |
| 105 | selectorBuilder.add(Criteria.matchLambda(intent.lambda())); | 105 | selectorBuilder.add(Criteria.matchLambda(intent.lambda())); |
| 106 | + selectorBuilder.add(Criteria.matchOchSignalType(intent.signalType())); | ||
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | // Build the egress ROADM rule | 109 | // Build the egress ROADM rule | ... | ... |
| ... | @@ -26,6 +26,7 @@ import org.onosproject.net.ConnectPoint; | ... | @@ -26,6 +26,7 @@ import org.onosproject.net.ConnectPoint; |
| 26 | import org.onosproject.net.DefaultLink; | 26 | import org.onosproject.net.DefaultLink; |
| 27 | import org.onosproject.net.DefaultPath; | 27 | import org.onosproject.net.DefaultPath; |
| 28 | import org.onosproject.net.Link; | 28 | import org.onosproject.net.Link; |
| 29 | +import org.onosproject.net.OchSignalType; | ||
| 29 | import org.onosproject.net.flow.DefaultTrafficSelector; | 30 | import org.onosproject.net.flow.DefaultTrafficSelector; |
| 30 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 31 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| 31 | import org.onosproject.net.flow.FlowRule; | 32 | import org.onosproject.net.flow.FlowRule; |
| ... | @@ -95,6 +96,7 @@ public class OpticalPathIntentCompilerTest { | ... | @@ -95,6 +96,7 @@ public class OpticalPathIntentCompilerTest { |
| 95 | .dst(d3p1) | 96 | .dst(d3p1) |
| 96 | .path(new DefaultPath(PID, links, hops)) | 97 | .path(new DefaultPath(PID, links, hops)) |
| 97 | .lambda(createLambda()) | 98 | .lambda(createLambda()) |
| 99 | + .signalType(OchSignalType.FIXED_GRID) | ||
| 98 | .build(); | 100 | .build(); |
| 99 | intentExtensionService = createMock(IntentExtensionService.class); | 101 | intentExtensionService = createMock(IntentExtensionService.class); |
| 100 | intentExtensionService.registerCompiler(OpticalPathIntent.class, sut); | 102 | intentExtensionService.registerCompiler(OpticalPathIntent.class, sut); | ... | ... |
| ... | @@ -24,62 +24,30 @@ import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotSta | ... | @@ -24,62 +24,30 @@ import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotSta |
| 24 | import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus; | 24 | import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus; |
| 25 | import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply; | 25 | import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply; |
| 26 | import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest; | 26 | import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest; |
| 27 | -import org.projectfloodlight.openflow.protocol.OFFactories; | ||
| 28 | -import org.projectfloodlight.openflow.protocol.OFFactory; | ||
| 29 | -import org.projectfloodlight.openflow.protocol.OFFlowMod; | ||
| 30 | -import org.projectfloodlight.openflow.protocol.OFFlowModCommand; | ||
| 31 | -import org.projectfloodlight.openflow.protocol.OFInstructionType; | ||
| 32 | import org.projectfloodlight.openflow.protocol.OFMessage; | 27 | import org.projectfloodlight.openflow.protocol.OFMessage; |
| 33 | import org.projectfloodlight.openflow.protocol.OFObject; | 28 | import org.projectfloodlight.openflow.protocol.OFObject; |
| 34 | import org.projectfloodlight.openflow.protocol.OFPortDesc; | 29 | import org.projectfloodlight.openflow.protocol.OFPortDesc; |
| 35 | import org.projectfloodlight.openflow.protocol.OFStatsReply; | 30 | import org.projectfloodlight.openflow.protocol.OFStatsReply; |
| 36 | import org.projectfloodlight.openflow.protocol.OFStatsType; | 31 | import org.projectfloodlight.openflow.protocol.OFStatsType; |
| 37 | -import org.projectfloodlight.openflow.protocol.OFType; | ||
| 38 | -import org.projectfloodlight.openflow.protocol.OFVersion; | ||
| 39 | -import org.projectfloodlight.openflow.protocol.action.OFAction; | ||
| 40 | -import org.projectfloodlight.openflow.protocol.action.OFActionCircuit; | ||
| 41 | -import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; | ||
| 42 | -import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions; | ||
| 43 | -import org.projectfloodlight.openflow.protocol.match.Match; | ||
| 44 | -import org.projectfloodlight.openflow.protocol.match.MatchField; | ||
| 45 | -import org.projectfloodlight.openflow.protocol.OFActionType; | ||
| 46 | -import org.projectfloodlight.openflow.types.CircuitSignalID; | ||
| 47 | -import org.projectfloodlight.openflow.types.OFPort; | ||
| 48 | -import org.projectfloodlight.openflow.types.U8; | ||
| 49 | 32 | ||
| 50 | import com.google.common.collect.ImmutableList; | 33 | import com.google.common.collect.ImmutableList; |
| 51 | import com.google.common.collect.ImmutableSet; | 34 | import com.google.common.collect.ImmutableSet; |
| 52 | 35 | ||
| 53 | import java.io.IOException; | 36 | import java.io.IOException; |
| 54 | -import java.util.Collections; | ||
| 55 | import java.util.List; | 37 | import java.util.List; |
| 56 | -import java.util.Map; | ||
| 57 | -import java.util.ArrayList; | ||
| 58 | import java.util.Set; | 38 | import java.util.Set; |
| 59 | -import java.util.BitSet; | ||
| 60 | -import java.util.stream.Collectors; | ||
| 61 | import java.util.concurrent.atomic.AtomicBoolean; | 39 | import java.util.concurrent.atomic.AtomicBoolean; |
| 62 | -import java.util.concurrent.ConcurrentMap; | ||
| 63 | -import java.util.concurrent.ConcurrentHashMap; | ||
| 64 | - | ||
| 65 | -import static org.projectfloodlight.openflow.protocol.OFFlowMod.Builder; | ||
| 66 | 40 | ||
| 67 | /** | 41 | /** |
| 68 | * LINC-OE Optical Emulator switch class. | 42 | * LINC-OE Optical Emulator switch class. |
| 69 | */ | 43 | */ |
| 70 | public class OFOpticalSwitchImplLINC13 | 44 | public class OFOpticalSwitchImplLINC13 |
| 71 | extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch { | 45 | extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch { |
| 72 | - // default number of lambdas, assuming 50GHz channels. | ||
| 73 | - private static final int NUM_CHLS = 80; | ||
| 74 | - private final OFFactory factory = OFFactories.getFactory(OFVersion.OF_13); | ||
| 75 | 46 | ||
| 76 | private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false); | 47 | private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false); |
| 77 | private long barrierXidToWaitFor = -1; | 48 | private long barrierXidToWaitFor = -1; |
| 78 | 49 | ||
| 79 | private OFCircuitPortsReply wPorts; | 50 | private OFCircuitPortsReply wPorts; |
| 80 | - // book-keeping maps for allocated Linc-OE lambdas | ||
| 81 | - protected final ConcurrentMap<OFPort, BitSet> portChannelMap = new ConcurrentHashMap<>(); | ||
| 82 | - protected final ConcurrentMap<Match, Integer> matchMap = new ConcurrentHashMap<>(); | ||
| 83 | 51 | ||
| 84 | @Override | 52 | @Override |
| 85 | public void startDriverHandshake() { | 53 | public void startDriverHandshake() { |
| ... | @@ -201,139 +169,4 @@ public class OFOpticalSwitchImplLINC13 | ... | @@ -201,139 +169,4 @@ public class OFOpticalSwitchImplLINC13 |
| 201 | public Set<PortDescPropertyType> getPortTypes() { | 169 | public Set<PortDescPropertyType> getPortTypes() { |
| 202 | return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT); | 170 | return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT); |
| 203 | } | 171 | } |
| 204 | - | ||
| 205 | - @Override | ||
| 206 | - public OFMessage prepareMessage(OFMessage msg) { | ||
| 207 | - if (OFVersion.OF_13 != msg.getVersion() || msg.getType() != OFType.FLOW_MOD) { | ||
| 208 | - return msg; | ||
| 209 | - } | ||
| 210 | - OFFlowMod fm = (OFFlowMod) msg; | ||
| 211 | - Match match = fm.getMatch(); | ||
| 212 | - // Don't touch FlowMods that aren't Optical-related. | ||
| 213 | - if (match.get(MatchField.OCH_SIGTYPE) == null) { | ||
| 214 | - return msg; | ||
| 215 | - } | ||
| 216 | - | ||
| 217 | - OFMessage newFM; | ||
| 218 | - Builder builder = null; | ||
| 219 | - List<OFAction> actions = new ArrayList<>(); | ||
| 220 | - if (fm.getCommand() == OFFlowModCommand.ADD) { | ||
| 221 | - builder = factory.buildFlowAdd(); | ||
| 222 | - int lambda = allocateLambda(match.get(MatchField.IN_PORT), match); | ||
| 223 | - CircuitSignalID sigid = new CircuitSignalID((byte) 1, (byte) 2, (short) lambda, (short) 1); | ||
| 224 | - List<OFInstruction> instructions = fm.getInstructions(); | ||
| 225 | - | ||
| 226 | - newFM = buildFlowMod(builder, fm, buildMatch(match, sigid), buildActions(instructions, sigid)); | ||
| 227 | - } else if (fm.getCommand() == OFFlowModCommand.DELETE) { | ||
| 228 | - builder = factory.buildFlowDelete(); | ||
| 229 | - int lambda = freeLambda(match.get(MatchField.IN_PORT), match); | ||
| 230 | - CircuitSignalID sigid = new CircuitSignalID((byte) 1, (byte) 2, (short) lambda, (short) 1); | ||
| 231 | - | ||
| 232 | - newFM = buildFlowMod(builder, fm, buildMatch(match, sigid), actions); | ||
| 233 | - } else { | ||
| 234 | - newFM = msg; | ||
| 235 | - } | ||
| 236 | - log.debug("new FM = {}", newFM); | ||
| 237 | - return newFM; | ||
| 238 | - } | ||
| 239 | - | ||
| 240 | - // fetch the next available channel as the flat lambda value, or the lambda | ||
| 241 | - // associated with a port/match combination | ||
| 242 | - private int allocateLambda(OFPort port, Match match) { | ||
| 243 | - Integer lambda = null; | ||
| 244 | - synchronized (this) { | ||
| 245 | - BitSet channels = portChannelMap.getOrDefault(port, new BitSet(NUM_CHLS + 1)); | ||
| 246 | - lambda = matchMap.get(match); | ||
| 247 | - if (lambda == null) { | ||
| 248 | - // TODO : double check behavior when bitset is full | ||
| 249 | - // Linc lambdas start at 1. | ||
| 250 | - lambda = channels.nextClearBit(1); | ||
| 251 | - channels.set(lambda); | ||
| 252 | - portChannelMap.put(port, channels); | ||
| 253 | - matchMap.put(match, lambda); | ||
| 254 | - } | ||
| 255 | - } | ||
| 256 | - return lambda; | ||
| 257 | - } | ||
| 258 | - | ||
| 259 | - // free lambda that was mapped to Port/Match combination and return its | ||
| 260 | - // value to caller. | ||
| 261 | - private int freeLambda(OFPort port, Match match) { | ||
| 262 | - synchronized (this) { | ||
| 263 | - Integer lambda = matchMap.get(match); | ||
| 264 | - if (lambda != null) { | ||
| 265 | - portChannelMap.get(port).clear(lambda); | ||
| 266 | - return lambda; | ||
| 267 | - } | ||
| 268 | - // 1 is a sane-ish default for Linc. | ||
| 269 | - return 1; | ||
| 270 | - } | ||
| 271 | - } | ||
| 272 | - | ||
| 273 | - // build matches - *tons of assumptions are made here based on Linc-OE's behavior.* | ||
| 274 | - // gridType = 1 (DWDM) | ||
| 275 | - // channelSpacing = 2 (50GHz) | ||
| 276 | - // spectralWidth = 1 (fixed grid default value) | ||
| 277 | - private Match buildMatch(Match original, CircuitSignalID sigid) { | ||
| 278 | - Match.Builder mBuilder = factory.buildMatch(); | ||
| 279 | - | ||
| 280 | - original.getMatchFields().forEach(mf -> { | ||
| 281 | - String name = mf.getName(); | ||
| 282 | - if (MatchField.OCH_SIGID.getName().equals(name)) { | ||
| 283 | - mBuilder.setExact(MatchField.OCH_SIGID, sigid); | ||
| 284 | - } else if (MatchField.OCH_SIGTYPE.getName().equals(name)) { | ||
| 285 | - mBuilder.setExact(MatchField.OCH_SIGTYPE, U8.of((short) 1)); | ||
| 286 | - } else if (MatchField.IN_PORT.getName().equals(name)) { | ||
| 287 | - mBuilder.setExact(MatchField.IN_PORT, original.get(MatchField.IN_PORT)); | ||
| 288 | - } | ||
| 289 | - }); | ||
| 290 | - | ||
| 291 | - return mBuilder.build(); | ||
| 292 | - } | ||
| 293 | - | ||
| 294 | - private List<OFAction> buildActions(List<OFInstruction> iList, CircuitSignalID sigid) { | ||
| 295 | - Map<OFInstructionType, OFInstruction> instructions = iList.stream() | ||
| 296 | - .collect(Collectors.toMap(OFInstruction::getType, inst -> inst)); | ||
| 297 | - | ||
| 298 | - OFInstruction inst = instructions.get(OFInstructionType.APPLY_ACTIONS); | ||
| 299 | - if (inst == null) { | ||
| 300 | - return Collections.emptyList(); | ||
| 301 | - } | ||
| 302 | - | ||
| 303 | - List<OFAction> actions = new ArrayList<>(); | ||
| 304 | - OFInstructionApplyActions iaa = (OFInstructionApplyActions) inst; | ||
| 305 | - if (iaa.getActions() == null) { | ||
| 306 | - return actions; | ||
| 307 | - } | ||
| 308 | - iaa.getActions().forEach(action -> { | ||
| 309 | - if (OFActionType.EXPERIMENTER == action.getType()) { | ||
| 310 | - OFActionCircuit.Builder cBuilder = factory.actions().buildCircuit() | ||
| 311 | - .setField(factory.oxms() | ||
| 312 | - .buildOchSigid() | ||
| 313 | - .setValue(sigid) | ||
| 314 | - .build()); | ||
| 315 | - actions.add(cBuilder.build()); | ||
| 316 | - } else { | ||
| 317 | - actions.add(action); | ||
| 318 | - } | ||
| 319 | - }); | ||
| 320 | - return actions; | ||
| 321 | - } | ||
| 322 | - | ||
| 323 | - private OFMessage buildFlowMod(Builder builder, OFFlowMod fm, Match m, List<OFAction> act) { | ||
| 324 | - return builder | ||
| 325 | - .setXid(fm.getXid()) | ||
| 326 | - .setCookie(fm.getCookie()) | ||
| 327 | - .setCookieMask(fm.getCookieMask()) | ||
| 328 | - .setTableId(fm.getTableId()) | ||
| 329 | - .setIdleTimeout(fm.getIdleTimeout()) | ||
| 330 | - .setHardTimeout(fm.getHardTimeout()) | ||
| 331 | - .setBufferId(fm.getBufferId()) | ||
| 332 | - .setOutPort(fm.getOutPort()) | ||
| 333 | - .setOutGroup(fm.getOutGroup()) | ||
| 334 | - .setFlags(fm.getFlags()) | ||
| 335 | - .setMatch(m) | ||
| 336 | - .setActions(act) | ||
| 337 | - .build(); | ||
| 338 | - } | ||
| 339 | } | 172 | } | ... | ... |
| ... | @@ -148,16 +148,4 @@ public interface OpenFlowSwitch { | ... | @@ -148,16 +148,4 @@ public interface OpenFlowSwitch { |
| 148 | * @return string representation of the connection to the device | 148 | * @return string representation of the connection to the device |
| 149 | */ | 149 | */ |
| 150 | String channelId(); | 150 | String channelId(); |
| 151 | - | ||
| 152 | - /** | ||
| 153 | - * Prepares a message to be sent, if necessary. Default is to do nothing, | ||
| 154 | - * since most Devices do not need to pre-process a message that's about to | ||
| 155 | - * be sent. | ||
| 156 | - * | ||
| 157 | - * @param msg The message to prepare for sending | ||
| 158 | - * @return the prepared OFMessage | ||
| 159 | - */ | ||
| 160 | - default OFMessage prepareMessage(OFMessage msg) { | ||
| 161 | - return msg; | ||
| 162 | - } | ||
| 163 | } | 151 | } | ... | ... |
| ... | @@ -97,7 +97,7 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour | ... | @@ -97,7 +97,7 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour |
| 97 | @Override | 97 | @Override |
| 98 | public final void sendMsg(OFMessage m) { | 98 | public final void sendMsg(OFMessage m) { |
| 99 | if (role == RoleState.MASTER && channel.isWritable()) { | 99 | if (role == RoleState.MASTER && channel.isWritable()) { |
| 100 | - channel.write(Collections.singletonList(prepareMessage(m))); | 100 | + channel.write(Collections.singletonList(m)); |
| 101 | } | 101 | } |
| 102 | } | 102 | } |
| 103 | 103 | ... | ... |
| ... | @@ -40,7 +40,7 @@ import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion; | ... | @@ -40,7 +40,7 @@ import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion; |
| 40 | import org.onosproject.net.flow.criteria.MetadataCriterion; | 40 | import org.onosproject.net.flow.criteria.MetadataCriterion; |
| 41 | import org.onosproject.net.flow.criteria.MplsCriterion; | 41 | import org.onosproject.net.flow.criteria.MplsCriterion; |
| 42 | import org.onosproject.net.flow.criteria.OchSignalCriterion; | 42 | import org.onosproject.net.flow.criteria.OchSignalCriterion; |
| 43 | -import org.onosproject.net.flow.criteria.OpticalSignalTypeCriterion; | 43 | +import org.onosproject.net.flow.criteria.OchSignalTypeCriterion; |
| 44 | import org.onosproject.net.flow.criteria.PortCriterion; | 44 | import org.onosproject.net.flow.criteria.PortCriterion; |
| 45 | import org.onosproject.net.flow.criteria.SctpPortCriterion; | 45 | import org.onosproject.net.flow.criteria.SctpPortCriterion; |
| 46 | import org.onosproject.net.flow.criteria.TcpPortCriterion; | 46 | import org.onosproject.net.flow.criteria.TcpPortCriterion; |
| ... | @@ -388,10 +388,9 @@ public abstract class FlowModBuilder { | ... | @@ -388,10 +388,9 @@ public abstract class FlowModBuilder { |
| 388 | } | 388 | } |
| 389 | break; | 389 | break; |
| 390 | case OCH_SIGTYPE: | 390 | case OCH_SIGTYPE: |
| 391 | - OpticalSignalTypeCriterion sc = | 391 | + OchSignalTypeCriterion sc = (OchSignalTypeCriterion) c; |
| 392 | - (OpticalSignalTypeCriterion) c; | 392 | + byte signalType = FlowModBuilderHelper.convertOchSignalType(sc.signalType()); |
| 393 | - mBuilder.setExact(MatchField.OCH_SIGTYPE, | 393 | + mBuilder.setExact(MatchField.OCH_SIGTYPE, U8.of(signalType)); |
| 394 | - U8.of(sc.signalType())); | ||
| 395 | break; | 394 | break; |
| 396 | case ARP_OP: | 395 | case ARP_OP: |
| 397 | case ARP_SHA: | 396 | case ARP_SHA: | ... | ... |
| ... | @@ -17,6 +17,7 @@ package org.onosproject.provider.of.flow.impl; | ... | @@ -17,6 +17,7 @@ package org.onosproject.provider.of.flow.impl; |
| 17 | 17 | ||
| 18 | import org.onosproject.net.ChannelSpacing; | 18 | import org.onosproject.net.ChannelSpacing; |
| 19 | import org.onosproject.net.GridType; | 19 | import org.onosproject.net.GridType; |
| 20 | +import org.onosproject.net.OchSignalType; | ||
| 20 | import org.slf4j.Logger; | 21 | import org.slf4j.Logger; |
| 21 | import org.slf4j.LoggerFactory; | 22 | import org.slf4j.LoggerFactory; |
| 22 | 23 | ||
| ... | @@ -87,4 +88,22 @@ final class FlowModBuilderHelper { | ... | @@ -87,4 +88,22 @@ final class FlowModBuilderHelper { |
| 87 | throw new UnsupportedChannelSpacingException(spacing); | 88 | throw new UnsupportedChannelSpacingException(spacing); |
| 88 | } | 89 | } |
| 89 | } | 90 | } |
| 91 | + | ||
| 92 | + /** | ||
| 93 | + * Converts a {@link OchSignalType} to the corresponding byte value. | ||
| 94 | + * | ||
| 95 | + * @param signalType optical signal type | ||
| 96 | + * @return byte value corresponding to the specified OCh signal type | ||
| 97 | + */ | ||
| 98 | + static byte convertOchSignalType(OchSignalType signalType) { | ||
| 99 | + switch (signalType) { | ||
| 100 | + case FIXED_GRID: | ||
| 101 | + return (byte) 1; | ||
| 102 | + case FLEX_GRID: | ||
| 103 | + return (byte) 2; | ||
| 104 | + default: | ||
| 105 | + log.info("OchSignalType {} is not supported", signalType); | ||
| 106 | + return (byte) 0; | ||
| 107 | + } | ||
| 108 | + } | ||
| 90 | } | 109 | } | ... | ... |
| ... | @@ -67,7 +67,7 @@ from mininet.link import Link, Intf | ... | @@ -67,7 +67,7 @@ from mininet.link import Link, Intf |
| 67 | from mininet.cli import CLI | 67 | from mininet.cli import CLI |
| 68 | 68 | ||
| 69 | # Sleep time and timeout values in seconds | 69 | # Sleep time and timeout values in seconds |
| 70 | -SLEEP_TIME = .5 | 70 | +SLEEP_TIME = 2 |
| 71 | TIMEOUT = 60 | 71 | TIMEOUT = 60 |
| 72 | 72 | ||
| 73 | class OpticalSwitch(Switch): | 73 | class OpticalSwitch(Switch): | ... | ... |
-
Please register or login to post a comment