blob: db4c36c60a17c433b08dc34a216797f6aea64367 [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;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070012import org.projectfloodlight.openflow.protocol.OFMessage;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070013import org.projectfloodlight.openflow.protocol.OFPortDesc;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070014import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070015import org.projectfloodlight.openflow.protocol.OFPortOptical;
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070016import org.projectfloodlight.openflow.protocol.OFStatsReply;
17import org.projectfloodlight.openflow.protocol.OFStatsType;
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070018import java.io.IOException;
19import java.util.ArrayList;
20import java.util.Collection;
21import java.util.Collections;
22import java.util.List;
23import java.util.concurrent.atomic.AtomicBoolean;
24
25/**
26 * LINC-OE Optical Emulator switch class.
27 */
28public class OFOpticalSwitchImplLINC13 extends AbstractOpenFlowSwitch {
29
30 private final AtomicBoolean driverHandshakeComplete;
31 private long barrierXidToWaitFor = -1;
32
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070033 private OFPortDescStatsReply wPorts;
34
Yuta HIGUCHIbccb6be2014-10-09 17:20:29 -070035 OFOpticalSwitchImplLINC13(Dpid dpid, OFDescStatsReply desc) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070036 super(dpid);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070037 driverHandshakeComplete = new AtomicBoolean(false);
38 setSwitchDescription(desc);
39 }
40
41 @Override
42 public String toString() {
43 return "OFOpticalSwitchImplLINC13 [" + ((channel != null)
44 ? channel.getRemoteAddress() : "?")
45 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
46 }
47
48 @Override
49 public void startDriverHandshake() {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070050 log.warn("Starting driver handshake for sw {}", getStringId());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070051 if (startDriverHandshakeCalled) {
52 throw new SwitchDriverSubHandshakeAlreadyStarted();
53 }
54 startDriverHandshakeCalled = true;
55 try {
56 sendHandshakeOFExperimenterPortDescRequest();
57 } catch (IOException e) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070058 log.error("LINC-OE exception while sending experimenter port desc:",
59 e.getMessage());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070060 e.printStackTrace();
61 }
62 }
63
64 @Override
65 public boolean isDriverHandshakeComplete() {
66 if (!startDriverHandshakeCalled) {
67 throw new SwitchDriverSubHandshakeNotStarted();
68 }
69 return driverHandshakeComplete.get();
70 }
71
72 @Override
73 public void processDriverHandshakeMessage(OFMessage m) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070074 if (!startDriverHandshakeCalled) {
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070075 throw new SwitchDriverSubHandshakeNotStarted();
76 }
77 if (driverHandshakeComplete.get()) {
78 throw new SwitchDriverSubHandshakeCompleted(m);
79 }
80
81 switch (m.getType()) {
82 case BARRIER_REPLY:
83 if (m.getXid() == barrierXidToWaitFor) {
84 log.debug("LINC-OE Received barrier response");
85 }
86 break;
87 case ERROR:
Yuta HIGUCHIf5416d82014-10-24 21:17:40 -070088 log.error("Switch {} Error {}", getStringId(), m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -070089 break;
90 case FEATURES_REPLY:
91 break;
92 case FLOW_REMOVED:
93 break;
94 case GET_ASYNC_REPLY:
95 break;
96 case PACKET_IN:
97 break;
98 case PORT_STATUS:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -070099 log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
100 processOFPortStatus((OFCircuitPortStatus) m);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700101 break;
102 case QUEUE_GET_CONFIG_REPLY:
103 break;
104 case ROLE_REPLY:
105 break;
106 case STATS_REPLY:
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700107 OFStatsReply stats = (OFStatsReply) m;
108 if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
109 log.warn("LINC-OE : Received stats reply message {}", m);
110 processHandshakeOFExperimenterPortDescRequest(
111 (OFCircuitPortsReply) m);
112 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 //Todo
125 public void processOFPortStatus(OFCircuitPortStatus ps) {
126 log.debug("LINC-OE ..OF Port Status :", ps);
127
128 }
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700129
130 private void processHandshakeOFExperimenterPortDescRequest(
131 OFCircuitPortsReply sr) {
132 Collection<OFPortOptical> entries = sr.getEntries();
133 List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
134 for (OFPortOptical entry : entries) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700135 log.warn("LINC:OE port message {}", entry.toString());
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700136 ofPortDescList.add(factory().buildPortDesc().
137 setPortNo(entry.getPortNo())
138 .setConfig(entry.getConfig())
139 .setState(entry.getState())
140 .setHwAddr(entry.getHwAddr())
141 .setName(entry.getName())
142 .build());
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700143
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700144 }
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700145 setExperimenterPortDescReply(factory().buildPortDescStatsReply().
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700146 setEntries(ofPortDescList).build());
147 }
148
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700149 private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
150 wPorts = reply;
151 }
152
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700153
154 private void sendHandshakeOFExperimenterPortDescRequest() throws
155 IOException {
156 // send multi part message for port description for optical switches
157 OFCircuitPortsRequest circuitPortsRequest = factory()
158 .buildCircuitPortsRequest().setXid(getNextTransactionId())
159 .build();
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700160 log.warn("LINC-OE : Sending experimented circuit port stats " +
161 "message " +
162 "{}",
163 circuitPortsRequest.toString());
164 this.write(Collections.<OFMessage>singletonList(circuitPortsRequest));
165 }
166
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700167 @Override
168 public List<OFPortDesc> getPorts() {
169 List<OFPortDesc> portEntries = new ArrayList<>();
170 portEntries.addAll(ports.getEntries());
171 if (wPorts != null) {
172 portEntries.addAll(wPorts.getEntries());
173 }
174 return Collections.unmodifiableList(portEntries);
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700175 }
176
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700177 @Override
178 public void write(OFMessage msg) {
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700179 this.channel.write(Collections.singletonList(msg));
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700180 }
181
182 @Override
183 public void write(List<OFMessage> msgs) {
184 this.channel.write(msgs);
185 }
186
187 @Override
188 public Boolean supportNxRole() {
189 return false;
190 }
191
Praseed Balakrishnana22eadf2014-10-20 14:21:45 -0700192 @Override
193 public boolean isOptical() {
194 return true;
195 }
196
197
Praseed Balakrishnane48aa682014-10-08 17:31:37 -0700198}