blob: 3d8d93f74b9f82d0367a4cf20f11d36e51520dbb [file] [log] [blame]
Praseed Balakrishnane48aa682014-10-08 17:31:37 -07001package org.onlab.onos.openflow.drivers.impl;
2
3import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
4import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeCompleted;
5import org.onlab.onos.openflow.controller.driver.SwitchDriverSubHandshakeNotStarted;
6import org.onlab.onos.openflow.controller.Dpid;
7import org.onlab.onos.openflow.controller.driver.AbstractOpenFlowSwitch;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -07008import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -07009import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
10import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
11import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
12import org.projectfloodlight.openflow.protocol.OFErrorMsg;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070013import org.projectfloodlight.openflow.protocol.OFMessage;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070014import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070015import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070016import org.projectfloodlight.openflow.protocol.OFPortOptical;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070017import org.projectfloodlight.openflow.protocol.OFStatsReply;
18import org.projectfloodlight.openflow.protocol.OFStatsType;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070019import org.slf4j.Logger;
20import org.slf4j.LoggerFactory;
21
22import java.io.IOException;
23import java.util.ArrayList;
24import java.util.Collection;
25import java.util.Collections;
26import java.util.List;
27import java.util.concurrent.atomic.AtomicBoolean;
28
29/**
30 * LINC-OE Optical Emulator switch class.
31 */
32public class OFOpticalSwitchImplLINC13 extends AbstractOpenFlowSwitch {
33
34 private final AtomicBoolean driverHandshakeComplete;
35 private long barrierXidToWaitFor = -1;
36
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070037 private OFPortDescStatsReply wPorts;
38
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070039 private final Logger log =
40 LoggerFactory.getLogger(OFOpticalSwitchImplLINC13.class);
41
Yuta HIGUCHIbccb6be2014-10-09 17:20:29 -070042 OFOpticalSwitchImplLINC13(Dpid dpid, OFDescStatsReply desc) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070043 super(dpid);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070044 driverHandshakeComplete = new AtomicBoolean(false);
45 setSwitchDescription(desc);
46 }
47
48 @Override
49 public String toString() {
50 return "OFOpticalSwitchImplLINC13 [" + ((channel != null)
51 ? channel.getRemoteAddress() : "?")
52 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
53 }
54
55 @Override
56 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070057 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070058 if (startDriverHandshakeCalled) {
59 throw new SwitchDriverSubHandshakeAlreadyStarted();
60 }
61 startDriverHandshakeCalled = true;
62 try {
63 sendHandshakeOFExperimenterPortDescRequest();
64 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070065 log.error("LINC-OE exception while sending experimenter port desc:",
66 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070067 e.printStackTrace();
68 }
69 }
70
71 @Override
72 public boolean isDriverHandshakeComplete() {
73 if (!startDriverHandshakeCalled) {
74 throw new SwitchDriverSubHandshakeNotStarted();
75 }
76 return driverHandshakeComplete.get();
77 }
78
79 @Override
80 public void processDriverHandshakeMessage(OFMessage m) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070081 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070082 throw new SwitchDriverSubHandshakeNotStarted();
83 }
84 if (driverHandshakeComplete.get()) {
85 throw new SwitchDriverSubHandshakeCompleted(m);
86 }
87
88 switch (m.getType()) {
89 case BARRIER_REPLY:
90 if (m.getXid() == barrierXidToWaitFor) {
91 log.debug("LINC-OE Received barrier response");
92 }
93 break;
94 case ERROR:
95 log.error("Switch {} Error {}", getStringId(), (OFErrorMsg) m);
96 break;
97 case FEATURES_REPLY:
98 break;
99 case FLOW_REMOVED:
100 break;
101 case GET_ASYNC_REPLY:
102 break;
103 case PACKET_IN:
104 break;
105 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700106 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
107 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700108 break;
109 case QUEUE_GET_CONFIG_REPLY:
110 break;
111 case ROLE_REPLY:
112 break;
113 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700114 OFStatsReply stats = (OFStatsReply) m;
115 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
116 log.warn("LINC-OE : Received stats reply message {}", m);
117 processHandshakeOFExperimenterPortDescRequest(
118 (OFCircuitPortsReply) m);
119 driverHandshakeComplete.set(true);
120 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700121 break;
122 default:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700123 log.warn("Received message {} during switch-driver " +
124 "subhandshake " + "from switch {} ... " +
125 "Ignoring message", m,
126 getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700127
128 }
129 }
130
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700131 //Todo
132 public void processOFPortStatus(OFCircuitPortStatus ps) {
133 log.debug("LINC-OE ..OF Port Status :", ps);
134
135 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700136
137 private void processHandshakeOFExperimenterPortDescRequest(
138 OFCircuitPortsReply sr) {
139 Collection<OFPortOptical> entries = sr.getEntries();
140 List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
141 for (OFPortOptical entry : entries) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700142 log.warn("LINC:OE port message {}", entry.toString());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700143 ofPortDescList.add(factory().buildPortDesc().
144 setPortNo(entry.getPortNo())
145 .setConfig(entry.getConfig())
146 .setState(entry.getState())
147 .setHwAddr(entry.getHwAddr())
148 .setName(entry.getName())
149 .build());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700150
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700151 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700152 setExperimenterPortDescReply(factory().buildPortDescStatsReply().
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700153 setEntries(ofPortDescList).build());
154 }
155
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700156 private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
157 wPorts = reply;
158 }
159
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700160
161 private void sendHandshakeOFExperimenterPortDescRequest() throws
162 IOException {
163 // send multi part message for port description for optical switches
164 OFCircuitPortsRequest circuitPortsRequest = factory()
165 .buildCircuitPortsRequest().setXid(getNextTransactionId())
166 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700167 log.warn("LINC-OE : Sending experimented circuit port stats " +
168 "message " +
169 "{}",
170 circuitPortsRequest.toString());
171 this.write(Collections.<OFMessage>singletonList(circuitPortsRequest));
172 }
173
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700174 @Override
175 public List<OFPortDesc> getPorts() {
176 List<OFPortDesc> portEntries = new ArrayList<>();
177 portEntries.addAll(ports.getEntries());
178 if (wPorts != null) {
179 portEntries.addAll(wPorts.getEntries());
180 }
181 return Collections.unmodifiableList(portEntries);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700182 }
183
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700184 @Override
185 public void write(OFMessage msg) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700186 this.channel.write(Collections.singletonList(msg));
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700187 }
188
189 @Override
190 public void write(List<OFMessage> msgs) {
191 this.channel.write(msgs);
192 }
193
194 @Override
195 public Boolean supportNxRole() {
196 return false;
197 }
198
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700199 @Override
200 public boolean isOptical() {
201 return true;
202 }
203
204
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700205}