[VOL-2055] Use Tech Profile ID to differentiate downstream traffic scheduler

- CreateQueue / RemoveQueue / CreateSched / RemoveSched / FlowAdd updated to include
  tech_profile_id to select downstream scheduler.
- A DS scheduler is now identified by the tuple (pon, onu, uni, dir, tech_profile_id)
- voltha_protos v3.3.5 is now referred.
- Unit tests updated.
- VERSION updated.

Change-Id: I399bbb03aa33b61a02da10af0a40d354d44bd5cf
diff --git a/agent/src/core_utils.cc b/agent/src/core_utils.cc
index 6570c2f..1412000 100644
--- a/agent/src/core_utils.cc
+++ b/agent/src/core_utils.cc
@@ -83,18 +83,20 @@
 /**
 * Gets a unique tm_sched_id for a given intf_id, onu_id, uni_id, gemport_id, direction
 * The tm_sched_id is locally cached in a map, so that it can rendered when necessary.
-* VOLTHA replays whole configuration on OLT reboot, so caching locally is not a problem
+* VOLTHA replays whole configuration on OLT reboot, so caching locally is not a problem.
+* Note that tech_profile_id is used to differentiate service schedulers in downstream direction.
 *
 * @param intf_id NNI or PON intf ID
 * @param onu_id ONU ID
 * @param uni_id UNI ID
 * @param gemport_id GEM Port ID
 * @param direction Upstream or downstream
+* @param tech_profile_id Technology Profile ID
 *
 * @return tm_sched_id
 */
-uint32_t get_tm_sched_id(int pon_intf_id, int onu_id, int uni_id, std::string direction) {
-    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction);
+uint32_t get_tm_sched_id(int pon_intf_id, int onu_id, int uni_id, std::string direction, int tech_profile_id) {
+    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction, tech_profile_id);
     int sched_id = -1;
 
     std::map<sched_map_key_tuple, int>::const_iterator it = sched_map.find(key);
@@ -126,16 +128,17 @@
 }
 
 /**
-* Free tm_sched_id for a given intf_id, onu_id, uni_id, gemport_id, direction
+* Free tm_sched_id for a given intf_id, onu_id, uni_id, gemport_id, direction, tech_profile_id
 *
 * @param intf_id NNI or PON intf ID
 * @param onu_id ONU ID
 * @param uni_id UNI ID
 * @param gemport_id GEM Port ID
 * @param direction Upstream or downstream
+* @param tech_profile_id Technology Profile ID
 */
-void free_tm_sched_id(int pon_intf_id, int onu_id, int uni_id, std::string direction) {
-    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction);
+void free_tm_sched_id(int pon_intf_id, int onu_id, int uni_id, std::string direction, int tech_profile_id) {
+    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction, tech_profile_id);
     std::map<sched_map_key_tuple, int>::const_iterator it;
     bcmos_fastlock_lock(&data_lock);
     it = sched_map.find(key);
@@ -146,8 +149,8 @@
     bcmos_fastlock_unlock(&data_lock, 0);
 }
 
-bool is_tm_sched_id_present(int pon_intf_id, int onu_id, int uni_id, std::string direction) {
-    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction);
+bool is_tm_sched_id_present(int pon_intf_id, int onu_id, int uni_id, std::string direction, int tech_profile_id) {
+    sched_map_key_tuple key(pon_intf_id, onu_id, uni_id, direction, tech_profile_id);
     std::map<sched_map_key_tuple, int>::const_iterator it = sched_map.find(key);
     if (it != sched_map.end()) {
         return true;