yjimmyy
Committed by Gerrit Code Review

Add Oplink attenuation extension and channel power drivers.

Change-Id: I2558595b03cbb6cc58237dc48b8a03e83357fe1f
...@@ -61,7 +61,8 @@ public final class ExtensionTreatmentType { ...@@ -61,7 +61,8 @@ public final class ExtensionTreatmentType {
61 NICIRA_ENCAP_ETH_SRC(121), 61 NICIRA_ENCAP_ETH_SRC(121),
62 NICIRA_ENCAP_ETH_DST(122), 62 NICIRA_ENCAP_ETH_DST(122),
63 NICIRA_ENCAP_ETH_TYPE(123), 63 NICIRA_ENCAP_ETH_TYPE(123),
64 - BMV2_ACTION(128); 64 + BMV2_ACTION(128),
65 + OPLINK_ATTENUATION(130);
65 66
66 private ExtensionTreatmentType type; 67 private ExtensionTreatmentType type;
67 68
......
...@@ -32,6 +32,7 @@ import org.onosproject.driver.extensions.NiciraSetNshSpi; ...@@ -32,6 +32,7 @@ import org.onosproject.driver.extensions.NiciraSetNshSpi;
32 import org.onosproject.driver.extensions.NiciraSetTunnelDst; 32 import org.onosproject.driver.extensions.NiciraSetTunnelDst;
33 import org.onosproject.driver.extensions.OfdpaMatchVlanVid; 33 import org.onosproject.driver.extensions.OfdpaMatchVlanVid;
34 import org.onosproject.driver.extensions.OfdpaSetVlanVid; 34 import org.onosproject.driver.extensions.OfdpaSetVlanVid;
35 +import org.onosproject.driver.extensions.OplinkAttenuation;
35 import org.onosproject.driver.extensions.codec.MoveExtensionTreatmentCodec; 36 import org.onosproject.driver.extensions.codec.MoveExtensionTreatmentCodec;
36 import org.onosproject.driver.extensions.codec.NiciraMatchNshSiCodec; 37 import org.onosproject.driver.extensions.codec.NiciraMatchNshSiCodec;
37 import org.onosproject.driver.extensions.codec.NiciraMatchNshSpiCodec; 38 import org.onosproject.driver.extensions.codec.NiciraMatchNshSpiCodec;
...@@ -43,6 +44,7 @@ import org.onosproject.driver.extensions.codec.NiciraSetNshSpiCodec; ...@@ -43,6 +44,7 @@ import org.onosproject.driver.extensions.codec.NiciraSetNshSpiCodec;
43 import org.onosproject.driver.extensions.codec.NiciraSetTunnelDstCodec; 44 import org.onosproject.driver.extensions.codec.NiciraSetTunnelDstCodec;
44 import org.onosproject.driver.extensions.codec.OfdpaMatchVlanVidCodec; 45 import org.onosproject.driver.extensions.codec.OfdpaMatchVlanVidCodec;
45 import org.onosproject.driver.extensions.codec.OfdpaSetVlanVidCodec; 46 import org.onosproject.driver.extensions.codec.OfdpaSetVlanVidCodec;
47 +import org.onosproject.driver.extensions.codec.OplinkAttenuationCodec;
46 import org.slf4j.Logger; 48 import org.slf4j.Logger;
47 49
48 import static org.slf4j.LoggerFactory.getLogger; 50 import static org.slf4j.LoggerFactory.getLogger;
...@@ -71,6 +73,7 @@ public class DefaultCodecRegister { ...@@ -71,6 +73,7 @@ public class DefaultCodecRegister {
71 codecService.registerCodec(NiciraSetNshContextHeader.class, new NiciraSetNshContextHeaderCodec()); 73 codecService.registerCodec(NiciraSetNshContextHeader.class, new NiciraSetNshContextHeaderCodec());
72 codecService.registerCodec(OfdpaMatchVlanVid.class, new OfdpaMatchVlanVidCodec()); 74 codecService.registerCodec(OfdpaMatchVlanVid.class, new OfdpaMatchVlanVidCodec());
73 codecService.registerCodec(OfdpaSetVlanVid.class, new OfdpaSetVlanVidCodec()); 75 codecService.registerCodec(OfdpaSetVlanVid.class, new OfdpaSetVlanVidCodec());
76 + codecService.registerCodec(OplinkAttenuation.class, new OplinkAttenuationCodec());
74 log.info("Registered default driver codecs."); 77 log.info("Registered default driver codecs.");
75 } 78 }
76 79
...@@ -87,6 +90,7 @@ public class DefaultCodecRegister { ...@@ -87,6 +90,7 @@ public class DefaultCodecRegister {
87 codecService.unregisterCodec(NiciraSetNshContextHeader.class); 90 codecService.unregisterCodec(NiciraSetNshContextHeader.class);
88 codecService.unregisterCodec(OfdpaMatchVlanVid.class); 91 codecService.unregisterCodec(OfdpaMatchVlanVid.class);
89 codecService.unregisterCodec(OfdpaSetVlanVid.class); 92 codecService.unregisterCodec(OfdpaSetVlanVid.class);
93 + codecService.unregisterCodec(OplinkAttenuation.class);
90 log.info("Unregistered default driver codecs."); 94 log.info("Unregistered default driver codecs.");
91 } 95 }
92 } 96 }
......
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.driver.extensions;
18 +
19 +import com.google.common.base.MoreObjects;
20 +import com.google.common.collect.Maps;
21 +import org.onlab.util.KryoNamespace;
22 +import org.onosproject.net.flow.AbstractExtension;
23 +import org.onosproject.net.flow.instructions.ExtensionTreatment;
24 +import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
25 +
26 +import java.util.Map;
27 +import java.util.Objects;
28 +
29 +/**
30 + * Instruction for Oplink channel attenuation.
31 + */
32 +public class OplinkAttenuation extends AbstractExtension implements ExtensionTreatment {
33 + private static final String KEY_ATT = "attenuation";
34 +
35 + private int attenuation;
36 +
37 + private final KryoNamespace appKryo = new KryoNamespace.Builder()
38 + .register(Map.class)
39 + .build("OplinkAttenuation");
40 +
41 + /**
42 + * Creates new attenuation instruction.
43 + * @param attenuation attenuation value
44 + */
45 + public OplinkAttenuation(int attenuation) {
46 + this.attenuation = attenuation;
47 + }
48 +
49 + /**
50 + * Gets the attenuation value.
51 + * @return attenuation
52 + */
53 + public int getAttenuation() {
54 + return attenuation;
55 + }
56 +
57 + /**
58 + * Modify the attenuation value.
59 + * @param attenuation new attenuation value
60 + */
61 + public void setAttenuation(int attenuation) {
62 + this.attenuation = attenuation;
63 + }
64 +
65 + @Override
66 + public ExtensionTreatmentType type() {
67 + return ExtensionTreatmentType.ExtensionTreatmentTypes.OPLINK_ATTENUATION.type();
68 + }
69 +
70 + @Override
71 + public byte[] serialize() {
72 + Map<String, Object> values = Maps.newHashMap();
73 + values.put(KEY_ATT, attenuation);
74 + return appKryo.serialize(values);
75 + }
76 +
77 + @Override
78 + public void deserialize(byte[] data) {
79 + Map<String, Object> values = appKryo.deserialize(data);
80 + attenuation = (int) values.get(KEY_ATT);
81 + }
82 +
83 + @Override
84 + public int hashCode() {
85 + return Objects.hash(attenuation);
86 + }
87 +
88 + @Override
89 + public boolean equals(Object obj) {
90 + if (this == obj) {
91 + return true;
92 + }
93 + if (obj instanceof OplinkAttenuation) {
94 + OplinkAttenuation that = (OplinkAttenuation) obj;
95 + return Objects.equals(attenuation, that.attenuation);
96 + }
97 + return false;
98 + }
99 +
100 + @Override
101 + public String toString() {
102 + return MoreObjects.toStringHelper(getClass())
103 + .add(KEY_ATT, attenuation)
104 + .toString();
105 + }
106 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.driver.extensions;
18 +
19 +import org.onosproject.net.driver.AbstractHandlerBehaviour;
20 +import org.onosproject.net.flow.instructions.ExtensionTreatment;
21 +import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
22 +import org.onosproject.openflow.controller.ExtensionTreatmentInterpreter;
23 +import org.projectfloodlight.openflow.protocol.OFActionType;
24 +import org.projectfloodlight.openflow.protocol.OFFactory;
25 +import org.projectfloodlight.openflow.protocol.action.OFAction;
26 +import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter;
27 +import org.projectfloodlight.openflow.protocol.action.OFActionOplinkAtt;
28 +import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
29 +import org.projectfloodlight.openflow.types.U32;
30 +
31 +/**
32 + * Interpreter for Oplink OpenFlow treatment extensions.
33 + */
34 +public class OplinkExtensionTreatmentInterpreter extends AbstractHandlerBehaviour
35 + implements ExtensionTreatmentInterpreter {
36 +
37 + private static final long ATTENUATION_EXP = 0xff000088L;
38 +
39 + @Override
40 + public boolean supported(ExtensionTreatmentType extensionTreatmentType) {
41 + if (extensionTreatmentType.equals(
42 + ExtensionTreatmentType.ExtensionTreatmentTypes.OPLINK_ATTENUATION.type())) {
43 + return true;
44 + }
45 + return false;
46 + }
47 +
48 + @Override
49 + public OFAction mapInstruction(OFFactory factory, ExtensionTreatment extensionTreatment) {
50 + ExtensionTreatmentType type = extensionTreatment.type();
51 + if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OPLINK_ATTENUATION.type())) {
52 + int att = ((OplinkAttenuation) extensionTreatment).getAttenuation();
53 + return factory.actions().oplinkAtt(factory.oxms().ochSigatt(U32.ofRaw(att)));
54 + }
55 + return null;
56 + }
57 +
58 + @Override
59 + public ExtensionTreatment mapAction(OFAction action) throws UnsupportedOperationException {
60 + if (action.getType().equals(OFActionType.EXPERIMENTER)) {
61 + OFActionExperimenter actionExp = (OFActionExperimenter) action;
62 + if (actionExp.getExperimenter() == ATTENUATION_EXP) {
63 + OFActionOplinkAtt actionAtt = (OFActionOplinkAtt) action;
64 + return new OplinkAttenuation(((OFOxm<U32>) actionAtt.getField()).getValue().getRaw());
65 + }
66 + }
67 + return null;
68 + }
69 +}
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.driver.extensions.codec;
18 +
19 +import com.fasterxml.jackson.databind.node.ObjectNode;
20 +import org.onosproject.codec.CodecContext;
21 +import org.onosproject.codec.JsonCodec;
22 +import org.onosproject.driver.extensions.OplinkAttenuation;
23 +
24 +import static org.onlab.util.Tools.nullIsIllegal;
25 +
26 +/**
27 + * JSON Codec for OplinkAttenuation class.
28 + */
29 +public class OplinkAttenuationCodec extends JsonCodec<OplinkAttenuation> {
30 + private static final String ATTENUATION = "attenuation";
31 + private static final String MISSING_ATT = "Missing value for \"attenuation\"";
32 +
33 + @Override
34 + public OplinkAttenuation decode(ObjectNode json, CodecContext context) {
35 + if (json == null || !json.isObject()) {
36 + return null;
37 + }
38 + String att = nullIsIllegal(json.get(ATTENUATION), MISSING_ATT).asText();
39 + return new OplinkAttenuation(Integer.valueOf(att));
40 + }
41 +}
1 +package org.onosproject.driver.optical.extensions;
2 +
3 +import com.fasterxml.jackson.databind.node.ObjectNode;
4 +import org.onlab.osgi.DefaultServiceDirectory;
5 +import org.onlab.osgi.ServiceDirectory;
6 +import org.onosproject.codec.CodecContext;
7 +import org.onosproject.codec.CodecService;
8 +import org.onosproject.codec.ExtensionTreatmentCodec;
9 +import org.onosproject.driver.extensions.OplinkAttenuation;
10 +import org.onosproject.net.driver.AbstractHandlerBehaviour;
11 +import org.onosproject.net.flow.instructions.ExtensionTreatment;
12 +import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
13 +
14 +import static org.onlab.util.Tools.nullIsIllegal;
15 +
16 +/**
17 + * Codec for Oplink extensions.
18 + */
19 +public class OplinkExtensionTreatmentCodec extends AbstractHandlerBehaviour
20 + implements ExtensionTreatmentCodec {
21 +
22 + private static final String TYPE = "type";
23 + private static final String MISSING_TYPE = "Missing extension type";
24 + private static final String UNSUPPORTED_TYPE = "Extension type is not supported: ";
25 +
26 + @Override
27 + public ExtensionTreatment decode(ObjectNode objectNode, CodecContext context) {
28 + if (objectNode == null || !objectNode.isObject()) {
29 + return null;
30 + }
31 +
32 + int typeInt = nullIsIllegal(objectNode.get(TYPE), MISSING_TYPE).asInt();
33 + ExtensionTreatmentType type = new ExtensionTreatmentType(typeInt);
34 +
35 + if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OPLINK_ATTENUATION.type())) {
36 + return decodeTreatment(objectNode, context, OplinkAttenuation.class);
37 + } else {
38 + throw new UnsupportedOperationException(UNSUPPORTED_TYPE + type.toString());
39 + }
40 + }
41 +
42 + private <T extends ExtensionTreatment> ExtensionTreatment decodeTreatment(
43 + ObjectNode objectNode, CodecContext context, Class<T> entityClass) {
44 + if (context == null) {
45 + ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
46 + return serviceDirectory.get(CodecService.class).getCodec(entityClass).decode(objectNode, null);
47 + } else {
48 + return context.codec(entityClass).decode(objectNode, context);
49 + }
50 + }
51 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +/**
17 + * Implementations of extension behaviours for optical devices.
18 + */
19 +package org.onosproject.driver.optical.extensions;
...@@ -41,6 +41,7 @@ import org.onosproject.net.device.DefaultPortDescription; ...@@ -41,6 +41,7 @@ import org.onosproject.net.device.DefaultPortDescription;
41 import org.onosproject.net.device.DeviceService; 41 import org.onosproject.net.device.DeviceService;
42 import org.onosproject.net.device.PortDescription; 42 import org.onosproject.net.device.PortDescription;
43 import org.onosproject.net.link.DefaultLinkDescription; 43 import org.onosproject.net.link.DefaultLinkDescription;
44 +import org.onosproject.net.link.LinkService;
44 import org.onosproject.net.optical.OpticalAnnotations; 45 import org.onosproject.net.optical.OpticalAnnotations;
45 import org.onosproject.openflow.controller.Dpid; 46 import org.onosproject.openflow.controller.Dpid;
46 import org.onosproject.openflow.controller.OpenFlowOpticalSwitch; 47 import org.onosproject.openflow.controller.OpenFlowOpticalSwitch;
...@@ -190,17 +191,19 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic ...@@ -190,17 +191,19 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic
190 public final void sendMsg(OFMessage m) { 191 public final void sendMsg(OFMessage m) {
191 List<OFMessage> messages = new ArrayList<>(); 192 List<OFMessage> messages = new ArrayList<>();
192 messages.add(m); 193 messages.add(m);
194 +
193 if (m.getType() == OFType.STATS_REQUEST) { 195 if (m.getType() == OFType.STATS_REQUEST) {
194 OFStatsRequest sr = (OFStatsRequest) m; 196 OFStatsRequest sr = (OFStatsRequest) m;
195 log.debug("OPLK ROADM rebuilding stats request type {}", sr.getStatsType()); 197 log.debug("OPLK ROADM rebuilding stats request type {}", sr.getStatsType());
196 switch (sr.getStatsType()) { 198 switch (sr.getStatsType()) {
197 case PORT: 199 case PORT:
198 - //replace with Oplink experiment stats message to get the port current power 200 + //add Oplink experiment stats message to get the port's current power
199 OFOplinkPortPowerRequest powerRequest = this.factory().buildOplinkPortPowerRequest() 201 OFOplinkPortPowerRequest powerRequest = this.factory().buildOplinkPortPowerRequest()
200 .setXid(sr.getXid()) 202 .setXid(sr.getXid())
201 .setFlags(sr.getFlags()) 203 .setFlags(sr.getFlags())
202 .build(); 204 .build();
203 messages.add(powerRequest); 205 messages.add(powerRequest);
206 + // add experiment message to get adjacent ports
204 OFExpPortAdjacencyRequest adjacencyRequest = this.factory().buildExpPortAdjacencyRequest() 207 OFExpPortAdjacencyRequest adjacencyRequest = this.factory().buildExpPortAdjacencyRequest()
205 .setXid(sr.getXid()) 208 .setXid(sr.getXid())
206 .setFlags(sr.getFlags()) 209 .setFlags(sr.getFlags())
...@@ -335,7 +338,7 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic ...@@ -335,7 +338,7 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic
335 338
336 private void addLink(PortNumber portNumber, OplinkPortAdjacency neighbor) { 339 private void addLink(PortNumber portNumber, OplinkPortAdjacency neighbor) {
337 ConnectPoint dst = new ConnectPoint(handler().data().deviceId(), portNumber); 340 ConnectPoint dst = new ConnectPoint(handler().data().deviceId(), portNumber);
338 - ConnectPoint src = new ConnectPoint(neighbor.getDeviceId(), neighbor.portNumber); 341 + ConnectPoint src = new ConnectPoint(neighbor.getDeviceId(), neighbor.getPort());
339 OpticalAdjacencyLinkService adService = 342 OpticalAdjacencyLinkService adService =
340 this.handler().get(OpticalAdjacencyLinkService.class); 343 this.handler().get(OpticalAdjacencyLinkService.class);
341 adService.linkDetected(new DefaultLinkDescription(src, dst, Link.Type.OPTICAL)); 344 adService.linkDetected(new DefaultLinkDescription(src, dst, Link.Type.OPTICAL));
...@@ -344,9 +347,13 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic ...@@ -344,9 +347,13 @@ public class OplinkRoadm extends AbstractOpenFlowSwitch implements OpenFlowOptic
344 // Remove incoming link with port if there are any. 347 // Remove incoming link with port if there are any.
345 private void removeLink(PortNumber portNumber) { 348 private void removeLink(PortNumber portNumber) {
346 ConnectPoint dst = new ConnectPoint(handler().data().deviceId(), portNumber); 349 ConnectPoint dst = new ConnectPoint(handler().data().deviceId(), portNumber);
347 - OpticalAdjacencyLinkService adService = 350 + // Check so only incoming links are removed
348 - this.handler().get(OpticalAdjacencyLinkService.class); 351 + Set<Link> links = this.handler().get(LinkService.class).getIngressLinks(dst);
349 - adService.linksVanished(dst); 352 + if (!links.isEmpty()) {
353 + OpticalAdjacencyLinkService adService =
354 + this.handler().get(OpticalAdjacencyLinkService.class);
355 + adService.linksVanished(dst);
356 + }
350 } 357 }
351 358
352 private class OplinkPortAdjacency { 359 private class OplinkPortAdjacency {
......
...@@ -58,6 +58,10 @@ ...@@ -58,6 +58,10 @@
58 impl="org.onosproject.net.optical.DefaultOpticalDevice"/> 58 impl="org.onosproject.net.optical.DefaultOpticalDevice"/>
59 <behaviour api="org.onosproject.net.behaviour.PowerConfig" 59 <behaviour api="org.onosproject.net.behaviour.PowerConfig"
60 impl="org.onosproject.driver.optical.power.OplinkRoadmPowerConfig"/> 60 impl="org.onosproject.driver.optical.power.OplinkRoadmPowerConfig"/>
61 + <behaviour api="org.onosproject.codec.ExtensionTreatmentCodec"
62 + impl="org.onosproject.driver.optical.extensions.OplinkExtensionTreatmentCodec"/>
63 + <behaviour api="org.onosproject.openflow.controller.ExtensionTreatmentInterpreter"
64 + impl="org.onosproject.driver.extensions.OplinkExtensionTreatmentInterpreter"/>
61 </driver> 65 </driver>
62 66
63 </drivers> 67 </drivers>
......