blob: 4aed9406553c5b9cad238c821353e855e6d1febd [file] [log] [blame]
alshabibf1216ed2014-09-03 11:53:54 -07001package org.onlab.onos.of.drivers.impl;
alshabibd777b202014-08-28 17:52:55 -07002
alshabibc944fd02014-09-10 17:55:17 -07003import java.util.Collections;
alshabib6171f182014-09-02 19:00:32 -07004import java.util.List;
alshabibd777b202014-08-28 17:52:55 -07005import java.util.concurrent.atomic.AtomicBoolean;
6
7import org.onlab.onos.of.controller.Dpid;
alshabib6171f182014-09-02 19:00:32 -07008import org.onlab.onos.of.controller.driver.AbstractOpenFlowSwitch;
9import org.onlab.onos.of.controller.driver.SwitchDriverSubHandshakeAlreadyStarted;
10import org.onlab.onos.of.controller.driver.SwitchDriverSubHandshakeCompleted;
11import org.onlab.onos.of.controller.driver.SwitchDriverSubHandshakeNotStarted;
alshabibd777b202014-08-28 17:52:55 -070012import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
13import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
alshabibd777b202014-08-28 17:52:55 -070014import org.projectfloodlight.openflow.protocol.OFFactory;
15import org.projectfloodlight.openflow.protocol.OFMessage;
16import org.slf4j.Logger;
17import org.slf4j.LoggerFactory;
18
19/**
20 * OFDescriptionStatistics Vendor (Manufacturer Desc.): Nicira, Inc. Make
21 * (Hardware Desc.) : Open vSwitch Model (Datapath Desc.) : None Software :
22 * 2.1.0 (or whatever version + build) Serial : None
23 */
24public class OFSwitchImplOVS13 extends AbstractOpenFlowSwitch {
25
26 private static Logger log =
27 LoggerFactory.getLogger(OFSwitchImplOVS13.class);
28
alshabib6171f182014-09-02 19:00:32 -070029 private final AtomicBoolean driverHandshakeComplete;
alshabibd777b202014-08-28 17:52:55 -070030 private OFFactory factory;
31 private long barrierXidToWaitFor = -1;
32
33 public OFSwitchImplOVS13(Dpid dpid, OFDescStatsReply desc) {
34 super(dpid);
35 driverHandshakeComplete = new AtomicBoolean(false);
36 setSwitchDescription(desc);
37 }
38
39 @Override
40 public String toString() {
41 return "OFSwitchImplOVS13 [" + ((channel != null)
42 ? channel.getRemoteAddress() : "?")
43 + " DPID[" + ((getStringId() != null) ? getStringId() : "?") + "]]";
44 }
45
46 @Override
47 public void startDriverHandshake() {
48 log.debug("Starting driver handshake for sw {}", getStringId());
49 if (startDriverHandshakeCalled) {
50 throw new SwitchDriverSubHandshakeAlreadyStarted();
51 }
52 startDriverHandshakeCalled = true;
53 factory = factory();
54 configureSwitch();
55 }
56
57 @Override
58 public boolean isDriverHandshakeComplete() {
59 if (!startDriverHandshakeCalled) {
60 throw new SwitchDriverSubHandshakeNotStarted();
61 }
62 return driverHandshakeComplete.get();
63 }
64
65 @Override
66 public void processDriverHandshakeMessage(OFMessage m) {
67 if (!startDriverHandshakeCalled) {
68 throw new SwitchDriverSubHandshakeNotStarted();
69 }
70 if (driverHandshakeComplete.get()) {
71 throw new SwitchDriverSubHandshakeCompleted(m);
72 }
73
74 switch (m.getType()) {
75 case BARRIER_REPLY:
76 if (m.getXid() == barrierXidToWaitFor) {
77 driverHandshakeComplete.set(true);
78 }
79 break;
80
81 case ERROR:
alshabib6171f182014-09-02 19:00:32 -070082 log.error("Switch {} Error {}", getStringId(), m);
alshabibd777b202014-08-28 17:52:55 -070083 break;
84
85 case FEATURES_REPLY:
86 break;
87 case FLOW_REMOVED:
88 break;
89 case GET_ASYNC_REPLY:
90 // OFAsyncGetReply asrep = (OFAsyncGetReply)m;
91 // decodeAsyncGetReply(asrep);
92 break;
93
94 case PACKET_IN:
95 break;
96 case PORT_STATUS:
97 break;
98 case QUEUE_GET_CONFIG_REPLY:
99 break;
100 case ROLE_REPLY:
101 break;
102
103 case STATS_REPLY:
104 // processStatsReply((OFStatsReply) m);
105 break;
106
107 default:
108 log.debug("Received message {} during switch-driver subhandshake "
109 + "from switch {} ... Ignoring message", m, getStringId());
110
111 }
112 }
113
114
115 private void configureSwitch() {
116 sendBarrier(true);
117 }
118
119
120 private void sendBarrier(boolean finalBarrier) {
121 int xid = getNextTransactionId();
122 if (finalBarrier) {
123 barrierXidToWaitFor = xid;
124 }
125 OFBarrierRequest br = factory
126 .buildBarrierRequest()
127 .setXid(xid)
128 .build();
129 sendMsg(br);
130 }
131
132 @Override
alshabib6171f182014-09-02 19:00:32 -0700133 public Boolean supportNxRole() {
134 return false;
alshabibd777b202014-08-28 17:52:55 -0700135 }
136
137 @Override
alshabib6171f182014-09-02 19:00:32 -0700138 public void write(OFMessage msg) {
alshabibc944fd02014-09-10 17:55:17 -0700139 channel.write(Collections.singletonList(msg));
alshabib6171f182014-09-02 19:00:32 -0700140
141 }
142
143 @Override
144 public void write(List<OFMessage> msgs) {
145 channel.write(msgs);
alshabibd777b202014-08-28 17:52:55 -0700146 }
147}