- Respond to switch Echo Request immediately. It bypasses transmit queue and sends... 83/383/1
authorJason Ye <yisye@cisco.com>
Tue, 21 May 2013 18:29:50 +0000 (11:29 -0700)
committerJason Ye <yisye@cisco.com>
Wed, 22 May 2013 06:16:35 +0000 (23:16 -0700)
- Send PACKET_OUT (lldp/arp etc) at high priority. When the controller sends down large amount of flowmod messages, the switch may take some time to install/update all the rules in HW. At high priority, the PACKET_OUT messages do not have to wait for the whole flowmod operation to be complete.

Signed-off-by: Jason Ye <yisye@cisco.com>
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SwitchHandler.java
opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DataPacketMuxDemux.java

index 91606f4..5d51d26 100644 (file)
@@ -228,7 +228,7 @@ public class SwitchHandler implements ISwitch {
      * should be used for non-critical messages such as statistics request,
      * discovery packets, etc. An unique XID is generated automatically and
      * inserted into the message.
-     * 
+     *
      * @param msg
      *            The OF message to be sent
      * @return The XID used
@@ -247,7 +247,7 @@ public class SwitchHandler implements ISwitch {
      * priority. It will be served after high priority messages. The method
      * should be used for non-critical messages such as statistics request,
      * discovery packets, etc. The specified XID is inserted into the message.
-     * 
+     *
      * @param msg
      *            The OF message to be Sent
      * @param xid
@@ -269,7 +269,7 @@ public class SwitchHandler implements ISwitch {
      * method should be used for critical messages such as hello, echo reply
      * etc. An unique XID is generated automatically and inserted into the
      * message.
-     * 
+     *
      * @param msg
      *            The OF message to be sent
      * @return The XID used
@@ -284,7 +284,7 @@ public class SwitchHandler implements ISwitch {
      * priority. It will be served first before normal priority messages. The
      * method should be used for critical messages such as hello, echo reply
      * etc. The specified XID is inserted into the message.
-     * 
+     *
      * @param msg
      *            The OF message to be sent
      * @return The XID used
@@ -308,6 +308,48 @@ public class SwitchHandler implements ISwitch {
         }
     }
 
+    /**
+     * This method bypasses the transmit queue and sends the message over the
+     * socket directly. If the input xid is not null, the specified xid is
+     * inserted into the message. Otherwise, an unique xid is generated
+     * automatically and inserted into the message.
+     *
+     * @param msg
+     *            Message to be sent
+     * @param xid
+     *            Message xid
+     */
+    private void asyncSendNow(OFMessage msg, Integer xid) {
+        if (xid == null) {
+            xid = getNextXid();
+        }
+        msg.setXid(xid);
+
+        asyncSendNow(msg);
+    }
+
+    /**
+     * This method bypasses the transmit queue and sends the message over the
+     * socket directly.
+     *
+     * @param msg
+     *            Message to be sent
+     */
+    private void asyncSendNow(OFMessage msg) {
+        if (msgReadWriteService == null) {
+            logger.warn(
+                    "asyncSendNow: {} is not sent because Message ReadWrite Service is not available.",
+                    msg);
+            return;
+        }
+
+        try {
+            msgReadWriteService.asyncSend(msg);
+        } catch (Exception e) {
+            reportError(e);
+        }
+    }
+
     public void handleMessages() {
         List<OFMessage> msgs = null;
 
@@ -349,7 +391,8 @@ public class SwitchHandler implements ISwitch {
             case ECHO_REQUEST:
                 OFEchoReply echoReply = (OFEchoReply) factory
                         .getMessage(OFType.ECHO_REPLY);
-                asyncFastSend(echoReply);
+                // respond immediately
+                asyncSendNow(echoReply, msg.getXid());
                 break;
             case ECHO_REPLY:
                 this.probeSent = false;
@@ -822,7 +865,7 @@ public class SwitchHandler implements ISwitch {
 
         barrierMsg.setXid(xid);
         transmitQ.add(new PriorityMessage(barrierMsg, 0, true));
-        
+
         return Boolean.TRUE;
     }
 
@@ -830,7 +873,7 @@ public class SwitchHandler implements ISwitch {
      * This method returns the switch liveness timeout value. If controller did
      * not receive any message from the switch for such a long period,
      * controller will tear down the connection to the switch.
-     * 
+     *
      * @return The timeout value
      */
     private static int getSwitchLivenessTimeout() {
@@ -853,7 +896,7 @@ public class SwitchHandler implements ISwitch {
      * Barrier request message. Then it's blocked until the Barrier rely arrives
      * or timeout. If syncRequest is false, it simply skips the message send and
      * just waits for the response back.
-     * 
+     *
      * @param msg
      *            Message to be sent
      * @param xid
index 7614a4d..dc84304 100644 (file)
@@ -290,7 +290,8 @@ public class DataPacketMuxDemux implements IContainerListener,
                 + data.length);
         po.setPacketData(data);
 
-        sw.asyncSend(po);
+        // send PACKET_OUT at high priority
+        sw.asyncFastSend(po);
         logger.trace("Transmitted a frame of size: {}", data.length);
     }