Marc De Leenheer

Support lambda's in selector & treatment

1 +package org.onlab.onos.optical.testapp;
2 +
3 +import static org.slf4j.LoggerFactory.getLogger;
4 +
5 +import java.util.HashMap;
6 +import java.util.Map;
7 +
8 +import org.apache.felix.scr.annotations.Activate;
9 +import org.apache.felix.scr.annotations.Component;
10 +import org.apache.felix.scr.annotations.Deactivate;
11 +import org.apache.felix.scr.annotations.Reference;
12 +import org.apache.felix.scr.annotations.ReferenceCardinality;
13 +import org.onlab.onos.ApplicationId;
14 +import org.onlab.onos.CoreService;
15 +import org.onlab.onos.net.Device;
16 +import org.onlab.onos.net.DeviceId;
17 +import org.onlab.onos.net.PortNumber;
18 +import org.onlab.onos.net.device.DeviceEvent;
19 +import org.onlab.onos.net.device.DeviceListener;
20 +import org.onlab.onos.net.device.DeviceService;
21 +import org.onlab.onos.net.flow.DefaultFlowRule;
22 +import org.onlab.onos.net.flow.DefaultTrafficSelector;
23 +import org.onlab.onos.net.flow.DefaultTrafficTreatment;
24 +import org.onlab.onos.net.flow.FlowRule;
25 +import org.onlab.onos.net.flow.FlowRuleService;
26 +import org.onlab.onos.net.flow.TrafficSelector;
27 +import org.onlab.onos.net.flow.TrafficTreatment;
28 +import org.slf4j.Logger;
29 +
30 +/**
31 + * Sample reactive forwarding application.
32 + */
33 +@Component(immediate = true)
34 +public class LambdaForwarding {
35 +
36 + private final Logger log = getLogger(getClass());
37 +
38 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
39 + protected FlowRuleService flowRuleService;
40 +
41 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
42 + protected CoreService coreService;
43 +
44 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
45 + protected DeviceService deviceService;
46 +
47 + private ApplicationId appId;
48 +
49 + private final InternalDeviceListener listener = new InternalDeviceListener();
50 +
51 + private final Map<DeviceId, Integer> uglyMap = new HashMap<>();
52 +
53 + @Activate
54 + public void activate() {
55 + appId = coreService.registerApplication("org.onlab.onos.fwd");
56 +
57 + deviceService.addListener(listener);
58 +
59 + uglyMap.put(DeviceId.deviceId("of:0000ffffffffff01"), 1);
60 + uglyMap.put(DeviceId.deviceId("of:0000ffffffffff02"), 2);
61 + uglyMap.put(DeviceId.deviceId("of:0000ffffffffff03"), 3);
62 +
63 + log.info("Started with Application ID {}", appId.id());
64 + }
65 +
66 + @Deactivate
67 + public void deactivate() {
68 + flowRuleService.removeFlowRulesById(appId);
69 +
70 + log.info("Stopped");
71 + }
72 +
73 +
74 + private void pushRules(Device device) {
75 +
76 + TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
77 + TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
78 + int inport;
79 + int outport;
80 + short lambda = 10;
81 +
82 + int switchNumber = uglyMap.get(device.id());
83 + switch (switchNumber) {
84 + case 1:
85 + inport = 10;
86 + outport = 20;
87 + sbuilder.matchInport(PortNumber.portNumber(inport));
88 + tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
89 + break;
90 + case 2:
91 + inport = 21;
92 + outport = 11;
93 + sbuilder.matchLambda(lambda).matchInport(PortNumber.portNumber(inport)); // match sigtype
94 + tbuilder.setOutput(PortNumber.portNumber(outport));
95 + break;
96 + case 3:
97 + inport = 30;
98 + outport = 31;
99 + sbuilder.matchLambda(lambda).matchInport(PortNumber.portNumber(inport));
100 + tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda);
101 + break;
102 + default:
103 + }
104 + sbuilder.matchLambda((short) 25).matchInport(PortNumber.portNumber(5));
105 +
106 + tbuilder.setOutput(PortNumber.portNumber(5));
107 +
108 + TrafficTreatment treatement = tbuilder.build();
109 + TrafficSelector selector = sbuilder.build();
110 +
111 + FlowRule f = new DefaultFlowRule(device.id(), selector,
112 + treatement, 100, appId, 600, false);
113 +
114 + flowRuleService.applyFlowRules(f);
115 +
116 +
117 +
118 + }
119 +
120 + public class InternalDeviceListener implements DeviceListener {
121 +
122 + @Override
123 + public void event(DeviceEvent event) {
124 + switch (event.type()) {
125 + case DEVICE_ADDED:
126 + pushRules(event.subject());
127 + break;
128 + case DEVICE_AVAILABILITY_CHANGED:
129 + break;
130 + case DEVICE_MASTERSHIP_CHANGED:
131 + break;
132 + case DEVICE_REMOVED:
133 + break;
134 + case DEVICE_SUSPENDED:
135 + break;
136 + case DEVICE_UPDATED:
137 + break;
138 + case PORT_ADDED:
139 + break;
140 + case PORT_REMOVED:
141 + break;
142 + case PORT_UPDATED:
143 + break;
144 + default:
145 + break;
146 +
147 + }
148 +
149 + }
150 +
151 + }
152 +
153 +
154 +}
155 +
156 +
...@@ -176,6 +176,11 @@ public final class DefaultTrafficSelector implements TrafficSelector { ...@@ -176,6 +176,11 @@ public final class DefaultTrafficSelector implements TrafficSelector {
176 } 176 }
177 177
178 @Override 178 @Override
179 + public Builder matchLambda(short lambda) {
180 + return add(Criteria.matchLambda(lambda));
181 + }
182 +
183 + @Override
179 public TrafficSelector build() { 184 public TrafficSelector build() {
180 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values())); 185 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
181 } 186 }
......
...@@ -137,6 +137,7 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { ...@@ -137,6 +137,7 @@ public final class DefaultTrafficTreatment implements TrafficTreatment {
137 case OUTPUT: 137 case OUTPUT:
138 outputs.add(instruction); 138 outputs.add(instruction);
139 break; 139 break;
140 + case L0MODIFICATION:
140 case L2MODIFICATION: 141 case L2MODIFICATION:
141 case L3MODIFICATION: 142 case L3MODIFICATION:
142 // TODO: enforce modification order if any 143 // TODO: enforce modification order if any
...@@ -193,6 +194,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { ...@@ -193,6 +194,11 @@ public final class DefaultTrafficTreatment implements TrafficTreatment {
193 } 194 }
194 195
195 @Override 196 @Override
197 + public Builder setLambda(short lambda) {
198 + return add(Instructions.modL0Lambda(lambda));
199 + }
200 +
201 + @Override
196 public TrafficTreatment build() { 202 public TrafficTreatment build() {
197 203
198 //If we are dropping should we just return an emptry list? 204 //If we are dropping should we just return an emptry list?
......
...@@ -130,6 +130,13 @@ public interface TrafficSelector { ...@@ -130,6 +130,13 @@ public interface TrafficSelector {
130 public Builder matchTcpDst(Short tcpPort); 130 public Builder matchTcpDst(Short tcpPort);
131 131
132 /** 132 /**
133 + * Matches an optical signal ID or lambda.
134 + * @param lambda
135 + * @return a selection builder
136 + */
137 + public Builder matchLambda(short lambda);
138 +
139 + /**
133 * Builds an immutable traffic selector. 140 * Builds an immutable traffic selector.
134 * 141 *
135 * @return traffic selector 142 * @return traffic selector
......
...@@ -105,6 +105,13 @@ public interface TrafficTreatment { ...@@ -105,6 +105,13 @@ public interface TrafficTreatment {
105 public Builder setIpDst(IpPrefix addr); 105 public Builder setIpDst(IpPrefix addr);
106 106
107 /** 107 /**
108 + * Sets the optical channel ID or lambda.
109 + * @param lambda optical channel ID
110 + * @return a treatment builder
111 + */
112 + public Builder setLambda(short lambda);
113 +
114 + /**
108 * Builds an immutable traffic treatment descriptor. 115 * Builds an immutable traffic treatment descriptor.
109 * 116 *
110 * @return traffic treatment 117 * @return traffic treatment
......
...@@ -151,10 +151,19 @@ public final class Criteria { ...@@ -151,10 +151,19 @@ public final class Criteria {
151 return new TcpPortCriterion(tcpPort, Type.TCP_DST); 151 return new TcpPortCriterion(tcpPort, Type.TCP_DST);
152 } 152 }
153 153
154 - /* 154 + /**
155 - * Implementations of criteria. 155 + * Creates a match on lambda field using the specified value.
156 + *
157 + * @param lambda
158 + * @return match criterion
156 */ 159 */
160 + public static Criterion matchLambda(Short lambda) {
161 + return new LambdaCriterion(lambda, Type.OCH_SIGID);
162 + }
157 163
164 + /**
165 + * Implementations of criteria.
166 + */
158 public static final class PortCriterion implements Criterion { 167 public static final class PortCriterion implements Criterion {
159 private final PortNumber port; 168 private final PortNumber port;
160 169
...@@ -523,4 +532,49 @@ public final class Criteria { ...@@ -523,4 +532,49 @@ public final class Criteria {
523 return false; 532 return false;
524 } 533 }
525 } 534 }
535 +
536 + public static final class LambdaCriterion implements Criterion {
537 +
538 + private final short lambda;
539 + private final Type type;
540 +
541 + public LambdaCriterion(short lambda, Type type) {
542 + this.lambda = lambda;
543 + this.type = type;
544 + }
545 +
546 + @Override
547 + public Type type() {
548 + return this.type;
549 + }
550 +
551 + public Short lambda() {
552 + return this.lambda;
553 + }
554 +
555 + @Override
556 + public String toString() {
557 + return toStringHelper(type().toString())
558 + .add("lambda", lambda).toString();
559 + }
560 +
561 + @Override
562 + public int hashCode() {
563 + return Objects.hash(lambda, type);
564 + }
565 +
566 + @Override
567 + public boolean equals(Object obj) {
568 + if (this == obj) {
569 + return true;
570 + }
571 + if (obj instanceof LambdaCriterion) {
572 + LambdaCriterion that = (LambdaCriterion) obj;
573 + return Objects.equals(lambda, that.lambda) &&
574 + Objects.equals(type, that.type);
575 + }
576 + return false;
577 + }
578 + }
579 +
526 } 580 }
......
...@@ -108,7 +108,11 @@ public interface Criterion { ...@@ -108,7 +108,11 @@ public interface Criterion {
108 /** Logical Port Metadata. */ 108 /** Logical Port Metadata. */
109 TUNNEL_ID, 109 TUNNEL_ID,
110 /** IPv6 Extension Header pseudo-field. */ 110 /** IPv6 Extension Header pseudo-field. */
111 - IPV6_EXTHDR 111 + IPV6_EXTHDR,
112 + /** Optical channel signal ID (lambda). */
113 + OCH_SIGID,
114 + /** Optical channel signal type (fixed or flexible). */
115 + OCH_SIGTYPE
112 } 116 }
113 117
114 /** 118 /**
......
...@@ -43,6 +43,11 @@ public interface Instruction { ...@@ -43,6 +43,11 @@ public interface Instruction {
43 GROUP, 43 GROUP,
44 44
45 /** 45 /**
46 + * Signifies that the traffic should be modified in L0 way.
47 + */
48 + L0MODIFICATION,
49 +
50 + /**
46 * Signifies that the traffic should be modified in L2 way. 51 * Signifies that the traffic should be modified in L2 way.
47 */ 52 */
48 L2MODIFICATION, 53 L2MODIFICATION,
......
...@@ -24,6 +24,8 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -24,6 +24,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
24 import java.util.Objects; 24 import java.util.Objects;
25 25
26 import org.onlab.onos.net.PortNumber; 26 import org.onlab.onos.net.PortNumber;
27 +import org.onlab.onos.net.flow.instructions.L0ModificationInstruction.L0SubType;
28 +import org.onlab.onos.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
27 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.L2SubType; 29 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.L2SubType;
28 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; 30 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
29 import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.L3SubType; 31 import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.L3SubType;
...@@ -62,6 +64,16 @@ public final class Instructions { ...@@ -62,6 +64,16 @@ public final class Instructions {
62 } 64 }
63 65
64 /** 66 /**
67 + * Creates a l0 modification.
68 + * @param lambda the lambda to modify to.
69 + * @return a l0 modification
70 + */
71 + public static L0ModificationInstruction modL0Lambda(short lambda) {
72 + checkNotNull(lambda, "L0 lambda cannot be null");
73 + return new ModLambdaInstruction(L0SubType.LAMBDA, lambda);
74 + }
75 +
76 + /**
65 * Creates a l2 src modification. 77 * Creates a l2 src modification.
66 * @param addr the mac address to modify to. 78 * @param addr the mac address to modify to.
67 * @return a l2 modification 79 * @return a l2 modification
......
1 +package org.onlab.onos.net.flow.instructions;
2 +
3 +import static com.google.common.base.MoreObjects.toStringHelper;
4 +
5 +import java.util.Objects;
6 +
7 +public abstract class L0ModificationInstruction implements Instruction {
8 +
9 + /**
10 + * Represents the type of traffic treatment.
11 + */
12 + public enum L0SubType {
13 + /**
14 + * Lambda modification.
15 + */
16 + LAMBDA
17 +
18 + //TODO: remaining types
19 + }
20 +
21 + public abstract L0SubType subtype();
22 +
23 + @Override
24 + public Type type() {
25 + return Type.L0MODIFICATION;
26 + }
27 +
28 + /**
29 + * Represents a L0 lambda modification instruction.
30 + */
31 + public static final class ModLambdaInstruction extends L0ModificationInstruction {
32 +
33 + private final L0SubType subtype;
34 + private final short lambda;
35 +
36 + public ModLambdaInstruction(L0SubType subType, short lambda) {
37 + this.subtype = subType;
38 + this.lambda = lambda;
39 + }
40 +
41 + @Override
42 + public L0SubType subtype() {
43 + return this.subtype;
44 + }
45 +
46 + public short lambda() {
47 + return this.lambda;
48 + }
49 +
50 + @Override
51 + public String toString() {
52 + return toStringHelper(subtype().toString())
53 + .add("lambda", lambda).toString();
54 + }
55 +
56 + @Override
57 + public int hashCode() {
58 + return Objects.hash(lambda, type(), subtype);
59 + }
60 +
61 + @Override
62 + public boolean equals(Object obj) {
63 + if (this == obj) {
64 + return true;
65 + }
66 + if (obj instanceof ModLambdaInstruction) {
67 + ModLambdaInstruction that = (ModLambdaInstruction) obj;
68 + return Objects.equals(lambda, that.lambda) &&
69 + Objects.equals(this.type(), that.type()) &&
70 + Objects.equals(subtype, that.subtype);
71 + }
72 + return false;
73 + }
74 + }
75 +}
1 package org.onlab.onos.openflow.controller; 1 package org.onlab.onos.openflow.controller;
2 2
3 +
4 +import java.util.Collections;
5 +import java.util.concurrent.atomic.AtomicBoolean;
6 +
3 import org.onlab.packet.Ethernet; 7 import org.onlab.packet.Ethernet;
4 import org.projectfloodlight.openflow.protocol.OFPacketIn; 8 import org.projectfloodlight.openflow.protocol.OFPacketIn;
5 import org.projectfloodlight.openflow.protocol.OFPacketOut; 9 import org.projectfloodlight.openflow.protocol.OFPacketOut;
...@@ -9,9 +13,6 @@ import org.projectfloodlight.openflow.protocol.match.MatchField; ...@@ -9,9 +13,6 @@ import org.projectfloodlight.openflow.protocol.match.MatchField;
9 import org.projectfloodlight.openflow.types.OFBufferId; 13 import org.projectfloodlight.openflow.types.OFBufferId;
10 import org.projectfloodlight.openflow.types.OFPort; 14 import org.projectfloodlight.openflow.types.OFPort;
11 15
12 -import java.util.Collections;
13 -import java.util.concurrent.atomic.AtomicBoolean;
14 -
15 public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext { 16 public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext {
16 17
17 private final AtomicBoolean free = new AtomicBoolean(true); 18 private final AtomicBoolean free = new AtomicBoolean(true);
......
...@@ -23,6 +23,8 @@ import org.projectfloodlight.openflow.protocol.OFFlowRemoved; ...@@ -23,6 +23,8 @@ import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
23 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; 23 import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry;
24 import org.projectfloodlight.openflow.protocol.OFInstructionType; 24 import org.projectfloodlight.openflow.protocol.OFInstructionType;
25 import org.projectfloodlight.openflow.protocol.action.OFAction; 25 import org.projectfloodlight.openflow.protocol.action.OFAction;
26 +import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
27 +import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter;
26 import org.projectfloodlight.openflow.protocol.action.OFActionOutput; 28 import org.projectfloodlight.openflow.protocol.action.OFActionOutput;
27 import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst; 29 import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst;
28 import org.projectfloodlight.openflow.protocol.action.OFActionSetDlSrc; 30 import org.projectfloodlight.openflow.protocol.action.OFActionSetDlSrc;
...@@ -34,6 +36,7 @@ import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; ...@@ -34,6 +36,7 @@ import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
34 import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions; 36 import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions;
35 import org.projectfloodlight.openflow.protocol.match.Match; 37 import org.projectfloodlight.openflow.protocol.match.Match;
36 import org.projectfloodlight.openflow.protocol.match.MatchField; 38 import org.projectfloodlight.openflow.protocol.match.MatchField;
39 +import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic;
37 import org.projectfloodlight.openflow.types.IPv4Address; 40 import org.projectfloodlight.openflow.types.IPv4Address;
38 import org.projectfloodlight.openflow.types.Masked; 41 import org.projectfloodlight.openflow.types.Masked;
39 import org.slf4j.Logger; 42 import org.slf4j.Logger;
...@@ -166,6 +169,15 @@ public class FlowEntryBuilder { ...@@ -166,6 +169,15 @@ public class FlowEntryBuilder {
166 builder.setIpSrc(IpPrefix.valueOf(si.getInt())); 169 builder.setIpSrc(IpPrefix.valueOf(si.getInt()));
167 } 170 }
168 break; 171 break;
172 + case EXPERIMENTER:
173 + OFActionExperimenter exp = (OFActionExperimenter) act;
174 + if (exp.getExperimenter() == 0x80005A06) {
175 + OFActionCircuit ct = (OFActionCircuit) exp;
176 + builder.setLambda(((OFOxmOchSigidBasic) ct.getField()).getValue().getChannelNumber());
177 + } else {
178 + log.warn("Unsupported OFActionExperimenter {}", exp.getExperimenter());
179 + }
180 + break;
169 case SET_TP_DST: 181 case SET_TP_DST:
170 case SET_TP_SRC: 182 case SET_TP_SRC:
171 case POP_MPLS: 183 case POP_MPLS:
...@@ -188,7 +200,7 @@ public class FlowEntryBuilder { ...@@ -188,7 +200,7 @@ public class FlowEntryBuilder {
188 case DEC_MPLS_TTL: 200 case DEC_MPLS_TTL:
189 case DEC_NW_TTL: 201 case DEC_NW_TTL:
190 case ENQUEUE: 202 case ENQUEUE:
191 - case EXPERIMENTER: 203 +
192 case GROUP: 204 case GROUP:
193 default: 205 default:
194 log.warn("Action type {} not yet implemented.", act.getType()); 206 log.warn("Action type {} not yet implemented.", act.getType());
...@@ -268,6 +280,10 @@ public class FlowEntryBuilder { ...@@ -268,6 +280,10 @@ public class FlowEntryBuilder {
268 case TCP_SRC: 280 case TCP_SRC:
269 builder.matchTcpSrc((short) match.get(MatchField.TCP_SRC).getPort()); 281 builder.matchTcpSrc((short) match.get(MatchField.TCP_SRC).getPort());
270 break; 282 break;
283 + case OCH_SIGID:
284 + builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber());
285 + break;
286 + case OCH_SIGTYPE_BASIC:
271 case ARP_OP: 287 case ARP_OP:
272 case ARP_SHA: 288 case ARP_SHA:
273 case ARP_SPA: 289 case ARP_SPA:
......
...@@ -14,6 +14,7 @@ import org.onlab.onos.net.flow.criteria.Criteria.EthCriterion; ...@@ -14,6 +14,7 @@ import org.onlab.onos.net.flow.criteria.Criteria.EthCriterion;
14 import org.onlab.onos.net.flow.criteria.Criteria.EthTypeCriterion; 14 import org.onlab.onos.net.flow.criteria.Criteria.EthTypeCriterion;
15 import org.onlab.onos.net.flow.criteria.Criteria.IPCriterion; 15 import org.onlab.onos.net.flow.criteria.Criteria.IPCriterion;
16 import org.onlab.onos.net.flow.criteria.Criteria.IPProtocolCriterion; 16 import org.onlab.onos.net.flow.criteria.Criteria.IPProtocolCriterion;
17 +import org.onlab.onos.net.flow.criteria.Criteria.LambdaCriterion;
17 import org.onlab.onos.net.flow.criteria.Criteria.PortCriterion; 18 import org.onlab.onos.net.flow.criteria.Criteria.PortCriterion;
18 import org.onlab.onos.net.flow.criteria.Criteria.TcpPortCriterion; 19 import org.onlab.onos.net.flow.criteria.Criteria.TcpPortCriterion;
19 import org.onlab.onos.net.flow.criteria.Criteria.VlanIdCriterion; 20 import org.onlab.onos.net.flow.criteria.Criteria.VlanIdCriterion;
...@@ -21,6 +22,8 @@ import org.onlab.onos.net.flow.criteria.Criteria.VlanPcpCriterion; ...@@ -21,6 +22,8 @@ import org.onlab.onos.net.flow.criteria.Criteria.VlanPcpCriterion;
21 import org.onlab.onos.net.flow.criteria.Criterion; 22 import org.onlab.onos.net.flow.criteria.Criterion;
22 import org.onlab.onos.net.flow.instructions.Instruction; 23 import org.onlab.onos.net.flow.instructions.Instruction;
23 import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction; 24 import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
25 +import org.onlab.onos.net.flow.instructions.L0ModificationInstruction;
26 +import org.onlab.onos.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
24 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction; 27 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction;
25 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; 28 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
26 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; 29 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction;
...@@ -35,6 +38,7 @@ import org.projectfloodlight.openflow.protocol.OFFlowModFlags; ...@@ -35,6 +38,7 @@ import org.projectfloodlight.openflow.protocol.OFFlowModFlags;
35 import org.projectfloodlight.openflow.protocol.action.OFAction; 38 import org.projectfloodlight.openflow.protocol.action.OFAction;
36 import org.projectfloodlight.openflow.protocol.match.Match; 39 import org.projectfloodlight.openflow.protocol.match.Match;
37 import org.projectfloodlight.openflow.protocol.match.MatchField; 40 import org.projectfloodlight.openflow.protocol.match.MatchField;
41 +import org.projectfloodlight.openflow.types.CircuitSignalID;
38 import org.projectfloodlight.openflow.types.EthType; 42 import org.projectfloodlight.openflow.types.EthType;
39 import org.projectfloodlight.openflow.types.IPv4Address; 43 import org.projectfloodlight.openflow.types.IPv4Address;
40 import org.projectfloodlight.openflow.types.IpProtocol; 44 import org.projectfloodlight.openflow.types.IpProtocol;
...@@ -137,6 +141,8 @@ public class FlowModBuilder { ...@@ -137,6 +141,8 @@ public class FlowModBuilder {
137 case DROP: 141 case DROP:
138 log.warn("Saw drop action; assigning drop action"); 142 log.warn("Saw drop action; assigning drop action");
139 return new LinkedList<>(); 143 return new LinkedList<>();
144 + case L0MODIFICATION:
145 + acts.add(buildL0Modification(i));
140 case L2MODIFICATION: 146 case L2MODIFICATION:
141 acts.add(buildL2Modification(i)); 147 acts.add(buildL2Modification(i));
142 break; 148 break;
...@@ -157,6 +163,20 @@ public class FlowModBuilder { ...@@ -157,6 +163,20 @@ public class FlowModBuilder {
157 return acts; 163 return acts;
158 } 164 }
159 165
166 + private OFAction buildL0Modification(Instruction i) {
167 + L0ModificationInstruction l0m = (L0ModificationInstruction) i;
168 + switch (l0m.subtype()) {
169 + case LAMBDA:
170 + ModLambdaInstruction ml = (ModLambdaInstruction) i;
171 + return factory.actions().circuit(factory.oxms().ochSigidBasic(
172 + new CircuitSignalID((byte) 1, (byte) 2, ml.lambda(), (short) 1)));
173 + default:
174 + log.warn("Unimplemented action type {}.", l0m.subtype());
175 + break;
176 + }
177 + return null;
178 + }
179 +
160 private OFAction buildL3Modification(Instruction i) { 180 private OFAction buildL3Modification(Instruction i) {
161 L3ModificationInstruction l3m = (L3ModificationInstruction) i; 181 L3ModificationInstruction l3m = (L3ModificationInstruction) i;
162 ModIPInstruction ip; 182 ModIPInstruction ip;
...@@ -261,6 +281,11 @@ public class FlowModBuilder { ...@@ -261,6 +281,11 @@ public class FlowModBuilder {
261 tp = (TcpPortCriterion) c; 281 tp = (TcpPortCriterion) c;
262 mBuilder.setExact(MatchField.TCP_SRC, TransportPort.of(tp.tcpPort())); 282 mBuilder.setExact(MatchField.TCP_SRC, TransportPort.of(tp.tcpPort()));
263 break; 283 break;
284 + case OCH_SIGID:
285 + LambdaCriterion lc = (LambdaCriterion) c;
286 + mBuilder.setExact(MatchField.OCH_SIGID,
287 + new CircuitSignalID((byte) 1, (byte) 2, lc.lambda(), (short) 1));
288 + break;
264 case ARP_OP: 289 case ARP_OP:
265 case ARP_SHA: 290 case ARP_SHA:
266 case ARP_SPA: 291 case ARP_SPA:
......