blob: 2c0749cbd9a2c1eb789bff163a138458cc1788f2 [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
Brian O'Connorabafb502014-12-02 22:26:20 -080018import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
19import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
20import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
21import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070022import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070023import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
24import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070025import org.projectfloodlight.openflow.protocol.OFMessage;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070026import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070027import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070028import org.projectfloodlight.openflow.protocol.OFPortOptical;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070029import org.projectfloodlight.openflow.protocol.OFStatsReply;
30import org.projectfloodlight.openflow.protocol.OFStatsType;
alshabib452234e2014-11-25 00:03:49 -050031
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070032import java.io.IOException;
33import java.util.ArrayList;
34import java.util.Collection;
35import java.util.Collections;
36import java.util.List;
37import java.util.concurrent.atomic.AtomicBoolean;
38
39/**
40 * LINC-OE Optical Emulator switch class.
41 */
42public class OFOpticalSwitchImplLINC13 extends AbstractOpenFlowSwitch {
43
alshabibb452fd72015-04-22 20:46:20 -070044 private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070045 private long barrierXidToWaitFor = -1;
46
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070047 private OFPortDescStatsReply wPorts;
48
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070049 @Override
50 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070051 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070052 if (startDriverHandshakeCalled) {
53 throw new SwitchDriverSubHandshakeAlreadyStarted();
54 }
55 startDriverHandshakeCalled = true;
56 try {
57 sendHandshakeOFExperimenterPortDescRequest();
58 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070059 log.error("LINC-OE exception while sending experimenter port desc:",
60 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070061 e.printStackTrace();
62 }
63 }
64
65 @Override
66 public boolean isDriverHandshakeComplete() {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070067 return driverHandshakeComplete.get();
68 }
69
70 @Override
71 public void processDriverHandshakeMessage(OFMessage m) {
alshabib9af70072015-02-09 14:34:16 -080072 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070073 throw new SwitchDriverSubHandshakeNotStarted();
74 }
75 if (driverHandshakeComplete.get()) {
76 throw new SwitchDriverSubHandshakeCompleted(m);
77 }
78
79 switch (m.getType()) {
80 case BARRIER_REPLY:
81 if (m.getXid() == barrierXidToWaitFor) {
82 log.debug("LINC-OE Received barrier response");
83 }
84 break;
85 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -070086 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070087 break;
88 case FEATURES_REPLY:
89 break;
90 case FLOW_REMOVED:
91 break;
92 case GET_ASYNC_REPLY:
93 break;
94 case PACKET_IN:
95 break;
96 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070097 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
98 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070099 break;
100 case QUEUE_GET_CONFIG_REPLY:
101 break;
102 case ROLE_REPLY:
103 break;
104 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700105 OFStatsReply stats = (OFStatsReply) m;
106 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
107 log.warn("LINC-OE : Received stats reply message {}", m);
108 processHandshakeOFExperimenterPortDescRequest(
109 (OFCircuitPortsReply) m);
110 driverHandshakeComplete.set(true);
111 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700112 break;
113 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700114 log.warn("Received message {} during switch-driver " +
115 "subhandshake " + "from switch {} ... " +
116 "Ignoring message", m,
117 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700118
119 }
120 }
121
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700122 public void processOFPortStatus(OFCircuitPortStatus ps) {
123 log.debug("LINC-OE ..OF Port Status :", ps);
124
125 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700126
127 private void processHandshakeOFExperimenterPortDescRequest(
128 OFCircuitPortsReply sr) {
129 Collection<OFPortOptical> entries = sr.getEntries();
130 List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
131 for (OFPortOptical entry : entries) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700132 log.warn("LINC:OE port message {}", entry.toString());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700133 ofPortDescList.add(factory().buildPortDesc().
134 setPortNo(entry.getPortNo())
135 .setConfig(entry.getConfig())
136 .setState(entry.getState())
137 .setHwAddr(entry.getHwAddr())
138 .setName(entry.getName())
139 .build());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700140
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700141 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700142 setExperimenterPortDescReply(factory().buildPortDescStatsReply().
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700143 setEntries(ofPortDescList).build());
144 }
145
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700146 private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
147 wPorts = reply;
148 }
149
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700150
151 private void sendHandshakeOFExperimenterPortDescRequest() throws
152 IOException {
153 // send multi part message for port description for optical switches
154 OFCircuitPortsRequest circuitPortsRequest = factory()
155 .buildCircuitPortsRequest().setXid(getNextTransactionId())
156 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700157 log.warn("LINC-OE : Sending experimented circuit port stats " +
158 "message " +
159 "{}",
160 circuitPortsRequest.toString());
alshabiba2df7b2a2015-05-06 13:57:10 -0700161 this.sendHandshakeMessage(circuitPortsRequest);
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700162 }
163
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700164 @Override
165 public List<OFPortDesc> getPorts() {
166 List<OFPortDesc> portEntries = new ArrayList<>();
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -0700167 portEntries.addAll(super.getPorts());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700168 if (wPorts != null) {
169 portEntries.addAll(wPorts.getEntries());
170 }
171 return Collections.unmodifiableList(portEntries);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700172 }
173
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700174
175 @Override
176 public Boolean supportNxRole() {
177 return false;
178 }
179
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700180 @Override
181 public boolean isOptical() {
182 return true;
183 }
184
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700185}