2 * Copyright 2014 Open Networking Laboratory
4 * 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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.onosproject.openflow.controller.driver;
18 import org.jboss.netty.channel.Channel;
19 import org.onosproject.net.driver.HandlerBehaviour;
20 import org.onosproject.openflow.controller.Dpid;
21 import org.onosproject.openflow.controller.OpenFlowSwitch;
22 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
23 import org.projectfloodlight.openflow.protocol.OFErrorMsg;
24 import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
25 import org.projectfloodlight.openflow.protocol.OFMessage;
26 import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
27 import org.projectfloodlight.openflow.protocol.OFVersion;
29 import java.util.List;
32 * Represents the driver side of an OpenFlow switch.
33 * This interface should never be exposed to consumers.
36 public interface OpenFlowSwitchDriver extends OpenFlowSwitch, HandlerBehaviour {
39 * Sets the OpenFlow agent to be used. This method
40 * can only be called once.
41 * @param agent the agent to set.
43 void setAgent(OpenFlowAgent agent);
46 * Sets the Role handler object.
47 * This method can only be called once.
48 * @param roleHandler the roleHandler class
50 void setRoleHandler(RoleHandler roleHandler);
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.
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.
64 boolean handleRoleError(OFErrorMsg error);
67 * If this driver know of Nicira style role messages, these should
69 * @param m the role message to handle.
70 * @throws SwitchStateException if the message received was
71 * not a nicira role or was malformed.
73 void handleNiciraRole(OFMessage m) throws SwitchStateException;
76 * Handle OF 1.x (where x > 0) role messages.
77 * @param m the role message to handle
78 * @throws SwitchStateException if the message received was
79 * not a nicira role or was malformed.
81 void handleRole(OFMessage m) throws SwitchStateException;
84 * Announce to the OpenFlow agent that this switch has connected.
85 * @return true if successful, false if duplicate switch.
87 boolean connectSwitch();
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.
94 boolean activateMasterSwitch();
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.
101 boolean activateEqualSwitch();
104 * Transition this switch-controller relationship to an EQUAL state.
106 void transitionToEqualSwitch();
109 * Transition this switch-controller relationship to an Master state.
111 void transitionToMasterSwitch();
114 * Remove this switch from the openflow agent.
116 void removeConnectedSwitch();
119 * Sets the ports on this switch.
120 * @param portDescReply the port set and descriptions
122 void setPortDescReply(OFPortDescStatsReply portDescReply);
125 * Sets the ports on this switch.
126 * @param portDescReplies list of port set and descriptions
128 void setPortDescReplies(List<OFPortDescStatsReply> portDescReplies);
131 * Sets the features reply for this switch.
132 * @param featuresReply the features to set.
134 void setFeaturesReply(OFFeaturesReply featuresReply);
137 * Sets the switch description.
138 * @param desc the descriptions
140 void setSwitchDescription(OFDescStatsReply desc);
143 * Gets the next transaction id to use.
146 int getNextTransactionId();
150 * Sets the OF version for this switch.
151 * @param ofV the version to set.
153 void setOFVersion(OFVersion ofV);
156 * Sets this switch has having a full flowtable.
157 * @param full true if full, false otherswise.
159 void setTableFull(boolean full);
162 * Sets the associated Netty channel for this switch.
163 * @param channel the Netty channel
165 void setChannel(Channel channel);
168 * Sets whether the switch is connected.
170 * @param connected whether the switch is connected
172 void setConnected(boolean connected);
175 * Initialises the behaviour.
177 * @param desc a switch description
178 * @param ofv OpenFlow version
180 void init(Dpid dpid, OFDescStatsReply desc, OFVersion ofv);
183 * Does this switch support Nicira Role messages.
184 * @return true if supports, false otherwise.
186 Boolean supportNxRole();
190 * Starts the driver specific handshake process.
192 void startDriverHandshake();
195 * Checks whether the driver specific handshake is complete.
196 * @return true is finished, false if not.
198 boolean isDriverHandshakeComplete();
201 * Process a message during the driver specific handshake.
202 * @param m the message to process.
204 void processDriverHandshakeMessage(OFMessage m);
207 * Sends only role request messages.
209 * @param message a role request message.
211 void sendRoleRequest(OFMessage message);
214 * Allows the handshaker behaviour to send messages during the
215 * handshake phase only.
217 * @param message an OpenFlow message
219 void sendHandshakeMessage(OFMessage message);