Bug-590: Packet loss on first time ping test 16/6316/3
authorFlavio Fernandes <ffernand@redhat.com>
Tue, 22 Apr 2014 15:39:36 +0000 (11:39 -0400)
committerFlavio Fernandes <ffernand@redhat.com>
Tue, 22 Apr 2014 18:05:46 +0000 (14:05 -0400)
In this commit, we are addressing 2 issues that could cause the exception (ie first ip packet) to
be lost. What is observed with this bug is that the non-arp packet -- in this case the icmp packet --
is being 'exceptioned' to the SimpleForwarding code path because the node has not yet been programmed
with flows that would allow it to forward the packet to its destination w/out involving the controller.

Change #1: In cases when the src and dst ip are of hosts in the same node, the getRoute() call is going
to return 'null'. That is because the IRouting lookup will not find a path when src and dst nodes are
the same.

Change #2: When looking up the rulesDB, the key used was using the destHost and the node of the incoming
connector. It should be the destHost and the node of the destHost. Kudos go 100% to Giovanni on this.

Change-Id: I4861acd6ab6d7efe14b50d7537e4b920bffc8a75
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
opendaylight/samples/simpleforwarding/src/main/java/org/opendaylight/controller/samples/simpleforwarding/internal/SimpleForwardingImpl.java

index b9d8fee..d3cefd4 100644 (file)
@@ -999,12 +999,18 @@ public class SimpleForwardingImpl implements IfNewHostNotify,
             return;
         }
         HostNodeConnector destHost = hostTracker.hostFind(dIP);
+        /*
+         * In cases when incoming and outgoing connectors are in the same node, there is no need
+         * to verify that there is a route. Because of that, we will only need routing.getRoute()
+         * if we know that src and dst nodes are different.
+         */
         if (destHost != null
-                && (routing == null ||
+                && (incomingNodeConnector.getNode().equals(destHost.getnodeconnectorNode()) ||
+                    routing == null ||
                     routing.getRoute(incomingNodeConnector.getNode(), destHost.getnodeconnectorNode()) != null)) {
 
             log.trace("Host {} is at {}", dIP, destHost.getnodeConnector());
-            HostNodePair key = new HostNodePair(destHost, incomingNodeConnector.getNode());
+            HostNodePair key = new HostNodePair(destHost, destHost.getnodeconnectorNode());
 
             // If SimpleForwarding is aware of this host, it will try to install
             // a path. Forward packet until it's done.