blob: 66c017bc3abb3ce04052d58acc007628a4e155ae [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 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 */
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070016package org.onlab.onos.openflow.drivers.impl;
17
18import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
19import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
20import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
21import org.onlab.onos.openflow.controller.Dpid;
22import org.onlab.onos.openflow.controller.driver.AbstractOpenFlowSwitch;
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;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070033import java.io.IOException;
34import java.util.ArrayList;
35import java.util.Collection;
36import java.util.Collections;
37import java.util.List;
38import java.util.concurrent.atomic.AtomicBoolean;
39
40/**
41 * LINC-OE Optical Emulator switch class.
42 */
43public class OFOpticalSwitchImplLINC13 extends AbstractOpenFlowSwitch {
44
45 private final AtomicBoolean driverHandshakeComplete;
46 private long barrierXidToWaitFor = -1;
47
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070048 private OFPortDescStatsReply wPorts;
49
Yuta HIGUCHIbccb6be2014-10-09 17:20:29 -070050 OFOpticalSwitchImplLINC13(Dpid dpid, OFDescStatsReply desc) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070051 super(dpid);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070052 driverHandshakeComplete = new AtomicBoolean(false);
53 setSwitchDescription(desc);
54 }
55
56 @Override
57 public String toString() {
58 return "OFOpticalSwitchImplLINC13 [" + ((channel != null)
59 ? channel.getRemoteAddress() : "?")
60 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
61 }
62
63 @Override
64 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070065 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070066 if (startDriverHandshakeCalled) {
67 throw new SwitchDriverSubHandshakeAlreadyStarted();
68 }
69 startDriverHandshakeCalled = true;
70 try {
71 sendHandshakeOFExperimenterPortDescRequest();
72 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070073 log.error("LINC-OE exception while sending experimenter port desc:",
74 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070075 e.printStackTrace();
76 }
77 }
78
79 @Override
80 public boolean isDriverHandshakeComplete() {
81 if (!startDriverHandshakeCalled) {
82 throw new SwitchDriverSubHandshakeNotStarted();
83 }
84 return driverHandshakeComplete.get();
85 }
86
87 @Override
88 public void processDriverHandshakeMessage(OFMessage m) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070089 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070090 throw new SwitchDriverSubHandshakeNotStarted();
91 }
92 if (driverHandshakeComplete.get()) {
93 throw new SwitchDriverSubHandshakeCompleted(m);
94 }
95
96 switch (m.getType()) {
97 case BARRIER_REPLY:
98 if (m.getXid() == barrierXidToWaitFor) {
99 log.debug("LINC-OE Received barrier response");
100 }
101 break;
102 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -0700103 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700104 break;
105 case FEATURES_REPLY:
106 break;
107 case FLOW_REMOVED:
108 break;
109 case GET_ASYNC_REPLY:
110 break;
111 case PACKET_IN:
112 break;
113 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700114 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
115 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700116 break;
117 case QUEUE_GET_CONFIG_REPLY:
118 break;
119 case ROLE_REPLY:
120 break;
121 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700122 OFStatsReply stats = (OFStatsReply) m;
123 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
124 log.warn("LINC-OE : Received stats reply message {}", m);
125 processHandshakeOFExperimenterPortDescRequest(
126 (OFCircuitPortsReply) m);
127 driverHandshakeComplete.set(true);
128 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700129 break;
130 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700131 log.warn("Received message {} during switch-driver " +
132 "subhandshake " + "from switch {} ... " +
133 "Ignoring message", m,
134 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700135
136 }
137 }
138
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700139 //Todo
140 public void processOFPortStatus(OFCircuitPortStatus ps) {
141 log.debug("LINC-OE ..OF Port Status :", ps);
142
143 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700144
145 private void processHandshakeOFExperimenterPortDescRequest(
146 OFCircuitPortsReply sr) {
147 Collection<OFPortOptical> entries = sr.getEntries();
148 List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
149 for (OFPortOptical entry : entries) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700150 log.warn("LINC:OE port message {}", entry.toString());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700151 ofPortDescList.add(factory().buildPortDesc().
152 setPortNo(entry.getPortNo())
153 .setConfig(entry.getConfig())
154 .setState(entry.getState())
155 .setHwAddr(entry.getHwAddr())
156 .setName(entry.getName())
157 .build());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700158
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700159 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700160 setExperimenterPortDescReply(factory().buildPortDescStatsReply().
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700161 setEntries(ofPortDescList).build());
162 }
163
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700164 private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
165 wPorts = reply;
166 }
167
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700168
169 private void sendHandshakeOFExperimenterPortDescRequest() throws
170 IOException {
171 // send multi part message for port description for optical switches
172 OFCircuitPortsRequest circuitPortsRequest = factory()
173 .buildCircuitPortsRequest().setXid(getNextTransactionId())
174 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700175 log.warn("LINC-OE : Sending experimented circuit port stats " +
176 "message " +
177 "{}",
178 circuitPortsRequest.toString());
179 this.write(Collections.<OFMessage>singletonList(circuitPortsRequest));
180 }
181
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700182 @Override
183 public List<OFPortDesc> getPorts() {
184 List<OFPortDesc> portEntries = new ArrayList<>();
185 portEntries.addAll(ports.getEntries());
186 if (wPorts != null) {
187 portEntries.addAll(wPorts.getEntries());
188 }
189 return Collections.unmodifiableList(portEntries);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700190 }
191
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700192 @Override
193 public void write(OFMessage msg) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700194 this.channel.write(Collections.singletonList(msg));
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700195 }
196
197 @Override
198 public void write(List<OFMessage> msgs) {
199 this.channel.write(msgs);
200 }
201
202 @Override
203 public Boolean supportNxRole() {
204 return false;
205 }
206
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700207 @Override
208 public boolean isOptical() {
209 return true;
210 }
211
212
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700213}