Committed by
Gerrit Code Review
Driver and flow stats handling for Calient fiber switch S160.
Bump loxigen to 0.4.1.onos-SNAPSHOT. Change-Id: Ieb8aa4fe716e12f89b83770eff617561f30cdd08
Showing
16 changed files
with
369 additions
and
34 deletions
| ... | @@ -26,7 +26,7 @@ public interface Device extends Element { | ... | @@ -26,7 +26,7 @@ public interface Device extends Element { |
| 26 | * Coarse classification of the type of the infrastructure device. | 26 | * Coarse classification of the type of the infrastructure device. |
| 27 | */ | 27 | */ |
| 28 | public enum Type { | 28 | public enum Type { |
| 29 | - SWITCH, ROUTER, ROADM, OTN, ROADM_OTN, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, VIRTUAL, OTHER | 29 | + SWITCH, ROUTER, ROADM, OTN, ROADM_OTN, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, VIRTUAL, FIBER_SWITCH, OTHER |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | /** | 32 | /** | ... | ... |
| ... | @@ -194,8 +194,7 @@ public class PacketManager | ... | @@ -194,8 +194,7 @@ public class PacketManager |
| 194 | * @param request the packet request | 194 | * @param request the packet request |
| 195 | */ | 195 | */ |
| 196 | private void pushRule(Device device, PacketRequest request) { | 196 | private void pushRule(Device device, PacketRequest request) { |
| 197 | - // Everything is pre-provisioned on ROADMs | 197 | + if (!device.type().equals(Device.Type.SWITCH)) { |
| 198 | - if (device.type().equals(Device.Type.ROADM)) { | ||
| 199 | return; | 198 | return; |
| 200 | } | 199 | } |
| 201 | 200 | ||
| ... | @@ -217,8 +216,7 @@ public class PacketManager | ... | @@ -217,8 +216,7 @@ public class PacketManager |
| 217 | * @param request the packet request | 216 | * @param request the packet request |
| 218 | */ | 217 | */ |
| 219 | private void removeRule(Device device, PacketRequest request) { | 218 | private void removeRule(Device device, PacketRequest request) { |
| 220 | - // Everything is pre-provisioned on ROADMs | 219 | + if (!device.type().equals(Device.Type.SWITCH)) { |
| 221 | - if (device.type().equals(Device.Type.ROADM)) { | ||
| 222 | return; | 220 | return; |
| 223 | } | 221 | } |
| 224 | 222 | ... | ... |
drivers/src/main/java/org/onosproject/driver/handshaker/CalientFiberSwitchHandshaker.java
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright 2015 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 | +package org.onosproject.driver.handshaker; | ||
| 17 | + | ||
| 18 | +import com.google.common.collect.ImmutableList; | ||
| 19 | +import com.google.common.collect.ImmutableSet; | ||
| 20 | +import org.onosproject.net.Device; | ||
| 21 | +import org.onosproject.openflow.controller.OpenFlowOpticalSwitch; | ||
| 22 | +import org.onosproject.openflow.controller.PortDescPropertyType; | ||
| 23 | +import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; | ||
| 24 | +import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted; | ||
| 25 | +import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted; | ||
| 26 | +import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted; | ||
| 27 | +import org.projectfloodlight.openflow.protocol.OFCalientFlowStatsRequest; | ||
| 28 | +import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsEntry; | ||
| 29 | +import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsReply; | ||
| 30 | +import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsRequest; | ||
| 31 | +import org.projectfloodlight.openflow.protocol.OFFlowStatsRequest; | ||
| 32 | +import org.projectfloodlight.openflow.protocol.OFMessage; | ||
| 33 | +import org.projectfloodlight.openflow.protocol.OFObject; | ||
| 34 | +import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; | ||
| 35 | +import org.projectfloodlight.openflow.protocol.OFStatsRequest; | ||
| 36 | +import org.projectfloodlight.openflow.protocol.OFType; | ||
| 37 | +import org.projectfloodlight.openflow.types.OFPort; | ||
| 38 | +import org.projectfloodlight.openflow.types.TableId; | ||
| 39 | + | ||
| 40 | +import java.io.IOException; | ||
| 41 | +import java.util.ArrayList; | ||
| 42 | +import java.util.List; | ||
| 43 | +import java.util.Set; | ||
| 44 | +import java.util.concurrent.atomic.AtomicBoolean; | ||
| 45 | + | ||
| 46 | +public class CalientFiberSwitchHandshaker extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch { | ||
| 47 | + | ||
| 48 | + private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false); | ||
| 49 | + private List<OFCalientPortDescStatsEntry> fiberPorts = new ArrayList<>(); | ||
| 50 | + | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public Boolean supportNxRole() { | ||
| 54 | + return false; | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + @Override | ||
| 58 | + public void startDriverHandshake() { | ||
| 59 | + log.warn("Starting driver handshake for sw {}", getStringId()); | ||
| 60 | + if (startDriverHandshakeCalled) { | ||
| 61 | + throw new SwitchDriverSubHandshakeAlreadyStarted(); | ||
| 62 | + } | ||
| 63 | + startDriverHandshakeCalled = true; | ||
| 64 | + try { | ||
| 65 | + sendHandshakeOFExperimenterPortDescRequest(); | ||
| 66 | + } catch (IOException e) { | ||
| 67 | + log.error("Exception while sending experimenter port desc:", e.getMessage()); | ||
| 68 | + e.printStackTrace(); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + private void sendHandshakeOFExperimenterPortDescRequest() throws IOException { | ||
| 74 | + // send multi part message for port description for optical switches | ||
| 75 | + OFCalientPortDescStatsRequest portsRequest = factory() | ||
| 76 | + .buildCalientPortDescStatsRequest() | ||
| 77 | + .build(); | ||
| 78 | + log.warn("Sending experimenter port description message {}", | ||
| 79 | + portsRequest.toString()); | ||
| 80 | + this.sendHandshakeMessage(portsRequest); | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + @Override | ||
| 84 | + public boolean isDriverHandshakeComplete() { | ||
| 85 | + return driverHandshakeComplete.get(); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + @Override | ||
| 89 | + public void processDriverHandshakeMessage(OFMessage m) { | ||
| 90 | + if (!startDriverHandshakeCalled) { | ||
| 91 | + throw new SwitchDriverSubHandshakeNotStarted(); | ||
| 92 | + } | ||
| 93 | + if (driverHandshakeComplete.get()) { | ||
| 94 | + throw new SwitchDriverSubHandshakeCompleted(m); | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + switch (m.getType()) { | ||
| 98 | + case BARRIER_REPLY: | ||
| 99 | + break; | ||
| 100 | + case ERROR: | ||
| 101 | + log.error("Switch Error {} {}", getStringId(), m); | ||
| 102 | + break; | ||
| 103 | + case FEATURES_REPLY: | ||
| 104 | + break; | ||
| 105 | + case FLOW_REMOVED: | ||
| 106 | + break; | ||
| 107 | + case GET_ASYNC_REPLY: | ||
| 108 | + break; | ||
| 109 | + case PACKET_IN: | ||
| 110 | + break; | ||
| 111 | + case PORT_STATUS: | ||
| 112 | + break; | ||
| 113 | + case QUEUE_GET_CONFIG_REPLY: | ||
| 114 | + break; | ||
| 115 | + case ROLE_REPLY: | ||
| 116 | + break; | ||
| 117 | + case STATS_REPLY: | ||
| 118 | + log.warn("Received port desc reply"); | ||
| 119 | + OFCalientPortDescStatsReply descStatsReply = (OFCalientPortDescStatsReply) m; | ||
| 120 | + fiberPorts.addAll(descStatsReply.getPortDesc()); | ||
| 121 | + // Multi-part message | ||
| 122 | + if (!descStatsReply.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) { | ||
| 123 | + driverHandshakeComplete.set(true); | ||
| 124 | + } | ||
| 125 | + break; | ||
| 126 | + default: | ||
| 127 | + log.warn("Received message {} during switch-driver " + | ||
| 128 | + "subhandshake " + "from switch {} ... " + | ||
| 129 | + "Ignoring message", m, | ||
| 130 | + getStringId()); | ||
| 131 | + | ||
| 132 | + } | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + @Override | ||
| 136 | + public Device.Type deviceType() { | ||
| 137 | + return Device.Type.FIBER_SWITCH; | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + @Override | ||
| 141 | + public List<? extends OFObject> getPortsOf(PortDescPropertyType type) { | ||
| 142 | + return ImmutableList.copyOf(fiberPorts); | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + @Override | ||
| 146 | + public Set<PortDescPropertyType> getPortTypes() { | ||
| 147 | + return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT); | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + @Override | ||
| 151 | + public final void sendMsg(OFMessage m) { | ||
| 152 | + OFMessage newMsg = m; | ||
| 153 | + | ||
| 154 | + if (m.getType() == OFType.STATS_REQUEST) { | ||
| 155 | + OFStatsRequest sr = (OFStatsRequest) m; | ||
| 156 | + log.debug("Rebuilding stats request type {}", sr.getStatsType()); | ||
| 157 | + switch (sr.getStatsType()) { | ||
| 158 | + case FLOW: | ||
| 159 | + OFCalientFlowStatsRequest request = this.factory().buildCalientFlowStatsRequest() | ||
| 160 | + .setCookie(((OFFlowStatsRequest) sr).getCookie()) | ||
| 161 | + .setCookieMask(((OFFlowStatsRequest) sr).getCookieMask()) | ||
| 162 | + .setMatch(this.factory().matchWildcardAll()) | ||
| 163 | + .setOutGroup(((OFFlowStatsRequest) sr).getOutGroup().getGroupNumber()) | ||
| 164 | + .setOutPort(OFPort.ANY) | ||
| 165 | + .setTableId(TableId.ALL) | ||
| 166 | + .setXid(sr.getXid()) | ||
| 167 | + .setFlags(sr.getFlags()) | ||
| 168 | + .build(); | ||
| 169 | + newMsg = request; | ||
| 170 | + break; | ||
| 171 | + case PORT: | ||
| 172 | + // TODO | ||
| 173 | + break; | ||
| 174 | + default: | ||
| 175 | + break; | ||
| 176 | + } | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + super.sendMsg(newMsg); | ||
| 180 | + } | ||
| 181 | +} |
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.driver.handshaker; | 16 | package org.onosproject.driver.handshaker; |
| 17 | 17 | ||
| 18 | +import org.onosproject.net.Device; | ||
| 18 | import org.onosproject.openflow.controller.OpenFlowOpticalSwitch; | 19 | import org.onosproject.openflow.controller.OpenFlowOpticalSwitch; |
| 19 | import org.onosproject.openflow.controller.PortDescPropertyType; | 20 | import org.onosproject.openflow.controller.PortDescPropertyType; |
| 20 | import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; | 21 | import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch; |
| ... | @@ -156,8 +157,8 @@ public class OFOpticalSwitchImplLINC13 | ... | @@ -156,8 +157,8 @@ public class OFOpticalSwitchImplLINC13 |
| 156 | } | 157 | } |
| 157 | 158 | ||
| 158 | @Override | 159 | @Override |
| 159 | - public boolean isOptical() { | 160 | + public Device.Type deviceType() { |
| 160 | - return true; | 161 | + return Device.Type.ROADM; |
| 161 | } | 162 | } |
| 162 | 163 | ||
| 163 | @Override | 164 | @Override | ... | ... |
| ... | @@ -105,5 +105,11 @@ | ... | @@ -105,5 +105,11 @@ |
| 105 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" | 105 | <behaviour api="org.onosproject.net.behaviour.Pipeliner" |
| 106 | impl="org.onosproject.driver.pipeline.CpqdOFDPA1Pipeline"/> | 106 | impl="org.onosproject.driver.pipeline.CpqdOFDPA1Pipeline"/> |
| 107 | </driver> | 107 | </driver> |
| 108 | + <driver name="calient" extends="default" | ||
| 109 | + manufacturer="calient inc" hwVersion="calient hardware" | ||
| 110 | + swVersion="ocs switch"> | ||
| 111 | + <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver" | ||
| 112 | + impl="org.onosproject.driver.handshaker.CalientFiberSwitchHandshaker"/> | ||
| 113 | + </driver> | ||
| 108 | </drivers> | 114 | </drivers> |
| 109 | 115 | ... | ... |
| ... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.openflow.controller; | 16 | package org.onosproject.openflow.controller; |
| 17 | 17 | ||
| 18 | +import org.onosproject.net.Device; | ||
| 18 | import org.projectfloodlight.openflow.protocol.OFFactory; | 19 | import org.projectfloodlight.openflow.protocol.OFFactory; |
| 19 | import org.projectfloodlight.openflow.protocol.OFMessage; | 20 | import org.projectfloodlight.openflow.protocol.OFMessage; |
| 20 | import org.projectfloodlight.openflow.protocol.OFPortDesc; | 21 | import org.projectfloodlight.openflow.protocol.OFPortDesc; |
| ... | @@ -136,11 +137,11 @@ public interface OpenFlowSwitch { | ... | @@ -136,11 +137,11 @@ public interface OpenFlowSwitch { |
| 136 | void returnRoleReply(RoleState requested, RoleState response); | 137 | void returnRoleReply(RoleState requested, RoleState response); |
| 137 | 138 | ||
| 138 | /** | 139 | /** |
| 139 | - * Indicates if this switch is optical. | 140 | + * Returns the switch device type. |
| 140 | * | 141 | * |
| 141 | - * @return true if optical | 142 | + * @return device type |
| 142 | */ | 143 | */ |
| 143 | - boolean isOptical(); | 144 | + Device.Type deviceType(); |
| 144 | 145 | ||
| 145 | /** | 146 | /** |
| 146 | * Identifies the channel used to communicate with the switch. | 147 | * Identifies the channel used to communicate with the switch. | ... | ... |
| ... | @@ -18,6 +18,7 @@ package org.onosproject.openflow.controller.driver; | ... | @@ -18,6 +18,7 @@ package org.onosproject.openflow.controller.driver; |
| 18 | 18 | ||
| 19 | import org.jboss.netty.channel.Channel; | 19 | import org.jboss.netty.channel.Channel; |
| 20 | import org.onlab.packet.IpAddress; | 20 | import org.onlab.packet.IpAddress; |
| 21 | +import org.onosproject.net.Device; | ||
| 21 | import org.onosproject.net.driver.AbstractHandlerBehaviour; | 22 | import org.onosproject.net.driver.AbstractHandlerBehaviour; |
| 22 | import org.onosproject.openflow.controller.Dpid; | 23 | import org.onosproject.openflow.controller.Dpid; |
| 23 | import org.onosproject.openflow.controller.RoleState; | 24 | import org.onosproject.openflow.controller.RoleState; |
| ... | @@ -95,7 +96,7 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour | ... | @@ -95,7 +96,7 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour |
| 95 | } | 96 | } |
| 96 | 97 | ||
| 97 | @Override | 98 | @Override |
| 98 | - public final void sendMsg(OFMessage m) { | 99 | + public void sendMsg(OFMessage m) { |
| 99 | if (role == RoleState.MASTER && channel.isConnected()) { | 100 | if (role == RoleState.MASTER && channel.isConnected()) { |
| 100 | channel.write(Collections.singletonList(m)); | 101 | channel.write(Collections.singletonList(m)); |
| 101 | } | 102 | } |
| ... | @@ -413,8 +414,8 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour | ... | @@ -413,8 +414,8 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour |
| 413 | 414 | ||
| 414 | 415 | ||
| 415 | @Override | 416 | @Override |
| 416 | - public boolean isOptical() { | 417 | + public Device.Type deviceType() { |
| 417 | - return false; | 418 | + return Device.Type.SWITCH; |
| 418 | } | 419 | } |
| 419 | 420 | ||
| 420 | 421 | ... | ... |
| ... | @@ -38,6 +38,8 @@ import org.onosproject.openflow.controller.PacketListener; | ... | @@ -38,6 +38,8 @@ import org.onosproject.openflow.controller.PacketListener; |
| 38 | import org.onosproject.openflow.controller.RoleState; | 38 | import org.onosproject.openflow.controller.RoleState; |
| 39 | import org.onosproject.openflow.controller.driver.OpenFlowAgent; | 39 | import org.onosproject.openflow.controller.driver.OpenFlowAgent; |
| 40 | import org.osgi.service.component.ComponentContext; | 40 | import org.osgi.service.component.ComponentContext; |
| 41 | +import org.projectfloodlight.openflow.protocol.OFCalientFlowStatsEntry; | ||
| 42 | +import org.projectfloodlight.openflow.protocol.OFCalientFlowStatsReply; | ||
| 41 | import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus; | 43 | import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus; |
| 42 | import org.projectfloodlight.openflow.protocol.OFExperimenter; | 44 | import org.projectfloodlight.openflow.protocol.OFExperimenter; |
| 43 | import org.projectfloodlight.openflow.protocol.OFFactories; | 45 | import org.projectfloodlight.openflow.protocol.OFFactories; |
| ... | @@ -55,12 +57,17 @@ import org.projectfloodlight.openflow.protocol.OFPortStatsReply; | ... | @@ -55,12 +57,17 @@ import org.projectfloodlight.openflow.protocol.OFPortStatsReply; |
| 55 | import org.projectfloodlight.openflow.protocol.OFPortStatus; | 57 | import org.projectfloodlight.openflow.protocol.OFPortStatus; |
| 56 | import org.projectfloodlight.openflow.protocol.OFStatsReply; | 58 | import org.projectfloodlight.openflow.protocol.OFStatsReply; |
| 57 | import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; | 59 | import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; |
| 60 | +import org.projectfloodlight.openflow.protocol.action.OFActionOutput; | ||
| 61 | +import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; | ||
| 58 | import org.slf4j.Logger; | 62 | import org.slf4j.Logger; |
| 59 | import org.slf4j.LoggerFactory; | 63 | import org.slf4j.LoggerFactory; |
| 60 | 64 | ||
| 61 | import java.util.Collection; | 65 | import java.util.Collection; |
| 66 | +import java.util.Collections; | ||
| 62 | import java.util.Dictionary; | 67 | import java.util.Dictionary; |
| 63 | import java.util.HashMap; | 68 | import java.util.HashMap; |
| 69 | +import java.util.LinkedList; | ||
| 70 | +import java.util.List; | ||
| 64 | import java.util.Map; | 71 | import java.util.Map; |
| 65 | import java.util.Set; | 72 | import java.util.Set; |
| 66 | import java.util.concurrent.ConcurrentHashMap; | 73 | import java.util.concurrent.ConcurrentHashMap; |
| ... | @@ -299,16 +306,63 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -299,16 +306,63 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
| 299 | case PORT: | 306 | case PORT: |
| 300 | executorMsgs.submit(new OFMessageHandler(dpid, reply)); | 307 | executorMsgs.submit(new OFMessageHandler(dpid, reply)); |
| 301 | break; | 308 | break; |
| 302 | - default: | 309 | + case EXPERIMENTER: |
| 310 | + if (reply instanceof OFCalientFlowStatsReply) { | ||
| 311 | + // Convert Calient flow statistics to regular flow stats | ||
| 312 | + // TODO: parse remaining fields such as power levels etc. when we have proper monitoring API | ||
| 313 | + OFFlowStatsReply.Builder fsr = getSwitch(dpid).factory().buildFlowStatsReply(); | ||
| 314 | + List<OFFlowStatsEntry> entries = new LinkedList<>(); | ||
| 315 | + for (OFCalientFlowStatsEntry entry : ((OFCalientFlowStatsReply) msg).getEntries()) { | ||
| 316 | + | ||
| 317 | + // Single instruction, i.e., output to port | ||
| 318 | + OFActionOutput action = OFFactories | ||
| 319 | + .getFactory(msg.getVersion()) | ||
| 320 | + .actions() | ||
| 321 | + .buildOutput() | ||
| 322 | + .setPort(entry.getOutPort()) | ||
| 323 | + .build(); | ||
| 324 | + OFInstruction instruction = OFFactories | ||
| 325 | + .getFactory(msg.getVersion()) | ||
| 326 | + .instructions() | ||
| 327 | + .applyActions(Collections.singletonList(action)); | ||
| 328 | + OFFlowStatsEntry fs = getSwitch(dpid).factory().buildFlowStatsEntry() | ||
| 329 | + .setMatch(entry.getMatch()) | ||
| 330 | + .setTableId(entry.getTableId()) | ||
| 331 | + .setDurationSec(entry.getDurationSec()) | ||
| 332 | + .setDurationNsec(entry.getDurationNsec()) | ||
| 333 | + .setPriority(entry.getPriority()) | ||
| 334 | + .setIdleTimeout(entry.getIdleTimeout()) | ||
| 335 | + .setHardTimeout(entry.getHardTimeout()) | ||
| 336 | + .setFlags(entry.getFlags()) | ||
| 337 | + .setCookie(entry.getCookie()) | ||
| 338 | + .setInstructions(Collections.singletonList(instruction)) | ||
| 339 | + .build(); | ||
| 340 | + entries.add(fs); | ||
| 341 | + } | ||
| 342 | + fsr.setEntries(entries); | ||
| 343 | + | ||
| 344 | + flowStats = publishFlowStats(dpid, fsr.build()); | ||
| 345 | + if (flowStats != null) { | ||
| 346 | + OFFlowStatsReply.Builder rep = | ||
| 347 | + OFFactories.getFactory(msg.getVersion()).buildFlowStatsReply(); | ||
| 348 | + rep.setEntries(Lists.newLinkedList(flowStats)); | ||
| 349 | + executorMsgs.submit(new OFMessageHandler(dpid, rep.build())); | ||
| 350 | + } | ||
| 351 | + } else { | ||
| 303 | log.warn("Unsupported stats type : {}", reply.getStatsType()); | 352 | log.warn("Unsupported stats type : {}", reply.getStatsType()); |
| 304 | } | 353 | } |
| 305 | break; | 354 | break; |
| 355 | + default: | ||
| 356 | + break; | ||
| 357 | + } | ||
| 358 | + break; | ||
| 306 | case BARRIER_REPLY: | 359 | case BARRIER_REPLY: |
| 307 | executorBarrier.submit(new OFMessageHandler(dpid, msg)); | 360 | executorBarrier.submit(new OFMessageHandler(dpid, msg)); |
| 308 | break; | 361 | break; |
| 309 | case EXPERIMENTER: | 362 | case EXPERIMENTER: |
| 310 | - // Handle optical port stats | 363 | + long experimenter = ((OFExperimenter) msg).getExperimenter(); |
| 311 | - if (((OFExperimenter) msg).getExperimenter() == 0x748771) { | 364 | + if (experimenter == 0x748771) { |
| 365 | + // LINC-OE port stats | ||
| 312 | OFCircuitPortStatus circuitPortStatus = (OFCircuitPortStatus) msg; | 366 | OFCircuitPortStatus circuitPortStatus = (OFCircuitPortStatus) msg; |
| 313 | OFPortStatus.Builder portStatus = this.getSwitch(dpid).factory().buildPortStatus(); | 367 | OFPortStatus.Builder portStatus = this.getSwitch(dpid).factory().buildPortStatus(); |
| 314 | OFPortDesc.Builder portDesc = this.getSwitch(dpid).factory().buildPortDesc(); | 368 | OFPortDesc.Builder portDesc = this.getSwitch(dpid).factory().buildPortDesc(); | ... | ... |
| ... | @@ -19,6 +19,7 @@ import org.jboss.netty.channel.Channel; | ... | @@ -19,6 +19,7 @@ import org.jboss.netty.channel.Channel; |
| 19 | import org.junit.After; | 19 | import org.junit.After; |
| 20 | import org.junit.Before; | 20 | import org.junit.Before; |
| 21 | import org.junit.Test; | 21 | import org.junit.Test; |
| 22 | +import org.onosproject.net.Device; | ||
| 22 | import org.onosproject.net.driver.DriverData; | 23 | import org.onosproject.net.driver.DriverData; |
| 23 | import org.onosproject.net.driver.DriverHandler; | 24 | import org.onosproject.net.driver.DriverHandler; |
| 24 | import org.onosproject.openflow.controller.Dpid; | 25 | import org.onosproject.openflow.controller.Dpid; |
| ... | @@ -181,8 +182,8 @@ public class RoleManagerTest { | ... | @@ -181,8 +182,8 @@ public class RoleManagerTest { |
| 181 | } | 182 | } |
| 182 | 183 | ||
| 183 | @Override | 184 | @Override |
| 184 | - public boolean isOptical() { | 185 | + public Device.Type deviceType() { |
| 185 | - return false; | 186 | + return Device.Type.SWITCH; |
| 186 | } | 187 | } |
| 187 | 188 | ||
| 188 | @Override | 189 | @Override | ... | ... |
| ... | @@ -74,7 +74,7 @@ | ... | @@ -74,7 +74,7 @@ |
| 74 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | 74 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| 75 | <netty4.version>4.0.23.Final</netty4.version> | 75 | <netty4.version>4.0.23.Final</netty4.version> |
| 76 | <copycat.version>0.5.0.onos12-SNAPSHOT</copycat.version> | 76 | <copycat.version>0.5.0.onos12-SNAPSHOT</copycat.version> |
| 77 | - <openflowj.version>0.4.0.onos</openflowj.version> | 77 | + <openflowj.version>0.4.1.onos-SNAPSHOT</openflowj.version> |
| 78 | <karaf.version>3.0.3</karaf.version> | 78 | <karaf.version>3.0.3</karaf.version> |
| 79 | <jersey.version>1.19</jersey.version> | 79 | <jersey.version>1.19</jersey.version> |
| 80 | </properties> | 80 | </properties> | ... | ... |
| ... | @@ -29,9 +29,10 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -29,9 +29,10 @@ import org.apache.felix.scr.annotations.Reference; |
| 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 30 | import org.onlab.packet.ChassisId; | 30 | import org.onlab.packet.ChassisId; |
| 31 | import org.onosproject.cfg.ComponentConfigService; | 31 | import org.onosproject.cfg.ComponentConfigService; |
| 32 | +import org.onlab.util.Frequency; | ||
| 33 | +import org.onlab.util.Spectrum; | ||
| 32 | import org.onosproject.net.AnnotationKeys; | 34 | import org.onosproject.net.AnnotationKeys; |
| 33 | import org.onosproject.net.DefaultAnnotations; | 35 | import org.onosproject.net.DefaultAnnotations; |
| 34 | -import org.onosproject.net.Device; | ||
| 35 | import org.onosproject.net.DeviceId; | 36 | import org.onosproject.net.DeviceId; |
| 36 | import org.onosproject.net.MastershipRole; | 37 | import org.onosproject.net.MastershipRole; |
| 37 | import org.onosproject.net.Port; | 38 | import org.onosproject.net.Port; |
| ... | @@ -44,6 +45,7 @@ import org.onosproject.net.device.DeviceDescription; | ... | @@ -44,6 +45,7 @@ import org.onosproject.net.device.DeviceDescription; |
| 44 | import org.onosproject.net.device.DeviceProvider; | 45 | import org.onosproject.net.device.DeviceProvider; |
| 45 | import org.onosproject.net.device.DeviceProviderRegistry; | 46 | import org.onosproject.net.device.DeviceProviderRegistry; |
| 46 | import org.onosproject.net.device.DeviceProviderService; | 47 | import org.onosproject.net.device.DeviceProviderService; |
| 48 | +import org.onosproject.net.device.OmsPortDescription; | ||
| 47 | import org.onosproject.net.device.PortDescription; | 49 | import org.onosproject.net.device.PortDescription; |
| 48 | import org.onosproject.net.device.PortStatistics; | 50 | import org.onosproject.net.device.PortStatistics; |
| 49 | import org.onosproject.net.provider.AbstractProvider; | 51 | import org.onosproject.net.provider.AbstractProvider; |
| ... | @@ -57,6 +59,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitchListener; | ... | @@ -57,6 +59,7 @@ import org.onosproject.openflow.controller.OpenFlowSwitchListener; |
| 57 | import org.onosproject.openflow.controller.PortDescPropertyType; | 59 | import org.onosproject.openflow.controller.PortDescPropertyType; |
| 58 | import org.onosproject.openflow.controller.RoleState; | 60 | import org.onosproject.openflow.controller.RoleState; |
| 59 | import org.osgi.service.component.ComponentContext; | 61 | import org.osgi.service.component.ComponentContext; |
| 62 | +import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsEntry; | ||
| 60 | import org.projectfloodlight.openflow.protocol.OFFactory; | 63 | import org.projectfloodlight.openflow.protocol.OFFactory; |
| 61 | import org.projectfloodlight.openflow.protocol.OFMessage; | 64 | import org.projectfloodlight.openflow.protocol.OFMessage; |
| 62 | import org.projectfloodlight.openflow.protocol.OFPortConfig; | 65 | import org.projectfloodlight.openflow.protocol.OFPortConfig; |
| ... | @@ -290,8 +293,6 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -290,8 +293,6 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 290 | DeviceId did = deviceId(uri(dpid)); | 293 | DeviceId did = deviceId(uri(dpid)); |
| 291 | OpenFlowSwitch sw = controller.getSwitch(dpid); | 294 | OpenFlowSwitch sw = controller.getSwitch(dpid); |
| 292 | 295 | ||
| 293 | - Device.Type deviceType = sw.isOptical() ? Device.Type.ROADM : | ||
| 294 | - Device.Type.SWITCH; | ||
| 295 | ChassisId cId = new ChassisId(dpid.value()); | 296 | ChassisId cId = new ChassisId(dpid.value()); |
| 296 | 297 | ||
| 297 | SparseAnnotations annotations = DefaultAnnotations.builder() | 298 | SparseAnnotations annotations = DefaultAnnotations.builder() |
| ... | @@ -300,7 +301,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -300,7 +301,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 300 | .build(); | 301 | .build(); |
| 301 | 302 | ||
| 302 | DeviceDescription description = | 303 | DeviceDescription description = |
| 303 | - new DefaultDeviceDescription(did.uri(), deviceType, | 304 | + new DefaultDeviceDescription(did.uri(), sw.deviceType(), |
| 304 | sw.manufacturerDescription(), | 305 | sw.manufacturerDescription(), |
| 305 | sw.hardwareDescription(), | 306 | sw.hardwareDescription(), |
| 306 | sw.softwareDescription(), | 307 | sw.softwareDescription(), |
| ... | @@ -380,8 +381,11 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -380,8 +381,11 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 380 | private List<PortDescription> buildPortDescriptions(OpenFlowSwitch sw) { | 381 | private List<PortDescription> buildPortDescriptions(OpenFlowSwitch sw) { |
| 381 | final List<PortDescription> portDescs = new ArrayList<>(sw.getPorts().size()); | 382 | final List<PortDescription> portDescs = new ArrayList<>(sw.getPorts().size()); |
| 382 | sw.getPorts().forEach(port -> portDescs.add(buildPortDescription(port))); | 383 | sw.getPorts().forEach(port -> portDescs.add(buildPortDescription(port))); |
| 383 | - if (sw.isOptical()) { | 384 | + |
| 384 | - OpenFlowOpticalSwitch opsw = (OpenFlowOpticalSwitch) sw; | 385 | + OpenFlowOpticalSwitch opsw; |
| 386 | + switch (sw.deviceType()) { | ||
| 387 | + case ROADM: | ||
| 388 | + opsw = (OpenFlowOpticalSwitch) sw; | ||
| 385 | opsw.getPortTypes().forEach(type -> { | 389 | opsw.getPortTypes().forEach(type -> { |
| 386 | opsw.getPortsOf(type).forEach( | 390 | opsw.getPortsOf(type).forEach( |
| 387 | op -> { | 391 | op -> { |
| ... | @@ -389,7 +393,21 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -389,7 +393,21 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 389 | } | 393 | } |
| 390 | ); | 394 | ); |
| 391 | }); | 395 | }); |
| 396 | + break; | ||
| 397 | + case FIBER_SWITCH: | ||
| 398 | + opsw = (OpenFlowOpticalSwitch) sw; | ||
| 399 | + opsw.getPortTypes().forEach(type -> { | ||
| 400 | + opsw.getPortsOf(type).forEach( | ||
| 401 | + op -> { | ||
| 402 | + portDescs.add(buildPortDescription((OFCalientPortDescStatsEntry) op)); | ||
| 403 | + } | ||
| 404 | + ); | ||
| 405 | + }); | ||
| 406 | + break; | ||
| 407 | + default: | ||
| 408 | + break; | ||
| 392 | } | 409 | } |
| 410 | + | ||
| 393 | return portDescs; | 411 | return portDescs; |
| 394 | } | 412 | } |
| 395 | 413 | ||
| ... | @@ -454,6 +472,28 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -454,6 +472,28 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 454 | return new DefaultPortDescription(portNo, enabled, FIBER, 0, annotations); | 472 | return new DefaultPortDescription(portNo, enabled, FIBER, 0, annotations); |
| 455 | } | 473 | } |
| 456 | 474 | ||
| 475 | + /** | ||
| 476 | + * Build a portDescription from a given port description describing a fiber switch optical port. | ||
| 477 | + * | ||
| 478 | + * @param port description property type. | ||
| 479 | + * @param port the port to build from. | ||
| 480 | + * @return portDescription for the port. | ||
| 481 | + */ | ||
| 482 | + private PortDescription buildPortDescription(OFCalientPortDescStatsEntry port) { | ||
| 483 | + PortNumber portNo = PortNumber.portNumber(port.getPortNo().getPortNumber()); | ||
| 484 | + | ||
| 485 | + // FIXME when Calient OF agent reports port status | ||
| 486 | + boolean enabled = true; | ||
| 487 | + SparseAnnotations annotations = makePortNameAnnotation(port.getName()); | ||
| 488 | + | ||
| 489 | + // Wavelength range: 1260 - 1630 nm (S160 data sheet) | ||
| 490 | + // Grid is irrelevant for this type of switch | ||
| 491 | + Frequency minFreq = Spectrum.O_BAND_MAX; | ||
| 492 | + Frequency maxFreq = Spectrum.U_BAND_MIN; | ||
| 493 | + Frequency grid = Frequency.ofGHz(100); | ||
| 494 | + return new OmsPortDescription(portNo, enabled, minFreq, maxFreq, grid, annotations); | ||
| 495 | + } | ||
| 496 | + | ||
| 457 | private PortDescription buildPortDescription(OFPortStatus status) { | 497 | private PortDescription buildPortDescription(OFPortStatus status) { |
| 458 | OFPortDesc port = status.getDesc(); | 498 | OFPortDesc port = status.getDesc(); |
| 459 | if (status.getReason() != OFPortReason.DELETE) { | 499 | if (status.getReason() != OFPortReason.DELETE) { | ... | ... |
| ... | @@ -384,8 +384,8 @@ public class OpenFlowDeviceProviderTest { | ... | @@ -384,8 +384,8 @@ public class OpenFlowDeviceProviderTest { |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | @Override | 386 | @Override |
| 387 | - public boolean isOptical() { | 387 | + public Device.Type deviceType() { |
| 388 | - return false; | 388 | + return Device.Type.SWITCH; |
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | @Override | 391 | @Override | ... | ... |
| ... | @@ -370,7 +370,7 @@ public class OpenFlowRuleProvider extends AbstractProvider | ... | @@ -370,7 +370,7 @@ public class OpenFlowRuleProvider extends AbstractProvider |
| 370 | + " tell us which one."); | 370 | + " tell us which one."); |
| 371 | } | 371 | } |
| 372 | } | 372 | } |
| 373 | - | 373 | + break; |
| 374 | default: | 374 | default: |
| 375 | log.debug("Unhandled message type: {}", msg.getType()); | 375 | log.debug("Unhandled message type: {}", msg.getType()); |
| 376 | } | 376 | } | ... | ... |
| ... | @@ -6,6 +6,7 @@ import org.junit.Before; | ... | @@ -6,6 +6,7 @@ import org.junit.Before; |
| 6 | import org.junit.Test; | 6 | import org.junit.Test; |
| 7 | import org.onosproject.core.DefaultGroupId; | 7 | import org.onosproject.core.DefaultGroupId; |
| 8 | import org.onosproject.core.GroupId; | 8 | import org.onosproject.core.GroupId; |
| 9 | +import org.onosproject.net.Device; | ||
| 9 | import org.onosproject.net.DeviceId; | 10 | import org.onosproject.net.DeviceId; |
| 10 | import org.onosproject.net.PortNumber; | 11 | import org.onosproject.net.PortNumber; |
| 11 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 12 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| ... | @@ -383,8 +384,8 @@ public class OpenFlowGroupProviderTest { | ... | @@ -383,8 +384,8 @@ public class OpenFlowGroupProviderTest { |
| 383 | } | 384 | } |
| 384 | 385 | ||
| 385 | @Override | 386 | @Override |
| 386 | - public boolean isOptical() { | 387 | + public Device.Type deviceType() { |
| 387 | - return false; | 388 | + return Device.Type.SWITCH; |
| 388 | } | 389 | } |
| 389 | 390 | ||
| 390 | @Override | 391 | @Override | ... | ... |
| ... | @@ -22,6 +22,7 @@ import org.junit.Before; | ... | @@ -22,6 +22,7 @@ import org.junit.Before; |
| 22 | import org.junit.Test; | 22 | import org.junit.Test; |
| 23 | import org.onlab.packet.ARP; | 23 | import org.onlab.packet.ARP; |
| 24 | import org.onlab.packet.Ethernet; | 24 | import org.onlab.packet.Ethernet; |
| 25 | +import org.onosproject.net.Device; | ||
| 25 | import org.onosproject.net.DeviceId; | 26 | import org.onosproject.net.DeviceId; |
| 26 | import org.onosproject.net.PortNumber; | 27 | import org.onosproject.net.PortNumber; |
| 27 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 28 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| ... | @@ -412,12 +413,11 @@ public class OpenFlowPacketProviderTest { | ... | @@ -412,12 +413,11 @@ public class OpenFlowPacketProviderTest { |
| 412 | } | 413 | } |
| 413 | 414 | ||
| 414 | @Override | 415 | @Override |
| 415 | - public boolean isOptical() { | 416 | + public void returnRoleReply(RoleState requested, RoleState reponse) { |
| 416 | - return false; | ||
| 417 | } | 417 | } |
| 418 | - | ||
| 419 | @Override | 418 | @Override |
| 420 | - public void returnRoleReply(RoleState requested, RoleState reponse) { | 419 | + public Device.Type deviceType() { |
| 420 | + return Device.Type.SWITCH; | ||
| 421 | } | 421 | } |
| 422 | 422 | ||
| 423 | @Override | 423 | @Override | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 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 | +package org.onlab.util; | ||
| 17 | + | ||
| 18 | +/** | ||
| 19 | + * Telecom optical wavelength bands: O, E, S, C, L and U bands. | ||
| 20 | + * | ||
| 21 | + * See ITU-T G-Series Recommendations, Supplement 39 | ||
| 22 | + */ | ||
| 23 | +public final class Spectrum { | ||
| 24 | + | ||
| 25 | + private Spectrum() { | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + // O band (original): 1260 to 1360 nm | ||
| 29 | + public static final Frequency O_BAND_MIN = Frequency.ofTHz(220.436); | ||
| 30 | + public static final Frequency O_BAND_MAX = Frequency.ofTHz(237.931); | ||
| 31 | + | ||
| 32 | + // E band (extended): 1360 to 1460 nm | ||
| 33 | + public static final Frequency E_BAND_MIN = Frequency.ofTHz(205.337); | ||
| 34 | + public static final Frequency E_BAND_MAX = Frequency.ofTHz(220.436); | ||
| 35 | + | ||
| 36 | + // S band (short wavelength): 1460 to 1530 nm | ||
| 37 | + public static final Frequency S_BAND_MIN = Frequency.ofTHz(195.943); | ||
| 38 | + public static final Frequency S_BAND_MAX = Frequency.ofTHz(205.337); | ||
| 39 | + | ||
| 40 | + // C band (conventional): 1530 to 1565 nm | ||
| 41 | + public static final Frequency C_BAND_MIN = Frequency.ofTHz(191.561); | ||
| 42 | + public static final Frequency C_BAND_MAX = Frequency.ofTHz(195.943); | ||
| 43 | + | ||
| 44 | + // L band (long wavelength): 1565 to 1625 nm | ||
| 45 | + public static final Frequency L_BAND_MIN = Frequency.ofTHz(184.488); | ||
| 46 | + public static final Frequency L_BAND_MAX = Frequency.ofTHz(191.561); | ||
| 47 | + | ||
| 48 | + // U band (ultra-long wavelength): 1625 to 1675 nm | ||
| 49 | + public static final Frequency U_BAND_MIN = Frequency.ofTHz(178.981); | ||
| 50 | + public static final Frequency U_BAND_MAX = Frequency.ofTHz(184.488); | ||
| 51 | +} |
-
Please register or login to post a comment