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