/******************************************************************************
 *
 *  <: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 */
