VOL-3371:
- Miscellaneous fixes and enhancements for in-band script
- watchdog script for openolt and dev_mgmt_daemon processes

Change-Id: I993c95b15ceb23154646fe8b3a875ec09369e6ce
diff --git a/agent/Makefile.in b/agent/Makefile.in
index e699a70..ad1a0b9 100644
--- a/agent/Makefile.in
+++ b/agent/Makefile.in
@@ -321,6 +321,7 @@
 	cp $(BUILD_DIR)/libstdc++.so.6 device/$(OPENOLTDEVICE)/mkdebian/debian
 	cp $(BUILD_DIR)/libbal_host_api.so device/$(OPENOLTDEVICE)/mkdebian/debian
 	cp -a scripts/init.d device/$(OPENOLTDEVICE)/mkdebian/debian
+	cp -a scripts/watchdog device/$(OPENOLTDEVICE)/mkdebian/debian
 	cd device/$(OPENOLTDEVICE)/mkdebian && ./build_$(OPENOLTDEVICE)_deb.sh
 	mv device/$(OPENOLTDEVICE)/*.deb $(BUILD_DIR)/openolt_$(OPENOLTDEVICE)-$(VERSION)-$(LABEL_VCS_REF).deb
 	make deb-cleanup
@@ -344,14 +345,14 @@
 	    exit 1; \
 	fi;
 
-	# Update vlan.config file with VLAN ID argument passed
-	sed -i 's/asfvolt16_vlan_id_eth2=.*/asfvolt16_vlan_id_eth2=$(VLAN_ID)/' $(TOP_DIR)/inband/config/vlan.config
-	sed -i 's/asgvolt64_vlan_id_eth1=.*/asgvolt64_vlan_id_eth1=$(VLAN_ID)/' $(TOP_DIR)/inband/config/vlan.config
+	# Update inband.config file with VLAN ID argument passed
+	sed -i 's/asfvolt16_vlan_id_eth2=.*/asfvolt16_vlan_id_eth2=$(VLAN_ID)/' $(TOP_DIR)/inband/config/inband.config
+	sed -i 's/asgvolt64_vlan_id_eth1=.*/asgvolt64_vlan_id_eth1=$(VLAN_ID)/' $(TOP_DIR)/inband/config/inband.config
 
 	# Copy Inband config files and olt startup scripts to ONL source code and build
 	cd $(TOP_DIR)  && mkdir -p $(ONL_DIR)/OpenNetworkLinux/bal_packages
 	cp $(TOP_DIR)/inband/scripts/* $(ONL_DIR)/OpenNetworkLinux/bal_packages
-	cp $(TOP_DIR)/inband/config/vlan.config $(ONL_DIR)/OpenNetworkLinux/bal_packages
+	cp $(TOP_DIR)/inband/config/inband.config $(ONL_DIR)/OpenNetworkLinux/bal_packages
 	cp $(BUILD_DIR)/openolt_$(OPENOLTDEVICE)-$(VERSION)-$(LABEL_VCS_REF).deb $(ONL_DIR)/OpenNetworkLinux/bal_packages/openolt_$(OPENOLTDEVICE).deb
 
 	# Rebuild ONL packed with already built BAL+Openolt debian package
diff --git a/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postinst b/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postinst
index 8f0e380..87a0d19 100644
--- a/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postinst
+++ b/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postinst
@@ -20,11 +20,14 @@
 tar zxf /tmp/release_asfvolt16_V3.4.3.3.202002100101.tar.gz -C / 2>&1 > /dev/null
 grep -q '\/opt\/bcm68620\/svk_init.sh' /etc/rc.local || sed -i -e '$i \/opt\/bcm68620\/svk_init.sh' /etc/rc.local
 rm -f /run/bcm68620
+mkdir -p /opt/openolt && cp /tmp/watchdog/openolt_dev_mgmt_daemon_process_watchdog /opt/openolt
+[ -f /opt/openolt/openolt_dev_mgmt_daemon_process_watchdog ] && grep -q '\/opt\/openolt\/openolt_dev_mgmt_daemon_process_watchdog' /etc/rc.local || sed -i -e '$i nohup bash \/opt\/openolt\/openolt_dev_mgmt_daemon_process_watchdog &' /etc/rc.local
 cp /tmp/init.d/dev_mgmt_daemon /etc/init.d
 cp /tmp/init.d/openolt /etc/init.d
 cp /tmp/logrotate.d/openolt /etc/logrotate.d
 chmod +x /etc/init.d/dev_mgmt_daemon
 chmod +x /etc/init.d/openolt
+chmod +x /opt/openolt/openolt_dev_mgmt_daemon_process_watchdog
 update-rc.d dev_mgmt_daemon defaults
 update-rc.d openolt defaults
 mv /tmp/openolt /broadcom
diff --git a/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postrm b/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postrm
index 2f514af..f799e09 100644
--- a/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postrm
+++ b/agent/device/asfvolt16/mkdebian/debian/asfvolt16.postrm
@@ -16,6 +16,7 @@
 
 
 rm -rf /opt/bcm68620
+rm -rf /opt/openolt
 rm -rf /broadcom
 sed -i '\/opt\/bcm68620\/svk_init.sh/d' /etc/rc.local
 rm -rf /run/bcm68620
diff --git a/agent/device/asfvolt16/mkdebian/debian/rules b/agent/device/asfvolt16/mkdebian/debian/rules
index bf86af6..0869afa 100755
--- a/agent/device/asfvolt16/mkdebian/debian/rules
+++ b/agent/device/asfvolt16/mkdebian/debian/rules
@@ -34,6 +34,7 @@
 	cp -a $(CURDIR)/debian/openolt $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/init.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/logrotate.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
+	cp -a $(CURDIR)/debian/watchdog $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 
 #override_dh_shlibdeps:
 #	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info -l$(ONLP_LIB_PATH):$(OFDPA_LIB_PATH)
diff --git a/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postinst b/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postinst
index 7e74326..72b4b19 100644
--- a/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postinst
+++ b/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postinst
@@ -20,11 +20,14 @@
 tar zxf /tmp/release_asgvolt64_V3.4.3.3.202002100101.tar.gz -C / 2>&1 > /dev/null
 grep -q '\/opt\/bcm68620\/svk_init.sh' /etc/rc.local || sed -i -e '$i \/opt\/bcm68620\/svk_init.sh' /etc/rc.local
 rm -f /run/bcm68620
+mkdir -p /opt/openolt && cp /tmp/watchdog/openolt_dev_mgmt_daemon_process_watchdog /opt/openolt
+[ -f /opt/openolt/openolt_dev_mgmt_daemon_process_watchdog ] && grep -q '\/opt\/openolt\/openolt_dev_mgmt_daemon_process_watchdog' /etc/rc.local || sed -i -e '$i nohup bash \/opt\/openolt\/openolt_dev_mgmt_daemon_process_watchdog &' /etc/rc.local
 cp /tmp/init.d/dev_mgmt_daemon /etc/init.d
 cp /tmp/init.d/openolt /etc/init.d
 cp /tmp/logrotate.d/openolt /etc/logrotate.d
 chmod +x /etc/init.d/dev_mgmt_daemon
 chmod +x /etc/init.d/openolt
+chmod +x /opt/openolt/openolt_dev_mgmt_daemon_process_watchdog
 update-rc.d dev_mgmt_daemon defaults
 update-rc.d openolt defaults
 mv /tmp/openolt /broadcom
diff --git a/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postrm b/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postrm
index 2f514af..f799e09 100644
--- a/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postrm
+++ b/agent/device/asgvolt64/mkdebian/debian/asgvolt64.postrm
@@ -16,6 +16,7 @@
 
 
 rm -rf /opt/bcm68620
+rm -rf /opt/openolt
 rm -rf /broadcom
 sed -i '\/opt\/bcm68620\/svk_init.sh/d' /etc/rc.local
 rm -rf /run/bcm68620
diff --git a/agent/device/asgvolt64/mkdebian/debian/rules b/agent/device/asgvolt64/mkdebian/debian/rules
index 7298161..561c092 100755
--- a/agent/device/asgvolt64/mkdebian/debian/rules
+++ b/agent/device/asgvolt64/mkdebian/debian/rules
@@ -34,6 +34,7 @@
 	cp -a $(CURDIR)/debian/openolt $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/init.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 	cp -a $(CURDIR)/debian/logrotate.d $(DEB_DH_INSTALL_SOURCEDIR)/tmp
+	cp -a $(CURDIR)/debian/watchdog $(DEB_DH_INSTALL_SOURCEDIR)/tmp
 
 #override_dh_shlibdeps:
 #	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info -l$(ONLP_LIB_PATH):$(OFDPA_LIB_PATH)
diff --git a/agent/inband/config/inband.config b/agent/inband/config/inband.config
new file mode 100644
index 0000000..eb737a4
--- /dev/null
+++ b/agent/inband/config/inband.config
@@ -0,0 +1,18 @@
+### BEGIN INIT INFO
+# Description: This file utilized by olt inband init script and onl validation script to
+#              know what VLAN configured by the user for inband CTRL and MGMT interface.
+#              It also has configuration which indicates wether out-of-band connection
+#              should be enabled on the OLT. This defaults to "no". To enable, it should
+#              be set to "yes"
+#              the OLT)
+#
+### END INIT INFO
+
+#asfvolt16
+asfvolt16_vlan_id_eth2=4093
+
+#asgvolt64
+asgvolt64_vlan_id_eth1=4093
+
+# enable out of band connection to OLT?
+enable_out_of_band_connection=no
diff --git a/agent/inband/config/vlan.config b/agent/inband/config/vlan.config
deleted file mode 100644
index e0dd6c2..0000000
--- a/agent/inband/config/vlan.config
+++ /dev/null
@@ -1,10 +0,0 @@
-### BEGIN INIT INFO
-# Description: This file utilized by olt inband init script and onl validation script to
-#              know what VLAN configured by the user for inband CTRL and MGMT interface
-### END INIT INFO
-
-#asfvolt16
-asfvolt16_vlan_id_eth2=4093
-
-#asgvolt64
-asgvolt64_vlan_id_eth1=4093
diff --git a/agent/inband/patch/inband-72b95a7.patch b/agent/inband/patch/inband-72b95a7.patch
index 529bbf4..341ab48 100644
--- a/agent/inband/patch/inband-72b95a7.patch
+++ b/agent/inband/patch/inband-72b95a7.patch
@@ -34,7 +34,7 @@
 +  mv  "$workdir"/openolt* "$destdir"/
 +  echo "INFO: Copying init scripts to init.d"
 +  cp  "$workdir"/start_inband_oltservices.sh "$destdir"/etc/init.d/
-+  cp "$workdir"/vlan.config "$destdir"/
++  cp "$workdir"/inband.config "$destdir"/
 +  cd -
  fi
 +cat > "$destdir"/etc/rc.local  <<- EOF
@@ -53,7 +53,7 @@
 +
 +chmod 0777 /etc/init.d/start_inband_oltservices.sh
 +chmod 0777 /root/validate_onl_installation.sh
-+nohup sh /etc/init.d/start_inband_oltservices.sh > /var/log/startup.log &
++nohup sh /etc/init.d/start_inband_oltservices.sh >> /var/log/startup.log &
 +exit 0
 +
 +EOF
diff --git a/agent/inband/scripts/fetch_olt_sw_hw_details.py b/agent/inband/scripts/fetch_olt_sw_hw_details.py
index 627a73c..25d28ae 100644
--- a/agent/inband/scripts/fetch_olt_sw_hw_details.py
+++ b/agent/inband/scripts/fetch_olt_sw_hw_details.py
@@ -64,8 +64,8 @@
 # and openolt binaries are located.
 BRCM_DIR = '/broadcom'
 
-# Path to vlan config file
-VLAN_CONFIG_FILE = BRCM_DIR+"/vlan.config"
+# Path to inband config file
+INBAND_CONFIG_FILE = BRCM_DIR+"/inband.config"
 
 # Operating system name which is running at OLT.
 # By default Open Network Linux (ONL) is used as operating
@@ -140,8 +140,8 @@
     asg64_vlan = 'asgvolt64_vlan_id_eth1'
     olt_model=get_olt_board_name()
     try:
-        if os.path.exists(VLAN_CONFIG_FILE):
-            with open(VLAN_CONFIG_FILE, "r") as file_descriptor:
+        if os.path.exists(INBAND_CONFIG_FILE):
+            with open(INBAND_CONFIG_FILE, "r") as file_descriptor:
                 lines = file_descriptor.readlines()
                 for line in lines:
                     if olt_model == ASX_16:
@@ -151,7 +151,7 @@
                         if re.search(asg64_vlan, line):
                             eth_vlan = int(line.split('=')[1].strip())
         else:
-            syslog.syslog(syslog.LOG_ERR, "{}-file-does-not-exist".format(VLAN_CONFIG_FILE))
+            syslog.syslog(syslog.LOG_ERR, "{}-file-does-not-exist".format(INBAND_CONFIG_FILE))
             return None, None
     except(EnvironmentError, re.error) as exception:
         syslog.syslog(syslog.LOG_ERR, "error-retreving-vlan-ids-{}".format(exception))
diff --git a/agent/inband/scripts/start_inband_oltservices.sh b/agent/inband/scripts/start_inband_oltservices.sh
index 5dfd1e8..016c1b7 100644
--- a/agent/inband/scripts/start_inband_oltservices.sh
+++ b/agent/inband/scripts/start_inband_oltservices.sh
@@ -50,8 +50,8 @@
 # olt service files
 SVK_INIT_FILE="${BRCM_OPT_DIR}/svk_init.sh"
 
-# vlan config file
-VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
+# inband config file
+INBAND_CONFIG_FILE="${BRCM_DIR}/inband.config"
 DHCLIENT_CONF="/etc/dhcp/dhclient.conf"
 
 # olt serial number
@@ -78,7 +78,7 @@
 OPENOLT_ARG_INPUT_FILE=/etc/default/openolt
 
 # Wait time for BAL to get ready
-WAIT_TIME_BAL_READY=120
+WAIT_TIME_BAL_READY=80
 
 #------------------------------------------------------------------------------
 # Function Name: does_logger_exist
@@ -145,11 +145,11 @@
 #------------------------------------------------------------------------------
 # Function Name: get_vlan_ids
 # Description:
-#    This function facilitates to fetch vlan id from vlan configuration file
-#    located at /broadcom/vlan.config
+#    This function facilitates to fetch vlan id from inband configuration file
+#    located at /broadcom/inband.config
 #
 # Globals:
-#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
+#    INBAND_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
 #    ASGVOLT64_VLAN_ID_ETH1, ASGVOLT64_VLAN_ID_ETH2
 #
 # Arguments:
@@ -159,27 +159,61 @@
 #    None
 #------------------------------------------------------------------------------
 get_vlan_ids() {
-    # Read vlan.config file to fetch vlan id information
-    if [ -f ${VLAN_CONFIG_FILE} ]; then
-        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
-        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+    # Read inband.config file to fetch vlan id information
+    if [ -f ${INBAND_CONFIG_FILE} ]; then
+        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
+        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
         if [ -z ${ASFVOLT16_VLAN_ID_ETH2} ] || [ -z ${ASGVOLT64_VLAN_ID_ETH1} ]; then
             error_message "ERROR: vlan ids not valid"
             exit 1
         fi
     else
-        error_message "ERROR: ${VLAN_CONFIG_FILE} not found, using default value 4093"
+        error_message "ERROR: ${INBAND_CONFIG_FILE} not found, using default value 4093"
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: is_out_band_connection_enabled
+# Description:
+#    This function checks if out-of-band connection is enabled by reading
+#    the enable_out_of_band_connection value in file /broadcom/inband.config
+#
+# Globals:
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    true if out-of-band connection enabled, else false
+#------------------------------------------------------------------------------
+is_out_band_connection_enabled() {
+    # Read inband.config file to fetch configurtion to enable or not the out-of-band connection to the OLT.
+    if [ -f ${INBAND_CONFIG_FILE} ]; then
+        ob_cfg=$(awk '/enable_out_of_band_connection/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
+        if [ -z ${ob_cfg} ]; then
+            error_message "ERROR: missing configuration to enable out-of-band connection to OLT. Default to false"
+            return false
+        fi
+    else
+        if [ "${ob_cfg}" = "yes" ]; then
+            return true
+        elif [ "${ob_cfg}" = "no" ]; then
+            return false
+        else
+            error_message "ERROR: Invalid configuration to enable out-of-band connection -> ${ob_cfg}"
+            return false
+        fi
     fi
 }
 
 #------------------------------------------------------------------------------
 # Function Name: setup_nw_configuration
 # Description:
-#    This function read the "/broadcom/vlan.config" file to get VLAND IDs
+#    This function read the "/broadcom/inband.config" file to get VLAND IDs
 #    for the interface eth1 and eth2 based on the OLT model  and update
 #    these VLAN ID to /etc/network/interfaces file for dhcp request.
 # Globals:
-#    VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
+#    INBAND_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1
 #
 # Arguments:
 #    None
@@ -189,7 +223,14 @@
 #------------------------------------------------------------------------------
 setup_nw_configuration() {
     # Dynamic vlan entry in /etc/network/interfaces file
-    # Should have only one entry in the file in case of multiple reboot
+
+    if [ is_out_band_connection_enabled ]; then
+        # This interface is used for out-of-band connection for the OLT
+        # This is not a mandatory requirement for in-band management of the OLT
+        set_dhcp_ip_configuration ma1
+    fi
+
+    # These interfaces are used for in-band management of the OLT
     if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
         set_dhcp_ip_configuration eth2 ${ASFVOLT16_VLAN_ID_ETH2}
     else
@@ -219,12 +260,72 @@
     vlan_id=$2
     grep -q "iface ${interface}.${vlan_id}" $NETWORK_INTERFACE
     if [ $? -ne 0 ]; then
-        echo "auto ${interface}.${vlan_id}" >>${NETWORK_INTERFACE}
-        echo "iface ${interface}.${vlan_id} inet dhcp" >>${NETWORK_INTERFACE}
+        if [ -z ${vlan_id} ]; then
+            echo "auto ${interface}" >>${NETWORK_INTERFACE}
+            echo "iface ${interface} inet dhcp" >>${NETWORK_INTERFACE}
+        else
+            echo "auto ${interface}.${vlan_id}" >>${NETWORK_INTERFACE}
+            echo "iface ${interface}.${vlan_id} inet dhcp" >>${NETWORK_INTERFACE}
+        fi
     fi
 }
 
 #------------------------------------------------------------------------------
+# Function Name: disable_autostart_of_openolt_and_dev_mgmt_daemon_processes
+# Description:
+#    Disables autostart of openolt processes (openolt and dev_mgmt_daemon).
+#    The start of these openolt processes is now controlled through this script
+#
+# Globals:
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+disable_autostart_of_openolt_and_dev_mgmt_daemon_processes() {
+    update-rc.d dev_mgmt_daemon disable
+    update-rc.d openolt disable
+}
+
+#------------------------------------------------------------------------------
+# Function Name: stop_openolt_and_dev_mgmt_daemon_processes
+# Description:
+#    Stop openolt processes (openolt and dev_mgmt_daemon) if they were running
+#    before
+#
+# Globals:
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+stop_openolt_and_dev_mgmt_daemon_processes() {
+    service dev_mgmt_daemon stop
+    service openolt stop
+}
+
+#------------------------------------------------------------------------------
+# Function Name: start_openolt_dev_mgmt_daemon_process_watchdog
+# Description:
+#    Start openolt and dev_mgmt_daemon process watchdog
+#
+# Globals:
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+start_openolt_dev_mgmt_daemon_process_watchdog() {
+    nohup bash /opt/openolt/openolt_dev_mgmt_daemon_process_watchdog &
+}
+
+#------------------------------------------------------------------------------
 # Function Name: start_dev_mgmt_service
 # Description:
 #    This function starts svk_init.sh script and device management service.
@@ -532,7 +633,13 @@
 #    None
 #------------------------------------------------------------------------------
 start_olt_services() {
+    # First stop any openolt processes if they were running before
+    # and also disable auto start of these processes (since they are in /etc/init.d)
+    stop_openolt_and_dev_mgmt_daemon_processes
+    disable_autostart_of_openolt_and_dev_mgmt_daemon_processes
+
     start_dev_mgmt_service
+    start_openolt_dev_mgmt_daemon_process_watchdog
     create_vlan_tagged_Iface
     setup_dhcpd_configuration
     setup_nw_configuration
@@ -559,7 +666,7 @@
     #     [ -f /qax.soc ] && cp "/qax.soc" "${BRCM_DIR}/"
     # fi
     # [ -f /config.bcm ] && cp "/config.bcm" "${BRCM_DIR}/"
-    [ -f /vlan.config ] && cp "/vlan.config" "${BRCM_DIR}/"
+    [ -f /inband.config ] && cp "/inband.config" "${BRCM_DIR}/"
 }
 
 # Execution starts from here
diff --git a/agent/inband/scripts/validate_onl_installation.sh b/agent/inband/scripts/validate_onl_installation.sh
index 8cbccbc..ab9d06c 100644
--- a/agent/inband/scripts/validate_onl_installation.sh
+++ b/agent/inband/scripts/validate_onl_installation.sh
@@ -48,8 +48,8 @@
 # Root path where required bal directories are located
 BRCM_DIR='/broadcom'
 
-# Path to vlan config file
-VLAN_CONFIG_FILE="${BRCM_DIR}/vlan.config"
+# Path to inband config file
+INBAND_CONFIG_FILE="${BRCM_DIR}/inband.config"
 
 # vlan id for asfvolt16
 ASFVOLT16_VLAN_ID_ETH2=
@@ -278,7 +278,7 @@
 #    in counter a number is equal to 20
 #
 # Globals:
-#     VLAN_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1,
+#     INBAND_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASGVOLT64_VLAN_ID_ETH1,
 #     TIME_INTERVAL, ASFVOLT16
 #
 # Arguments:
@@ -289,9 +289,9 @@
 #------------------------------------------------------------------------------
 check_services()
 {
-    if [ -f ${VLAN_CONFIG_FILE} ]; then
-        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
-        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${VLAN_CONFIG_FILE} | awk -F "=" '{print $2}')
+    if [ -f ${INBAND_CONFIG_FILE} ]; then
+        ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
+        ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
         if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
             if [ ${ASFVOLT16_VLAN_ID_ETH2} -gt 4094 ] || [ ${ASFVOLT16_VLAN_ID_ETH2} -lt 1 ]; then
                 error_message "vlan ids not in range"
@@ -304,7 +304,7 @@
            fi
        fi
     else
-        error_message "${VLAN_CONFIG_FILE} does not exist"
+        error_message "${INBAND_CONFIG_FILE} does not exist"
         exit 1
     fi
     echo "*********************************************************************"
diff --git a/agent/scripts/watchdog/openolt_dev_mgmt_daemon_process_watchdog b/agent/scripts/watchdog/openolt_dev_mgmt_daemon_process_watchdog
new file mode 100755
index 0000000..54d1f82
--- /dev/null
+++ b/agent/scripts/watchdog/openolt_dev_mgmt_daemon_process_watchdog
@@ -0,0 +1,253 @@
+#!/bin/bash
+
+#Copyright 2020-present Open Networking Foundation
+#
+#Licensed under the Apache License, Version 2.0 (the "License");
+#you may not use this file except in compliance with the License.
+#You may obtain a copy of the License at
+#
+#http://www.apache.org/licenses/LICENSE-2.0
+#
+#Unless required by applicable law or agreed to in writing, software
+#distributed under the License is distributed on an "AS IS" BASIS,
+#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#See the License for the specific language governing permissions and
+#limitations under the License.
+
+# This script is a watchdog to monitor openolt and dev_mgmt_daemon processes
+# It restarts the processes when they crash
+# When OLT is working in in-band mode, it just monitors the dev_mgmt_daemon
+# process to start with. Once the openolt processes is also up, it starts
+# monitoring both the processes.
+# When OLT is working in out-of-band, it monitors both the processes to start
+# with. When either of the processes crash, it restarts both the processes.
+
+PID_MONITOR_INTERVAL=1 # in seconds
+MAX_WAIT_TIMER_FOR_OPENOLT_PROCESS_TO_START=120
+
+WATCHDOG_LOG_FILE="/var/log/openolt_process_watchdog.log"
+
+# inband config file
+INBAND_CONFIG_FILE="${BRCM_DIR}/inband.config"
+
+OLT_MODEL=$(cat /sys/devices/virtual/dmi/id/board_name)
+
+ASF16_MODEL="ASXvOLT16"
+
+# vlan id for asfvolt16
+ASFVOLT16_VLAN_ID_ETH2=
+
+# vlan id for asgvolt64
+ASGVOLT64_VLAN_ID_ETH1=
+
+
+#------------------------------------------------------------------------------
+# Function Name: LOG
+# Description:
+#    Logs to WATCHDOG_LOG_FILE
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    string to be logged
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+LOG() {
+    echo `date`" $1" >> ${WATCHDOG_LOG_FILE}
+}
+
+#------------------------------------------------------------------------------
+# Function Name: get_vlan_ids
+# Description:
+#    This function facilitates to fetch vlan id from inband configuration file
+#    located at /broadcom/inband.config
+#
+# Globals:
+#    INBAND_CONFIG_FILE, ASFVOLT16_VLAN_ID_ETH2, ASFVOLT16_VLAN_ID_ETH3,
+#    ASGVOLT64_VLAN_ID_ETH1, ASGVOLT64_VLAN_ID_ETH2
+#
+# Arguments:
+#    None
+#
+# Returns:
+#    None
+#------------------------------------------------------------------------------
+get_vlan_ids() {
+    # Read inband.config file to fetch vlan id information
+    if [ -f ${INBAND_CONFIG_FILE} ]; then
+        if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+            ASFVOLT16_VLAN_ID_ETH2=$(awk '/asfvolt16_vlan_id_eth2/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
+        else
+            ASGVOLT64_VLAN_ID_ETH1=$(awk '/asgvolt64_vlan_id_eth1/{print $0}' ${INBAND_CONFIG_FILE} | awk -F "=" '{print $2}')
+        fi
+
+        if [ -z ${ASFVOLT16_VLAN_ID_ETH2} ] || [ -z ${ASGVOLT64_VLAN_ID_ETH1} ]; then
+            LOG "ERROR: vlan ids not valid"
+            exit 1
+        fi
+    else
+        LOG "ERROR: ${INBAND_CONFIG_FILE} not found, using default value 4093"
+    fi
+}
+
+#------------------------------------------------------------------------------
+# Function Name: monitor_openolt_and_dev_mgmt_daemon_process
+# Description:
+#    Monitors openolt and dev_mgmt_daemon processes in an infinite loop.
+#    Restarts both the processes if either of them exits
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#
+#------------------------------------------------------------------------------
+monitor_openolt_and_dev_mgmt_daemon_process() {
+    LOG "start monitor openolt and dev_mgmt_daemon processes"
+
+    # This is builtin bash variable that tracks the number of seconds
+    # elapsed since the shell started. We can reset to 0 and the timer
+    # starts from here
+    SECONDS=0
+
+    while true; do
+
+        DEV_MGMT_DAEMON_PID=`pidof /broadcom/dev_mgmt_daemon`
+        OPENOLT_PID=$(pidof /broadcom/openolt)
+        if [ -z ${OPENOLT_PID} ] || [ -z ${DEV_MGMT_DAEMON_PID} ];then
+
+            if [ -z ${DEV_MGMT_DAEMON_PID} ]; then
+               LOG "dev_mgmt_daemon processes not available"
+            fi
+
+            if [ -z ${OPENOLT_PID} ]; then
+                LOG "openolt processes not available"
+            fi
+
+            # Reboot OLT so that everything recovers in the right state
+            reboot -n
+            exit 1
+        fi
+
+        sleep ${PID_MONITOR_INTERVAL}
+
+        if [ $(is_olt_in_inband_mode; echo $?) -eq 1 ]; then
+            if [ "${OLT_MODEL}" = ${ASF16_MODEL} ]; then
+                INBAND_IF_IP_ADDR=`ip -o -4 addr list eth2.${ASFVOLT16_VLAN_ID_ETH2} | awk '{print $4}' | cut -d/ -f1`
+            else
+                INBAND_IF_IP_ADDR=`ip -o -4 addr list eth1.${ASGVOLT64_VLAN_ID_ETH1} | awk '{print $4}' | cut -d/ -f1`
+            fi
+
+            if [ -z ${INBAND_IF_IP_ADDR} ] && [ ${SECONDS} -gt 60 ]; then
+                # If the in-band interface does not have an IP for more than 60s, reboot the OLT
+                LOG "in-band interface does not have IP for more than 60s, rebooting OLT"
+                reboot -n
+                exit 1
+            elif [ ${#INBAND_IF_IP_ADDR} -gt 0 ]; then
+                # This is case where we have an IP address on the in-band interface
+
+                # Reset timer if the in-band interface has an IP address
+                SECONDS=0
+            fi
+        fi
+    done
+}
+
+#------------------------------------------------------------------------------
+# Function Name: monitor_dev_mgmt_daemon_process
+# Description:
+#    Monitors dev_mgmt_daemon in an infinite loop. The loop breaks if openolt
+#    agent process starts
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#
+#------------------------------------------------------------------------------
+monitor_dev_mgmt_daemon_process() {
+
+    # This is builtin bash variable that tracks the number of seconds
+    # elapsed since the shell started. We can reset to 0 and the timer
+    # starts from here
+    SECONDS=0
+    while true; do
+        DEV_MGMT_DAEMON_PID=$(pidof /broadcom/dev_mgmt_daemon)
+        if [ -z ${DEV_MGMT_DAEMON_PID} ];then
+            # Reboot OLT so that everything recovers in the right state
+            LOG "dev_mgmt_daemon process crashed or not available in in-band mode of OLT, rebooting OLT"
+            reboot -n
+        fi
+
+        sleep ${PID_MONITOR_INTERVAL}
+
+        OPENOLT_PID=$(pidof /broadcom/openolt)
+        if [ ${OPENOLT_PID} ]; then
+            LOG "openolt process has started. start monitoring both dev_mgmt_daemon and openolt processes"
+            break
+        elif [ ${SECONDS} -ge ${MAX_WAIT_TIMER_FOR_OPENOLT_PROCESS_TO_START} ]; then
+            # Typically the openolt process is supposed to start within MAX_WAIT_TIMER_FOR_OPENOLT_PROCESS_TO_START
+            # If that does not happen, reboot the OLT.
+            LOG "openolt process did not start for more than ${MAX_WAIT_TIMER_FOR_OPENOLT_PROCESS_TO_START} seconds, rebooting OLT"
+            reboot -n
+            exit 1
+        fi
+    done
+}
+
+#------------------------------------------------------------------------------
+# Function Name: is_olt_in_inband_mode
+# Description:
+#    Checks if OLT is working in in-band mode
+#    Presence of in-band startup scripts indicates in-band mode. These scripts
+#    are not packaged as part of the debian package or the ONL when OLT is working
+#    in out-of-band mode.
+#
+# Globals:
+#    None
+#
+# Arguments:
+#    None
+#
+# Returns:
+#
+#------------------------------------------------------------------------------
+is_olt_in_inband_mode() {
+    ! [ -f "/etc/init.d/start_inband_oltservices.sh" ]
+}
+
+
+# Execution starts here
+LOG "---- watchdog started ----"
+
+# Source watchdog configuration
+ . /opt/openolt/watchdog.config
+
+if [ ${enable_watchdog} = "yes" ]; then
+    LOG "watchdog is enabled"
+else
+    LOG "watchdog is disabled - exiting"
+    exit 0
+fi
+
+# If OLT is working in out-of-band start with monitoring only dev_mgmt_daemon process
+if [ $(is_olt_in_inband_mode; echo $?) -eq 1 ]; then
+    LOG "openolt working in in-band mode, starting to monitor dev_mgmt_daemon process first"
+    monitor_dev_mgmt_daemon_process
+    # If we are here, that means the openolt process has just started and we now need to
+    # monitor both dev_mgmt_daemon and openolt process
+else
+    sleep ${watchdog_startup_timer} # Allow some time for openolt and dev_mgmt_daemon process to start
+    LOG "openolt working in out-of-band mode"
+fi
+
+monitor_openolt_and_dev_mgmt_daemon_process
diff --git a/agent/scripts/watchdog/watchdog.config b/agent/scripts/watchdog/watchdog.config
new file mode 100644
index 0000000..7e864c2
--- /dev/null
+++ b/agent/scripts/watchdog/watchdog.config
@@ -0,0 +1,14 @@
+###
+# Description: This file utilized by openolt_dev_mgmt_daemon_process_watchdog script
+#              read the watchdog config
+#
+###
+
+# Enable watchdog or not. yes to enable, no or other string to disable.
+enable_watchdog=no
+
+# watchdog startup timer - this is the time watchdog waits before starting
+# to monitor the openolt and dev_mgmt_daemon process when working in
+# out-of-band mode. This gives the buffer time for openolt and dev_mgmt_daemon
+# processes to start for the first time after OLT boot.
+watchdog_startup_timer=30