blob: 1e270b0cd9febf2cf7816fd19fdaee6694d235e2 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
alshabibb452fd72015-04-22 20:46:20 -07002 * Copyright 2015 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
alshabibb452fd72015-04-22 20:46:20 -070016package org.onosproject.driver.handshaker;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070017
Marc De Leenheerb9311372015-07-09 11:36:49 -070018import org.onosproject.net.Device;
Ayaka Koshibe5460d622015-05-14 12:19:19 -070019import org.onosproject.openflow.controller.OpenFlowOpticalSwitch;
20import org.onosproject.openflow.controller.PortDescPropertyType;
Brian O'Connorabafb502014-12-02 22:26:20 -080021import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
22import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
23import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
24import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070025import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070026import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
27import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070028import org.projectfloodlight.openflow.protocol.OFMessage;
Ayaka Koshibe5460d622015-05-14 12:19:19 -070029import org.projectfloodlight.openflow.protocol.OFObject;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070030import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070031import org.projectfloodlight.openflow.protocol.OFStatsReply;
32import org.projectfloodlight.openflow.protocol.OFStatsType;
alshabib452234e2014-11-25 00:03:49 -050033
Ayaka Koshibe5460d622015-05-14 12:19:19 -070034import com.google.common.collect.ImmutableList;
35import com.google.common.collect.ImmutableSet;
36
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070037import java.io.IOException;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070038import java.util.List;
Ayaka Koshibe5460d622015-05-14 12:19:19 -070039import java.util.Set;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070040import java.util.concurrent.atomic.AtomicBoolean;
41
42/**
43 * LINC-OE Optical Emulator switch class.
44 */
Ayaka Koshibe5460d622015-05-14 12:19:19 -070045public class OFOpticalSwitchImplLINC13
46 extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070047
alshabibb452fd72015-04-22 20:46:20 -070048 private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070049 private long barrierXidToWaitFor = -1;
50
Ayaka Koshibe5460d622015-05-14 12:19:19 -070051 private OFCircuitPortsReply wPorts;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070052
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070053 @Override
54 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070055 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070056 if (startDriverHandshakeCalled) {
57 throw new SwitchDriverSubHandshakeAlreadyStarted();
58 }
59 startDriverHandshakeCalled = true;
60 try {
61 sendHandshakeOFExperimenterPortDescRequest();
62 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070063 log.error("LINC-OE exception while sending experimenter port desc:",
64 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070065 e.printStackTrace();
66 }
67 }
68
69 @Override
70 public boolean isDriverHandshakeComplete() {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070071 return driverHandshakeComplete.get();
72 }
73
74 @Override
75 public void processDriverHandshakeMessage(OFMessage m) {
alshabib9af70072015-02-09 14:34:16 -080076 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070077 throw new SwitchDriverSubHandshakeNotStarted();
78 }
79 if (driverHandshakeComplete.get()) {
80 throw new SwitchDriverSubHandshakeCompleted(m);
81 }
82
83 switch (m.getType()) {
84 case BARRIER_REPLY:
85 if (m.getXid() == barrierXidToWaitFor) {
86 log.debug("LINC-OE Received barrier response");
87 }
88 break;
89 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -070090 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070091 break;
92 case FEATURES_REPLY:
93 break;
94 case FLOW_REMOVED:
95 break;
96 case GET_ASYNC_REPLY:
97 break;
98 case PACKET_IN:
99 break;
100 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700101 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
102 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700103 break;
104 case QUEUE_GET_CONFIG_REPLY:
105 break;
106 case ROLE_REPLY:
107 break;
108 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700109 OFStatsReply stats = (OFStatsReply) m;
110 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
111 log.warn("LINC-OE : Received stats reply message {}", m);
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700112 wPorts = (OFCircuitPortsReply) m;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700113 driverHandshakeComplete.set(true);
114 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700115 break;
116 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700117 log.warn("Received message {} during switch-driver " +
118 "subhandshake " + "from switch {} ... " +
119 "Ignoring message", m,
120 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700121
122 }
123 }
124
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700125 public void processOFPortStatus(OFCircuitPortStatus ps) {
126 log.debug("LINC-OE ..OF Port Status :", ps);
127
128 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700129
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700130 private void sendHandshakeOFExperimenterPortDescRequest() throws
131 IOException {
132 // send multi part message for port description for optical switches
133 OFCircuitPortsRequest circuitPortsRequest = factory()
134 .buildCircuitPortsRequest().setXid(getNextTransactionId())
135 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700136 log.warn("LINC-OE : Sending experimented circuit port stats " +
137 "message " +
138 "{}",
139 circuitPortsRequest.toString());
alshabiba2df7b2a2015-05-06 13:57:10 -0700140 this.sendHandshakeMessage(circuitPortsRequest);
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700141 }
142
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700143 @Override
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700144 /**
145 * Returns a list of standard (Ethernet) ports.
146 *
147 * @return List of ports
148 */
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700149 public List<OFPortDesc> getPorts() {
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700150 return ImmutableList.copyOf(super.getPorts());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700151 }
152
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700153
154 @Override
155 public Boolean supportNxRole() {
156 return false;
157 }
158
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700159 @Override
Marc De Leenheerb9311372015-07-09 11:36:49 -0700160 public Device.Type deviceType() {
161 return Device.Type.ROADM;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700162 }
163
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700164 @Override
165 public List<? extends OFObject> getPortsOf(PortDescPropertyType type) {
166 return ImmutableList.copyOf(wPorts.getEntries());
167 }
168
169 @Override
170 public Set<PortDescPropertyType> getPortTypes() {
171 return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT);
172 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700173}