blob: 9cc029153a8a1ca8b93397aad3b688a5a3494fec [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present 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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.openflow.controller.driver;
tom7ef8ff92014-09-17 13:08:06 -070017
tom7ef8ff92014-09-17 13:08:06 -070018import org.jboss.netty.channel.Channel;
alshabibb452fd72015-04-22 20:46:20 -070019import org.onosproject.net.driver.HandlerBehaviour;
20import org.onosproject.openflow.controller.Dpid;
Brian O'Connorabafb502014-12-02 22:26:20 -080021import org.onosproject.openflow.controller.OpenFlowSwitch;
tom7ef8ff92014-09-17 13:08:06 -070022import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
23import org.projectfloodlight.openflow.protocol.OFErrorMsg;
24import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
25import org.projectfloodlight.openflow.protocol.OFMessage;
26import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
27import org.projectfloodlight.openflow.protocol.OFVersion;
28
alshabibb452fd72015-04-22 20:46:20 -070029import java.util.List;
30
tom7ef8ff92014-09-17 13:08:06 -070031/**
32 * Represents the driver side of an OpenFlow switch.
33 * This interface should never be exposed to consumers.
34 *
35 */
alshabibb452fd72015-04-22 20:46:20 -070036public interface OpenFlowSwitchDriver extends OpenFlowSwitch, HandlerBehaviour {
tom7ef8ff92014-09-17 13:08:06 -070037
38 /**
39 * Sets the OpenFlow agent to be used. This method
40 * can only be called once.
41 * @param agent the agent to set.
42 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070043 void setAgent(OpenFlowAgent agent);
tom7ef8ff92014-09-17 13:08:06 -070044
45 /**
46 * Sets the Role handler object.
47 * This method can only be called once.
48 * @param roleHandler the roleHandler class
49 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070050 void setRoleHandler(RoleHandler roleHandler);
tom7ef8ff92014-09-17 13:08:06 -070051
52 /**
53 * Reasserts this controllers role to the switch.
54 * Useful in cases where the switch no longer agrees
55 * that this controller has the role it claims.
56 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070057 void reassertRole();
tom7ef8ff92014-09-17 13:08:06 -070058
59 /**
60 * Handle the situation where the role request triggers an error.
61 * @param error the error to handle.
62 * @return true if handled, false if not.
63 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070064 boolean handleRoleError(OFErrorMsg error);
tom7ef8ff92014-09-17 13:08:06 -070065
66 /**
67 * If this driver know of Nicira style role messages, these should
68 * be handled here.
69 * @param m the role message to handle.
70 * @throws SwitchStateException if the message received was
71 * not a nicira role or was malformed.
72 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070073 void handleNiciraRole(OFMessage m) throws SwitchStateException;
tom7ef8ff92014-09-17 13:08:06 -070074
75 /**
Thomas Vachuska4b420772014-10-30 16:46:17 -070076 * Handle OF 1.x (where x > 0) role messages.
tom7ef8ff92014-09-17 13:08:06 -070077 * @param m the role message to handle
78 * @throws SwitchStateException if the message received was
79 * not a nicira role or was malformed.
80 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070081 void handleRole(OFMessage m) throws SwitchStateException;
tom7ef8ff92014-09-17 13:08:06 -070082
83 /**
tom7ef8ff92014-09-17 13:08:06 -070084 * Announce to the OpenFlow agent that this switch has connected.
85 * @return true if successful, false if duplicate switch.
86 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070087 boolean connectSwitch();
tom7ef8ff92014-09-17 13:08:06 -070088
89 /**
90 * Activate this MASTER switch-controller relationship in the OF agent.
91 * @return true is successful, false is switch has not
92 * connected or is unknown to the system.
93 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -070094 boolean activateMasterSwitch();
tom7ef8ff92014-09-17 13:08:06 -070095
96 /**
97 * Activate this EQUAL switch-controller relationship in the OF agent.
98 * @return true is successful, false is switch has not
99 * connected or is unknown to the system.
100 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700101 boolean activateEqualSwitch();
tom7ef8ff92014-09-17 13:08:06 -0700102
103 /**
104 * Transition this switch-controller relationship to an EQUAL state.
105 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700106 void transitionToEqualSwitch();
tom7ef8ff92014-09-17 13:08:06 -0700107
108 /**
109 * Transition this switch-controller relationship to an Master state.
110 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700111 void transitionToMasterSwitch();
tom7ef8ff92014-09-17 13:08:06 -0700112
113 /**
114 * Remove this switch from the openflow agent.
115 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700116 void removeConnectedSwitch();
tom7ef8ff92014-09-17 13:08:06 -0700117
118 /**
119 * Sets the ports on this switch.
120 * @param portDescReply the port set and descriptions
121 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700122 void setPortDescReply(OFPortDescStatsReply portDescReply);
tom7ef8ff92014-09-17 13:08:06 -0700123
124 /**
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -0700125 * Sets the ports on this switch.
126 * @param portDescReplies list of port set and descriptions
127 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700128 void setPortDescReplies(List<OFPortDescStatsReply> portDescReplies);
Srikanth Vavilapallif5b234a2015-04-21 13:04:13 -0700129
130 /**
tom7ef8ff92014-09-17 13:08:06 -0700131 * Sets the features reply for this switch.
132 * @param featuresReply the features to set.
133 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700134 void setFeaturesReply(OFFeaturesReply featuresReply);
tom7ef8ff92014-09-17 13:08:06 -0700135
136 /**
137 * Sets the switch description.
138 * @param desc the descriptions
139 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700140 void setSwitchDescription(OFDescStatsReply desc);
tom7ef8ff92014-09-17 13:08:06 -0700141
142 /**
143 * Gets the next transaction id to use.
144 * @return the xid
145 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700146 int getNextTransactionId();
tom7ef8ff92014-09-17 13:08:06 -0700147
148
149 /**
tom7ef8ff92014-09-17 13:08:06 -0700150 * Sets the OF version for this switch.
151 * @param ofV the version to set.
152 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700153 void setOFVersion(OFVersion ofV);
tom7ef8ff92014-09-17 13:08:06 -0700154
155 /**
156 * Sets this switch has having a full flowtable.
157 * @param full true if full, false otherswise.
158 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700159 void setTableFull(boolean full);
tom7ef8ff92014-09-17 13:08:06 -0700160
161 /**
162 * Sets the associated Netty channel for this switch.
163 * @param channel the Netty channel
164 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700165 void setChannel(Channel channel);
tom7ef8ff92014-09-17 13:08:06 -0700166
167 /**
168 * Sets whether the switch is connected.
169 *
170 * @param connected whether the switch is connected
171 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700172 void setConnected(boolean connected);
tom7ef8ff92014-09-17 13:08:06 -0700173
174 /**
alshabibb452fd72015-04-22 20:46:20 -0700175 * Initialises the behaviour.
176 * @param dpid a dpid
177 * @param desc a switch description
178 * @param ofv OpenFlow version
tom7ef8ff92014-09-17 13:08:06 -0700179 */
alshabibb452fd72015-04-22 20:46:20 -0700180 void init(Dpid dpid, OFDescStatsReply desc, OFVersion ofv);
tom7ef8ff92014-09-17 13:08:06 -0700181
182 /**
alshabibb452fd72015-04-22 20:46:20 -0700183 * Does this switch support Nicira Role messages.
184 * @return true if supports, false otherwise.
tom7ef8ff92014-09-17 13:08:06 -0700185 */
alshabibb452fd72015-04-22 20:46:20 -0700186 Boolean supportNxRole();
187
188
189 /**
190 * Starts the driver specific handshake process.
191 */
192 void startDriverHandshake();
193
194 /**
195 * Checks whether the driver specific handshake is complete.
196 * @return true is finished, false if not.
197 */
198 boolean isDriverHandshakeComplete();
199
200 /**
201 * Process a message during the driver specific handshake.
202 * @param m the message to process.
203 */
204 void processDriverHandshakeMessage(OFMessage m);
205
206 /**
207 * Sends only role request messages.
208 *
209 * @param message a role request message.
210 */
211 void sendRoleRequest(OFMessage message);
tom7ef8ff92014-09-17 13:08:06 -0700212
alshabiba2df7b2a2015-05-06 13:57:10 -0700213 /**
214 * Allows the handshaker behaviour to send messages during the
215 * handshake phase only.
216 *
217 * @param message an OpenFlow message
218 */
219 void sendHandshakeMessage(OFMessage message);
tom7ef8ff92014-09-17 13:08:06 -0700220}