Fix controller for ptcp manager 29/79229/1
authorVishal Thapar <vthapar@redhat.com>
Fri, 4 Jan 2019 12:51:53 +0000 (18:21 +0530)
committerVishal Thapar <vthapar@redhat.com>
Fri, 4 Jan 2019 12:55:44 +0000 (18:25 +0530)
If a ptcp manager is set on OVS, we configure
controller through conneciton info. There are two
issues with this code today:

1. Doesn't work well for IPv6.
2. Doesn't check if connection is to same port
   as configured in ptcp manager.

So we end up with an improper controller configured
basde on ptcp even if we already configured correct
ones from manager entries.

JIRA: OVSDB-475

Change-Id: Ic69be0a9a6f2fd96085b60cdc3ccb9f1022b54a8
Signed-off-by: Vishal Thapar <vthapar@redhat.com>
utils/southbound-utils/src/main/java/org/opendaylight/ovsdb/utils/southbound/utils/SouthboundUtils.java

index 5d86fed567acd0b9368d1dbd0fef7e1ad957557b..b4434d2825adde56389a650666c1b4baea715ee1 100644 (file)
@@ -889,8 +889,21 @@ public class SouthboundUtils {
                                 + getControllerOFPort());
                         } else if (managerStr.startsWith("ptcp")) {
                             ConnectionInfo connectionInfo = ovsdbNodeAugmentation.getConnectionInfo();
-                            if (connectionInfo != null && connectionInfo.getLocalIp() != null) {
-                                controllerIpStr = connectionInfo.getLocalIp().stringValue();
+                            /* If we're connected to switch ptcp, only then use connection info
+                                to configure controller. Ptcp is configured as:
+                                Manager "ptcp:<port>:<ip>"
+                                ip is optional
+                             */
+                            String managerPortStr =  managerStr.split(":", 3)[1];
+                            if (connectionInfo != null && connectionInfo.getLocalIp() != null
+                                    && connectionInfo.getRemotePort() != null
+                                    && managerPortStr.equals(connectionInfo.getRemotePort().toString())) {
+                                IpAddress controllerIp = connectionInfo.getLocalIp();
+                                if (controllerIp.getIpv6Address() != null) {
+                                    controllerIpStr = "[" + connectionInfo.getLocalIp().stringValue() + "]";
+                                } else {
+                                    controllerIpStr = connectionInfo.getLocalIp().stringValue();
+                                }
                                 controllersStr.add(OPENFLOW_CONNECTION_PROTOCOL
                                     + ":" + controllerIpStr + ":" + OPENFLOW_PORT);
                             } else {