aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow')
-rw-r--r--framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java8
-rw-r--r--framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java26
2 files changed, 30 insertions, 4 deletions
diff --git a/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java b/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
index 1b6810be..51a2ce42 100644
--- a/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
+++ b/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitch.java
@@ -30,6 +30,14 @@ public interface OpenFlowSwitch {
/**
* Writes the message to the driver.
*
+ * Note:
+ * Calling {@link #sendMsg(OFMessage)} does NOT guarantee the messages to be
+ * transmitted on the wire in order, especially during role transition.
+ * The messages may be reordered at the switch side.
+ *
+ * Calling {@link #sendMsg(List)} guarantee the messages inside the list
+ * to be transmitted on the wire in order.
+ *
* @param msg the message to write
*/
void sendMsg(OFMessage msg);
diff --git a/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java b/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
index 2f6357bd..2c19837e 100644
--- a/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/framework/src/onos/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -79,6 +79,8 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour
protected OFFeaturesReply features;
protected OFDescStatsReply desc;
+ List<OFMessage> messagesPendingMastership;
+
@Override
public void init(Dpid dpid, OFDescStatsReply desc, OFVersion ofv) {
this.dpid = dpid;
@@ -96,16 +98,21 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour
}
@Override
- public void sendMsg(OFMessage m) {
- if (role == RoleState.MASTER && channel.isConnected()) {
- channel.write(Collections.singletonList(m));
- }
+ public void sendMsg(OFMessage msg) {
+ this.sendMsg(Collections.singletonList(msg));
}
@Override
public final void sendMsg(List<OFMessage> msgs) {
if (role == RoleState.MASTER && channel.isConnected()) {
channel.write(msgs);
+ } else if (messagesPendingMastership != null) {
+ messagesPendingMastership.addAll(msgs);
+ log.debug("Enqueue message for switch {}. queue size after is {}",
+ dpid, messagesPendingMastership.size());
+ } else {
+ log.warn("Dropping message for switch {} (role: {}, connected: {}): {}",
+ dpid, role, channel.isConnected(), msgs);
}
}
@@ -232,6 +239,12 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour
@Override
public final void transitionToMasterSwitch() {
this.agent.transitionToMasterSwitch(dpid);
+ if (messagesPendingMastership != null) {
+ this.sendMsg(messagesPendingMastership);
+ log.debug("Sending {} pending messages to switch {}",
+ messagesPendingMastership.size(), dpid);
+ messagesPendingMastership = null;
+ }
}
@Override
@@ -278,6 +291,11 @@ public abstract class AbstractOpenFlowSwitch extends AbstractHandlerBehaviour
log.debug("Sending role {} to switch {}", role, getStringId());
if (role == RoleState.SLAVE || role == RoleState.EQUAL) {
this.role = role;
+ } else {
+ if (messagesPendingMastership == null) {
+ log.debug("Initializing new queue for switch {}", dpid);
+ messagesPendingMastership = new ArrayList<>();
+ }
}
} else {
this.role = role;