blob: ec449b78d49f761bc41dde60ee52d5affbe393b6 [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
Ayaka Koshibe5460d622015-05-14 12:19:19 -070018import org.onosproject.openflow.controller.OpenFlowOpticalSwitch;
19import org.onosproject.openflow.controller.PortDescPropertyType;
Brian O'Connorabafb502014-12-02 22:26:20 -080020import org.onosproject.openflow.controller.driver.AbstractOpenFlowSwitch;
21import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
22import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
23import org.onosproject.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070024import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070025import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
26import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070027import org.projectfloodlight.openflow.protocol.OFMessage;
Ayaka Koshibe5460d622015-05-14 12:19:19 -070028import org.projectfloodlight.openflow.protocol.OFObject;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070029import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070030import org.projectfloodlight.openflow.protocol.OFStatsReply;
31import org.projectfloodlight.openflow.protocol.OFStatsType;
alshabib452234e2014-11-25 00:03:49 -050032
Ayaka Koshibe5460d622015-05-14 12:19:19 -070033import com.google.common.collect.ImmutableList;
34import com.google.common.collect.ImmutableSet;
35
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070036import java.io.IOException;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070037import java.util.List;
Ayaka Koshibe5460d622015-05-14 12:19:19 -070038import java.util.Set;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070039import java.util.concurrent.atomic.AtomicBoolean;
40
41/**
42 * LINC-OE Optical Emulator switch class.
43 */
Ayaka Koshibe5460d622015-05-14 12:19:19 -070044public class OFOpticalSwitchImplLINC13
45 extends AbstractOpenFlowSwitch implements OpenFlowOpticalSwitch {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070046
alshabibb452fd72015-04-22 20:46:20 -070047 private final AtomicBoolean driverHandshakeComplete = new AtomicBoolean(false);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070048 private long barrierXidToWaitFor = -1;
49
Ayaka Koshibe5460d622015-05-14 12:19:19 -070050 private OFCircuitPortsReply wPorts;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070051
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070052 @Override
53 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070054 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070055 if (startDriverHandshakeCalled) {
56 throw new SwitchDriverSubHandshakeAlreadyStarted();
57 }
58 startDriverHandshakeCalled = true;
59 try {
60 sendHandshakeOFExperimenterPortDescRequest();
61 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070062 log.error("LINC-OE exception while sending experimenter port desc:",
63 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070064 e.printStackTrace();
65 }
66 }
67
68 @Override
69 public boolean isDriverHandshakeComplete() {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070070 return driverHandshakeComplete.get();
71 }
72
73 @Override
74 public void processDriverHandshakeMessage(OFMessage m) {
alshabib9af70072015-02-09 14:34:16 -080075 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070076 throw new SwitchDriverSubHandshakeNotStarted();
77 }
78 if (driverHandshakeComplete.get()) {
79 throw new SwitchDriverSubHandshakeCompleted(m);
80 }
81
82 switch (m.getType()) {
83 case BARRIER_REPLY:
84 if (m.getXid() == barrierXidToWaitFor) {
85 log.debug("LINC-OE Received barrier response");
86 }
87 break;
88 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -070089 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070090 break;
91 case FEATURES_REPLY:
92 break;
93 case FLOW_REMOVED:
94 break;
95 case GET_ASYNC_REPLY:
96 break;
97 case PACKET_IN:
98 break;
99 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700100 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
101 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700102 break;
103 case QUEUE_GET_CONFIG_REPLY:
104 break;
105 case ROLE_REPLY:
106 break;
107 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700108 OFStatsReply stats = (OFStatsReply) m;
109 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
110 log.warn("LINC-OE : Received stats reply message {}", m);
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700111 wPorts = (OFCircuitPortsReply) m;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700112 driverHandshakeComplete.set(true);
113 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700114 break;
115 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700116 log.warn("Received message {} during switch-driver " +
117 "subhandshake " + "from switch {} ... " +
118 "Ignoring message", m,
119 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700120
121 }
122 }
123
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700124 public void processOFPortStatus(OFCircuitPortStatus ps) {
125 log.debug("LINC-OE ..OF Port Status :", ps);
126
127 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700128
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700129 private void sendHandshakeOFExperimenterPortDescRequest() throws
130 IOException {
131 // send multi part message for port description for optical switches
132 OFCircuitPortsRequest circuitPortsRequest = factory()
133 .buildCircuitPortsRequest().setXid(getNextTransactionId())
134 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700135 log.warn("LINC-OE : Sending experimented circuit port stats " +
136 "message " +
137 "{}",
138 circuitPortsRequest.toString());
alshabiba2df7b2a2015-05-06 13:57:10 -0700139 this.sendHandshakeMessage(circuitPortsRequest);
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700140 }
141
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700142 @Override
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700143 /**
144 * Returns a list of standard (Ethernet) ports.
145 *
146 * @return List of ports
147 */
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700148 public List<OFPortDesc> getPorts() {
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700149 return ImmutableList.copyOf(super.getPorts());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700150 }
151
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700152
153 @Override
154 public Boolean supportNxRole() {
155 return false;
156 }
157
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700158 @Override
159 public boolean isOptical() {
160 return true;
161 }
162
Ayaka Koshibe5460d622015-05-14 12:19:19 -0700163 @Override
164 public List<? extends OFObject> getPortsOf(PortDescPropertyType type) {
165 return ImmutableList.copyOf(wPorts.getEntries());
166 }
167
168 @Override
169 public Set<PortDescPropertyType> getPortTypes() {
170 return ImmutableSet.of(PortDescPropertyType.OPTICAL_TRANSPORT);
171 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700172}