BAL and Maple Release 2.2

Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/src/common/include/bal_objs.h b/bal_release/src/common/include/bal_objs.h
new file mode 100644
index 0000000..6a13cce
--- /dev/null
+++ b/bal_release/src/common/include/bal_objs.h
@@ -0,0 +1,985 @@
+/******************************************************************************
+ *
+ *  <:copyright-BRCM:2016:DUAL/GPL:standard
+ *
+ *     Copyright (c) 2016 Broadcom
+ *     All Rights Reserved
+ *
+ *  Unless you and Broadcom execute a separate written software license
+ *  agreement governing use of this software, this software is licensed
+ *  to you under the terms of the GNU General Public License version 2
+ *  (the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
+ *  with the following added to such license:
+ *
+ *     As a special exception, the copyright holders of this software give
+ *     you permission to link this software with independent modules, and
+ *     to copy and distribute the resulting executable under terms of your
+ *     choice, provided that you also meet, for each linked independent
+ *     module, the terms and conditions of the license of that module.
+ *     An independent module is a module which is not derived from this
+ *     software.  The special exception does not apply to any modifications
+ *     of the software.
+ *
+ *  Not withstanding the above, under no circumstances may you combine
+ *  this software in any way with any other Broadcom software provided
+ *  under a license other than the GPL, without Broadcom's express prior
+ *  written consent.
+ *
+ *  :>
+ *
+ *****************************************************************************/
+
+/**
+ * @file bal_objs.h
+ * @brief The file provides an enumeration of all BAL objects
+ *
+ */
+#ifndef BALOBJS_H
+#define BALOBJS_H
+
+#include <bcmolt_host_api.h>
+#include "bal_common.h"
+#include "bal_model_ids.h"
+#include "bal_model_types.h"
+
+/** \ingroup api
+ * @{
+ */
+
+static char *bal_obj_str[] =
+{
+    [bcmbal_obj_id_access_terminal] =     "access_terminal object",
+    [bcmbal_obj_id_interface] =           "interface object",
+    [bcmbal_obj_id_subscriber_terminal] = "subscriber_terminal object",
+    [bcmbal_obj_id_flow] =                "flow object",
+    [bcmbal_obj_id_packet] =              "packet object",
+    [bcmbal_obj_id_group] =               "group object",
+    [bcmbal_obj_id_tm_sched] =            "scheduler object",
+    [bcmbal_obj_id_tm_queue] =            "queue object",
+};
+
+/* Ensure that the name array size matches the associated enum */
+BAL_STATIC_ASSERT (BCMBAL_OBJ_ID__NUM_OF == (sizeof (bal_obj_str) / sizeof (char *)), bcmbal_obj_id);
+
+static inline char *bcmbal_objtype_str(bcmbal_obj_id obj)
+{
+    return (BCMBAL_OBJ_ID__NUM_OF >= obj) ? bal_obj_str[obj] : "unknown";
+}
+
+#define BCMBAL_FLOW_PRIORITY_MAX      65535
+#define BCMBAL_FLOW_PRIORITY_MIN      0
+#define BAL_FLOW_DEFAULT_PRIORITY     10
+
+/*
+ * ------------------------------------------------------------------
+ *
+ * Internal BCMBAL macros used to manipulate the BAL object elements
+ *
+ * ------------------------------------------------------------------
+ */
+
+/* Initialize request. Internal macro
+ * \ingroup api
+ * \param[in]   _h      Message header
+ * \param[in]   _obj    Object name (i.e. flow)
+ * \param[in]   _grp    message type
+ * \param[in]   _subgrp message subgroup
+ */
+#define _BCMBAL_REQ_INIT(_h, _obj, _grp, _subgrp) \
+    (_h)->obj_init_val = BCMBAL_OBJ_INIT_VAL; \
+    (_h)->version = BCMBAL_OBJ_VERSION; \
+    (_h)->status = BCM_ERR_OK; \
+    (_h)->presence_mask = 0; \
+    (_h)->obj_type = bcmbal_obj_id_ ## _obj; \
+    (_h)->group = _grp; \
+    (_h)->subgroup = _subgrp;
+
+/** Initialize set structure
+ * \ingroup api
+ * \param[in]   _s      Set structure
+ * \param[in]   _obj    Object name (i.e. flow)
+ * \param[in]   _key    Object key
+ */
+#define BCMBAL_CFG_INIT(_s, _obj, _key) \
+    do { \
+        bcmbal_ ## _obj ## _cfg *_x_ = _s; \
+        memset(_x_, 0, sizeof(*_x_)); \
+        _BCMBAL_REQ_INIT(&((_x_)->hdr.hdr), _obj, BCMBAL_MGT_GROUP_CFG, 0); \
+        (_x_)->key = _key; \
+    } while (0)
+
+/** Initialize statistics structure
+ * \ingroup api
+ * \param[in]   _s      Statistics structure
+ * \param[in]   _obj    Object name (i.e. flow)
+ * \param[in]   _key    Object key
+ */
+#define BCMBAL_STAT_INIT(_s, _obj, _key) \
+    do { \
+        bcmbal_ ## _obj ## _stat *_x_ = _s; \
+        memset(_x_, 0, sizeof(*_x_)); \
+        _BCMBAL_REQ_INIT(&((_x_)->hdr.hdr), _obj, BCMBAL_MGT_GROUP_STAT, 0); \
+        (_x_)->key = _key; \
+    } while (0)
+
+/** Set the memory buffer to use for variable-sized lists within a cfg get
+ * \ingroup api
+ * \param[in]   _s      Configuration structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _buf    Pointer to a location in memory in which to store the lists
+ * \param[in]   _len    Length of the buffer pointed to by _buf
+ */
+#define BCMBAL_CFG_LIST_BUF_SET(_s, _obj, _buf, _len) \
+    do { \
+        bcmbal_ ## _obj ## _cfg *_x_ = _s; \
+        _x_->hdr.hdr.list_buf = _buf; \
+        _x_->hdr.hdr.list_buf_size = _len; \
+    } while (0)
+
+/* Set the object progress state
+ * \ingroup api
+ * \param[in]   _s      Object structure
+ * \param[in]   _p      New object in-progress state: BCMOS_TRUE, or BCMOS_FALSE
+ */
+#define BCMBAL_OBJ_IN_PROGRESS_SET(_s, _p) ((_s)->hdr.hdr.is_inprogress = _p )
+
+/* Return the object progress state
+ * \ingroup api
+ * \param[in]   _s      Object structure
+ */
+#define BCMBAL_OBJ_IN_PROGRESS_GET(_s) ((_s)->hdr.hdr.is_inprogress)
+
+/* Internal macro: Get a bitmask given a property ID enum */
+#define BCMBAL_PROP_MASK_GET(_obj, _grp, _p) \
+    (bcmbal_ ## _obj ## _grp ## _id_ ## _p == bcmbal_  ## _obj ## _grp ## _id_all_properties ? \
+        ((1ULL << (uint64_t)bcmbal_  ## _obj ## _grp ## _id_ ## _p) - 1) : \
+        (1ULL << (uint64_t)bcmbal_  ## _obj ## _grp ## _id_ ## _p))
+
+
+/* Macro: Indicate that configuration property is present - USE WITH CAUTION */
+#define BCMBAL_PROP_SET_PRESENT(_m, _obj, _grp, _p) \
+    do { \
+        (_m)->hdr.hdr.presence_mask |= BCMBAL_PROP_MASK_GET(_obj, _grp, _p); \
+    } while (0)
+
+/* Internal macro: Indicate that configuration property is not present */
+#define BCMBAL_PROP_CLEAR_PRESENT(_m, _obj, _grp, _p)                   \
+    do {                                                                \
+        (_m)->hdr.hdr.presence_mask &= ~(BCMBAL_PROP_MASK_GET(_obj, _grp, _p));\
+    } while (0)
+
+/* Internal macro: check if property is present */
+#define _BCMBAL_PROP_IS_PRESENT(_m, _obj, _grp, _p) \
+    (((_m)->hdr.hdr.presence_mask & BCMBAL_PROP_MASK_GET(_obj, _grp, _p)) ? \
+        BCMOS_TRUE : BCMOS_FALSE)
+
+/** Set configuration property in message structure
+ * \ingroup api
+ * \param[in]   _m      Configuration structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _p      Property name
+ * \param[in]   _v      Property value
+ */
+#define BCMBAL_CFG_PROP_SET(_m, _obj, _p, _v) \
+   do { \
+       BCMBAL_PROP_SET_PRESENT(_m, _obj, _cfg, _p);\
+       (_m)->data._p = (_v);\
+   } while (0)
+
+/** Indicate that configuration property should be read
+ * \ingroup api
+ * \param[in]   _m      Configuration structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _p      Property name
+ */
+#define BCMBAL_CFG_PROP_GET(_m, _obj, _p) BCMBAL_PROP_SET_PRESENT(_m, _obj, _cfg, _p)
+
+/** clear object property in message structure
+ * \ingroup api
+ * \param[in]   _m      Object structure pointer
+ * \param[in]   _obj    Object name (i.e. flow)
+ * \param[in]   _p      Attribute name (i.e. admin_state)
+ */
+#define BCMBAL_CFG_PROP_CLEAR(_m, _obj, _p)         \
+    do { \
+        BCMBAL_PROP_CLEAR_PRESENT(_m, _obj, _cfg, _p);        \
+        memset(&((_m)->data._p), 0, sizeof((_m)->data._p));    \
+    } while (0)
+
+/** Check if configuration property is set in message structure
+ * \ingroup api
+ * \param[in]   _m      Configuration structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _p      Property name
+ */
+#define BCMBAL_CFG_PROP_IS_SET(_m, _obj, _p) _BCMBAL_PROP_IS_PRESENT(_m, _obj, _cfg, _p)
+
+/** Indicate that statistic property should be read
+ * \ingroup api
+ * \param[in]   _m      Configuration structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _p      Property name
+ */
+#define BCMBAL_STAT_PROP_GET(_m, _obj, _p) BCMBAL_PROP_SET_PRESENT(_m, _obj, _stat, _p)
+
+/** Check if statistic property is set in message structure
+ * \ingroup api
+ * \param[in]   _m      Statistic structure
+ * \param[in]   _obj    Object type
+ * \param[in]   _p      Property name
+ */
+#define BCMBAL_STAT_PROP_IS_SET(_m, _obj, _p) _BCMBAL_PROP_IS_PRESENT(_m, _obj, _stat, _p)
+
+
+/***********************************************************************************
+ **
+ ** Macros for setting attribute values where an attribute supports a presence_mask
+ **
+ ***********************************************************************************
+ **/
+
+/* Internal macro: Get a bitmask given a attribute element property ID enum */
+#define BCMBAL_ATTRIBUTE_PROP_MASK_GET(_attr, _p) bcmbal_ ## _attr ## _id_ ## _p
+
+/* Internal macro: Indicate that configuration property is present */
+#define _BCMBAL_ATTRIBUTE_PROP_SET_PRESENT(p_attr, _attr,_p)            \
+    do {                                                                \
+        (p_attr)->presence_mask |= BCMBAL_ATTRIBUTE_PROP_MASK_GET(_attr, _p); \
+    } while (0)
+
+/* Internal macro: Indicate that configuration property is not present */
+#define _BCMBAL_ATTRIBUTE_PROP_CLEAR_PRESENT(p_attr, _attr,_p)            \
+    do {                                                                \
+        (p_attr)->presence_mask &= ~(BCMBAL_ATTRIBUTE_PROP_MASK_GET(_attr, _p)); \
+    } while (0)
+
+/** Set attribute element property in message structure
+ * \param[in]   _p_attr Attribute structure pointer
+ * \param[in]   _attr   Attribute name
+ * \param[in]   _p      Element name (i.e. o_tpid)
+ * \param[in]   _v      Element value
+ */
+#define BCMBAL_ATTRIBUTE_PROP_SET(_p_attr, _attr, _p, _v)    \
+    do { \
+        _BCMBAL_ATTRIBUTE_PROP_SET_PRESENT(_p_attr, _attr, _p);   \
+        (_p_attr)->_p = (_v);                                    \
+    } while (0)
+
+/** Clear attribute element property in message structure
+ * \param[in]   _p_attr Attribute structure pointer
+ * \param[in]   _attr   Attribute name
+ * \param[in]   _p      Element name (i.e. o_tpid)
+ */
+#define BCMBAL_ATTRIBUTE_PROP_CLEAR(_p_attr, _attr, _p)    \
+    do { \
+        _BCMBAL_ATTRIBUTE_PROP_CLEAR_PRESENT(_p_attr, _attr, _p);   \
+        memset(&((_p_attr)->_p), 0, sizeof((_p_attr)->_p));   \
+    } while (0)
+
+
+/* Internal macro: check if an attribute element is present */
+#define _BCMBAL_ATTRIBUTE_PROP_IS_PRESENT(_p_attr, _attr, _p)              \
+    (((_p_attr)->presence_mask & BCMBAL_ATTRIBUTE_PROP_MASK_GET(_attr, _p)) ? \
+         BCMOS_TRUE : BCMOS_FALSE)
+
+/** Check if attribute element property is set in message structure
+ * \param[in]   _p_attr Attribute structure pointer
+ * \param[in]   _attr   Attribute name
+ * \param[in]   _p      Element name (i.e. o_tpid)
+ */
+#define BCMBAL_ATTRIBUTE_PROP_IS_SET(_p_attr, _attr, _p)    _BCMBAL_ATTRIBUTE_PROP_IS_PRESENT(_p_attr, _attr, _p)
+
+
+/*
+ * ------------------------------------------------------------------
+ *
+ * Internal BCMBAL macros used to manipulate cmds_bitmask of action parameters
+ *
+ * ------------------------------------------------------------------
+ */
+
+/** Check if action cmd id is set in action structure
+ * \param[in]   _m      Object structure pointer
+ * \param[in]   _b      cmd Id bitmask
+ */
+#define BCMBAL_ACTION_CMD_ID_IS_SET(_m, _b) \
+    (((_m)->cmds_bitmask & (_b)) ? \
+        BCMOS_TRUE : BCMOS_FALSE)
+
+/** Set action cmd id in action structure
+ * \param[in]   _m      Object structure pointer
+ * \param[in]   _b      cmd Id bitmask
+ */
+#define BCMBAL_ACTION_CMD_ID_SET(_m, _b) \
+    do {                                                                \
+        (_m)->cmds_bitmask |= (_b);\
+    } while (0)
+
+
+/** Clear action cmd id in action structure
+ * \param[in]   _m      Object structure pointer
+ * \param[in]   _b      cmd Id bitmask
+ */
+#define BCMBAL_ACTION_CMD_ID_CLEAR(_m, _b) \
+    do {                                                                \
+        (_m)->cmds_bitmask &= ~(_b);\
+    } while (0)
+
+
+
+static inline void bcmbal_flow_object_overlay_w_src_priority(bcmbal_flow_cfg *dstobj, bcmbal_flow_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, admin_state))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, admin_state, srcobj->data.admin_state);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, access_int_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, access_int_id, srcobj->data.access_int_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, network_int_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, network_int_id, srcobj->data.network_int_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, sub_term_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, sub_term_id, srcobj->data.sub_term_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, svc_port_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, svc_port_id, srcobj->data.svc_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, agg_port_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, agg_port_id, srcobj->data.agg_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, resolve_mac))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, resolve_mac, srcobj->data.resolve_mac);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, queue))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, queue, srcobj->data.queue);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, action))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, action, srcobj->data.action);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, classifier))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, classifier, srcobj->data.classifier);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, sla))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, sla, srcobj->data.sla);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, group_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, group_id, srcobj->data.group_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, cookie))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, flow, cookie, srcobj->data.cookie);
+    }
+}
+
+static inline void bcmbal_flow_object_overlay_w_dst_priority(bcmbal_flow_cfg *dstobj, bcmbal_flow_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety,
+     * except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source and are not already set in the dst object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, admin_state))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, admin_state))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, admin_state, srcobj->data.admin_state);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, access_int_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, access_int_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, access_int_id, srcobj->data.access_int_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, network_int_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, network_int_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, network_int_id, srcobj->data.network_int_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, sub_term_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, sub_term_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, sub_term_id, srcobj->data.sub_term_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, svc_port_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, svc_port_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, svc_port_id, srcobj->data.svc_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, agg_port_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, agg_port_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, agg_port_id, srcobj->data.agg_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, resolve_mac))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, resolve_mac))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, resolve_mac, srcobj->data.resolve_mac);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, queue))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, queue))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, queue, srcobj->data.queue);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, action))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, action))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, action, srcobj->data.action);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, classifier))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, classifier))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, classifier, srcobj->data.classifier);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, sla))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, sla))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, sla, srcobj->data.sla);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, group_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, group_id))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, group_id, srcobj->data.group_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, flow, cookie))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, flow, cookie))
+            BCMBAL_CFG_PROP_SET(dstobj, flow, cookie, srcobj->data.cookie);
+    }
+}
+
+static inline void bcmbal_sub_term_object_overlay_w_src_priority(bcmbal_subscriber_terminal_cfg *dstobj,
+                                                                 bcmbal_subscriber_terminal_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, admin_state))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, admin_state, srcobj->data.admin_state);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, serial_number))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, serial_number, srcobj->data.serial_number);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, password))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, password, srcobj->data.password);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, registration_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, registration_id, srcobj->data.registration_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, svc_port_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, svc_port_id, srcobj->data.svc_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, ds_tm))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, ds_tm, srcobj->data.ds_tm);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, us_tm))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, us_tm, srcobj->data.us_tm);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, mac_address))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, mac_address, srcobj->data.mac_address);
+    }
+}
+
+static inline void bcmbal_sub_term_object_overlay_w_dst_priority(bcmbal_subscriber_terminal_cfg *dstobj,
+                                                                 bcmbal_subscriber_terminal_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, admin_state))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, admin_state))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, admin_state, srcobj->data.admin_state);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, serial_number))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, serial_number))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, serial_number, srcobj->data.serial_number);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, password))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, password))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, password, srcobj->data.password);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, registration_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, registration_id))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, registration_id, srcobj->data.registration_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, svc_port_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, svc_port_id))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, svc_port_id, srcobj->data.svc_port_id);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, ds_tm))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, ds_tm))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, ds_tm, srcobj->data.ds_tm);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, us_tm))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, us_tm))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, us_tm, srcobj->data.us_tm);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, subscriber_terminal, mac_address))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, subscriber_terminal, mac_address))
+            BCMBAL_CFG_PROP_SET(dstobj, subscriber_terminal, mac_address, srcobj->data.mac_address);
+    }
+}
+
+static inline void bcmbal_tm_sched_object_overlay_w_src_priority(bcmbal_tm_sched_cfg *dstobj, bcmbal_tm_sched_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, owner))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, owner, srcobj->data.owner);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_type))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_type, srcobj->data.sched_type);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_parent))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_parent, srcobj->data.sched_parent);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_child_type))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_child_type, srcobj->data.sched_child_type);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, rate))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, rate, srcobj->data.rate);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, tcont_sla))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, tcont_sla, srcobj->data.tcont_sla);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, creation_mode))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, creation_mode, srcobj->data.creation_mode);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, num_priorities))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_sched, num_priorities, srcobj->data.num_priorities);
+    }
+
+}
+
+
+
+static inline void bcmbal_tm_sched_object_overlay_w_dst_priority(bcmbal_tm_sched_cfg *dstobj, bcmbal_tm_sched_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety,
+     * except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source and are not already set in the dst object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, owner))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, owner))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, owner, srcobj->data.owner);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_type))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, sched_type))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_type, srcobj->data.sched_type);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_parent))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, sched_parent))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_parent, srcobj->data.sched_parent);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, sched_child_type))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, sched_child_type))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, sched_child_type, srcobj->data.sched_child_type);
+    }
+    
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, rate))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, rate))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, rate, srcobj->data.rate);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, tcont_sla))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, tcont_sla))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, tcont_sla, srcobj->data.tcont_sla);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_sched, creation_mode))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, tm_sched, creation_mode))
+            BCMBAL_CFG_PROP_SET(dstobj, tm_sched, creation_mode, srcobj->data.creation_mode);
+    }					
+
+}
+
+
+static inline void bcmbal_tm_queue_object_overlay(bcmbal_tm_queue_cfg *dstobj, bcmbal_tm_queue_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+
+    bcmbal_presence_mask dest_presence_mask;
+
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+
+    /* Now copy only the fields that have been specified in the source object */
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_queue, priority))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_queue, priority, srcobj->data.priority);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_queue, weight))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_queue, weight, srcobj->data.weight);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_queue, rate))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_queue, rate, srcobj->data.rate);
+    }
+
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, tm_queue, bac))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, tm_queue, bac, srcobj->data.bac);
+    }
+}
+
+static inline bcmos_errno bal_obj_key_str_get(bcmbal_obj *obj, char *p_obj_key_str)
+{
+    BUG_ON(NULL == p_obj_key_str);
+
+    bcmos_errno ret = BCM_ERR_OK;
+
+    switch (obj->obj_type)
+    {
+
+        case (BCMBAL_OBJ_ID_ACCESS_TERMINAL):
+        {
+            sprintf(p_obj_key_str, "unit:%d", 
+                    ((bcmbal_access_terminal_cfg *)obj)->key.access_term_id);
+            break;
+        }
+        
+        case (BCMBAL_OBJ_ID_INTERFACE):
+        {
+            sprintf(p_obj_key_str, "intf_id:%d, type:%s",
+                    ((bcmbal_interface_cfg *)obj)->key.intf_id,
+                    ((bcmbal_interface_cfg *)obj)->key.intf_type == BCMBAL_INTF_TYPE_NNI ? "NNI" :
+                    ((bcmbal_interface_cfg *)obj)->key.intf_type == BCMBAL_INTF_TYPE_PON ? "PON" :
+                    "???"
+                    );
+            break;
+        }
+
+        case (BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL):
+        {
+            sprintf(p_obj_key_str, "sub_term_id:%d, intf_id:%d",
+                    ((bcmbal_subscriber_terminal_cfg *)obj)->key.sub_term_id,
+                    ((bcmbal_subscriber_terminal_cfg *)obj)->key.intf_id);
+            break;
+        }
+            
+        case (BCMBAL_OBJ_ID_FLOW):
+        {
+            sprintf(p_obj_key_str, "flow_id:%d, type:%s",
+                    ((bcmbal_flow_cfg *)obj)->key.flow_id,
+                    ((bcmbal_flow_cfg *)obj)->key.flow_type == BCMBAL_FLOW_TYPE_UPSTREAM ? "upstream" :
+                    ((bcmbal_flow_cfg *)obj)->key.flow_type == BCMBAL_FLOW_TYPE_DOWNSTREAM ? "downstream" :
+                    ((bcmbal_flow_cfg *)obj)->key.flow_type == BCMBAL_FLOW_TYPE_BROADCAST ? "broadcast" :
+                    ((bcmbal_flow_cfg *)obj)->key.flow_type == BCMBAL_FLOW_TYPE_MULTICAST ? "multicast" :
+                    "???"
+                    );
+            break;
+        }
+
+        case (BCMBAL_OBJ_ID_GROUP):
+        {
+            sprintf(p_obj_key_str, "group_id:%d",
+                    ((bcmbal_group_cfg *)obj)->key.group_id);
+            break;
+        }
+
+        case (BCMBAL_OBJ_ID_TM_SCHED):
+        {
+            sprintf(p_obj_key_str, "dir:%s, id:%d",
+                    ((bcmbal_tm_sched_cfg *)obj)->key.dir == BCMBAL_TM_SCHED_DIR_US ? "upstream" :
+                    ((bcmbal_tm_sched_cfg *)obj)->key.dir == BCMBAL_TM_SCHED_DIR_DS ? "downstream" :
+                    "???",
+                    ((bcmbal_tm_sched_cfg *)obj)->key.id
+                    );
+            break;
+        } 
+
+        case (BCMBAL_OBJ_ID_TM_QUEUE):
+        {
+            sprintf(p_obj_key_str, "sched_id:%d, sched_dir:%s, id:%d",                   
+                    ((bcmbal_tm_queue_cfg *)obj)->key.sched_id,
+                    ((bcmbal_tm_queue_cfg *)obj)->key.sched_dir == BCMBAL_TM_SCHED_DIR_US ? "upstream" :
+                    ((bcmbal_tm_queue_cfg *)obj)->key.sched_dir == BCMBAL_TM_SCHED_DIR_DS ? "downstream" :
+                    "???",
+                    ((bcmbal_tm_queue_cfg *)obj)->key.id
+                    );
+            break;
+        } 
+                    
+        case (BCMBAL_OBJ_ID_PACKET):
+        {
+            sprintf(p_obj_key_str, " ");
+            break;
+        }
+
+        default:
+            sprintf(p_obj_key_str, " ");
+            ret = BCM_ERR_PARM;
+            break;
+    }
+
+    return ret;
+}
+
+static inline void bcmbal_interface_object_overlay_w_dst_priority(bcmbal_interface_cfg *dstobj, bcmbal_interface_cfg *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+    
+    bcmbal_presence_mask dest_presence_mask;
+    
+    /* First, copy the common object and keys in their entirety,
+    * except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+    
+    /* Now copy only the fields that have been specified in the source and are not already set in the dst object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, admin_state))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, admin_state))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, admin_state, srcobj->data.admin_state);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, min_data_agg_port_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, min_data_agg_port_id))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, min_data_agg_port_id, srcobj->data.min_data_agg_port_id);
+    }   
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, min_data_svc_port_id))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, min_data_svc_port_id))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, min_data_svc_port_id, srcobj->data.min_data_svc_port_id);
+    }    
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, transceiver_type))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, transceiver_type))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, transceiver_type, srcobj->data.transceiver_type);
+    }    
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, ds_miss_mode))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, ds_miss_mode))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, ds_miss_mode, srcobj->data.ds_miss_mode);
+    }  
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, mtu))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, mtu))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, mtu, srcobj->data.mtu);
+    }		
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, flow_control))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, flow_control))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, flow_control, srcobj->data.flow_control);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, ds_tm))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, ds_tm))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, ds_tm, srcobj->data.ds_tm);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, us_tm))
+    {
+        if(!BCMBAL_CFG_PROP_IS_SET(dstobj, interface, us_tm))
+            BCMBAL_CFG_PROP_SET(dstobj, interface, us_tm, srcobj->data.us_tm);
+    }
+}
+
+
+static inline void bcmbal_interface_object_overlay_w_src_priority(bcmbal_interface_cfg *dstobj,
+                                                                 bcmbal_interface_cfg  *srcobj)
+{
+    BUG_ON(NULL == dstobj);
+    BUG_ON(NULL == srcobj);
+    
+    bcmbal_presence_mask dest_presence_mask;
+    
+    /* First, copy the common object and keys in their entirety, except for preserving the presence_mask */
+    dest_presence_mask = dstobj->hdr.hdr.presence_mask;
+    dstobj->hdr = srcobj->hdr;
+    dstobj->key = srcobj->key;
+    dstobj->hdr.hdr.presence_mask = dest_presence_mask;
+    
+    /* Now copy only the fields that have been specified in the source object */
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, admin_state))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, admin_state, srcobj->data.admin_state);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, min_data_agg_port_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, min_data_agg_port_id, srcobj->data.min_data_agg_port_id);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, min_data_svc_port_id))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, min_data_svc_port_id, srcobj->data.min_data_svc_port_id);
+    }    
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, transceiver_type))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, transceiver_type, srcobj->data.transceiver_type);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, ds_miss_mode))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, ds_miss_mode, srcobj->data.ds_miss_mode);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, mtu))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, mtu, srcobj->data.mtu);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, flow_control))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, flow_control, srcobj->data.flow_control);
+    }    
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, ds_tm))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, ds_tm, srcobj->data.ds_tm);
+    }
+    if(BCMBAL_CFG_PROP_IS_SET(srcobj, interface, us_tm))
+    {
+        BCMBAL_CFG_PROP_SET(dstobj, interface, us_tm, srcobj->data.us_tm);
+    }
+
+}
+/*@}*/
+
+
+#endif /* BALOBJS_H */