VOL-4736 : oltapp unable to remove fttb flows on port down as learnt mac address is lost

Change-Id: Ibfc704af33d134538512b250c719727ec6a19522
diff --git a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
index 04ea492..7a1cdc7 100644
--- a/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
+++ b/impl/src/main/java/org/opencord/olt/impl/OltFlowService.java
@@ -231,6 +231,13 @@
     private final Lock provisionedSubscribersReadLock = provisionedSubscribersLock.readLock();
 
     /**
+     * For storing the mapping of ConnectPoints to FTTB DPU MAC addresses.
+     */
+    protected Map<ConnectPoint, MacAddress> fttbMacAddresses;
+    private final ReentrantReadWriteLock fttbMacAddressesLock = new ReentrantReadWriteLock();
+    private final Lock fttbMacAddressesWriteLock = fttbMacAddressesLock.writeLock();
+
+    /**
      * Create DHCP trap flow on NNI port(s).
      */
     protected boolean enableDhcpOnNni = ENABLE_DHCP_ON_NNI_DEFAULT;
@@ -305,6 +312,18 @@
                 .withSerializer(Serializer.using(serializer))
                 .build().asJavaMap();
 
+        KryoNamespace fttbMacSerializer = KryoNamespace.newBuilder()
+                .register(KryoNamespaces.API)
+                .register(ConnectPoint.class)
+                .register(MacAddress.class)
+                .build();
+
+        fttbMacAddresses = storageService.<ConnectPoint, MacAddress>consistentMapBuilder()
+                .withName("fttb-mac-addresses")
+                .withApplicationId(appId)
+                .withSerializer(Serializer.using(fttbMacSerializer))
+                .build().asJavaMap();
+
         flowRuleService.addListener(internalFlowListener);
 
         log.info("Started");
@@ -1824,8 +1843,10 @@
         VlanId innerVlan = null;
         treatmentBuilder.setOutput(nniPort.number());
         if (serviceName.equals(FTTB_SERVICE_DPU_MGMT_TRAFFIC) || serviceName.equals(FTTB_SERVICE_DPU_ANCP_TRAFFIC)) {
+            fttbMacAddressesWriteLock.lock();
             MacAddress mac = FttbUtils.getMacAddressFromDhcpEnabledUti(
-                    hostService, si, deviceId, port);
+                    hostService, si, deviceId, port, fttbMacAddresses);
+            fttbMacAddressesWriteLock.unlock();
 
             if (mac == null) {
                 log.error("Mac address not found port:{}, vlan:{}, service:{}",
@@ -1884,8 +1905,10 @@
         VlanId innerVlan = null;
 
         if (serviceName.equals(FTTB_SERVICE_DPU_MGMT_TRAFFIC) || serviceName.equals(FTTB_SERVICE_DPU_ANCP_TRAFFIC)) {
+            fttbMacAddressesWriteLock.lock();
             MacAddress mac = FttbUtils.getMacAddressFromDhcpEnabledUti(
-                    hostService, si, deviceId, port);
+                    hostService, si, deviceId, port, fttbMacAddresses);
+            fttbMacAddressesWriteLock.unlock();
 
             if (mac == null) {
                 log.error("Mac address not found port:{}, vlan:{}, service:{}",
@@ -1951,4 +1974,4 @@
             flowObjectiveService.forward(deviceId, flow);
         }
     }
-}
\ No newline at end of file
+}