Merge "1.add a flag that allow igmp join/leave with out ssm translate; 2.catch the exception while configured an invalid igmp global connect point"
diff --git a/src/main/java/org/opencord/igmpproxy/IgmpManager.java b/src/main/java/org/opencord/igmpproxy/IgmpManager.java
index 1b4285b..6063b96 100644
--- a/src/main/java/org/opencord/igmpproxy/IgmpManager.java
+++ b/src/main/java/org/opencord/igmpproxy/IgmpManager.java
@@ -111,6 +111,8 @@
     public static boolean connectPointMode = true;
     public static ConnectPoint connectPoint = null;
 
+    private static boolean pimSSmInterworking = false;
+    private static final String DEFAULT_PIMSSM_HOST = "127.0.0.1";
     private final ScheduledExecutorService scheduledExecutorService =
             Executors.newScheduledThreadPool(1);
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -296,10 +298,15 @@
                 join = true;
             }
         } else {
-            IpAddress src = ssmTranslateRoute(groupIp);
-            if (src == null) {
-                log.info("no ssm translate for group " + groupIp.toString());
-                return;
+            IpAddress src = null;
+            if (pimSSmInterworking) {
+                src = ssmTranslateRoute(groupIp);
+                if (src == null) {
+                    log.info("no ssm translate for group " + groupIp.toString());
+                    return;
+                }
+            } else {
+                src = IpAddress.valueOf(DEFAULT_PIMSSM_HOST);
             }
             sourceList.add(src.getIp4Address());
             if (recordType == IGMPMembership.CHANGE_TO_EXCLUDE_MODE ||
@@ -672,7 +679,7 @@
             igmpCos = newCfg.igmpCos();
             periodicQuery = newCfg.periodicQuery();
             fastLeave = newCfg.fastLeave();
-
+            pimSSmInterworking = newCfg.pimSsmInterworking();
             connectPoint = newCfg.connectPoint();
             if (connectPointMode != newCfg.connectPointMode()) {
                 connectPointMode = newCfg.connectPointMode();
diff --git a/src/main/java/org/opencord/igmpproxy/IgmpproxyConfig.java b/src/main/java/org/opencord/igmpproxy/IgmpproxyConfig.java
index 107c262..efd39ba 100644
--- a/src/main/java/org/opencord/igmpproxy/IgmpproxyConfig.java
+++ b/src/main/java/org/opencord/igmpproxy/IgmpproxyConfig.java
@@ -35,6 +35,9 @@
     protected static final Boolean DEFAULT_PERIODIC_QUERY = true;
     protected static final String DEFAULT_WITH_RA_UPLINK = "true";
     protected static final String DEFAULT_WITH_RA_DOWNLINK = "true";
+    private static final Boolean DEFAULT_CONNECT_POINT_MODE = true;
+    private static final Boolean DEFAULT_PIMSSM_INTERWORKING = false;
+
     protected static final String CONNECT_POINT_MODE = "globalConnectPointMode";
     protected static final String CONNECT_POINT = "globalConnectPoint";
     private static final String UNSOLICITED_TIMEOUT = "UnsolicitedTimeOut";
@@ -48,7 +51,7 @@
     private static final String IGMP_COS = "IgmpCos";
     private static final String WITH_RA_UPLINK = "withRAUpLink";
     private static final String WITH_RA_DOWN_LINK = "withRADownLink";
-    private static final Boolean DEFAULT_CONNECT_POINT_MODE = true;
+    private static final String PIMSSM_INTERWORKING = "pimSSmInterworking";
 
     /**
      * Gets the value of a string property, protecting for an empty
@@ -165,6 +168,17 @@
             return null;
         }
 
-        return ConnectPoint.deviceConnectPoint(getStringProperty(CONNECT_POINT, ""));
+        try {
+            return ConnectPoint.deviceConnectPoint(getStringProperty(CONNECT_POINT, ""));
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+    public boolean pimSsmInterworking() {
+        if (object == null || object.path(PIMSSM_INTERWORKING) == null) {
+            return DEFAULT_PIMSSM_INTERWORKING;
+        }
+        return Boolean.parseBoolean(getStringProperty(PIMSSM_INTERWORKING, DEFAULT_PIMSSM_INTERWORKING.toString()));
     }
 }