blob: 37022a129d866dab708860507af3e991031dc93a [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.openflow.drivers;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070017
Brian O'Connorabafb502014-12-02 22:26:20 -080018import org.onosproject.openflow.controller.Dpid;
19import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
20import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
21import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
22import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070023import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070024import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
25import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
26import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070027import org.projectfloodlight.openflow.protocol.OFMessage;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070028import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070029import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070030import org.projectfloodlight.openflow.protocol.OFPortOptical;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070031import org.projectfloodlight.openflow.protocol.OFStatsReply;
32import org.projectfloodlight.openflow.protocol.OFStatsType;
Saurav Dasfa2fa932015-03-03 11:29:48 -080033import org.projectfloodlight.openflow.types.TableId;
alshabib452234e2014-11-25 00:03:49 -050034
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070035import java.io.IOException;
36import java.util.ArrayList;
37import java.util.Collection;
38import java.util.Collections;
39import java.util.List;
40import java.util.concurrent.atomic.AtomicBoolean;
41
42/**
43 * LINC-OE Optical Emulator switch class.
44 */
45public class OFOpticalSwitchImplLINC13 extends AbstractOpenFlowSwitch {
46
47 private final AtomicBoolean driverHandshakeComplete;
48 private long barrierXidToWaitFor = -1;
49
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070050 private OFPortDescStatsReply wPorts;
51
Yuta HIGUCHIbccb6be2014-10-09 17:20:29 -070052 OFOpticalSwitchImplLINC13(Dpid dpid, OFDescStatsReply desc) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070053 super(dpid);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070054 driverHandshakeComplete = new AtomicBoolean(false);
55 setSwitchDescription(desc);
56 }
57
58 @Override
59 public String toString() {
60 return "OFOpticalSwitchImplLINC13 [" + ((channel != null)
61 ? channel.getRemoteAddress() : "?")
62 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
63 }
64
65 @Override
66 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070067 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070068 if (startDriverHandshakeCalled) {
69 throw new SwitchDriverSubHandshakeAlreadyStarted();
70 }
71 startDriverHandshakeCalled = true;
72 try {
73 sendHandshakeOFExperimenterPortDescRequest();
74 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070075 log.error("LINC-OE exception while sending experimenter port desc:",
76 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070077 e.printStackTrace();
78 }
79 }
80
81 @Override
82 public boolean isDriverHandshakeComplete() {
83 if (!startDriverHandshakeCalled) {
84 throw new SwitchDriverSubHandshakeNotStarted();
85 }
86 return driverHandshakeComplete.get();
87 }
88
89 @Override
90 public void processDriverHandshakeMessage(OFMessage m) {
alshabib9af70072015-02-09 14:34:16 -080091 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070092 throw new SwitchDriverSubHandshakeNotStarted();
93 }
94 if (driverHandshakeComplete.get()) {
95 throw new SwitchDriverSubHandshakeCompleted(m);
96 }
97
98 switch (m.getType()) {
99 case BARRIER_REPLY:
100 if (m.getXid() == barrierXidToWaitFor) {
101 log.debug("LINC-OE Received barrier response");
102 }
103 break;
104 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -0700105 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700106 break;
107 case FEATURES_REPLY:
108 break;
109 case FLOW_REMOVED:
110 break;
111 case GET_ASYNC_REPLY:
112 break;
113 case PACKET_IN:
114 break;
115 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700116 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
117 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700118 break;
119 case QUEUE_GET_CONFIG_REPLY:
120 break;
121 case ROLE_REPLY:
122 break;
123 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700124 OFStatsReply stats = (OFStatsReply) m;
125 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
126 log.warn("LINC-OE : Received stats reply message {}", m);
127 processHandshakeOFExperimenterPortDescRequest(
128 (OFCircuitPortsReply) m);
129 driverHandshakeComplete.set(true);
130 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700131 break;
132 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700133 log.warn("Received message {} during switch-driver " +
134 "subhandshake " + "from switch {} ... " +
135 "Ignoring message", m,
136 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700137
138 }
139 }
140
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700141 public void processOFPortStatus(OFCircuitPortStatus ps) {
142 log.debug("LINC-OE ..OF Port Status :", ps);
143
144 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700145
146 private void processHandshakeOFExperimenterPortDescRequest(
147 OFCircuitPortsReply sr) {
148 Collection<OFPortOptical> entries = sr.getEntries();
149 List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
150 for (OFPortOptical entry : entries) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700151 log.warn("LINC:OE port message {}", entry.toString());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700152 ofPortDescList.add(factory().buildPortDesc().
153 setPortNo(entry.getPortNo())
154 .setConfig(entry.getConfig())
155 .setState(entry.getState())
156 .setHwAddr(entry.getHwAddr())
157 .setName(entry.getName())
158 .build());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700159
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700160 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700161 setExperimenterPortDescReply(factory().buildPortDescStatsReply().
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700162 setEntries(ofPortDescList).build());
163 }
164
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700165 private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
166 wPorts = reply;
167 }
168
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700169
170 private void sendHandshakeOFExperimenterPortDescRequest() throws
171 IOException {
172 // send multi part message for port description for optical switches
173 OFCircuitPortsRequest circuitPortsRequest = factory()
174 .buildCircuitPortsRequest().setXid(getNextTransactionId())
175 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700176 log.warn("LINC-OE : Sending experimented circuit port stats " +
177 "message " +
178 "{}",
179 circuitPortsRequest.toString());
180 this.write(Collections.<OFMessage>singletonList(circuitPortsRequest));
181 }
182
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700183 @Override
184 public List<OFPortDesc> getPorts() {
185 List<OFPortDesc> portEntries = new ArrayList<>();
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -0700186 portEntries.addAll(super.getPorts());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700187 if (wPorts != null) {
188 portEntries.addAll(wPorts.getEntries());
189 }
190 return Collections.unmodifiableList(portEntries);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700191 }
192
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700193 @Override
194 public void write(OFMessage msg) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700195 this.channel.write(Collections.singletonList(msg));
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700196 }
197
198 @Override
199 public void write(List<OFMessage> msgs) {
200 this.channel.write(msgs);
201 }
202
203 @Override
204 public Boolean supportNxRole() {
205 return false;
206 }
207
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700208 @Override
209 public boolean isOptical() {
210 return true;
211 }
212
Saurav Dasfa2fa932015-03-03 11:29:48 -0800213 @Override
214 public TableType getTableType(TableId tid) {
215 return TableType.NONE;
216 }
217
218 @Override
219 public void transformAndSendMsg(OFMessage msg, TableType tableType) {
220 // TODO Auto-generated method stub
221
222 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700223
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700224}