VOL-4727: Remove restriction that flows have to be replicated for
8 pbits when replication is enabled

Change-Id: I947315ea6a5f52a2c7fd9491896e73ee8730de84
diff --git a/agent/src/core_api_handler.cc b/agent/src/core_api_handler.cc
index 5b7bb74..8f6ea7b 100644
--- a/agent/src/core_api_handler.cc
+++ b/agent/src/core_api_handler.cc
@@ -1669,7 +1669,11 @@
             update_voltha_flow_to_cache(voltha_flow_id, dev_fl);
         } else { // Flow to be replicated
             OPENOLT_LOG(INFO, openolt_log_id,"symmetric flow and replication is needed\n");
-            for (uint8_t i=0; i<NUMBER_OF_REPLICATED_FLOWS; i++) {
+            if (pbit_to_gemport.size() > NUMBER_OF_PBITS) {
+                OPENOLT_LOG(ERROR, openolt_log_id, "invalid pbit-to-gemport map size=%lu", pbit_to_gemport.size())
+                return ::Status(grpc::StatusCode::OUT_OF_RANGE, "pbit-to-gemport-map-len-invalid-for-flow-replication");
+            }
+            for (uint8_t i=0; i<pbit_to_gemport.size(); i++) {
                 ::openolt::Classifier cl = ::openolt::Classifier(classifier);
                 flow_id = dev_fl_symm_params[i].flow_id;
                 gemport_id = dev_fl_symm_params[i].gemport_id;
@@ -1696,8 +1700,9 @@
             dev_fl.is_flow_replicated = true;
             dev_fl.symmetric_voltha_flow_id = symmetric_voltha_flow_id;
             dev_fl.voltha_flow_id = voltha_flow_id;
+            dev_fl.total_replicated_flows = pbit_to_gemport.size();
             dev_fl.flow_type = flow_type;
-            memcpy(dev_fl.params, dev_fl_symm_params, sizeof(device_flow_params)*NUMBER_OF_REPLICATED_FLOWS);
+            memcpy(dev_fl.params, dev_fl_symm_params, sizeof(device_flow_params)*dev_fl.total_replicated_flows);
             // update voltha flow to cache
             update_voltha_flow_to_cache(voltha_flow_id, dev_fl);
         }
@@ -1731,17 +1736,18 @@
             }
         } else { // Flow to be replicated
             OPENOLT_LOG(INFO, openolt_log_id,"not a symmetric flow and replication is needed\n");
-            if (pbit_to_gemport.size() != NUMBER_OF_PBITS) {
+            if (pbit_to_gemport.size() > NUMBER_OF_PBITS) {
                 OPENOLT_LOG(ERROR, openolt_log_id, "invalid pbit-to-gemport map size=%lu", pbit_to_gemport.size())
                 return ::Status(grpc::StatusCode::OUT_OF_RANGE, "pbit-to-gemport-map-len-invalid-for-flow-replication");
             }
-            uint16_t flow_ids[NUMBER_OF_REPLICATED_FLOWS];
+            uint16_t flow_ids[MAX_NUMBER_OF_REPLICATED_FLOWS];
             device_flow dev_fl;
-            if (get_flow_ids(NUMBER_OF_REPLICATED_FLOWS, flow_ids)) {
+            if (get_flow_ids(pbit_to_gemport.size(), flow_ids)) {
                 uint8_t cnt = 0;
                 dev_fl.is_flow_replicated = true;
                 dev_fl.voltha_flow_id = voltha_flow_id;
                 dev_fl.symmetric_voltha_flow_id = INVALID_FLOW_ID; // invalid
+                dev_fl.total_replicated_flows = pbit_to_gemport.size();
                 dev_fl.flow_type = flow_type;
                 for (google::protobuf::Map<unsigned int, unsigned int>::const_iterator it=pbit_to_gemport.begin(); it!=pbit_to_gemport.end(); it++) {
                     dev_fl.params[cnt].flow_id = flow_ids[cnt];
@@ -1766,7 +1772,7 @@
                             }
                         }
                         // Free up all the flow IDs on failure
-                        free_flow_ids(NUMBER_OF_REPLICATED_FLOWS, flow_ids);
+                        free_flow_ids(pbit_to_gemport.size(), flow_ids);
                         return st;
                     }
                     cnt++;
@@ -2198,7 +2204,7 @@
     std::string flow_type = dev_fl->flow_type;
     if (dev_fl->is_flow_replicated) {
         // Note: Here we are ignoring FlowRemove failures
-        for (int i=0; i<NUMBER_OF_REPLICATED_FLOWS; i++) {
+        for (int i=0; i<dev_fl->total_replicated_flows; i++) {
             st = FlowRemove_(dev_fl->params[i].flow_id, flow_type);
             if (st.error_code() == grpc::StatusCode::OK) {
                 free_flow_id(dev_fl->params[i].flow_id);