BAL and Maple Release 2.2

Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/src/lib/libbalapicli/Makefile b/bal_release/src/lib/libbalapicli/Makefile
new file mode 100644
index 0000000..44b7bac
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/Makefile
@@ -0,0 +1,37 @@
+###############################################################################
+#
+#  <: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.
+#  
+#  :>
+#
+###############################################################################
+MOD_NAME = bal_api_cli
+MOD_TYPE = lib
+MOD_DEPS = cli bal_api
+MOD_INC_DIRS = $(SRC_DIR) $(OUT_DIR)
+
+srcs = bal_api_cli.c bal_api_cli_dump.c 
+gen_bal_srcs = bal_api_cli_helpers.c bal_api_cli_handlers.c
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli.c b/bal_release/src/lib/libbalapicli/bal_api_cli.c
new file mode 100644
index 0000000..cbbe973
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli.c
@@ -0,0 +1,1059 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+ */
+
+#include <bcmos_system.h>
+#include <bcmcli.h>
+#include <bal_api.h>
+#include "bal_api_cli.h"
+#include "bal_api_cli_helpers.h"
+#include "bal_api_cli_handlers.h"
+
+#define BCMBAL_APICLI_CAST_DISCARD_CONST(p, type)       (type)((long)(p))
+
+/* bool enum table */
+static bcmcli_enum_val bool_enum[] =
+{
+    { .name = "yes", .val = 1 },
+    { .name = "no", .val = 0 },
+    BCMCLI_ENUM_LAST
+};
+
+static bcmbal_apicli_type_descr bool_type_descr = {
+    .name = "bool",
+    .descr = "Boolean",
+    .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM,
+    .size = sizeof(bcmos_bool),
+    .x = {.e = bool_enum}
+};
+
+/* parameter data */
+typedef struct
+{
+    const bcmbal_apicli_prop_descr *prop;      /* property */
+    const bcmbal_apicli_field_descr *field;    /* field or NULL */
+    const bcmbal_apicli_field_descr *array_fd; /* array field descriptor or NULL */
+    uint16_t offset;                         /* offset from the beginning of the property */
+    uint16_t array_fd_offset;                /* offset of array_fd from the beginning of the property */
+    bcmbal_mgt_group group;                  /* management group */
+} bcmbal_apicli_parm_data;
+
+typedef enum
+{
+    BCMBAL_APICLI_FLAGS_NONE = 0,
+    BCMBAL_APICLI_FLAGS_IGNORE_FIELDS = 1 << 0
+} bcmbal_apicli_flags;
+
+/* Current session */
+static bcmcli_session *current_session;
+
+/*
+ * helpers
+ */
+
+/* calculate number of fields in type */
+static uint32_t bcmbal_apicli_get_num_fields_in_type(const bcmbal_apicli_type_descr *td)
+{
+    uint16_t f;
+    uint32_t nf = 0;
+
+
+    switch (td->base_type)
+    {
+        case BCMBAL_APICLI_BASE_TYPE_ID_STRUCT:
+        {
+            if (!td->x.s.num_fields)
+                return 0;
+            BUG_ON(!td->x.s.fields);
+            for (f = 0; f < td->x.s.num_fields; f++)
+            {
+                nf +=  bcmbal_apicli_get_num_fields_in_type(td->x.s.fields[f].type);
+            }
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_UNION:
+        {
+            /* Union. Count only common fields */
+            nf = td->x.u.num_common_fields;
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED:
+        {
+            nf = bcmbal_apicli_get_num_fields_in_type(td->x.arr_fixed.elem_type);
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN:
+        {
+            nf = bcmbal_apicli_get_num_fields_in_type(td->x.arr_dyn.elem_type);
+            break;
+        }
+
+        default:
+        {
+            nf = 1;
+            break;
+        }
+    }
+
+    return nf;
+}
+
+/* calculate number of property fields for given object+group+subgroup+access. simple property=single field */
+static bcmos_errno bcmbal_apicli_get_num_fields_in_group(bcmbal_obj_id o, bcmbal_mgt_group group, uint16_t subgroup,
+    bcmbal_apicli_prop_access_id access_level, uint32_t *nfields)
+{
+    uint32_t nf = 0;
+    int i;
+    bcmos_errno rc = BCM_ERR_OK;
+
+    for (i = 0; rc != BCM_ERR_RANGE; i++)
+    {
+        const bcmbal_apicli_prop_descr *pd;
+        rc = bcmbal_apicli_object_property(o, group, subgroup, i, &pd);
+        if (rc == BCM_ERR_OK && (pd->access & access_level))
+        {
+            /* Calculate number of fields if write access. Count only properties for read access */
+            if ((access_level & BCMBAL_APICLI_PROP_ACCESS_ID_W) != 0)
+            {
+                BUG_ON(!pd->type);
+                nf += bcmbal_apicli_get_num_fields_in_type(pd->type);
+            }
+            else
+            {
+                ++nf;
+            }
+        }
+    }
+    *nfields = nf;
+
+    return BCM_ERR_OK;
+}
+
+/*
+ * Command handlers
+ */
+
+static bcmos_errno bcmbal_apicli_objects_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    int rc;
+    bcmbal_obj_id o;
+    const char *name, *descr;
+
+    bcmcli_print(session, "System Object Types:\n");
+    bcmcli_print(session, "=======================================\n");
+    bcmcli_print(session, "Id   Name                   Description\n");
+    bcmcli_print(session, "=======================================\n");
+    for (o = 0; o < BCMBAL_OBJ_ID__NUM_OF; o++)
+    {
+        rc = bcmbal_apicli_object_name(o, &name, &descr);
+        if (!rc)
+            bcmcli_print(session, "%.4d %-22s %s\n", o, name, descr);
+    }
+
+    return 0;
+}
+
+static bcmos_errno bcmbal_apicli_set_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    return bcmbal_apicli_call(BCMBAL_MGT_GROUP_CFG, BCMBAL_OBJ_MSG_TYPE_SET, session);
+}
+
+static bcmos_errno bcmbal_apicli_get_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    return bcmbal_apicli_call(BCMBAL_MGT_GROUP_CFG, BCMBAL_OBJ_MSG_TYPE_GET, session);
+}
+
+static bcmos_errno bcmbal_apicli_clear_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    return bcmbal_apicli_call(BCMBAL_MGT_GROUP_CFG, BCMBAL_OBJ_MSG_TYPE_CLEAR, session);
+}
+
+static bcmos_errno bcmbal_apicli_stat_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    return bcmbal_apicli_call(BCMBAL_MGT_GROUP_STAT, BCMBAL_OBJ_MSG_TYPE_GET, session);
+}
+
+/*
+ * Init-time helpers
+ */
+
+/* map to CLI type */
+static bcmos_errno bcmbal_apicli_map_type(
+    const bcmbal_apicli_type_descr *td,
+    const bcmbal_apicli_type_descr *array_td,
+    bcmcli_cmd_parm *cmd_parm)
+{
+    bcmbal_apicli_parm_data *parm_data = cmd_parm->user_data;
+    bcmos_errno rc = BCM_ERR_OK;
+
+    /* Map type */
+    switch(td->base_type)
+    {
+    case BCMBAL_APICLI_BASE_TYPE_ID_SNUM:
+        cmd_parm->type = BCMCLI_PARM_NUMBER;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_UNUM:
+        cmd_parm->type = BCMCLI_PARM_UNUMBER;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX:
+        cmd_parm->type = BCMCLI_PARM_HEX;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_BOOL:
+        cmd_parm->type = BCMCLI_PARM_ENUM;
+        cmd_parm->enum_table = bool_enum;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_FLOAT:
+        cmd_parm->type = td->size == sizeof(double) ? BCMCLI_PARM_DOUBLE : BCMCLI_PARM_FLOAT;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_STRING:
+        cmd_parm->type = BCMCLI_PARM_STRING;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_IPV4:
+        cmd_parm->type = BCMCLI_PARM_IP;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_MAC:
+        cmd_parm->type = BCMCLI_PARM_MAC;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_ENUM:
+        cmd_parm->type = BCMCLI_PARM_ENUM;
+        cmd_parm->enum_table = td->x.e;
+        break;
+    case BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK:
+        cmd_parm->type = BCMCLI_PARM_ENUM_MASK;
+        cmd_parm->enum_table = td->x.e;
+        break;
+    default:
+        bcmcli_print(current_session, "*** can't map type %s (%d)\n", td->name, (int)td->base_type);
+        rc = BCM_ERR_NOT_SUPPORTED;
+        break;
+    }
+
+    /* Map uint8_t array to buffer if it is independent (not structure field) */
+    if (array_td &&
+        td->size == 1 &&
+        (td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNUM || td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX) &&
+        (parm_data->array_fd == parm_data->field || !parm_data->field))
+    {
+        cmd_parm->type = BCMCLI_PARM_BUFFER;
+    }
+
+    return rc;
+}
+
+/* allocate memory for name and description and copy to to parm */
+static bcmos_errno bcmbal_apicli_copy_parm_name(bcmcli_cmd_parm *parm, const char *name, const char *descr)
+{
+    parm->name = bcmos_alloc(strlen(name) + 1);
+    parm->description = bcmos_alloc(strlen(descr) + 1);
+    if ((parm->name == NULL) || (parm->description == NULL))
+    {
+        /* Successful allocation if any will be released by common cleanup
+         * along with the rest of dynamic parameter fields */
+        return BCM_ERR_NOMEM;
+    }
+    strcpy(BCMBAL_APICLI_CAST_DISCARD_CONST(parm->name, void *), name);
+    strcpy(BCMBAL_APICLI_CAST_DISCARD_CONST(parm->description, void *), descr);
+    return BCM_ERR_OK;
+}
+
+/* populate single parameter */
+static int bcmbal_apicli_populate_parm1(
+    const bcmbal_apicli_prop_descr *pd,
+    const bcmbal_apicli_field_descr *fd,
+    const bcmbal_apicli_type_descr *td,
+    const bcmbal_apicli_field_descr *array_fd,
+    uint32_t offset,
+    uint32_t array_fd_offset,
+    bcmcli_cmd_parm *cmd_parm,
+    uint32_t cmd_flags,
+    char *name,
+    char *help)
+{
+    bcmbal_apicli_parm_data *parm_data = cmd_parm->user_data;
+    int rc;
+
+    parm_data->prop = pd;
+    parm_data->field = fd;
+    parm_data->offset = offset;
+    parm_data->array_fd = array_fd;
+    parm_data->array_fd_offset = array_fd_offset;
+
+    rc = bcmbal_apicli_copy_parm_name(cmd_parm, name, help);
+    if (rc)
+    {
+        return rc;
+    }
+    cmd_parm->flags = cmd_flags;
+    if (td->min_val != td->max_val || td->min_val)
+    {
+        cmd_parm->flags |= BCMCLI_PARM_FLAG_RANGE;
+        cmd_parm->low_val = td->min_val;
+        cmd_parm->hi_val = td->max_val;
+    }
+    rc = bcmbal_apicli_map_type(td, array_fd ? array_fd->type : NULL, cmd_parm);
+    if (rc < 0)
+    {
+        return rc;
+    }
+
+    /* Arrays require more work.
+     * - Calculate size. Known for fixed arrays, hard-coded max for dynamic
+     * - Allocate either buffer or array of values based on CLI parameter type
+     * - Calculate offset from the beginning of array entry
+     */
+    if (array_fd)
+    {
+        uint32_t array_size;
+
+        if (array_fd->type->base_type == BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED)
+        {
+            array_size = array_fd->type->x.arr_fixed.size;
+        }
+        else
+        {
+            array_size = array_fd->type->x.arr_dyn.max_size;
+        }
+        if (!array_size)
+        {
+            bcmcli_print(current_session, "*** Error in %s array descriptor. Size is not set.\n", array_fd->name);
+            return BCM_ERR_INTERNAL;
+        }
+        if (cmd_parm->type == BCMCLI_PARM_BUFFER)
+        {
+            rc = bcmbal_buf_alloc(&cmd_parm->value.buffer, array_size);
+            if (rc)
+            {
+                return rc;
+            }
+        }
+        else
+        {
+            cmd_parm->values = bcmos_calloc(sizeof(bcmcli_parm_value) * array_size);
+            if (!cmd_parm->values)
+            {
+                return BCM_ERR_NOMEM;
+            }
+            cmd_parm->max_array_size = array_size;
+        }
+    }
+
+    return 1;
+}
+
+
+/* populate name buf and help buf */
+static void bcmbal_apicli_populate_name_help(const bcmbal_apicli_field_descr *fld, char *name_buf0, char *help_buf0,
+    char *name_buf, char *help_buf)
+{
+    name_buf[0] = 0;
+    help_buf[0] = 0;
+    bcmcli_strncpy(name_buf, name_buf0, BCMBAL_APICLI_MAX_PARM_NAME_LENGTH);
+    if (strlen(name_buf))
+        bcmcli_strncat(name_buf, ".", BCMBAL_APICLI_MAX_PARM_NAME_LENGTH);
+    bcmcli_strncat(name_buf, fld->cli_name ? fld->cli_name : fld->name, BCMBAL_APICLI_MAX_PARM_NAME_LENGTH);
+    bcmcli_strncpy(help_buf, help_buf0, BCMBAL_APICLI_MAX_PARM_HELP_LENGTH);
+    bcmcli_strncat(help_buf, " - ", BCMBAL_APICLI_MAX_PARM_HELP_LENGTH);
+    bcmcli_strncat(help_buf, fld->descr ? fld->descr : fld->name, BCMBAL_APICLI_MAX_PARM_HELP_LENGTH);
+}
+
+/* Allocate CLI parameter array. Set up parm->data */
+static bcmcli_cmd_parm *bcmbal_apicli_parm_alloc(int nparms)
+{
+    uint32_t size;
+    bcmcli_cmd_parm *parms;
+    bcmbal_apicli_parm_data *parm_data;
+    int i;
+
+    /* Allocate parameter table and populate it */
+    size = (sizeof(bcmcli_cmd_parm) + sizeof(bcmbal_apicli_parm_data)) * (nparms + 1);
+    parms = bcmos_calloc(size);
+    if (!parms)
+        return NULL;
+
+    /* Associate parameter_data structs with parameters */
+    parm_data = (bcmbal_apicli_parm_data *)(parms + nparms + 1);
+    for (i = 0; i < nparms; i++)
+    {
+        parms[i].user_data = &parm_data[i];
+    }
+    return parms;
+}
+
+/* clone enum table */
+static bcmcli_enum_val *bcmbal_apicli_clone_enum_table(bcmcli_cmd_parm *parm)
+{
+    bcmcli_enum_val *org_table = parm->enum_table;
+    bcmcli_enum_val *val = org_table;
+    bcmcli_enum_val *clone_table = org_table;
+    int i, n;
+
+    BUG_ON(parm->type != BCMCLI_PARM_ENUM);
+    while (val && val->name)
+    {
+        ++val;
+    }
+    n = val - org_table;
+
+    clone_table = bcmos_calloc(sizeof(bcmcli_enum_val) * (n + 1));
+    if (!clone_table)
+    {
+        return NULL;
+    }
+    for (i = 0; i < n; i++)
+    {
+        clone_table[i].name = org_table[i].name;
+        clone_table[i].val = org_table[i].val;
+    }
+    return clone_table;
+}
+
+
+/* populate CLI parameter(s) from a single property. Can be multiple parameters
+ * if property contains multiple fields.
+ * Returns number of parameters populated >= 0 or error < 0
+ */
+static int bcmbal_apicli_populate_parms_from_property(const bcmbal_apicli_prop_descr *pd, 
+    const bcmbal_apicli_field_descr *fd, const bcmbal_apicli_field_descr *array_fd, uint32_t offset,
+    uint32_t array_fd_offset, bcmcli_cmd_parm *parms, bcmbal_apicli_prop_access_id access_level, uint32_t cmd_flags,
+    char *name_buf0, char *help_buf0)
+{
+    const bcmbal_apicli_type_descr *td = fd ? fd->type : pd->type;
+    uint32_t nf = 0;
+    char name_buf[BCMBAL_APICLI_MAX_PARM_NAME_LENGTH];
+    char help_buf[BCMBAL_APICLI_MAX_PARM_HELP_LENGTH];
+    int rc = 0;
+
+    /* presence masks are not set directly, they are calculated based on other fields */
+    if (fd != NULL && (fd->flags & BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK) != 0)
+    {
+        return BCM_ERR_READ_ONLY;
+    }
+
+    /* At top level take name from property */
+    if (td == pd->type)
+    {
+        /* In case there's a global prefix */
+        char *top_name_buf = name_buf0;
+        uint32_t top_name_buf_len = BCMBAL_APICLI_MAX_PARM_NAME_LENGTH;
+        uint32_t prefix_len = strlen(name_buf0);
+        if (prefix_len > 0)
+        {
+            top_name_buf += prefix_len;
+            top_name_buf_len -= prefix_len;
+        }
+
+        bcmcli_strncpy(top_name_buf, pd->cli_name ? pd->cli_name : pd->name, top_name_buf_len);
+        bcmcli_strncpy(help_buf0, pd->descr ? pd->descr : pd->name, BCMBAL_APICLI_MAX_PARM_HELP_LENGTH);
+    }
+
+    /* For read access we only mark whether read property or not. It is not field-by-field operation */
+    if (access_level == BCMBAL_APICLI_PROP_ACCESS_ID_R)
+    {
+        td = &bool_type_descr;
+    }
+
+    /* In case of arrays we should
+     * - check that there is no array in array. It is not supported
+     * - store array type descriptor FFU and replace the "current" type descriptor with element type
+     * - reset offset because for array fields it should be calculated from array base rather than property
+     */
+    if (td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN || td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED)
+    {
+        if (array_fd)
+        {
+            bcmcli_print(
+                current_session,
+                "*** %s in %s: arrays-in-arrays are not supported\n",
+                pd->name,
+                array_fd->name);
+            return BCM_ERR_NOT_SUPPORTED;
+        }
+        /* store array type and fetch element type */
+        array_fd = fd ? fd : (const bcmbal_apicli_field_descr *)pd;
+        if (td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN)
+        {
+            td = td->x.arr_dyn.elem_type;
+        }
+        else
+        {
+            td = td->x.arr_fixed.elem_type;
+        }
+        array_fd_offset = offset;
+        offset = 0;
+    }
+
+    if (td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_STRUCT)
+    {
+        uint16_t f;
+        if (!td->x.s.num_fields)
+            return 0;
+        BUG_ON(!td->x.s.fields);
+        for (f = 0; f < td->x.s.num_fields; f++)
+        {
+            const bcmbal_apicli_field_descr *fld = &td->x.s.fields[f];
+            bcmbal_apicli_populate_name_help(fld, name_buf0, help_buf0, name_buf, help_buf);
+            rc = bcmbal_apicli_populate_parms_from_property(pd, fld, array_fd, offset+fld->offset,
+                array_fd_offset, &parms[nf], access_level, cmd_flags, name_buf, help_buf);
+            if (rc > 0)
+                nf +=  rc;
+        }
+    }
+    else if (td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNION)
+    {
+        /* Union */
+        uint16_t f;
+        const bcmbal_apicli_field_descr *fld;
+        bcmcli_cmd_parm *sel_parm;
+        bcmbal_apicli_parm_data *sel_data;
+        bcmcli_enum_val *e;
+
+        if (!td->x.u.num_common_fields)
+            return 0;
+        BUG_ON(!td->x.u.common_fields);
+
+        /* Populate parameters preceding the union selector */
+        for (f = 0; f < td->x.u.classifier_idx; f++)
+        {
+            fld = &td->x.u.common_fields[f];
+            bcmbal_apicli_populate_name_help(fld, name_buf0, help_buf0, name_buf, help_buf);
+            rc =  bcmbal_apicli_populate_parms_from_property(pd, fld, array_fd,
+                offset+fld->offset, array_fd_offset, &parms[nf], access_level, cmd_flags, name_buf, help_buf);
+            if (rc > 0)
+                nf += rc;
+        }
+
+        /* Now populate parameter for selector */
+        sel_parm = &parms[nf];
+        fld = &td->x.u.common_fields[f];
+        bcmbal_apicli_populate_name_help(fld, name_buf0, help_buf0, name_buf, help_buf);
+        rc = bcmbal_apicli_populate_parms_from_property(pd, fld, array_fd,
+            offset+fld->offset, array_fd_offset, sel_parm, access_level, cmd_flags, name_buf, help_buf);
+        if (rc > 0)
+            nf += rc;
+        /* Clone enum table in order to allow modifying it */
+        if (rc >= 1)
+        {
+            sel_parm->enum_table = bcmbal_apicli_clone_enum_table(sel_parm);
+            if (!sel_parm->enum_table)
+            {
+                rc = BCM_ERR_NOMEM;
+            }
+        }
+
+        /* Now set-up selector */
+        sel_parm->flags |= BCMCLI_PARM_FLAG_SELECTOR;
+        sel_data = sel_parm->user_data;
+        e = sel_parm->enum_table;
+        while (e && e->name && rc >= 0)
+        {
+            fld = &td->x.u.union_fields[e - sel_parm->enum_table];
+            if (fld->type)
+            {
+                int np = bcmbal_apicli_get_num_fields_in_type(fld->type);
+                int i;
+
+                e->parms = bcmbal_apicli_parm_alloc(np);
+                if (!e->parms)
+                {
+                    rc = BCM_ERR_NOMEM;
+                    break;
+                }
+                for (i = 0; i < np; i++)
+                {
+                    bcmbal_apicli_parm_data *data = e->parms[i].user_data;
+                    data->group = sel_data->group;
+                }
+                /* Collapse substructure name */
+                if (fld->type->base_type == BCMBAL_APICLI_BASE_TYPE_ID_STRUCT ||
+                    fld->type->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNION)
+                {
+                    bcmcli_strncpy(name_buf, name_buf0, sizeof(name_buf));
+                    bcmcli_strncpy(help_buf, help_buf0, sizeof(help_buf));
+                }
+                else
+                {
+                    bcmbal_apicli_populate_name_help(fld, name_buf0, help_buf0, name_buf, help_buf);
+                }
+                rc = bcmbal_apicli_populate_parms_from_property(pd, fld, array_fd,
+                    offset+fld->offset, array_fd_offset, e->parms, access_level, cmd_flags, name_buf, help_buf);
+            }
+            ++e;
+        }
+
+        /* Finally populate parameters following the selector parameter */
+        for (f = td->x.u.classifier_idx + 1; f < td->x.u.num_common_fields && rc >= 0; f++)
+        {
+            fld = &td->x.u.common_fields[f];
+            bcmbal_apicli_populate_name_help(fld, name_buf0, help_buf0, name_buf, help_buf);
+            rc = bcmbal_apicli_populate_parms_from_property(pd, fld, array_fd,
+                offset+fld->offset, array_fd_offset, &parms[nf], access_level, cmd_flags, name_buf, help_buf);
+            if (rc > 0)
+                nf += rc;
+        }
+    }
+    else
+    {
+        /* Finally! Simple type that maps to a single CLI parameter */
+        nf = bcmbal_apicli_populate_parm1(pd, fd, td, array_fd, offset, array_fd_offset,
+            &parms[0], cmd_flags, name_buf0, help_buf0);
+    }
+    return (rc >= 0) ? nf : rc;
+}
+
+/* populate CLI parameter table */
+static int bcmbal_apicli_populate_parms(
+    bcmbal_obj_id o,
+    bcmbal_mgt_group group,
+    uint16_t subgroup,
+    bcmbal_apicli_prop_access_id access_level,
+    bcmcli_cmd_parm *parms,
+    uint32_t cmd_flags,
+    const char *prefix)
+{
+    int nf = 0;
+    int i;
+    bcmos_errno rc = BCM_ERR_OK;
+
+    for (i = 0; rc != BCM_ERR_RANGE; i++)
+    {
+        const bcmbal_apicli_prop_descr *pd;
+        char name_buf[BCMBAL_APICLI_MAX_PARM_NAME_LENGTH] = "";
+        char help_buf[BCMBAL_APICLI_MAX_PARM_HELP_LENGTH] = "";
+
+        strncpy(name_buf, prefix, BCMBAL_APICLI_MAX_PARM_NAME_LENGTH-1);
+        name_buf[BCMBAL_APICLI_MAX_PARM_NAME_LENGTH-1] = 0;
+
+        rc = bcmbal_apicli_object_property(o, group, subgroup, i, &pd);
+        if (rc == BCM_ERR_OK && (pd->access & access_level))
+        {
+            rc = bcmbal_apicli_populate_parms_from_property(pd, NULL, NULL, 0, 0, &parms[nf],
+                access_level, cmd_flags, name_buf, help_buf);
+            if (rc > 0)
+                nf += rc;
+        }
+    }
+    return nf;
+}
+
+
+/* compact selector table. squeeze out values that don't have parameter table attached */
+static void bcmbal_apicli_compact_selector(bcmcli_enum_val *selector, int size)
+{
+    int i, j;
+
+    for (i = 0; i < size; i++)
+    {
+        if (!selector[i].parms)
+        {
+            for ( j = i + 1; j < size && !selector[j].parms; j ++)
+                ;
+            if (j < size)
+            {
+                memcpy(&selector[i], &selector[j], sizeof(bcmcli_enum_val));
+                memset(&selector[j], 0, sizeof(bcmcli_enum_val));
+            }
+            else
+            {
+                memset(&selector[i], 0, sizeof(bcmcli_enum_val));
+            }
+        }
+    }
+}
+
+/* Free CLI parameters. both name and description are allocated dynamically */
+static void bcmbal_apicli_free_parms(bcmcli_cmd_parm *parms)
+{
+    bcmcli_cmd_parm *p = parms;
+
+    while (p->name)
+    {
+        if ((p->flags & BCMCLI_PARM_FLAG_SELECTOR))
+        {
+            /* Remove selector table */
+            bcmcli_enum_val *sel = p->enum_table;
+            if (sel)
+            {
+                bcmcli_enum_val *e = sel;
+                while(e->name)
+                {
+                    if (e->parms)
+                    {
+                        bcmbal_apicli_free_parms(e->parms);
+                    }
+                    ++e;
+                }
+                bcmos_free(sel);
+            }
+        }
+        if (p->description)
+            bcmos_free(BCMBAL_APICLI_CAST_DISCARD_CONST(p->description, void *));
+        if (p->name)
+            bcmos_free(BCMBAL_APICLI_CAST_DISCARD_CONST(p->name, void *));
+        if (p->max_array_size && p->values)
+            bcmos_free(p->values);
+        if (p->value.buffer.start)
+            bcmbal_buf_free(&p->value.buffer);
+
+        ++p;
+    }
+    bcmos_free(parms);
+}
+
+static uint8_t bcmbal_apicli_get_num_cmd_parms(bcmbal_mgt_group group, bcmbal_apicli_flags flags)
+{
+    if (group == BCMBAL_MGT_GROUP_STAT)
+        return 2; /* object + stat ID */
+    else
+        return 1; /* object */
+}
+
+/* Read generated info and add CLI command */
+static bcmos_errno bcmbal_apicli_add(bcmcli_entry *dir, const char *cmd_name, const char *cmd_descr,
+    bcmbal_mgt_group group, bcmbal_apicli_prop_access_id access_level, bcmcli_cmd_cb cmd_handler, 
+    bcmbal_apicli_flags flags)
+{
+    bcmcli_cmd_extra_parm cmd_extras = { .free_parms = bcmbal_apicli_free_parms };
+    bcmcli_cmd_parm *cmd_parms;
+    bcmcli_enum_val *obj_selector;
+    bcmbal_obj_id o;
+    bcmos_errno rc = BCM_ERR_OK;
+    uint32_t cmd_flags = 0;
+    uint8_t num_cmd_parms = bcmbal_apicli_get_num_cmd_parms(group, flags);
+    int n_obj;
+    int i;
+
+    /* Command flags: parameters in the following groups are optional */
+    if (group == BCMBAL_MGT_GROUP_CFG || group == BCMBAL_MGT_GROUP_STAT || group == BCMBAL_MGT_GROUP_AUTO_CFG)
+        cmd_flags = BCMCLI_PARM_FLAG_OPTIONAL;
+
+    /* command parameters are:
+     * - object_name (selector)
+     * - object_key_fields
+     * - object_per_group_fields filtered by access
+     * Therefore, there is 1 top-level enum parameter (object type) with per-value parameter tables
+     * In the case of operations or proxy messages, there is also a top-level enum parameter for the oper/proxy name
+     */
+
+    /* Allocate enum table based on max number of objects. Will be compacted in the end */
+    cmd_parms = bcmos_calloc(sizeof(bcmcli_cmd_parm) * (num_cmd_parms + 1));
+    if (!cmd_parms)
+        return BCM_ERR_NOMEM;
+
+    /* Allocate enough space for all object entries as well as a terminator entry (which is left NULL) */
+    obj_selector = bcmos_calloc(sizeof(bcmcli_enum_val) * (BCMBAL_OBJ_ID__NUM_OF + 1));
+    if (!obj_selector)
+        goto nomem_cleanup;
+
+    /* Allocate parameter table */
+    n_obj = 0;
+    for (o = 0; o < BCMBAL_OBJ_ID__NUM_OF; o++)
+    {
+        uint32_t nkeyfields = 0;
+        uint32_t nfields = 0;
+        uint32_t nfilterfields = 0;
+        uint32_t size;
+        uint16_t s;
+        uint16_t subgroup_count = bcmbal_apicli_get_subgroup_count(o, group);
+        bcmcli_enum_val *sub_selector;
+
+        if (subgroup_count == 0)
+            continue;
+
+        obj_selector[n_obj].val = o;
+        rc = bcmbal_apicli_object_name(o, &obj_selector[n_obj].name, NULL);
+        if (rc)
+            continue;
+
+        /* Get number of key fields and save it */
+        if (group == BCMBAL_MGT_GROUP_AUTO_CFG)
+        {
+            nkeyfields = 0;
+        }
+        else
+        {
+            bcmbal_apicli_get_num_fields_in_group(
+                o, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_APICLI_PROP_ACCESS_ID_W, &nkeyfields);
+        }
+
+        /* Allocate subgroup enum table */
+        sub_selector = bcmos_calloc(sizeof(bcmcli_enum_val) * (subgroup_count + 1));
+        if (!sub_selector)
+            goto nomem_cleanup;
+
+        /* Allocate single subgroup command parameter */
+        size = sizeof(bcmcli_cmd_parm) * 2;
+        obj_selector[n_obj].parms = bcmos_calloc(size);
+        if (!obj_selector[n_obj].parms)
+        {
+            bcmos_free(sub_selector);
+            goto nomem_cleanup;
+        }
+
+        /* Setup single subgroup command parameter */
+        obj_selector[n_obj].parms[0].type = BCMCLI_PARM_ENUM;
+        obj_selector[n_obj].parms[0].flags = BCMCLI_PARM_FLAG_SELECTOR;
+        obj_selector[n_obj].parms[0].enum_table = sub_selector;
+        rc = bcmbal_apicli_copy_parm_name(&obj_selector[n_obj].parms[0],
+                                 "sub",
+                                 "Subgroup (specific operation / proxy msg)");
+        if (rc)
+            goto nomem_cleanup;
+
+        for (s = 0; s < subgroup_count; ++s)
+        {
+            const char *sub_name;
+            bcmcli_cmd_parm *parm_ptr;
+
+            /* Get name of specific subgroup */
+            rc = bcmbal_apicli_object_subgroup_name(o, group, s, &sub_name, NULL);
+            if (rc)
+                continue;
+
+            /* Setup entry in subgroup enum table */
+            sub_selector[s].name = sub_name;
+            sub_selector[s].val = s;
+
+            /* Get number of group fields */
+            rc = bcmbal_apicli_get_num_fields_in_group(o, group, s, access_level, &nfields);
+            if (rc)
+                continue;
+
+            if ((flags & BCMBAL_APICLI_FLAGS_IGNORE_FIELDS) != BCMBAL_APICLI_FLAGS_NONE)
+            {
+                nfilterfields = 0;
+                nfields = 0;
+            }
+
+            /* Allocate parameter table and populate it */
+            sub_selector[s].parms = bcmbal_apicli_parm_alloc(nfields + nkeyfields + nfilterfields);
+            if (!sub_selector[s].parms)
+            {
+                rc = BCM_ERR_NOMEM;
+                goto nomem_cleanup;
+            }
+            for (i = 0; i < nkeyfields + nfields + nfilterfields; i++)
+            {
+                bcmbal_apicli_parm_data *parm_data = sub_selector[s].parms[i].user_data;
+                parm_data->group = (i < nkeyfields) ? BCMBAL_MGT_GROUP_KEY : group;
+            }
+
+            parm_ptr = sub_selector[s].parms;
+            if (nkeyfields)
+            {
+                rc = bcmbal_apicli_populate_parms(
+                    o, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_APICLI_PROP_ACCESS_ID_W, parm_ptr, 0, "");
+                if (rc < 0)
+                    goto nomem_cleanup;
+                parm_ptr += rc;
+            }
+            if (nfilterfields)
+            {
+                rc = bcmbal_apicli_populate_parms(
+                    o, group, s, BCMBAL_APICLI_PROP_ACCESS_ID_RW, parm_ptr, cmd_flags, "filter.");
+                if (rc < 0)
+                    goto nomem_cleanup;
+                parm_ptr += rc;
+            }
+            if (nfields)
+            {
+                rc = bcmbal_apicli_populate_parms(o, group, s, access_level, parm_ptr, cmd_flags, "");
+                if (rc < 0)
+                    goto nomem_cleanup;
+                parm_ptr += rc;
+            }
+        }
+
+        /* Compact sub_selector enum. Removes holes (values without parameter table) */
+        bcmbal_apicli_compact_selector(sub_selector, subgroup_count);
+
+        /* If the group type doesn't support subgroups, remove the subgroup param entry */
+        if (group == BCMBAL_MGT_GROUP_CFG || group == BCMBAL_MGT_GROUP_STAT || group == BCMBAL_MGT_GROUP_AUTO_CFG)
+        {
+            /* Free the memory associated with the (single) subgroup param */
+            bcmos_free(BCMBAL_APICLI_CAST_DISCARD_CONST(obj_selector[n_obj].parms[0].name, void *));
+            bcmos_free(BCMBAL_APICLI_CAST_DISCARD_CONST(obj_selector[n_obj].parms[0].description, void *));
+            bcmos_free(obj_selector[n_obj].parms);
+            /* Assign the subgroup params to the root object params */
+            obj_selector[n_obj].parms = sub_selector[0].parms;
+            bcmos_free(sub_selector);
+        }
+
+        ++n_obj; /* number of configured objects */
+    }
+
+    /* Compact obj_selector enum. Removes holes (values without parameter table) */
+    bcmbal_apicli_compact_selector(obj_selector, BCMBAL_OBJ_ID__NUM_OF);
+
+    /* Add a 'clear on read' to stats group */
+    if (group == BCMBAL_MGT_GROUP_STAT)
+    {
+        cmd_parms[0].type = BCMCLI_PARM_ENUM;
+        cmd_parms[0].enum_table = bool_enum;
+        rc = bcmbal_apicli_copy_parm_name(&cmd_parms[0], "clear", "clear on read");
+        if (rc)
+            goto nomem_cleanup;
+    }
+
+    /* We are ready to add this command */
+    cmd_parms[num_cmd_parms - 1].type = BCMCLI_PARM_ENUM;
+    cmd_parms[num_cmd_parms - 1].flags = BCMCLI_PARM_FLAG_SELECTOR;
+    cmd_parms[num_cmd_parms - 1].enum_table = obj_selector;
+    rc = bcmbal_apicli_copy_parm_name(&cmd_parms[num_cmd_parms - 1], "object", "Object Type");
+    if (rc)
+        goto nomem_cleanup;
+    rc = bcmcli_cmd_add(dir, cmd_name, cmd_handler, cmd_descr,
+        (access_level == BCMBAL_APICLI_PROP_ACCESS_ID_W) ? BCMCLI_ACCESS_ADMIN : BCMCLI_ACCESS_GUEST,
+        &cmd_extras, cmd_parms);
+    if (rc)
+        goto nomem_cleanup;
+    return 0;
+
+nomem_cleanup:
+    if (obj_selector)
+    {
+        for (o = 0; o < BCMBAL_OBJ_ID__NUM_OF; o++)
+        {
+            if (obj_selector[o].parms)
+                bcmbal_apicli_free_parms(obj_selector[o].parms);
+        }
+        bcmos_free(obj_selector);
+    }
+    bcmos_free(cmd_parms);
+    return rc;
+}
+
+static bcmcli_session *bcmbal_apicli_log;
+static FILE *bcmbal_apicli_log_file;
+
+static int bcmbal_apicli_log_write_cb(bcmcli_session *session, const char *buf, uint32_t size)
+{
+    if (bcmbal_apicli_log_file == NULL || buf == NULL)
+        return BCM_ERR_INTERNAL;
+    fwrite(buf, 1, size, bcmbal_apicli_log_file);
+    fflush(bcmbal_apicli_log_file);
+    return BCM_ERR_OK;
+}
+
+/* Enable/disable API logging
+ *       BCMCLI_MAKE_PARM("file", "Log file. Use \"-\" to disable logging", BCMCLI_PARM_STRING, 0));
+ */
+static bcmos_errno bcmbal_apicli_log_handler(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
+{
+    const char *fname = parm[0].value.string;
+    bcmcli_session_parm session_params =
+    {
+        .write = bcmbal_apicli_log_write_cb,
+        .name = "api_log"
+    };
+    bcmos_errno rc;
+    time_t start_time;
+
+    /* Close existing log session if any */
+    if (bcmbal_apicli_log)
+    {
+        bcmcli_log_set(BCMCLI_LOG_NONE, NULL);
+        bcmcli_session_close(bcmbal_apicli_log);
+        fclose(bcmbal_apicli_log_file);
+        bcmbal_apicli_log = NULL;
+        bcmbal_apicli_log_file = NULL;
+    }
+
+    if (!strcmp(fname, "-"))
+        return BCM_ERR_OK;
+
+    /* Starting a new log session */
+    bcmbal_apicli_log_file = fopen(fname, "a");
+    if (bcmbal_apicli_log_file == NULL)
+    {
+        bcmcli_print(session, "Can't open file %s for logging\n", fname);
+        return BCM_ERR_PARM;
+    }
+    rc = bcmcli_session_open_user(&session_params, &bcmbal_apicli_log);
+    if (rc)
+    {
+        fclose(bcmbal_apicli_log_file);
+        bcmbal_apicli_log_file = NULL;
+        bcmcli_print(session, "Can't open log session. Error %s\n", bcmos_strerror(rc));
+        return rc;
+    }
+    time(&start_time);
+    bcmcli_log_set(BCMCLI_LOG_C_COMMENT, bcmbal_apicli_log);
+    bcmcli_log("/* API logging session started. %s */\n", ctime(&start_time));
+    return BCM_ERR_OK;
+}
+
+static void bcmbal_apicli_find_del_cmd(bcmcli_entry *dir, const char *cmd_name)
+{
+    bcmcli_entry *cmd;
+    cmd = bcmcli_cmd_find(dir, cmd_name);
+    if (cmd)
+    {
+        bcmcli_token_destroy(cmd);
+    }
+}
+
+/* Unregisters commands and directories */
+void bcmbal_apicli_del_commands(bcmcli_session *session, bcmcli_entry *api_dir)
+{
+    bcmbal_apicli_find_del_cmd(api_dir, "set");
+    bcmbal_apicli_find_del_cmd(api_dir, "get");
+    bcmbal_apicli_find_del_cmd(api_dir, "clear");
+    bcmbal_apicli_find_del_cmd(api_dir, "stat");
+    bcmbal_apicli_find_del_cmd(api_dir, "objects");
+    bcmbal_apicli_find_del_cmd(api_dir, "log");
+}
+
+/* Registers commands and directories */
+bcmos_errno bcmbal_apicli_add_commands(bcmcli_session *session, bcmcli_entry *api_dir)
+{
+    bcmos_errno rc;
+
+    current_session = session;
+
+    /* Now generate and add commands */
+    rc = bcmbal_apicli_add(api_dir, "set", "Set object configuration", BCMBAL_MGT_GROUP_CFG,
+        BCMBAL_APICLI_PROP_ACCESS_ID_W, bcmbal_apicli_set_handler, BCMBAL_APICLI_FLAGS_NONE);
+    rc = rc ? rc : bcmbal_apicli_add(api_dir, "get", "Get object configuration", BCMBAL_MGT_GROUP_CFG,
+        BCMBAL_APICLI_PROP_ACCESS_ID_R, bcmbal_apicli_get_handler, BCMBAL_APICLI_FLAGS_NONE);
+    rc = rc ? rc : bcmbal_apicli_add(api_dir, "clear", "Clear object configuration", BCMBAL_MGT_GROUP_CFG,
+        BCMBAL_APICLI_PROP_ACCESS_ID_R, bcmbal_apicli_clear_handler, BCMBAL_APICLI_FLAGS_IGNORE_FIELDS);
+    rc = rc ? rc : bcmbal_apicli_add(api_dir, "stat", "Get statistics", BCMBAL_MGT_GROUP_STAT,
+        BCMBAL_APICLI_PROP_ACCESS_ID_R, bcmbal_apicli_stat_handler, BCMBAL_APICLI_FLAGS_NONE);
+
+    /* List all system objects */
+    rc = rc ? rc : bcmcli_cmd_add(api_dir, "objects", bcmbal_apicli_objects_handler,
+        "Object Types", BCMCLI_ACCESS_GUEST, NULL, NULL);
+
+    BCMCLI_MAKE_CMD(api_dir, "log", "Log API calls", bcmbal_apicli_log_handler,
+        BCMCLI_MAKE_PARM("file", "Log file. Use \"-\" to disable logging", BCMCLI_PARM_STRING, 0));
+
+    return rc;
+}
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli.h b/bal_release/src/lib/libbalapicli/bal_api_cli.h
new file mode 100644
index 0000000..2acc2a7
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli.h
@@ -0,0 +1,40 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+ */
+
+#ifndef BCMBAL_APICLI_H_
+#define BCMBAL_APICLI_H_
+
+#include <bcmcli.h>
+
+void bcmbal_apicli_del_commands(bcmcli_session *session, bcmcli_entry *api_dir);
+
+/* Add BAL CLI commands */
+bcmos_errno bcmbal_apicli_add_commands(bcmcli_session *session, bcmcli_entry *api_dir);
+
+#endif /* BCMBAL_APICLI_H_ */
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_dump.c b/bal_release/src/lib/libbalapicli/bal_api_cli_dump.c
new file mode 100644
index 0000000..5a34961
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_dump.c
@@ -0,0 +1,823 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+ */
+
+#include <bcmos_system.h>
+#include <bal_obj.h>
+#include <bcmcli.h>
+#include "bal_api_cli_helpers.h"
+
+typedef enum
+{
+    BCMBAL_APICLI_OUTPUT_STYLE_STD,
+    BCMBAL_APICLI_OUTPUT_STYLE_C_INIT
+} bcmbal_apicli_output_style;
+
+typedef struct
+{
+    const bcmbal_apicli_type_descr *type;
+    void *data;
+    uint8_t bit;
+} bcmbal_apicli_presence_mask_info;
+
+static bcmos_errno bcmbal_apicli_dump_array(
+    bcmcli_session *session,
+    const bcmbal_apicli_type_descr *td,
+    void *data,
+    uint32_t size,
+    const char *name,
+    bcmbal_apicli_output_style style,
+    const bcmbal_apicli_presence_mask_info *presence_mask);
+
+static bcmos_errno bcmbal_apicli_read_snum(
+    bcmcli_session *session, const bcmbal_apicli_type_descr *td, void *data, int64_t *n)
+{
+    switch (td->size)
+    {
+    case 1:
+    {
+        int8_t n1 = *(int8_t *)data;
+        *n = n1;
+        break;
+    }
+    case 2:
+    {
+        int16_t n2 = *(int16_t *)data;
+        *n = n2;
+        break;
+    }
+    case 4:
+    {
+        int32_t n4 = *(int32_t *)data;
+        *n = n4;
+        break;
+    }
+    case 8:
+    {
+        memcpy(n, data, sizeof(*n));
+        break;
+    }
+    default:
+        bcmcli_print(session, "*** number size %u is not supported\n", td->size);
+        return BCM_ERR_NOT_SUPPORTED;
+    }
+    return BCM_ERR_OK;
+}
+
+static bcmos_errno bcmbal_apicli_read_unum(
+    bcmcli_session *session, const bcmbal_apicli_type_descr *td, void *data, uint64_t *n)
+{
+    switch (td->size)
+    {
+    case 1:
+    {
+        uint8_t n1 = *(uint8_t *)data;
+        *n = n1;
+        break;
+    }
+    case 2:
+    {
+        uint16_t n2 = *(uint16_t *)data;
+        *n = n2;
+        break;
+    }
+    case 4:
+    {
+        uint32_t n4 = *(uint32_t *)data;
+        *n = n4;
+        break;
+    }
+    case 8:
+    {
+        memcpy(n, data, sizeof(*n));
+        break;
+    }
+    default:
+        bcmcli_print(session, "*** number size %u is not supported\n", td->size);
+        return BCM_ERR_NOT_SUPPORTED;
+    }
+    return BCM_ERR_OK;
+}
+
+static void bcmbal_apicli_strcat_upper(char *dest, uint32_t dest_len, const char *src, uint32_t src_len)
+{
+    uint32_t src_idx;
+    uint32_t dest_idx;
+
+    for (dest_idx = 0; dest_idx < dest_len - 1; ++dest_idx)
+    {
+        if (dest[dest_idx] == '\0')
+        {
+            break;
+        }
+    }
+
+    for (src_idx = 0; src_idx < src_len && dest_idx < dest_len - 1; ++src_idx, ++dest_idx)
+    {
+        dest[dest_idx] = src[src_idx];
+        if (dest[dest_idx] >= 'a' && dest[dest_idx] <= 'z')
+        {
+            dest[dest_idx] = 'A' + (dest[dest_idx] - 'a');
+        }
+    }
+
+    dest[dest_idx] = '\0';
+}
+
+static const char *bcmbal_apicli_get_c_enum_id(const bcmbal_apicli_type_descr *td, const char *name)
+{
+    static char full_name_buf[256];
+    full_name_buf[0] = '\0';
+    bcmbal_apicli_strcat_upper(full_name_buf, sizeof(full_name_buf), td->name, strlen(td->name));
+    bcmbal_apicli_strcat_upper(full_name_buf, sizeof(full_name_buf), "_", 1);
+    bcmbal_apicli_strcat_upper(full_name_buf, sizeof(full_name_buf), name, strlen(name));
+    return full_name_buf;
+}
+
+static bcmos_errno bcmbal_apicli_dump_simple_data_type(
+    bcmcli_session *session,
+    const bcmbal_apicli_type_descr *td,
+    void *data,
+    const char *name,
+    bcmbal_apicli_output_style style)
+{
+    bcmos_errno rc = BCM_ERR_OK;
+
+    switch (td->base_type)
+    {
+    case BCMBAL_APICLI_BASE_TYPE_ID_SNUM:       /* signed number */
+    {
+        int64_t n = 0;
+        rc = bcmbal_apicli_read_snum(session, td, data, &n);
+        bcmcli_print(session, "%lld", (long long)n);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_UNUM:       /* unsigned number */
+    {
+        uint64_t n = 0;
+        rc = bcmbal_apicli_read_unum(session, td, data, &n);
+        bcmcli_print(session, "%llu", (unsigned long long)n);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX:   /* unsigned number printed in hex */
+    {
+        uint64_t n = 0;
+        rc = bcmbal_apicli_read_unum(session, td, data, &n);
+        bcmcli_print(session, "0x%llx", (unsigned long long)n);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_FLOAT:      /* floating-point number */
+    {
+        if (td->size == sizeof(float))
+        {
+            bcmcli_print(session, "%f", *(float *)data);
+        }
+        else if (td->size == sizeof(double))
+        {
+            bcmcli_print(session, "%f", *(double *)data);
+        }
+        else
+        {
+            bcmcli_print(session, "*** floating-point number of width %u is not supported\n", td->size);
+            rc = BCM_ERR_NOT_SUPPORTED;
+        }
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_BOOL:
+    {
+        const char *no_str = style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT ? "BCMOS_FALSE" : "no";
+        const char *yes_str = style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT ? "BCMOS_TRUE" : "yes";
+        uint64_t n = 0;
+        rc = bcmbal_apicli_read_unum(session, td, data, &n);
+        bcmcli_print(session, "%s", n == 0 ? no_str : yes_str);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_STRING:     /* string */
+    {
+        if (td->size == 0)
+        {
+            bcmcli_print(session, "\"%s\"", (char *)data);
+        }
+        else
+        {
+            /* we know the size of the buffer */
+            bcmcli_print(session, "\"%.*s\"", td->size, (char *)data);
+        }
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_IPV4:       /* IPv4 address */
+    {
+        uint32_t ip;
+        memcpy(&ip, data, sizeof(ip));
+        bcmcli_print(
+            session,
+            style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT ? "{ %d,%d,%d,%d }" : "%d.%d.%d.%d",
+            (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_MAC:        /* MAC address */
+    {
+        bcmos_mac_address mac;
+        memcpy(mac.u8, data, sizeof(mac.u8));
+        bcmcli_print(
+            session,
+            style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT ?
+                "{{ 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x }}" :
+                "%02x:%02x:%02x:%02x:%02x:%02x",
+            mac.u8[0], mac.u8[1], mac.u8[2], mac.u8[3], mac.u8[4], mac.u8[5]);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_ENUM:       /* enum */
+    {
+        uint64_t n = 0;
+        const char *s;
+        rc = bcmbal_apicli_read_unum(session, td, data, &n);
+        BUG_ON(td->x.e == NULL);
+        s = bcmcli_enum_stringval(td->x.e, (long)n);
+        if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+        {
+            s = bcmbal_apicli_get_c_enum_id(td, s);
+        }
+        bcmcli_print(session, "%s", s);
+        break;
+    }
+
+    case BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK:
+    {
+        uint64_t n = 0;
+        const char *s;
+        const char *none = NULL;
+        bcmcli_enum_val *value = td->x.e;
+        bcmos_bool first = BCMOS_TRUE;
+        BUG_ON(value == NULL);
+        rc = bcmbal_apicli_read_unum(session, td, data, &n);
+        while (value->name != NULL)
+        {
+            if (value->val == 0)
+            {
+                none = value->name;
+            }
+            if ((value->val & n) != 0)
+            {
+                s = value->name;
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    s = bcmbal_apicli_get_c_enum_id(td, s);
+                }
+                bcmcli_print(session, "%s%s", first ? "" : (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT ? "|" : BCMCLI_ENUM_MASK_DEL_STR), s);
+                first = BCMOS_FALSE;
+                n -= value->val;
+            }
+            ++value;
+        }
+        if (first)
+        {
+            bcmcli_print(session, "%s", (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT) || (NULL == none) ? "0" : none);
+        }
+        break;
+    }
+
+    default:
+        bcmcli_print(session, "*** type %d is not supported\n", (int)td->base_type);
+        rc = BCM_ERR_NOT_SUPPORTED;
+        break;
+    }
+    return rc;
+}
+
+
+/* calculate number of enum values */
+static int bcmbal_apicli_get_num_enum_vals(const bcmcli_enum_val *vals)
+{
+    const bcmcli_enum_val *v = vals;
+    while (v && v->name)
+    {
+        ++v;
+    }
+    return (v - vals);
+}
+
+/* helper function to skip the "u." in front of union field names */
+static inline const char *bcmbal_apicli_skip_union_prefix(const char *name)
+{
+    if (name[0] == 'u' && name[1] == '.')
+    {
+        name += 2;
+    }
+    return name;
+}
+
+static bcmos_bool bcmbal_apicli_is_value_set(
+    bcmcli_session *session,
+    const bcmbal_apicli_presence_mask_info *presence_mask)
+{
+    uint64_t pm_value_num = 0;
+    if (!presence_mask || !presence_mask->type)
+    {
+        /* no presence mask - all values are implicitly set */
+        return BCMOS_TRUE;
+    }
+    bcmbal_apicli_read_unum(session, presence_mask->type, presence_mask->data, &pm_value_num);
+    return ((pm_value_num >> presence_mask->bit) & 1) != 0;
+}
+
+/* Dump data type */
+static bcmos_errno bcmbal_apicli_dump_data_type(
+    bcmcli_session *session,
+    const bcmbal_apicli_type_descr *td,
+    void *data,
+    const char *name,
+    uint32_t num_entries,
+    uint32_t entry_size,
+    bcmbal_apicli_output_style style,
+    const bcmbal_apicli_presence_mask_info *presence_mask)
+{
+    bcmos_errno rc = BCM_ERR_OK;
+
+    switch (td->base_type)
+    {
+        case BCMBAL_APICLI_BASE_TYPE_ID_STRUCT:
+        {
+            uint16_t f;
+            char full_name[BCMBAL_APICLI_MAX_PARM_NAME_LENGTH];
+            if (!td->x.s.num_fields)
+                return 0;
+            BUG_ON(!td->x.s.fields);
+            if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                bcmcli_print(session, "{ ");
+            }
+            for (f = 0; f < td->x.s.num_fields; f++)
+            {
+                const bcmbal_apicli_field_descr *fld = &td->x.s.fields[f];
+                void *fdata = (void *)((long)data + fld->offset);
+                bcmbal_apicli_presence_mask_info field_pm = {};
+                if (((td->x.s.fields[0].flags & BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK) != 0) &&
+                    style != BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    /* If the struct has a presence mask, skip the presence mask field itself, then record the position
+                     * of the presence mask so we can check it later for each entry. */
+                    if (f == 0)
+                    {
+                        continue;
+                    }
+
+                    field_pm.type = td->x.s.fields[0].type;
+                    field_pm.data = (uint8_t *)data + td->x.s.fields[0].offset;
+                    field_pm.bit = (uint8_t)(f - 1);
+                }
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT && f > 0)
+                {
+                    bcmcli_print(session, ", ");
+                }
+                bcmcli_strncpy(full_name, name, sizeof(full_name));
+                bcmcli_strncat(full_name, ".", sizeof(full_name));
+                bcmcli_strncat(full_name, fld->name, sizeof(full_name));
+                rc = bcmbal_apicli_dump_data_type(session, fld->type, fdata, full_name, num_entries, entry_size, style, &field_pm);
+            }
+            if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                bcmcli_print(session, " }");
+            }
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_UNION:
+        {
+            /* Print fields up to selector, then selector, then selected sub-structure */
+            uint16_t f;
+            char full_name[BCMBAL_APICLI_MAX_PARM_NAME_LENGTH];
+            const bcmbal_apicli_field_descr *fld;
+            void *fdata;
+            int64_t selector_val = 0;
+            int num_union_vals;
+
+            if (!td->x.u.num_common_fields)
+                return 0;
+            BUG_ON(!td->x.u.common_fields);
+            if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                bcmcli_print(session, "{ ");
+            }
+            /* Common fields, including selector */
+            for (f = 0; f <= td->x.u.classifier_idx && !rc; f++)
+            {
+                fld = &td->x.u.common_fields[f];
+                fdata = (void *)((long)data + fld->offset);
+
+                bcmcli_strncpy(full_name, name, sizeof(full_name));
+                if (fld->name && strlen(fld->name))
+                {
+                    bcmcli_strncat(full_name, ".", sizeof(full_name));
+                    bcmcli_strncat(full_name, fld->name, sizeof(full_name));
+                }
+                rc = bcmbal_apicli_dump_data_type(session, fld->type, fdata, full_name, num_entries, entry_size, style, presence_mask);
+                if (f == td->x.u.classifier_idx)
+                {
+                    rc = rc ? rc : bcmbal_apicli_read_snum(session, fld->type, fdata, &selector_val);
+                }
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    bcmcli_print(session, ", ");
+                }
+            }
+            if (rc)
+            {
+                bcmcli_print(session, "***internal error when dumping field %s\n",
+                    td->x.u.common_fields[f].name);
+                return rc;
+            }
+
+            num_union_vals = bcmbal_apicli_get_num_enum_vals(td->x.u.common_fields[td->x.u.classifier_idx].type->x.e);
+            if ((unsigned)selector_val >= num_union_vals)
+            {
+                bcmcli_print(session, "***invalid union selector value %lld\n", (long long)selector_val);
+                return BCM_ERR_INTERNAL;
+            }
+
+            /* Common fields following selector */
+            for (; f < td->x.u.num_common_fields; f++)
+            {
+                fld = &td->x.u.common_fields[f];
+                fdata = (void *)((long)data + fld->offset);
+
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    bcmcli_print(session, ", ");
+                }
+                bcmcli_strncpy(full_name, name, sizeof(full_name));
+                if (fld->name && strlen(fld->name))
+                {
+                    bcmcli_strncat(full_name, ".", sizeof(full_name));
+                    bcmcli_strncat(full_name, fld->name, sizeof(full_name));
+                }
+                rc = bcmbal_apicli_dump_data_type(session, fld->type, fdata, full_name, num_entries, entry_size, style, presence_mask);
+            }
+
+            /* Selected field */
+            fld = &td->x.u.union_fields[selector_val];
+            if (fld->type)
+            {
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    bcmcli_print(session, "{ .%s = ", bcmbal_apicli_skip_union_prefix(fld->name));
+                }
+                fdata = (void *)((long)data + fld->offset);
+
+                bcmcli_strncpy(full_name, name, sizeof(full_name));
+                if (fld->name && strlen(fld->name))
+                {
+                    bcmcli_strncat(full_name, ".", sizeof(full_name));
+                    bcmcli_strncat(full_name, fld->name, sizeof(full_name));
+                }
+                rc = bcmbal_apicli_dump_data_type(session, fld->type, fdata, full_name, num_entries, entry_size, style, presence_mask);
+                if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+                {
+                    bcmcli_print(session, " }");
+                }
+            }
+            if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                bcmcli_print(session, " }");
+            }
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED: /* fixed array */
+        {
+            rc = bcmbal_apicli_dump_array(session, td->x.arr_fixed.elem_type, data, td->x.arr_fixed.size, name, style, presence_mask);
+            break;
+        }
+
+        case BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN:   /* dynamic array that should be printed as buffer */
+        {
+            /* Read length */
+            uint32_t array_size;
+            long base_ptr;
+
+            switch (td->x.arr_dyn.len_size )
+            {
+                case 1: array_size = *(uint8_t *)data; break;
+                case 2: array_size = *(uint16_t *)data; break;
+                case 4: array_size = *(uint32_t *)data; break;
+                default:
+                    bcmcli_print(session,
+                        "*** %s: dyn array len_size %u is not supported\n", name, td->x.arr_dyn.len_size);
+                    return BCM_ERR_NOT_SUPPORTED;
+            }
+            base_ptr = BCMOS_ROUND_UP((long)data + td->x.arr_dyn.len_size, sizeof(void *));
+            BUG_ON(!base_ptr);
+            data = *(void **)base_ptr;
+            rc = bcmbal_apicli_dump_array(session, td->x.arr_dyn.elem_type, data, array_size, name, style, presence_mask);
+            break;
+        }
+
+        default:
+        {
+            /* Finally! Simple type that maps to a single CLI parameter */
+            int n;
+            bcmbal_apicli_presence_mask_info local_pm;
+
+            /* If we have a single value and that value is not included in the presence mask, just skip it entirely */
+            if (num_entries == 1 && !bcmbal_apicli_is_value_set(session, presence_mask))
+            {
+                break;
+            }
+
+            if (style != BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                if (name)
+                {
+                    bcmcli_print(session, "   %s=", name);
+                }
+                if (!num_entries)
+                {
+                    bcmcli_print(session, BCMCLI_ARRAY_EMPTY);
+                }
+            }
+
+            /* Dump simple value or array of simple values */
+            local_pm = presence_mask ? *presence_mask : (bcmbal_apicli_presence_mask_info){};
+            for (n = 0; n < num_entries; n++)
+            {
+                if (n)
+                {
+                    bcmcli_print(session, ",");
+                }
+
+                /* If we have a presence mask, make sure to print a special token if the value is unset */
+                if (bcmbal_apicli_is_value_set(session, &local_pm))
+                {
+                    rc = bcmbal_apicli_dump_simple_data_type(session, td, data, name, style);
+                }
+                else
+                {
+                    bcmcli_print(session, BCMCLI_PARM_NO_VALUE);
+                }
+                
+                data = (void *)((long)data + entry_size);
+                local_pm.data = (void *)((long)local_pm.data + entry_size);
+            }
+            if (style != BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+            {
+                bcmcli_print(session, "\n");
+            }
+            break;
+        }
+    }
+    return rc;
+}
+
+/* Dump array */
+static bcmos_errno bcmbal_apicli_dump_array(
+    bcmcli_session *session,
+    const bcmbal_apicli_type_descr *td,
+    void *data,
+    uint32_t size,
+    const char *name,
+    bcmbal_apicli_output_style style,
+    const bcmbal_apicli_presence_mask_info *presence_mask)
+{
+    bcmos_errno rc = BCM_ERR_OK;
+
+    /* Print as buffer or element by element ? */
+    if (style == BCMBAL_APICLI_OUTPUT_STYLE_C_INIT)
+    {
+        bcmcli_print(session, "{ ");
+        rc = bcmbal_apicli_dump_data_type(session, td, data, name, size, td->size, style, presence_mask);
+        bcmcli_print(session, " }");
+    }
+    else if ((td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNUM ||
+        td->base_type == BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX) && td->size == 1)
+    {
+        if (bcmbal_apicli_is_value_set(session, presence_mask))
+        {
+            bcmcli_print(session, "   %s=\n", name);
+            bcmcli_session_hexdump(session, data, 0, size, "      ");
+        }
+    }
+    else
+    {
+        rc = bcmbal_apicli_dump_data_type(session, td, data, name, size, td->size, style, presence_mask);
+    }
+    return rc;
+}
+
+/* Dump property */
+bcmos_errno bcmbal_apicli_dump_prop(bcmcli_session *session, const bcmbal_apicli_prop_descr *pd, void *prop_data)
+{
+    return bcmbal_apicli_dump_data_type(
+        session, pd->type, prop_data, pd->name, 1, 0, BCMBAL_APICLI_OUTPUT_STYLE_STD, NULL);
+}
+
+/* Dump a single property value in C initializer format */
+bcmos_errno bcmbal_apicli_dump_prop_initializer(
+    bcmcli_session *session, const bcmbal_apicli_prop_descr *pd, void *prop_data)
+{
+    return bcmbal_apicli_dump_data_type(
+        session, pd->type, prop_data, pd->name, 1, 0, BCMBAL_APICLI_OUTPUT_STYLE_C_INIT, NULL);
+}
+
+/* Calculate property pointer given the group data pointer and property description */
+static inline void *bcmbal_apicli_prop_data_ptr(void *group_ptr, const bcmbal_apicli_prop_descr *pd)
+{
+    return (void *)((long)group_ptr + pd->offset);
+}
+
+/* Dump object data */
+static bcmos_errno bcmbal_apicli_dump_data(bcmcli_session *session, bcmbal_obj *msg, void *data, uint32_t data_size)
+{
+    uint16_t prop;
+    bcmos_errno rc = BCM_ERR_OK;
+    const bcmbal_apicli_prop_descr *pd;
+
+    bcmcli_print(session, "data:\n");
+    for (prop = 0;
+         bcmbal_apicli_object_property(msg->obj_type, msg->group, msg->subgroup, prop, &pd) == BCM_ERR_OK;
+         ++prop)
+    {
+        void *prop_data = bcmbal_apicli_prop_data_ptr(data, pd);
+        if (!(msg->presence_mask & (1LL << prop)))
+            continue;
+        if (!prop_data)
+        {
+            continue;
+        }
+        BUG_ON(pd->offset > data_size);
+        rc = bcmbal_apicli_dump_prop(session, pd, prop_data);
+        if (rc != BCM_ERR_OK)
+        {
+            break;
+        }
+    }
+    return rc;
+}
+
+/* Dump object key */
+static bcmos_errno bcmbal_apicli_dump_key(bcmcli_session *session, bcmbal_obj *msg, void *key, uint32_t key_size)
+{
+    uint16_t prop;
+    bcmos_errno rc = BCM_ERR_OK;
+    const bcmbal_apicli_prop_descr *pd;
+
+    bcmcli_print(session, "key:\n");
+    for (prop = 0;
+         bcmbal_apicli_object_property(msg->obj_type, BCMBAL_MGT_GROUP_KEY, 0, prop, &pd) == BCM_ERR_OK;
+         ++prop)
+    {
+        void *prop_data = bcmbal_apicli_prop_data_ptr(key, pd);
+        if (!prop_data)
+        {
+            continue;
+        }
+        BUG_ON(pd->offset > key_size);
+        rc = bcmbal_apicli_dump_prop(session, pd, prop_data);
+        if (rc != BCM_ERR_OK)
+        {
+            break;
+        }
+    }
+    return rc;
+}
+
+const char *bcmbal_apicli_mgt_group_to_str(bcmbal_mgt_group group)
+{
+    static const char *str_table[BCMBAL_MGT_GROUP__NUM_OF] =
+    {
+        [BCMBAL_MGT_GROUP_KEY]      = "key",
+        [BCMBAL_MGT_GROUP_CFG]      = "cfg",
+        [BCMBAL_MGT_GROUP_STAT]     = "stat",
+        [BCMBAL_MGT_GROUP_AUTO]     = "auto",
+        [BCMBAL_MGT_GROUP_AUTO_CFG] = "auto_cfg",
+    };
+    return (group >= BCMBAL_MGT_GROUP__NUM_OF) ? "<unknown>" : str_table[group];
+}
+
+/* Dump message */
+bcmos_errno bcmbal_apicli_msg_dump(bcmcli_session *session, bcmbal_obj *msg)
+{
+    bcmos_errno rc;
+    const char *name, *descr;
+    uint32_t key_size;
+    uint32_t key_offset;
+    uint32_t data_size = 0;
+    uint32_t data_offset;
+    void *key = NULL;
+    void *data = NULL;
+
+    rc = bcmbal_apicli_object_name(msg->obj_type, &name, &descr);
+    if (rc)
+    {
+        goto dump_error;
+    }
+
+    bcmcli_print(session, "object: ");
+    if (name)
+    {
+        bcmcli_print(session, "%s", name);
+    }
+    if (descr)
+    {
+        bcmcli_print(session, " - %s", descr);
+    }
+    bcmcli_print(session, "\n");
+    rc = bcmbal_apicli_object_struct_size(msg->obj_type, BCMBAL_MGT_GROUP_KEY, 0, &key_size, &key_offset, &data_size, &data_offset);
+    rc = rc ? rc : bcmbal_apicli_object_struct_size(msg->obj_type, msg->group, msg->subgroup, &key_size, &key_offset, &data_size, &data_offset);
+    if (rc)
+    {
+        goto dump_error;
+    }
+
+    bcmcli_print(session, (msg->type & BCMBAL_OBJ_MSG_TYPE_GET) != 0 ? "get" : "set");
+    if ((msg->type & BCMBAL_OBJ_MSG_TYPE_CLEAR) != 0)
+    {
+        bcmcli_print(session, ",clear");
+    }
+    bcmcli_print(session, " %s ", bcmbal_apicli_mgt_group_to_str(msg->group));
+
+    if (msg->group != BCMBAL_MGT_GROUP_CFG && 
+        msg->group != BCMBAL_MGT_GROUP_STAT && 
+        msg->group != BCMBAL_MGT_GROUP_AUTO_CFG)
+    {
+        const char *sub_name, *sub_descr;
+        /* Get name of specific subgroup */
+        rc = bcmbal_apicli_object_subgroup_name(msg->obj_type, msg->group, msg->subgroup, &sub_name, &sub_descr);
+        if (rc)
+        {
+            goto dump_error;
+        }
+        bcmcli_print(session, "subgroup: %s-%s ", sub_name ? sub_name : "?", sub_descr ? sub_descr : "");
+    }
+    if (msg->dir == BCMBAL_OBJ_MSG_DIR_REQUEST)
+    {
+        bcmcli_print(session, "request\n");
+    }
+    else
+    {
+        bcmcli_print(session, "response: %s\n", bcmos_strerror(msg->status));
+        bcmcli_print(session, "is in-progress: %s\n", (msg->is_inprogress == BCMOS_TRUE) ? "yes" : "no");
+    }
+
+    if ((msg->group != BCMBAL_MGT_GROUP_AUTO_CFG) && key_size)
+    {
+        key = (void *)((long)msg + sizeof(bcmbal_obj));
+        rc = bcmbal_apicli_dump_key(session, msg, key, key_size);
+        if (rc)
+        {
+            goto dump_error;
+        }
+    }
+    if (data_size &&
+         (  ((msg->dir == BCMBAL_OBJ_MSG_DIR_REQUEST) && (msg->type & BCMBAL_OBJ_MSG_TYPE_SET))  ||
+            ((msg->dir == BCMBAL_OBJ_MSG_DIR_RESPONSE) && (msg->type & BCMBAL_OBJ_MSG_TYPE_GET)) ||
+            (msg->group == BCMBAL_MGT_GROUP_AUTO)
+         )
+       )
+    {
+        data = (void *)((long)msg + data_offset);
+        rc = bcmbal_apicli_dump_data(session, msg, data, data_size);
+        if (rc)
+        {
+            goto dump_error;
+        }
+    }
+    return BCM_ERR_OK;
+
+dump_error:
+    bcmcli_print(session, "*** Object dump error %s (%d)\n", bcmos_strerror(rc), rc);
+    return rc;
+}
+
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.c b/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.c
new file mode 100644
index 0000000..cc90bbf
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.c
@@ -0,0 +1,4516 @@
+#include <bcmos_system.h>
+#include <bal_api.h>
+#include <bcmcli.h>
+#include "bal_api_cli_helpers.h"
+#include "bal_api_cli_handlers.h"
+
+bcmcli_session *bcmbal_apicli_log_session = NULL;
+
+typedef struct
+{
+    uint8_t *start;
+    uint32_t used;
+} bcmbal_apicli_byte_pool;
+
+static bcmos_errno bcmbal_apicli_byte_pool_create(bcmbal_apicli_byte_pool *buf)
+{
+    buf->used = 0;
+    buf->start = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    return (buf->start == NULL) ? BCM_ERR_NOMEM : BCM_ERR_OK;
+}
+
+static void bcmbal_apicli_byte_pool_destroy(bcmbal_apicli_byte_pool *buf)
+{
+    bcmos_free(buf->start);
+}
+
+static void *bcmbal_apicli_byte_pool_calloc(bcmbal_apicli_byte_pool *buf, uint32_t num_bytes)
+{
+    void *ret;
+    if (buf->used + num_bytes > BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE)
+    {
+        return NULL;
+    }
+
+    ret = buf->start + buf->used;
+    buf->used += num_bytes;
+    memset(ret, 0, num_bytes);
+    return ret;
+}
+
+/*
+ * Start/end banners - these are specially formatted so listening apps can easily tell where API handling starts/ends.
+ */
+static void bcmbal_apicli_print_start(bcmcli_session *session, const char *api_name)
+{
+    bcmcli_print(session, "[-- API Start: %s --]\n", api_name);
+}
+
+static void bcmbal_apicli_print_data_start(bcmcli_session *session)
+{
+    bcmcli_print(session, "[-- API Message Data --]\n");
+}
+
+static void bcmbal_apicli_print_complete(bcmcli_session *session, bcmos_errno err, const char *err_text)
+{
+    if (err != BCM_ERR_OK && err_text != NULL && err_text[0] != '\0')
+    {
+        bcmcli_print(session, "ERROR: %s", err_text);
+    }
+
+    bcmcli_print(session, "[-- API Complete: %d (%s) --]\n", err, bcmos_strerror(err));
+}
+
+static int bcmbal_apicli_session_write_cb(bcmcli_session *cli_session, const char *buf, uint32_t size)
+{
+    bcmcli_log(buf, "%.*s", size, buf);
+    return (int)size;
+}
+
+/* Logs a property value to the CLI log in such a way that it is a valid RHS in an initializer.  For a primitve, this
+ * will just print the value (e.g. "42").  For a struct, it will emit all members in between curly braces. */
+static void bcmbal_apicli_log_prop_val(bcmolt_obj_id obj, bcmolt_mgt_group group, uint16_t subgroup, uint16_t prop, void *value)
+{
+    bcmos_errno err;
+    const bcmbal_apicli_prop_descr *prop_descr;
+
+    if (bcmbal_apicli_log_session == NULL)
+    {
+        static bcmcli_session_parm session_params = { .write = bcmbal_apicli_session_write_cb };
+
+        err = bcmcli_session_open(&session_params, &bcmbal_apicli_log_session);
+        if (err != BCM_ERR_OK)
+        {
+            bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error opening session: %s", bcmos_strerror(err));
+            return;
+        }
+    }
+
+    err = bcmbal_apicli_object_property(obj, group, subgroup, prop, &prop_descr);
+    if (err != BCM_ERR_OK)
+    {
+        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error getting info for property: %s", bcmos_strerror(err));
+        return;
+    }
+
+    err = bcmbal_apicli_dump_prop_initializer(bcmbal_apicli_log_session, prop_descr, value);
+    if (err != BCM_ERR_OK)
+    {
+        bcmos_trace(BCMOS_TRACE_LEVEL_ERROR, "Error printing property: %s", bcmos_strerror(err));
+    }
+}
+
+static inline bcmos_ipv4_address bcmbal_apicli_unumber_to_ipv4(uint32_t num)
+{
+    bcmos_ipv4_address ip = { .u32 = num };
+    return ip;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_access_terminal_cfg_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_access_terminal_cfg cfg;         /**< declare main API struct */
+    bcmbal_access_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_access_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_access_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, access_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, access_terminal, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, access_terminal, admin_state);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, access_terminal, admin_state);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "oper_status");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, access_terminal, oper_status);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, access_terminal, oper_status);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "iwf_mode");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, access_terminal, iwf_mode);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, access_terminal, iwf_mode);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, access_terminal, admin_state) && !BCMBAL_CFG_PROP_IS_SET(&cfg, access_terminal, oper_status) && !BCMBAL_CFG_PROP_IS_SET(&cfg, access_terminal, iwf_mode))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, access_terminal, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, access_terminal, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_access_terminal_cfg_set(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_access_terminal_cfg cfg;         /**< declare main API struct */
+    bcmbal_access_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_access_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_access_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, access_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, access_terminal, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        bcmbal_state val;
+        val = (bcmbal_state) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, access_terminal, admin_state, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, access_terminal, admin_state, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_ACCESS_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_ACCESS_TERMINAL_CFG_ID_ADMIN_STATE, &val);
+        bcmcli_log(");\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_access_terminal_cfg_clear(bcmcli_session *session)
+{
+    bcmos_errno err;
+    bcmbal_access_terminal_cfg cfg;         /**< declare main API struct */
+    bcmbal_access_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_access_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_access_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, access_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, access_terminal, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_flow_cfg_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_flow_cfg cfg;        /**< declare main API struct */
+    bcmbal_flow_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_flow_cfg cfg;\n");
+    bcmcli_log("bcmbal_flow_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        key.flow_id = (bcmbal_flow_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        key.flow_type = (bcmbal_flow_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_TYPE, &key.flow_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, flow, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, flow, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, admin_state);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, admin_state);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "oper_status");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, oper_status);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, oper_status);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "access_int_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, access_int_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, access_int_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "network_int_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, network_int_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, network_int_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, sub_term_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, sub_term_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_uni_idx");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, sub_term_uni_idx);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, sub_term_uni_idx);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, svc_port_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, svc_port_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "agg_port_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, agg_port_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, agg_port_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "resolve_mac");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, resolve_mac);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, resolve_mac);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "classifier");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, classifier);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, classifier);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "action");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, action);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, action);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sla");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, sla);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, sla);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "cookie");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, cookie);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, cookie);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "priority");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, priority);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, priority);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "group_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, group_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, group_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "queue");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, flow, queue);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, queue);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, flow, admin_state) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, oper_status) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, access_int_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, network_int_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, sub_term_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, sub_term_uni_idx) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, svc_port_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, agg_port_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, resolve_mac) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, classifier) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, action) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, sla) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, cookie) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, priority) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, group_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, flow, queue))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, flow, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, flow, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_flow_cfg_set(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_flow_cfg cfg;        /**< declare main API struct */
+    bcmbal_flow_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_flow_cfg cfg;\n");
+    bcmcli_log("bcmbal_flow_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        key.flow_id = (bcmbal_flow_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        key.flow_type = (bcmbal_flow_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_TYPE, &key.flow_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, flow, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, flow, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        bcmbal_state val;
+        val = (bcmbal_state) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, admin_state, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, admin_state, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_ADMIN_STATE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "access_int_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_intf_id val;
+        val = (bcmbal_intf_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, access_int_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, access_int_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_ACCESS_INT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "network_int_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_intf_id val;
+        val = (bcmbal_intf_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, network_int_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, network_int_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_NETWORK_INT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_sub_id val;
+        val = (bcmbal_sub_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, sub_term_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, sub_term_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_SUB_TERM_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_uni_idx");
+    if (cli_parm != NULL)
+    {
+        uint8_t val;
+        val = cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, sub_term_uni_idx, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, sub_term_uni_idx, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_SUB_TERM_UNI_IDX, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_service_port_id val;
+        val = (bcmbal_service_port_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, svc_port_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, svc_port_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_SVC_PORT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "agg_port_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_aggregation_port_id val;
+        val = (bcmbal_aggregation_port_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, agg_port_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, agg_port_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_AGG_PORT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "resolve_mac");
+    if (cli_parm != NULL)
+    {
+        bcmos_bool val;
+        val = cli_parm->value.number;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, resolve_mac, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, resolve_mac, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_RESOLVE_MAC, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "classifier.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_classifier val = { };
+        cli_parm = bcmcli_find_named_parm(session, "classifier.o_tpid");
+        if (cli_parm != NULL)
+        {
+            val.o_tpid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_TPID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.o_vid");
+        if (cli_parm != NULL)
+        {
+            val.o_vid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_VID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.i_tpid");
+        if (cli_parm != NULL)
+        {
+            val.i_tpid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_TPID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.i_vid");
+        if (cli_parm != NULL)
+        {
+            val.i_vid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_VID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.o_pbits");
+        if (cli_parm != NULL)
+        {
+            val.o_pbits = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_O_PBITS;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.i_pbits");
+        if (cli_parm != NULL)
+        {
+            val.i_pbits = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_I_PBITS;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.ether_type");
+        if (cli_parm != NULL)
+        {
+            val.ether_type = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_ETHER_TYPE;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.dst_mac");
+        if (cli_parm != NULL)
+        {
+            val.dst_mac = cli_parm->value.mac;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_MAC;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.src_mac");
+        if (cli_parm != NULL)
+        {
+            val.src_mac = cli_parm->value.mac;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_MAC;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.ip_proto");
+        if (cli_parm != NULL)
+        {
+            val.ip_proto = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_IP_PROTO;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.dst_ip");
+        if (cli_parm != NULL)
+        {
+            val.dst_ip = bcmbal_apicli_unumber_to_ipv4(cli_parm->value.unumber);
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_IP;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.src_ip");
+        if (cli_parm != NULL)
+        {
+            val.src_ip = bcmbal_apicli_unumber_to_ipv4(cli_parm->value.unumber);
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_IP;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.src_port");
+        if (cli_parm != NULL)
+        {
+            val.src_port = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_SRC_PORT;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.dst_port");
+        if (cli_parm != NULL)
+        {
+            val.dst_port = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_DST_PORT;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "classifier.pkt_tag_type");
+        if (cli_parm != NULL)
+        {
+            val.pkt_tag_type = (bcmbal_pkt_tag_type) cli_parm->value.enum_val;
+            val.presence_mask = val.presence_mask | BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, classifier, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_classifier val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_CLASSIFIER, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, classifier, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "action.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_action val = { };
+        cli_parm = bcmcli_find_named_parm(session, "action.cmds_bitmask");
+        if (cli_parm != NULL)
+        {
+            val.cmds_bitmask = (bcmbal_action_cmd_id) cli_parm->value.enum_val;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_CMDS_BITMASK;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.o_vid");
+        if (cli_parm != NULL)
+        {
+            val.o_vid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_VID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.o_pbits");
+        if (cli_parm != NULL)
+        {
+            val.o_pbits = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_PBITS;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.o_tpid");
+        if (cli_parm != NULL)
+        {
+            val.o_tpid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_O_TPID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.i_vid");
+        if (cli_parm != NULL)
+        {
+            val.i_vid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_VID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.i_pbits");
+        if (cli_parm != NULL)
+        {
+            val.i_pbits = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_PBITS;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "action.i_tpid");
+        if (cli_parm != NULL)
+        {
+            val.i_tpid = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_ACTION_ID_I_TPID;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, action, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_action val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_ACTION, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, action, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "sla.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_sla val = { };
+        cli_parm = bcmcli_find_named_parm(session, "sla.min_rate");
+        if (cli_parm != NULL)
+        {
+            val.min_rate = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_SLA_ID_MIN_RATE;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "sla.max_rate");
+        if (cli_parm != NULL)
+        {
+            val.max_rate = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_SLA_ID_MAX_RATE;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, sla, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_sla val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_SLA, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, sla, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "cookie");
+    if (cli_parm != NULL)
+    {
+        bcmbal_cookie val;
+        val = (bcmbal_cookie) cli_parm->value.unumber64;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, cookie, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, cookie, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_COOKIE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "priority");
+    if (cli_parm != NULL)
+    {
+        uint16_t val;
+        val = cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, priority, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, priority, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_PRIORITY, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "group_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_group_id val;
+        val = (bcmbal_group_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, flow, group_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, group_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_GROUP_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "queue.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_queue_ref val = { };
+        cli_parm = bcmcli_find_named_parm(session, "queue.sched_id");
+        if (cli_parm != NULL)
+        {
+            val.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "queue.sched_id is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "queue.queue_id");
+        if (cli_parm != NULL)
+        {
+            val.queue_id = (bcmbal_tm_queue_id) cli_parm->value.unumber;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "queue.queue_id is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, flow, queue, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_queue_ref val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_FLOW_CFG_ID_QUEUE, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, flow, queue, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_flow_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_flow_cfg cfg;        /**< declare main API struct */
+    bcmbal_flow_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_flow_cfg cfg;\n");
+    bcmcli_log("bcmbal_flow_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        key.flow_id = (bcmbal_flow_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        key.flow_type = (bcmbal_flow_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_TYPE, &key.flow_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, flow, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, flow, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_flow_stat_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_flow_stat stat;      /**< declare main API struct */
+    bcmbal_flow_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_flow_stat stat;\n");
+    bcmcli_log("bcmbal_flow_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_stat_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        key.flow_id = (bcmbal_flow_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_ID, &key.flow_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        key.flow_type = (bcmbal_flow_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "flow_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.flow_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_FLOW, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_FLOW_KEY_ID_FLOW_TYPE, &key.flow_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_STAT_INIT(&stat, flow, key);
+    bcmcli_log("BCMBAL_STAT_INIT(&stat, flow, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, flow, rx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, flow, rx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, flow, rx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, flow, rx_bytes);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, flow, tx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, flow, tx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, flow, tx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, flow, tx_bytes);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_STAT_PROP_IS_SET(&stat, flow, rx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, flow, rx_bytes) && !BCMBAL_STAT_PROP_IS_SET(&stat, flow, tx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, flow, tx_bytes))
+    {
+        BCMBAL_STAT_PROP_GET(&stat, flow, all_properties);
+        bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, flow, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_stat_get(&stat.hdr);
+    bcmcli_log("bcmbal_stat_get(&stat.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &stat.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_group_cfg_get(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_group_cfg cfg;       /**< declare main API struct */
+    bcmbal_group_key key = { }; /**< declare key */
+    uint8_t *list_mem;          /**< declare memory buffer for variable-sized lists */
+    bcmcli_log("bcmbal_group_cfg cfg;\n");
+    bcmcli_log("bcmbal_group_key key = {  };\n");
+    bcmcli_log("uint8_t* list_mem;\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "group_id");
+    if (cli_parm != NULL)
+    {
+        key.group_id = (bcmbal_group_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "group_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.group_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_GROUP_KEY_ID_GROUP_ID, &key.group_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, group, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, group, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "members_cmd");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, group, members_cmd);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, members_cmd);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "members");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, group, members);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, members);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "cookie");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, group, cookie);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, cookie);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flows");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, group, flows);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, flows);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "owner");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, group, owner);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, owner);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, group, members_cmd) && !BCMBAL_CFG_PROP_IS_SET(&cfg, group, members) && !BCMBAL_CFG_PROP_IS_SET(&cfg, group, cookie) && !BCMBAL_CFG_PROP_IS_SET(&cfg, group, flows) && !BCMBAL_CFG_PROP_IS_SET(&cfg, group, owner))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, group, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, group, all_properties);\n");
+    }
+
+    /* set memory to use for variable-sized lists */
+    list_mem = bcmbal_apicli_byte_pool_calloc(byte_pool, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    if (list_mem == NULL)
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmcli_log("list_mem = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+    BCMBAL_CFG_LIST_BUF_SET(&cfg, group, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    bcmcli_log("BCMBAL_CFG_LIST_BUF_SET(&cfg, group, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_group_cfg_set(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_group_cfg cfg;       /**< declare main API struct */
+    bcmbal_group_key key = { }; /**< declare key */
+    bcmcli_log("bcmbal_group_cfg cfg;\n");
+    bcmcli_log("bcmbal_group_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "group_id");
+    if (cli_parm != NULL)
+    {
+        key.group_id = (bcmbal_group_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "group_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.group_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_GROUP_KEY_ID_GROUP_ID, &key.group_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, group, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, group, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "members_cmd");
+    if (cli_parm != NULL)
+    {
+        bcmbal_group_member_cmd val;
+        val = (bcmbal_group_member_cmd) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, group, members_cmd, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, group, members_cmd, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_GROUP_CFG_ID_MEMBERS_CMD, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "members.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_group_member_info_list_u16 val = { };
+        int32_t i0;
+        val.val = bcmbal_apicli_byte_pool_calloc(byte_pool, cli_parm->array_size * sizeof(*val.val));
+        if (val.val == NULL)
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+            return BCM_ERR_NOMEM;
+        }
+
+        val.len = cli_parm->array_size;
+        cli_parm = bcmcli_find_named_parm(session, "members.intf_id");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.intf_id is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                val.val[i0].intf_id = (bcmbal_intf_id) cli_parm->values[i0].unumber;
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.svc_port_id");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.svc_port_id is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                val.val[i0].svc_port_id = (bcmbal_service_port_id) cli_parm->values[i0].unumber;
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.cmds_bitmask");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.cmds_bitmask is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.cmds_bitmask = (bcmbal_action_cmd_id) cli_parm->values[i0].enum_val;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_CMDS_BITMASK;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.o_vid");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.o_vid is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.o_vid = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_O_VID;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.o_pbits");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.o_pbits is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.o_pbits = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_O_PBITS;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.o_tpid");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.o_tpid is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.o_tpid = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_O_TPID;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.i_vid");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.i_vid is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.i_vid = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_I_VID;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.i_pbits");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.i_pbits is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.i_pbits = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_I_PBITS;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.action.i_tpid");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.action.i_tpid is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                if (bcmcli_parm_value_is_set(session, cli_parm, i0))
+                {
+                    val.val[i0].action.i_tpid = cli_parm->values[i0].unumber;
+                    val.val[i0].action.presence_mask = val.val[i0].action.presence_mask | BCMBAL_ACTION_ID_I_TPID;
+                }
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.queue.sched_id");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.queue.sched_id is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                val.val[i0].queue.sched_id = (bcmbal_tm_sched_id) cli_parm->values[i0].unumber;
+            }
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "members.queue.queue_id");
+        if (cli_parm != NULL)
+        {
+            if (cli_parm->array_size != val.len)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "members.queue.queue_id is a different size than other arrays in the struct\n");
+                return BCM_ERR_PARM;
+            }
+
+            for (i0 = 0; i0 < val.len; i0++)
+            {
+                val.val[i0].queue.queue_id = (bcmbal_tm_queue_id) cli_parm->values[i0].unumber;
+            }
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, group, members, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_group_member_info_list_u16 val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_GROUP_CFG_ID_MEMBERS, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, group, members, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "cookie");
+    if (cli_parm != NULL)
+    {
+        bcmbal_cookie val;
+        val = (bcmbal_cookie) cli_parm->value.unumber64;
+        BCMBAL_CFG_PROP_SET(&cfg, group, cookie, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, group, cookie, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_GROUP_CFG_ID_COOKIE, &val);
+        bcmcli_log(");\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_group_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_group_cfg cfg;       /**< declare main API struct */
+    bcmbal_group_key key = { }; /**< declare key */
+    bcmcli_log("bcmbal_group_cfg cfg;\n");
+    bcmcli_log("bcmbal_group_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "group_id");
+    if (cli_parm != NULL)
+    {
+        key.group_id = (bcmbal_group_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "group_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.group_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_GROUP, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_GROUP_KEY_ID_GROUP_ID, &key.group_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, group, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, group, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_interface_cfg_get(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_interface_cfg cfg;       /**< declare main API struct */
+    bcmbal_interface_key key = { }; /**< declare key */
+    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
+    bcmcli_log("bcmbal_interface_cfg cfg;\n");
+    bcmcli_log("bcmbal_interface_key key = {  };\n");
+    bcmcli_log("uint8_t* list_mem;\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        key.intf_type = (bcmbal_intf_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_TYPE, &key.intf_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, interface, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, interface, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, admin_state);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, admin_state);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "oper_status");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, oper_status);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, oper_status);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "min_data_agg_port_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, min_data_agg_port_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, min_data_agg_port_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "min_data_svc_port_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, min_data_svc_port_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, min_data_svc_port_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, transceiver_type);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, transceiver_type);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_miss_mode");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, ds_miss_mode);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, ds_miss_mode);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "mtu");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, mtu);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, mtu);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_control");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, flow_control);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, flow_control);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_tm");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, ds_tm);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, ds_tm);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "us_tm");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, us_tm);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, us_tm);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id_list");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, interface, sub_term_id_list);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, sub_term_id_list);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, interface, admin_state) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, oper_status) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, min_data_agg_port_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, min_data_svc_port_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, transceiver_type) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, ds_miss_mode) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, mtu) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, flow_control) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, ds_tm) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, us_tm) && !BCMBAL_CFG_PROP_IS_SET(&cfg, interface, sub_term_id_list))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, interface, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, interface, all_properties);\n");
+    }
+
+    /* set memory to use for variable-sized lists */
+    list_mem = bcmbal_apicli_byte_pool_calloc(byte_pool, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    if (list_mem == NULL)
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmcli_log("list_mem = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+    BCMBAL_CFG_LIST_BUF_SET(&cfg, interface, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    bcmcli_log("BCMBAL_CFG_LIST_BUF_SET(&cfg, interface, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_interface_cfg_set(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_interface_cfg cfg;       /**< declare main API struct */
+    bcmbal_interface_key key = { }; /**< declare key */
+    bcmcli_log("bcmbal_interface_cfg cfg;\n");
+    bcmcli_log("bcmbal_interface_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        key.intf_type = (bcmbal_intf_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_TYPE, &key.intf_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, interface, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, interface, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        bcmbal_state val;
+        val = (bcmbal_state) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, admin_state, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, admin_state, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_ADMIN_STATE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "min_data_agg_port_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_aggregation_port_id val;
+        val = (bcmbal_aggregation_port_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, min_data_agg_port_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, min_data_agg_port_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_MIN_DATA_AGG_PORT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "min_data_svc_port_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_service_port_id val;
+        val = (bcmbal_service_port_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, min_data_svc_port_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, min_data_svc_port_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_MIN_DATA_SVC_PORT_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "transceiver_type");
+    if (cli_parm != NULL)
+    {
+        bcmbal_trx_type val;
+        val = (bcmbal_trx_type) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, transceiver_type, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, transceiver_type, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_TRANSCEIVER_TYPE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_miss_mode");
+    if (cli_parm != NULL)
+    {
+        bcmbal_ds_miss_mode val;
+        val = (bcmbal_ds_miss_mode) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, ds_miss_mode, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, ds_miss_mode, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_DS_MISS_MODE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "mtu");
+    if (cli_parm != NULL)
+    {
+        uint16_t val;
+        val = cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, mtu, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, mtu, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_MTU, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_control");
+    if (cli_parm != NULL)
+    {
+        bcmbal_control val;
+        val = (bcmbal_control) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, flow_control, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, flow_control, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_FLOW_CONTROL, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_tm");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_id val;
+        val = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, ds_tm, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, ds_tm, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_DS_TM, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "us_tm");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_id val;
+        val = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, interface, us_tm, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, interface, us_tm, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_INTERFACE_CFG_ID_US_TM, &val);
+        bcmcli_log(");\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_interface_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_interface_cfg cfg;       /**< declare main API struct */
+    bcmbal_interface_key key = { }; /**< declare key */
+    bcmcli_log("bcmbal_interface_cfg cfg;\n");
+    bcmcli_log("bcmbal_interface_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        key.intf_type = (bcmbal_intf_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_TYPE, &key.intf_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, interface, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, interface, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_interface_stat_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_interface_stat stat;     /**< declare main API struct */
+    bcmbal_interface_key key = { }; /**< declare key */
+    bcmcli_log("bcmbal_interface_stat stat;\n");
+    bcmcli_log("bcmbal_interface_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_stat_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        key.intf_type = (bcmbal_intf_type) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_type is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_type = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_INTERFACE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_INTERFACE_KEY_ID_INTF_TYPE, &key.intf_type);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_STAT_INIT(&stat, interface, key);
+    bcmcli_log("BCMBAL_STAT_INIT(&stat, interface, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, interface, rx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, interface, rx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, interface, rx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, interface, rx_bytes);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, interface, tx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, interface, tx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, interface, tx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, interface, tx_bytes);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_STAT_PROP_IS_SET(&stat, interface, rx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, interface, rx_bytes) && !BCMBAL_STAT_PROP_IS_SET(&stat, interface, tx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, interface, tx_bytes))
+    {
+        BCMBAL_STAT_PROP_GET(&stat, interface, all_properties);
+        bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, interface, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_stat_get(&stat.hdr);
+    bcmcli_log("bcmbal_stat_get(&stat.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &stat.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_packet_cfg_get(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_packet_cfg cfg;          /**< declare main API struct */
+    bcmbal_packet_key key = { };    /**< declare key */
+    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
+    bcmcli_log("bcmbal_packet_cfg cfg;\n");
+    bcmcli_log("bcmbal_packet_key key = {  };\n");
+    bcmcli_log("uint8_t* list_mem;\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "reserved");
+    if (cli_parm != NULL)
+    {
+        key.reserved = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "reserved is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.reserved = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_RESERVED, &key.reserved);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_parm_by_prefix(session, "packet_send_dest.");
+    if (cli_parm != NULL)
+    {
+        cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.type");
+        if (cli_parm != NULL)
+        {
+            key.packet_send_dest.type = (bcmbal_dest_type) cli_parm->value.enum_val;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.type is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        switch (key.packet_send_dest.type)
+        {
+            case BCMBAL_DEST_TYPE_NNI:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.nni.int_id = (bcmbal_intf_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_SUB_TERM:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_uni");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_uni = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_uni is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.int_id = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_HOST:
+                break;
+            default:
+                bcmbal_apicli_print_complete(session, BCM_ERR_RANGE, "\n");
+                return BCM_ERR_RANGE;
+        }
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.packet_send_dest = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_PACKET_SEND_DEST, &key.packet_send_dest);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, packet, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, packet, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, flow_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, flow_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, flow_type);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, flow_type);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, intf_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, intf_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, intf_type);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, intf_type);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, svc_port);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, svc_port);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_cookie");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, flow_cookie);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, flow_cookie);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "pkt");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, packet, pkt);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, pkt);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, packet, flow_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, flow_type) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, intf_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, intf_type) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, svc_port) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, flow_cookie) && !BCMBAL_CFG_PROP_IS_SET(&cfg, packet, pkt))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, packet, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, packet, all_properties);\n");
+    }
+
+    /* set memory to use for variable-sized lists */
+    list_mem = bcmbal_apicli_byte_pool_calloc(byte_pool, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    if (list_mem == NULL)
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmcli_log("list_mem = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+    BCMBAL_CFG_LIST_BUF_SET(&cfg, packet, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    bcmcli_log("BCMBAL_CFG_LIST_BUF_SET(&cfg, packet, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_packet_cfg_set(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_packet_cfg cfg;          /**< declare main API struct */
+    bcmbal_packet_key key = { };    /**< declare key */
+    bcmcli_log("bcmbal_packet_cfg cfg;\n");
+    bcmcli_log("bcmbal_packet_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "reserved");
+    if (cli_parm != NULL)
+    {
+        key.reserved = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "reserved is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.reserved = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_RESERVED, &key.reserved);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_parm_by_prefix(session, "packet_send_dest.");
+    if (cli_parm != NULL)
+    {
+        cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.type");
+        if (cli_parm != NULL)
+        {
+            key.packet_send_dest.type = (bcmbal_dest_type) cli_parm->value.enum_val;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.type is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        switch (key.packet_send_dest.type)
+        {
+            case BCMBAL_DEST_TYPE_NNI:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.nni.int_id = (bcmbal_intf_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_SUB_TERM:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_uni");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_uni = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_uni is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.int_id = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_HOST:
+                break;
+            default:
+                bcmbal_apicli_print_complete(session, BCM_ERR_RANGE, "\n");
+                return BCM_ERR_RANGE;
+        }
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.packet_send_dest = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_PACKET_SEND_DEST, &key.packet_send_dest);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, packet, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, packet, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "flow_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_flow_id val;
+        val = (bcmbal_flow_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, flow_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, flow_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_FLOW_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_type");
+    if (cli_parm != NULL)
+    {
+        bcmbal_flow_type val;
+        val = (bcmbal_flow_type) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, flow_type, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, flow_type, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_FLOW_TYPE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        bcmbal_intf_id val;
+        val = (bcmbal_intf_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, intf_id, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, intf_id, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_INTF_ID, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "intf_type");
+    if (cli_parm != NULL)
+    {
+        bcmbal_intf_type val;
+        val = (bcmbal_intf_type) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, intf_type, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, intf_type, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_INTF_TYPE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port");
+    if (cli_parm != NULL)
+    {
+        bcmbal_service_port_id val;
+        val = (bcmbal_service_port_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, svc_port, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, svc_port, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_SVC_PORT, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "flow_cookie");
+    if (cli_parm != NULL)
+    {
+        bcmbal_cookie val;
+        val = (bcmbal_cookie) cli_parm->value.unumber64;
+        BCMBAL_CFG_PROP_SET(&cfg, packet, flow_cookie, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, flow_cookie, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_FLOW_COOKIE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "pkt");
+    if (cli_parm != NULL)
+    {
+        bcmbal_u8_list_u32 val = { };
+        val.len = bcmbal_buf_get_used(&cli_parm->value.buffer);
+        val.val = bcmbal_apicli_byte_pool_calloc(byte_pool, val.len);
+        if (val.val == NULL)
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+            return BCM_ERR_NOMEM;
+        }
+
+        bcmbal_buf_set_pos(&cli_parm->value.buffer, 0);
+        bcmbal_buf_read(&cli_parm->value.buffer, val.val, val.len);
+        BCMBAL_CFG_PROP_SET(&cfg, packet, pkt, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_u8_list_u32 val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_PACKET_CFG_ID_PKT, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, packet, pkt, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_packet_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_packet_cfg cfg;          /**< declare main API struct */
+    bcmbal_packet_key key = { };    /**< declare key */
+    bcmcli_log("bcmbal_packet_cfg cfg;\n");
+    bcmcli_log("bcmbal_packet_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "reserved");
+    if (cli_parm != NULL)
+    {
+        key.reserved = cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "reserved is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.reserved = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_RESERVED, &key.reserved);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_parm_by_prefix(session, "packet_send_dest.");
+    if (cli_parm != NULL)
+    {
+        cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.type");
+        if (cli_parm != NULL)
+        {
+            key.packet_send_dest.type = (bcmbal_dest_type) cli_parm->value.enum_val;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.type is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        switch (key.packet_send_dest.type)
+        {
+            case BCMBAL_DEST_TYPE_NNI:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.nni.int_id = (bcmbal_intf_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_SUB_TERM:
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.sub_term_uni");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.sub_term_uni = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.sub_term_uni is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "packet_send_dest.int_id");
+                if (cli_parm != NULL)
+                {
+                    key.packet_send_dest.u.sub_term.int_id = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest.int_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_DEST_TYPE_HOST:
+                break;
+            default:
+                bcmbal_apicli_print_complete(session, BCM_ERR_RANGE, "\n");
+                return BCM_ERR_RANGE;
+        }
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "packet_send_dest is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.packet_send_dest = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_PACKET, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_PACKET_KEY_ID_PACKET_SEND_DEST, &key.packet_send_dest);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, packet, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, packet, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_subscriber_terminal_cfg_get(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_subscriber_terminal_cfg cfg;         /**< declare main API struct */
+    bcmbal_subscriber_terminal_key key = { };   /**< declare key */
+    uint8_t *list_mem;  /**< declare memory buffer for variable-sized lists */
+    bcmcli_log("bcmbal_subscriber_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_subscriber_terminal_key key = {  };\n");
+    bcmcli_log("uint8_t* list_mem;\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        key.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sub_term_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sub_term_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID, &key.sub_term_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, admin_state);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, admin_state);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "oper_status");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, oper_status);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, oper_status);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "serial_number");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, serial_number);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, serial_number);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "password");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, password);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, password);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "registration_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, registration_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, registration_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port_id");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, svc_port_id);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, svc_port_id);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "mac_address");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, mac_address);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, mac_address);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_tm");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, ds_tm);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, ds_tm);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "us_tm");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, us_tm);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, us_tm);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "svc_port_id_list");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, svc_port_id_list);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, svc_port_id_list);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "agg_port_id_list");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, agg_port_id_list);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, agg_port_id_list);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, admin_state) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, oper_status) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, serial_number) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, password) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, registration_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, svc_port_id) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, mac_address) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, ds_tm) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, us_tm) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, svc_port_id_list) && !BCMBAL_CFG_PROP_IS_SET(&cfg, subscriber_terminal, agg_port_id_list))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, subscriber_terminal, all_properties);\n");
+    }
+
+    /* set memory to use for variable-sized lists */
+    list_mem = bcmbal_apicli_byte_pool_calloc(byte_pool, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    if (list_mem == NULL)
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmcli_log("list_mem = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+    BCMBAL_CFG_LIST_BUF_SET(&cfg, subscriber_terminal, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    bcmcli_log("BCMBAL_CFG_LIST_BUF_SET(&cfg, subscriber_terminal, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_subscriber_terminal_cfg_set(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_subscriber_terminal_cfg cfg; /**< declare main API struct */
+    bcmbal_subscriber_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_subscriber_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_subscriber_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        key.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sub_term_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sub_term_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID, &key.sub_term_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "admin_state");
+    if (cli_parm != NULL)
+    {
+        bcmbal_state val;
+        val = (bcmbal_state) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, admin_state, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, admin_state, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_ADMIN_STATE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "serial_number.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_serial_number val = { };
+        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_id");
+        if (cli_parm != NULL)
+        {
+            if (bcmbal_buf_get_used(&cli_parm->value.buffer) != 4)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_id must have 4 bytes\n");
+                return BCM_ERR_PARM;
+            }
+
+            bcmbal_buf_set_pos(&cli_parm->value.buffer, 0);
+            bcmbal_buf_read(&cli_parm->value.buffer, val.vendor_id, 4);
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_id is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "serial_number.vendor_specific");
+        if (cli_parm != NULL)
+        {
+            if (bcmbal_buf_get_used(&cli_parm->value.buffer) != 4)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "buffer serial_number.vendor_specific must have 4 bytes\n");
+                return BCM_ERR_PARM;
+            }
+
+            bcmbal_buf_set_pos(&cli_parm->value.buffer, 0);
+            bcmbal_buf_read(&cli_parm->value.buffer, val.vendor_specific, 4);
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "serial_number.vendor_specific is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, serial_number, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_serial_number val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SERIAL_NUMBER, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, serial_number, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "password.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_password val = { };
+        cli_parm = bcmcli_find_named_parm(session, "password.arr");
+        if (cli_parm != NULL)
+        {
+            if (bcmbal_buf_get_used(&cli_parm->value.buffer) != 10)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "buffer password.arr must have 10 bytes\n");
+                return BCM_ERR_PARM;
+            }
+
+            bcmbal_buf_set_pos(&cli_parm->value.buffer, 0);
+            bcmbal_buf_read(&cli_parm->value.buffer, val.arr, 10);
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "password.arr is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, password, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_password val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_PASSWORD, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, password, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "registration_id.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_registration_id val = { };
+        cli_parm = bcmcli_find_named_parm(session, "registration_id.arr");
+        if (cli_parm != NULL)
+        {
+            if (bcmbal_buf_get_used(&cli_parm->value.buffer) != 36)
+            {
+                bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "buffer registration_id.arr must have 36 bytes\n");
+                return BCM_ERR_PARM;
+            }
+
+            bcmbal_buf_set_pos(&cli_parm->value.buffer, 0);
+            bcmbal_buf_read(&cli_parm->value.buffer, val.arr, 36);
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "registration_id.arr is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, registration_id, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_registration_id val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_REGISTRATION_ID, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, registration_id, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "mac_address");
+    if (cli_parm != NULL)
+    {
+        bcmos_mac_address val;
+        val = cli_parm->value.mac;
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, mac_address, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, mac_address, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_MAC_ADDRESS, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ds_tm");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_id val;
+        val = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, ds_tm, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, ds_tm, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_DS_TM, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "us_tm");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_id val;
+        val = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, us_tm, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, subscriber_terminal, us_tm, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_US_TM, &val);
+        bcmcli_log(");\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_subscriber_terminal_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_subscriber_terminal_cfg cfg;         /**< declare main API struct */
+    bcmbal_subscriber_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_subscriber_terminal_cfg cfg;\n");
+    bcmcli_log("bcmbal_subscriber_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        key.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sub_term_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sub_term_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID, &key.sub_term_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, subscriber_terminal, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_subscriber_terminal_stat_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_subscriber_terminal_stat stat;       /**< declare main API struct */
+    bcmbal_subscriber_terminal_key key = { };   /**< declare key */
+    bcmcli_log("bcmbal_subscriber_terminal_stat stat;\n");
+    bcmcli_log("bcmbal_subscriber_terminal_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_stat_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sub_term_id");
+    if (cli_parm != NULL)
+    {
+        key.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sub_term_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sub_term_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID, &key.sub_term_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "intf_id");
+    if (cli_parm != NULL)
+    {
+        key.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "intf_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.intf_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID, &key.intf_id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_STAT_INIT(&stat, subscriber_terminal, key);
+    bcmcli_log("BCMBAL_STAT_INIT(&stat, subscriber_terminal, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "rx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, rx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, rx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "rx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, rx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, rx_bytes);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_packets");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, tx_packets);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, tx_packets);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tx_bytes");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, tx_bytes);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, tx_bytes);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_STAT_PROP_IS_SET(&stat, subscriber_terminal, rx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, subscriber_terminal, rx_bytes) && !BCMBAL_STAT_PROP_IS_SET(&stat, subscriber_terminal, tx_packets) && !BCMBAL_STAT_PROP_IS_SET(&stat, subscriber_terminal, tx_bytes))
+    {
+        BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, all_properties);
+        bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, subscriber_terminal, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_stat_get(&stat.hdr);
+    bcmcli_log("bcmbal_stat_get(&stat.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &stat.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_queue_cfg_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_queue_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_queue_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_queue_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sched_id");
+    if (cli_parm != NULL)
+    {
+        key.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID, &key.sched_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "sched_dir");
+    if (cli_parm != NULL)
+    {
+        key.sched_dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR, &key.sched_dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_queue_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_queue, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_queue, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "priority");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, priority);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, priority);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "weight");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, weight);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, weight);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "rate");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, rate);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, rate);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "bac");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, bac);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, bac);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "creation_mode");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, creation_mode);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, creation_mode);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "ref_count");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_queue, ref_count);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, ref_count);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, priority) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, weight) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, rate) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, bac) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, creation_mode) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_queue, ref_count))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, tm_queue, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_queue, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_queue_cfg_set(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_queue_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_queue_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_queue_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sched_id");
+    if (cli_parm != NULL)
+    {
+        key.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID, &key.sched_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "sched_dir");
+    if (cli_parm != NULL)
+    {
+        key.sched_dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR, &key.sched_dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_queue_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_queue, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_queue, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "priority");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_priority val;
+        val = (bcmbal_tm_priority) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, tm_queue, priority, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_queue, priority, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_QUEUE_CFG_ID_PRIORITY, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "weight");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_weight val;
+        val = (bcmbal_tm_weight) cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, tm_queue, weight, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_queue, weight, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_QUEUE_CFG_ID_WEIGHT, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "rate.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_shaping val = { };
+        cli_parm = bcmcli_find_named_parm(session, "rate.sbr");
+        if (cli_parm != NULL)
+        {
+            val.sbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_SBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "rate.pbr");
+        if (cli_parm != NULL)
+        {
+            val.pbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_PBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "rate.burst");
+        if (cli_parm != NULL)
+        {
+            val.burst = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_BURST;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_queue, rate, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_shaping val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_QUEUE_CFG_ID_RATE, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_queue, rate, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "bac.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_bac val = { };
+        cli_parm = bcmcli_find_named_parm(session, "bac.type");
+        if (cli_parm != NULL)
+        {
+            val.type = (bcmbal_tm_bac_type) cli_parm->value.enum_val;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.type is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        switch (val.type)
+        {
+            case BCMBAL_TM_BAC_TYPE_TAILDROP:
+                cli_parm = bcmcli_find_named_parm(session, "bac.max_size");
+                if (cli_parm != NULL)
+                {
+                    val.u.taildrop.max_size = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.max_size is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_TM_BAC_TYPE_RED:
+                cli_parm = bcmcli_find_parm_by_prefix(session, "bac.red.");
+                if (cli_parm != NULL)
+                {
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.min_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.red.red.min_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.min_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.max_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.red.red.max_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.max_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.max_probability");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.red.red.max_probability = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.max_probability is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_TM_BAC_TYPE_WRED:
+                cli_parm = bcmcli_find_parm_by_prefix(session, "bac.green.");
+                if (cli_parm != NULL)
+                {
+                    cli_parm = bcmcli_find_named_parm(session, "bac.green.min_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.green.min_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.green.min_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.green.max_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.green.max_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.green.max_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.green.max_probability");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.green.max_probability = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.green.max_probability is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.green is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_parm_by_prefix(session, "bac.yellow.");
+                if (cli_parm != NULL)
+                {
+                    cli_parm = bcmcli_find_named_parm(session, "bac.yellow.min_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.yellow.min_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.yellow.min_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.yellow.max_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.yellow.max_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.yellow.max_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.yellow.max_probability");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.yellow.max_probability = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.yellow.max_probability is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.yellow is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_parm_by_prefix(session, "bac.red.");
+                if (cli_parm != NULL)
+                {
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.min_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.red.min_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.min_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.max_threshold");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.red.max_threshold = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.max_threshold is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+
+                    cli_parm = bcmcli_find_named_parm(session, "bac.red.max_probability");
+                    if (cli_parm != NULL)
+                    {
+                        val.u.wred.red.max_probability = (bcmbal_percent) cli_parm->value.unumber;
+                    }
+                    else
+                    {
+                        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red.max_probability is not set\n");
+                        return BCM_ERR_PARM;
+                    }
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "bac.red is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            default:
+                bcmbal_apicli_print_complete(session, BCM_ERR_RANGE, "\n");
+                return BCM_ERR_RANGE;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_queue, bac, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_bac val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_QUEUE_CFG_ID_BAC, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_queue, bac, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_queue_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_queue_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_queue_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_queue_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sched_id");
+    if (cli_parm != NULL)
+    {
+        key.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID, &key.sched_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "sched_dir");
+    if (cli_parm != NULL)
+    {
+        key.sched_dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR, &key.sched_dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_queue_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_queue, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_queue, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_queue_stat_get(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_queue_stat stat;      /**< declare main API struct */
+    bcmbal_tm_queue_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_queue_stat stat;\n");
+    bcmcli_log("bcmbal_tm_queue_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_stat_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "sched_id");
+    if (cli_parm != NULL)
+    {
+        key.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID, &key.sched_id);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "sched_dir");
+    if (cli_parm != NULL)
+    {
+        key.sched_dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "sched_dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.sched_dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR, &key.sched_dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_queue_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_QUEUE, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_QUEUE_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_STAT_INIT(&stat, tm_queue, key);
+    bcmcli_log("BCMBAL_STAT_INIT(&stat, tm_queue, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "packets_ok");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, tm_queue, packets_ok);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, tm_queue, packets_ok);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "bytes_ok");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, tm_queue, bytes_ok);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, tm_queue, bytes_ok);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "packets_discarded");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, tm_queue, packets_discarded);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, tm_queue, packets_discarded);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "bytes_discarded");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_STAT_PROP_GET(&stat, tm_queue, bytes_discarded);
+            bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, tm_queue, bytes_discarded);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_STAT_PROP_IS_SET(&stat, tm_queue, packets_ok) && !BCMBAL_STAT_PROP_IS_SET(&stat, tm_queue, bytes_ok) && !BCMBAL_STAT_PROP_IS_SET(&stat, tm_queue, packets_discarded) && !BCMBAL_STAT_PROP_IS_SET(&stat, tm_queue, bytes_discarded))
+    {
+        BCMBAL_STAT_PROP_GET(&stat, tm_queue, all_properties);
+        bcmcli_log("BCMBAL_STAT_PROP_GET(&stat, tm_queue, all_properties);\n");
+    }
+
+    /* call API */
+    err = bcmbal_stat_get(&stat.hdr);
+    bcmcli_log("bcmbal_stat_get(&stat.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &stat.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_sched_cfg_get(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_sched_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_sched_key key = { };  /**< declare key */
+    uint8_t *list_mem;              /**< declare memory buffer for variable-sized lists */
+    bcmcli_log("bcmbal_tm_sched_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_sched_key key = {  };\n");
+    bcmcli_log("uint8_t* list_mem;\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_get");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "dir");
+    if (cli_parm != NULL)
+    {
+        key.dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_DIR, &key.dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_sched, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_sched, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_named_parm(session, "owner");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, owner);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, owner);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sched_type");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_type);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_type);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sched_parent");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_parent);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_parent);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sched_child_type");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_child_type);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sched_child_type);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "rate");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, rate);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, rate);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "tcont_sla");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, tcont_sla);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, tcont_sla);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "creation_mode");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, creation_mode);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, creation_mode);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "queues");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, queues);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, queues);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sub_scheds");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sub_scheds);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, sub_scheds);\n");
+        }
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "num_priorities");
+    if (cli_parm != NULL)
+    {
+        if (cli_parm->value.number)
+        {
+            BCMBAL_CFG_PROP_GET(&cfg, tm_sched, num_priorities);
+            bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, num_priorities);\n");
+        }
+    }
+
+    /* if no properties were requested, include everything */
+    if (!BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, owner) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, sched_type) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, sched_parent) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, sched_child_type) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, rate) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, tcont_sla) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, creation_mode) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, queues) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, sub_scheds) && !BCMBAL_CFG_PROP_IS_SET(&cfg, tm_sched, num_priorities))
+    {
+        BCMBAL_CFG_PROP_GET(&cfg, tm_sched, all_properties);
+        bcmcli_log("BCMBAL_CFG_PROP_GET(&cfg, tm_sched, all_properties);\n");
+    }
+
+    /* set memory to use for variable-sized lists */
+    list_mem = bcmbal_apicli_byte_pool_calloc(byte_pool, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    if (list_mem == NULL)
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_NOMEM, "\n");
+        return BCM_ERR_NOMEM;
+    }
+
+    bcmcli_log("list_mem = bcmos_calloc(BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+    BCMBAL_CFG_LIST_BUF_SET(&cfg, tm_sched, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);
+    bcmcli_log("BCMBAL_CFG_LIST_BUF_SET(&cfg, tm_sched, list_mem, BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE);\n");
+
+    /* call API */
+    err = bcmbal_cfg_get(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_get(&cfg.hdr);\n");
+    if (err == BCM_ERR_OK)
+    {
+        /* print API contents to the CLI */
+        bcmbal_apicli_print_data_start(session);
+        err = bcmbal_apicli_msg_dump(session, &cfg.hdr.hdr);
+    }
+
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_sched_cfg_set(bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_sched_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_sched_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_sched_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_sched_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_set");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "dir");
+    if (cli_parm != NULL)
+    {
+        key.dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_DIR, &key.dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_sched, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_sched, key);\n");
+
+    /* decode API parameters from CLI */
+    cli_parm = bcmcli_find_parm_by_prefix(session, "owner.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_owner val = { };
+        cli_parm = bcmcli_find_named_parm(session, "owner.type");
+        if (cli_parm != NULL)
+        {
+            val.type = (bcmbal_tm_sched_owner_type) cli_parm->value.enum_val;
+        }
+        else
+        {
+            bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.type is not set\n");
+            return BCM_ERR_PARM;
+        }
+
+        switch (val.type)
+        {
+            case BCMBAL_TM_SCHED_OWNER_TYPE_INTERFACE:
+                cli_parm = bcmcli_find_named_parm(session, "owner.intf_type");
+                if (cli_parm != NULL)
+                {
+                    val.u.interface.intf_type = (bcmbal_intf_type) cli_parm->value.enum_val;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.intf_type is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.intf_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.interface.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.intf_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_TM_SCHED_OWNER_TYPE_SUB_TERM:
+                cli_parm = bcmcli_find_named_parm(session, "owner.intf_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.sub_term.intf_id = (bcmbal_intf_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.intf_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.sub_term.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.sub_term_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_TM_SCHED_OWNER_TYPE_AGG_PORT:
+                cli_parm = bcmcli_find_named_parm(session, "owner.intf_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.agg_port.intf_id = cli_parm->value.unumber;
+                    val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_INTF_ID;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.agg_port.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                    val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_SUB_TERM_ID;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.agg_port_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.agg_port.agg_port_id = (bcmbal_aggregation_port_id) cli_parm->value.unumber;
+                    val.u.agg_port.presence_mask = val.u.agg_port.presence_mask | BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_AGG_PORT_ID;
+                }
+                break;
+            case BCMBAL_TM_SCHED_OWNER_TYPE_UNI:
+                cli_parm = bcmcli_find_named_parm(session, "owner.intf_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.uni.intf_id = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.intf_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.sub_term_id");
+                if (cli_parm != NULL)
+                {
+                    val.u.uni.sub_term_id = (bcmbal_sub_id) cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.sub_term_id is not set\n");
+                    return BCM_ERR_PARM;
+                }
+
+                cli_parm = bcmcli_find_named_parm(session, "owner.idx");
+                if (cli_parm != NULL)
+                {
+                    val.u.uni.idx = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.idx is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            case BCMBAL_TM_SCHED_OWNER_TYPE_VIRTUAL:
+                cli_parm = bcmcli_find_named_parm(session, "owner.idx");
+                if (cli_parm != NULL)
+                {
+                    val.u.virtual.idx = cli_parm->value.unumber;
+                }
+                else
+                {
+                    bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "owner.idx is not set\n");
+                    return BCM_ERR_PARM;
+                }
+                break;
+            default:
+                bcmbal_apicli_print_complete(session, BCM_ERR_RANGE, "\n");
+                return BCM_ERR_RANGE;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, owner, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_sched_owner val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_OWNER, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, owner, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sched_type");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_type val;
+        val = (bcmbal_tm_sched_type) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_type, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_type, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_SCHED_TYPE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "sched_parent.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_parent val = { };
+        cli_parm = bcmcli_find_named_parm(session, "sched_parent.sched_id");
+        if (cli_parm != NULL)
+        {
+            val.sched_id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SCHED_PARENT_ID_SCHED_ID;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "sched_parent.priority");
+        if (cli_parm != NULL)
+        {
+            val.priority = (bcmbal_tm_priority) cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SCHED_PARENT_ID_PRIORITY;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "sched_parent.weight");
+        if (cli_parm != NULL)
+        {
+            val.weight = (bcmbal_tm_weight) cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SCHED_PARENT_ID_WEIGHT;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_parent, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_sched_parent val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_SCHED_PARENT, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_parent, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "sched_child_type");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_sched_child_type val;
+        val = (bcmbal_tm_sched_child_type) cli_parm->value.enum_val;
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_child_type, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, sched_child_type, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_SCHED_CHILD_TYPE, &val);
+        bcmcli_log(");\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "rate.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_shaping val = { };
+        cli_parm = bcmcli_find_named_parm(session, "rate.sbr");
+        if (cli_parm != NULL)
+        {
+            val.sbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_SBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "rate.pbr");
+        if (cli_parm != NULL)
+        {
+            val.pbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_PBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "rate.burst");
+        if (cli_parm != NULL)
+        {
+            val.burst = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_SHAPING_ID_BURST;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, rate, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_shaping val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_RATE, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, rate, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_parm_by_prefix(session, "tcont_sla.");
+    if (cli_parm != NULL)
+    {
+        bcmbal_tm_tcont_sla val = { };
+        cli_parm = bcmcli_find_named_parm(session, "tcont_sla.extra_bw_elig");
+        if (cli_parm != NULL)
+        {
+            val.extra_bw_elig = (bcmbal_extra_bw_eligibility_type) cli_parm->value.enum_val;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_TCONT_SLA_ID_EXTRA_BW_ELIG;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "tcont_sla.nrt_cbr");
+        if (cli_parm != NULL)
+        {
+            val.nrt_cbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_TCONT_SLA_ID_NRT_CBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "tcont_sla.rt_cbr");
+        if (cli_parm != NULL)
+        {
+            val.rt_cbr = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_TCONT_SLA_ID_RT_CBR;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "tcont_sla.rt_profile");
+        if (cli_parm != NULL)
+        {
+            val.rt_profile = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_TCONT_SLA_ID_RT_PROFILE;
+        }
+
+        cli_parm = bcmcli_find_named_parm(session, "tcont_sla.nrt_profile");
+        if (cli_parm != NULL)
+        {
+            val.nrt_profile = cli_parm->value.unumber;
+            val.presence_mask = val.presence_mask | BCMBAL_TM_TCONT_SLA_ID_NRT_PROFILE;
+        }
+
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, tcont_sla, val);
+        bcmcli_log("{\n");
+        bcmcli_log("bcmbal_tm_tcont_sla val = ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_TCONT_SLA, &val);
+        bcmcli_log(";\n");
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, tcont_sla, val);\n");
+        bcmcli_log("}\n");
+    }
+
+    cli_parm = bcmcli_find_named_parm(session, "num_priorities");
+    if (cli_parm != NULL)
+    {
+        uint8_t val;
+        val = cli_parm->value.unumber;
+        BCMBAL_CFG_PROP_SET(&cfg, tm_sched, num_priorities, val);
+        bcmcli_log("BCMBAL_CFG_PROP_SET(&cfg, tm_sched, num_priorities, ");
+        bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_CFG, 0, BCMBAL_TM_SCHED_CFG_ID_NUM_PRIORITIES, &val);
+        bcmcli_log(");\n");
+    }
+
+    /* call API */
+    err = bcmbal_cfg_set(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_set(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_cli_tm_sched_cfg_clear(bcmcli_session *session)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmos_errno err;
+    bcmbal_tm_sched_cfg cfg;        /**< declare main API struct */
+    bcmbal_tm_sched_key key = { };  /**< declare key */
+    bcmcli_log("bcmbal_tm_sched_cfg cfg;\n");
+    bcmcli_log("bcmbal_tm_sched_key key = {  };\n");
+    bcmbal_apicli_print_start(session, "bcmbal_cfg_clear");
+
+    /* build key from CLI parameters */
+    cli_parm = bcmcli_find_named_parm(session, "dir");
+    if (cli_parm != NULL)
+    {
+        key.dir = (bcmbal_tm_sched_dir) cli_parm->value.enum_val;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "dir is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.dir = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_DIR, &key.dir);
+    bcmcli_log(";\n");
+    cli_parm = bcmcli_find_named_parm(session, "id");
+    if (cli_parm != NULL)
+    {
+        key.id = (bcmbal_tm_sched_id) cli_parm->value.unumber;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "id is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    bcmcli_log("key.id = ");
+    bcmbal_apicli_log_prop_val(BCMBAL_OBJ_ID_TM_SCHED, BCMBAL_MGT_GROUP_KEY, 0, BCMBAL_TM_SCHED_KEY_ID_ID, &key.id);
+    bcmcli_log(";\n");
+
+    /* init the API struct */
+    BCMBAL_CFG_INIT(&cfg, tm_sched, key);
+    bcmcli_log("BCMBAL_CFG_INIT(&cfg, tm_sched, key);\n");
+
+    /* call API */
+    err = bcmbal_cfg_clear(&cfg.hdr);
+    bcmcli_log("bcmbal_cfg_clear(&cfg.hdr);\n");
+    bcmbal_apicli_print_complete(session, err, NULL);
+    return err;
+}
+
+/******************************************************************************/
+static bcmos_errno bcmbal_apicli_root(bcmbal_mgt_group group_type, bcmbal_obj_msg_type msg_type, bcmcli_session *session, bcmbal_apicli_byte_pool *byte_pool)
+{
+    bcmcli_cmd_parm *cli_parm;
+    bcmbal_obj_id obj_id;
+    cli_parm = bcmcli_find_named_parm(session, "object");
+    if (cli_parm != NULL)
+    {
+        obj_id = cli_parm->value.number;
+    }
+    else
+    {
+        bcmbal_apicli_print_complete(session, BCM_ERR_PARM, "object is not set\n");
+        return BCM_ERR_PARM;
+    }
+
+    switch (obj_id)
+    {
+        case BCMBAL_OBJ_ID_ACCESS_TERMINAL:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_access_terminal_cfg_get(session);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_access_terminal_cfg_set(session);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_access_terminal_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_FLOW:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_flow_cfg_get(session);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_flow_cfg_set(session);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_flow_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    return bcmbal_cli_flow_stat_get(session);
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_GROUP:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_group_cfg_get(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_group_cfg_set(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_group_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_INTERFACE:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_interface_cfg_get(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_interface_cfg_set(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_interface_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    return bcmbal_cli_interface_stat_get(session);
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_PACKET:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_packet_cfg_get(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_packet_cfg_set(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_packet_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_subscriber_terminal_cfg_get(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_subscriber_terminal_cfg_set(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_subscriber_terminal_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    return bcmbal_cli_subscriber_terminal_stat_get(session);
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_QUEUE:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_tm_queue_cfg_get(session);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_tm_queue_cfg_set(session);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_tm_queue_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    return bcmbal_cli_tm_queue_stat_get(session);
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_SCHED:
+            switch (group_type)
+            {
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (msg_type)
+                    {
+                        case BCMBAL_OBJ_MSG_TYPE_GET:
+                            return bcmbal_cli_tm_sched_cfg_get(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_SET:
+                            return bcmbal_cli_tm_sched_cfg_set(session, byte_pool);
+                        case BCMBAL_OBJ_MSG_TYPE_CLEAR:
+                            return bcmbal_cli_tm_sched_cfg_clear(session);
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        default:
+            return BCM_ERR_RANGE;
+    }
+}
+
+/* Perform an API call based on CLI input */
+bcmos_errno bcmbal_apicli_call(bcmbal_mgt_group group_type, bcmbal_obj_msg_type msg_type, bcmcli_session *session)
+{
+    bcmos_errno err;
+    bcmbal_apicli_byte_pool byte_pool;
+
+    /* setup memory pool for dynamically-sized list memory allocation */
+    err = bcmbal_apicli_byte_pool_create(&byte_pool);
+    if (err != BCM_ERR_OK)
+    {
+        return err;
+    }
+
+    /* call the root API handler */
+    err = bcmbal_apicli_root(group_type, msg_type, session, &byte_pool);
+
+    /* free all dynamically allocated memory */
+    bcmbal_apicli_byte_pool_destroy(&byte_pool);
+
+    return err;
+}
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.h b/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.h
new file mode 100644
index 0000000..dc7f1fc
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_handlers.h
@@ -0,0 +1,46 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+*/
+
+#ifndef BCMBAL_APICLI_HANDLERS_H_
+#define BCMBAL_APICLI_HANDLERS_H_
+
+#include <bcmos_system.h>
+#include <bal_api.h>
+#include <bcmcli.h>
+
+/* the maximum amount of memory that could possibly by used by all variable-sized lists within a GET request */
+#define BCMBAL_APICLI_DYNAMIC_LIST_BUFFER_SIZE (32 * 1024)
+
+/* Perform an API call based on CLI input */
+bcmos_errno bcmbal_apicli_call(
+    bcmbal_mgt_group group_type,
+    bcmbal_obj_msg_type msg_type,
+    bcmcli_session *session);
+
+#endif
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.c b/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.c
new file mode 100644
index 0000000..d9b6e43
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.c
@@ -0,0 +1,1913 @@
+#include <bcmos_system.h>
+#include <bcmcli.h>
+#include <bal_api.h>
+#include "bal_api_cli_helpers.h"
+
+/* allow possibly unused descriptors to make the code easier to generate */
+#ifdef __GNUC__
+#define BCM_DESCR   __attribute__((unused))
+#else
+#define BCM_DESCR
+#endif
+
+/* Unless specified in the XML model, dynamic arrays will have this max size (in bytes, will divide by element size) */
+#define DEFAULT_DYN_ARR_MAX_SIZE    2048
+
+/* ==== Base Type Descriptors ==== */
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint8_t = { .name = "uint8", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM, .size = sizeof(uint8_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint16_t = { .name = "uint16", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM, .size = sizeof(uint16_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint32_t = { .name = "uint32", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM, .size = sizeof(uint32_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint64_t = { .name = "uint64", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM, .size = sizeof(uint64_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint8_t_hex = { .name = "uint8_hex", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX, .size = sizeof(uint8_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint16_t_hex = { .name = "uint16_hex", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX, .size = sizeof(uint16_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint32_t_hex = { .name = "uint32_hex", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX, .size = sizeof(uint32_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint64_t_hex = { .name = "uint64_hex", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX, .size = sizeof(uint64_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_int8_t = { .name = "int8", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_SNUM, .size = sizeof(int8_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_int16_t = { .name = "int16", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_SNUM, .size = sizeof(int16_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_int32_t = { .name = "int32", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_SNUM, .size = sizeof(int32_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_int64_t = { .name = "int64", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_SNUM, .size = sizeof(int64_t) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_float = { .name = "float", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_FLOAT, .size = sizeof(float) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_double = { .name = "double", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_FLOAT, .size = sizeof(double) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmos_mac_address = { .name = "mac", .descr = "MAC address", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_MAC, .size = sizeof(bcmos_mac_address) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmos_ipv4_address = { .name = "ipv4", .descr = "IPv4 address", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_IPV4, .size = sizeof(bcmos_ipv4_address) };
+
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmos_bool = { .name = "bool", .descr = "Boolean", .base_type = BCMBAL_APICLI_BASE_TYPE_ID_BOOL, .size = sizeof(bcmos_bool) };
+
+/* ==== Object Type Information ==== */
+static char *object_name[] = { "access_terminal", "flow", "group", "interface", "packet", "subscriber_terminal", "tm_queue", "tm_sched" };
+static char *object_descr[] = { "BAL Access Terminal Object", "BAL Flow", "BAL Group", "BAL interface object", "Packet that can be transmitted or received", "BAL Subscriber Terminal", "Transmit queue", "Scheduling node" };
+
+/* ==== Supporting Types ==== */
+bcmcli_enum_val bcmbal_access_terminal_cfg_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_ACCESS_TERMINAL_CFG_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_ACCESS_TERMINAL_CFG_ID_OPER_STATUS }, { .name = "iwf_mode", .val = BCMBAL_ACCESS_TERMINAL_CFG_ID_IWF_MODE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_cfg_id = { .name = "bcmbal_access_terminal_cfg_id", .descr = "Identifiers for all properties contained in the access_terminal_cfg group.", .size = sizeof(bcmbal_access_terminal_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_access_terminal_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_access_terminal_ind_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_ACCESS_TERMINAL_IND_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_ACCESS_TERMINAL_IND_ID_OPER_STATUS }, { .name = "iwf_mode", .val = BCMBAL_ACCESS_TERMINAL_IND_ID_IWF_MODE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_ind_id = { .name = "bcmbal_access_terminal_ind_id", .descr = "Identifiers for all properties contained in the access_terminal_ind group.", .size = sizeof(bcmbal_access_terminal_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_access_terminal_ind_id_string_table } };
+bcmcli_enum_val bcmbal_access_terminal_key_id_string_table[] = { { .name = "access_term_id", .val = BCMBAL_ACCESS_TERMINAL_KEY_ID_ACCESS_TERM_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_key_id = { .name = "bcmbal_access_terminal_key_id", .descr = "Identifiers for all properties contained in the access_terminal_key group.", .size = sizeof(bcmbal_access_terminal_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_access_terminal_key_id_string_table } };
+bcmcli_enum_val bcmbal_action_id_string_table[] = { { .name = "none", .val = BCMBAL_ACTION_ID_NONE }, { .name = "cmds_bitmask", .val = BCMBAL_ACTION_ID_CMDS_BITMASK }, { .name = "o_vid", .val = BCMBAL_ACTION_ID_O_VID }, { .name = "o_pbits", .val = BCMBAL_ACTION_ID_O_PBITS }, { .name = "o_tpid", .val = BCMBAL_ACTION_ID_O_TPID }, { .name = "i_vid", .val = BCMBAL_ACTION_ID_I_VID }, { .name = "i_pbits", .val = BCMBAL_ACTION_ID_I_PBITS }, { .name = "i_tpid", .val = BCMBAL_ACTION_ID_I_TPID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_action_id = { .name = "bcmbal_action_id", .descr = "action ID", .size = sizeof(bcmbal_action_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_action_id_string_table } };
+bcmcli_enum_val bcmbal_action_cmd_id_string_table[] = { { .name = "none", .val = BCMBAL_ACTION_CMD_ID_NONE }, { .name = "add_outer_tag", .val = BCMBAL_ACTION_CMD_ID_ADD_OUTER_TAG }, { .name = "remove_outer_tag", .val = BCMBAL_ACTION_CMD_ID_REMOVE_OUTER_TAG }, { .name = "xlate_outer_tag", .val = BCMBAL_ACTION_CMD_ID_XLATE_OUTER_TAG }, { .name = "xlate_two_tags", .val = BCMBAL_ACTION_CMD_ID_XLATE_TWO_TAGS }, { .name = "discard_ds_bcast", .val = BCMBAL_ACTION_CMD_ID_DISCARD_DS_BCAST }, { .name = "discard_ds_unknown", .val = BCMBAL_ACTION_CMD_ID_DISCARD_DS_UNKNOWN }, { .name = "add_two_tags", .val = BCMBAL_ACTION_CMD_ID_ADD_TWO_TAGS }, { .name = "remove_two_tags", .val = BCMBAL_ACTION_CMD_ID_REMOVE_TWO_TAGS }, { .name = "remark_pbits", .val = BCMBAL_ACTION_CMD_ID_REMARK_PBITS }, { .name = "copy_pbits", .val = BCMBAL_ACTION_CMD_ID_COPY_PBITS }, { .name = "reverse_copy_pbits", .val = BCMBAL_ACTION_CMD_ID_REVERSE_COPY_PBITS }, { .name = "dscp_to_pbits", .val = BCMBAL_ACTION_CMD_ID_DSCP_TO_PBITS }, { .name = "trap_to_host", .val = BCMBAL_ACTION_CMD_ID_TRAP_TO_HOST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_action_cmd_id = { .name = "bcmbal_action_cmd_id", .descr = "action_cmd_id", .size = sizeof(bcmbal_action_cmd_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_action_cmd_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_action_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_action, presence_mask), .type = &type_descr_bcmbal_action_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "cmds_bitmask", .descr = "Commands bitmask", .offset = offsetof(bcmbal_action, cmds_bitmask), .type = &type_descr_bcmbal_action_cmd_id }, { .name = "o_vid", .descr = "Outer vid", .offset = offsetof(bcmbal_action, o_vid), .type = &type_descr_uint16_t }, { .name = "o_pbits", .descr = "Outer pbits", .offset = offsetof(bcmbal_action, o_pbits), .type = &type_descr_uint8_t }, { .name = "o_tpid", .descr = "Outer tpid", .offset = offsetof(bcmbal_action, o_tpid), .type = &type_descr_uint16_t }, { .name = "i_vid", .descr = "Inner vid", .offset = offsetof(bcmbal_action, i_vid), .type = &type_descr_uint16_t }, { .name = "i_pbits", .descr = "Inner pbits", .offset = offsetof(bcmbal_action, i_pbits), .type = &type_descr_uint8_t }, { .name = "i_tpid", .descr = "Inner tpid", .offset = offsetof(bcmbal_action, i_tpid), .type = &type_descr_uint16_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_action = { .name = "bcmbal_action", .descr = "action", .size = sizeof(bcmbal_action), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_action_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_action_fields } } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_aggregation_port_id_list_u8 = { .name = "bcmbal_aggregation_port_id_list_u8", .descr = "Variable-length list of aggregation_port_id", .size = sizeof(bcmbal_aggregation_port_id_list_u8), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint16_t, .len_size = 1, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_aggregation_port_id) } } };
+bcmcli_enum_val bcmbal_classifier_id_string_table[] = { { .name = "none", .val = BCMBAL_CLASSIFIER_ID_NONE }, { .name = "o_tpid", .val = BCMBAL_CLASSIFIER_ID_O_TPID }, { .name = "o_vid", .val = BCMBAL_CLASSIFIER_ID_O_VID }, { .name = "i_tpid", .val = BCMBAL_CLASSIFIER_ID_I_TPID }, { .name = "i_vid", .val = BCMBAL_CLASSIFIER_ID_I_VID }, { .name = "o_pbits", .val = BCMBAL_CLASSIFIER_ID_O_PBITS }, { .name = "i_pbits", .val = BCMBAL_CLASSIFIER_ID_I_PBITS }, { .name = "ether_type", .val = BCMBAL_CLASSIFIER_ID_ETHER_TYPE }, { .name = "dst_mac", .val = BCMBAL_CLASSIFIER_ID_DST_MAC }, { .name = "src_mac", .val = BCMBAL_CLASSIFIER_ID_SRC_MAC }, { .name = "ip_proto", .val = BCMBAL_CLASSIFIER_ID_IP_PROTO }, { .name = "dst_ip", .val = BCMBAL_CLASSIFIER_ID_DST_IP }, { .name = "src_ip", .val = BCMBAL_CLASSIFIER_ID_SRC_IP }, { .name = "src_port", .val = BCMBAL_CLASSIFIER_ID_SRC_PORT }, { .name = "dst_port", .val = BCMBAL_CLASSIFIER_ID_DST_PORT }, { .name = "pkt_tag_type", .val = BCMBAL_CLASSIFIER_ID_PKT_TAG_TYPE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_classifier_id = { .name = "bcmbal_classifier_id", .descr = "classifier ID", .size = sizeof(bcmbal_classifier_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_classifier_id_string_table } };
+bcmcli_enum_val bcmbal_pkt_tag_type_string_table[] = { { .name = "none", .val = BCMBAL_PKT_TAG_TYPE_NONE }, { .name = "untagged", .val = BCMBAL_PKT_TAG_TYPE_UNTAGGED }, { .name = "single_tag", .val = BCMBAL_PKT_TAG_TYPE_SINGLE_TAG }, { .name = "double_tag", .val = BCMBAL_PKT_TAG_TYPE_DOUBLE_TAG }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_pkt_tag_type = { .name = "bcmbal_pkt_tag_type", .descr = "Packet tag type", .size = sizeof(bcmbal_pkt_tag_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_pkt_tag_type_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_classifier_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_classifier, presence_mask), .type = &type_descr_bcmbal_classifier_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "o_tpid", .descr = "Outer TPID of the packet to be classified", .offset = offsetof(bcmbal_classifier, o_tpid), .type = &type_descr_uint16_t }, { .name = "o_vid", .descr = "Outer VID of the packet to be classified", .offset = offsetof(bcmbal_classifier, o_vid), .type = &type_descr_uint16_t }, { .name = "i_tpid", .descr = "Inner TPID of the packet to be classified", .offset = offsetof(bcmbal_classifier, i_tpid), .type = &type_descr_uint16_t }, { .name = "i_vid", .descr = "Inner VID of the packet to be classified", .offset = offsetof(bcmbal_classifier, i_vid), .type = &type_descr_uint16_t }, { .name = "o_pbits", .descr = "Outer PBITS of the packet to be classified", .offset = offsetof(bcmbal_classifier, o_pbits), .type = &type_descr_uint8_t }, { .name = "i_pbits", .descr = "Inner PBITS of the packet to be classified", .offset = offsetof(bcmbal_classifier, i_pbits), .type = &type_descr_uint8_t }, { .name = "ether_type", .descr = "Ethertype of the packet to be classified", .offset = offsetof(bcmbal_classifier, ether_type), .type = &type_descr_uint16_t }, { .name = "dst_mac", .descr = "Destination MAC address of the packet to be classified", .offset = offsetof(bcmbal_classifier, dst_mac), .type = &type_descr_bcmos_mac_address }, { .name = "src_mac", .descr = "Source MAC address of the packet to be classified", .offset = offsetof(bcmbal_classifier, src_mac), .type = &type_descr_bcmos_mac_address }, { .name = "ip_proto", .descr = "IP protocol of the packet to be classified", .offset = offsetof(bcmbal_classifier, ip_proto), .type = &type_descr_uint8_t }, { .name = "dst_ip", .descr = "Destination IP address of the packet to be classified", .offset = offsetof(bcmbal_classifier, dst_ip), .type = &type_descr_bcmos_ipv4_address }, { .name = "src_ip", .descr = "Source IP address of the packet to be classified", .offset = offsetof(bcmbal_classifier, src_ip), .type = &type_descr_bcmos_ipv4_address }, { .name = "src_port", .descr = "Source port of the packet to be classified", .offset = offsetof(bcmbal_classifier, src_port), .type = &type_descr_uint16_t }, { .name = "dst_port", .descr = "Destination port of the packet to be classified", .offset = offsetof(bcmbal_classifier, dst_port), .type = &type_descr_uint16_t }, { .name = "pkt_tag_type", .descr = "The tag type of the ingress packets", .offset = offsetof(bcmbal_classifier, pkt_tag_type), .type = &type_descr_bcmbal_pkt_tag_type } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_classifier = { .name = "bcmbal_classifier", .descr = "classifier", .size = sizeof(bcmbal_classifier), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_classifier_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_classifier_fields } } };
+bcmcli_enum_val bcmbal_control_string_table[] = { { .name = "disable", .val = BCMBAL_CONTROL_DISABLE }, { .name = "enable", .val = BCMBAL_CONTROL_ENABLE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_control = { .name = "bcmbal_control", .descr = "Generic enable/disable enumeration", .size = sizeof(bcmbal_control), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_control_string_table } };
+bcmcli_enum_val bcmbal_dest_type_string_table[] = { { .name = "nni", .val = BCMBAL_DEST_TYPE_NNI }, { .name = "sub_term", .val = BCMBAL_DEST_TYPE_SUB_TERM }, { .name = "host", .val = BCMBAL_DEST_TYPE_HOST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_dest_type = { .name = "bcmbal_dest_type", .descr = "Destination type", .size = sizeof(bcmbal_dest_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_dest_type_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_dest_fields[] = { { .name = "type", .descr = "packet destination", .offset = offsetof(bcmbal_dest, type), .type = &type_descr_bcmbal_dest_type } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_dest_nni_fields[] = { { .name = "int_id", .descr = "Interface ID", .offset = offsetof(bcmbal_dest, u.nni.int_id) - offsetof(bcmbal_dest, u.nni.int_id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_dest_nni = { .name = "bcmbal_dest_nni", .descr = "Packet destination nni", .size = sizeof(((bcmbal_dest *)0)->u.nni), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_dest_nni_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_dest_nni_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_dest_sub_term_fields[] = { { .name = "sub_term_id", .descr = "Subscriber terminal ID", .offset = offsetof(bcmbal_dest, u.sub_term.sub_term_id) - offsetof(bcmbal_dest, u.sub_term.sub_term_id), .type = &type_descr_uint32_t }, { .name = "sub_term_uni", .descr = "Subscriber terminal UNI", .offset = offsetof(bcmbal_dest, u.sub_term.sub_term_uni) - offsetof(bcmbal_dest, u.sub_term.sub_term_id), .type = &type_descr_uint16_t }, { .name = "int_id", .descr = "Interface ID", .offset = offsetof(bcmbal_dest, u.sub_term.int_id) - offsetof(bcmbal_dest, u.sub_term.sub_term_id), .type = &type_descr_uint16_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_dest_sub_term = { .name = "bcmbal_dest_sub_term", .descr = "Packet destination subscriber terminal", .size = sizeof(((bcmbal_dest *)0)->u.sub_term), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_dest_sub_term_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_dest_sub_term_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_dest_union_fields[] = { { .name = "u.nni", .descr = "", .offset = offsetof(bcmbal_dest, u.nni), .type = &type_descr_bcmbal_dest_nni }, { .name = "u.sub_term", .descr = "", .offset = offsetof(bcmbal_dest, u.sub_term), .type = &type_descr_bcmbal_dest_sub_term }, { }, { } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_dest = { .name = "bcmbal_dest", .descr = "Packet destination", .size = sizeof(bcmbal_dest), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNION, .x = { .u = { .num_common_fields = sizeof(type_descr_bcmbal_dest_fields) / sizeof(bcmbal_apicli_field_descr), .common_fields = type_descr_bcmbal_dest_fields, .classifier_idx = 0, .union_fields = type_descr_bcmbal_dest_union_fields } } };
+bcmcli_enum_val bcmbal_ds_miss_mode_string_table[] = { { .name = "discard", .val = BCMBAL_DS_MISS_MODE_DISCARD }, { .name = "broadcast", .val = BCMBAL_DS_MISS_MODE_BROADCAST }, { .name = "vid", .val = BCMBAL_DS_MISS_MODE_VID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_ds_miss_mode = { .name = "bcmbal_ds_miss_mode", .descr = "Downstrean action for unknown packets", .size = sizeof(bcmbal_ds_miss_mode), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_ds_miss_mode_string_table } };
+bcmcli_enum_val bcmbal_extra_bw_eligibility_type_string_table[] = { { .name = "none", .val = BCMBAL_EXTRA_BW_ELIGIBILITY_TYPE_NONE }, { .name = "not_assured", .val = BCMBAL_EXTRA_BW_ELIGIBILITY_TYPE_NOT_ASSURED }, { .name = "best_effort", .val = BCMBAL_EXTRA_BW_ELIGIBILITY_TYPE_BEST_EFFORT }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_extra_bw_eligibility_type = { .name = "bcmbal_extra_bw_eligibility_type", .descr = "Extra BW Eligibility Type", .size = sizeof(bcmbal_extra_bw_eligibility_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_extra_bw_eligibility_type_string_table } };
+bcmcli_enum_val bcmbal_flow_cfg_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_FLOW_CFG_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_FLOW_CFG_ID_OPER_STATUS }, { .name = "access_int_id", .val = BCMBAL_FLOW_CFG_ID_ACCESS_INT_ID }, { .name = "network_int_id", .val = BCMBAL_FLOW_CFG_ID_NETWORK_INT_ID }, { .name = "sub_term_id", .val = BCMBAL_FLOW_CFG_ID_SUB_TERM_ID }, { .name = "sub_term_uni_idx", .val = BCMBAL_FLOW_CFG_ID_SUB_TERM_UNI_IDX }, { .name = "svc_port_id", .val = BCMBAL_FLOW_CFG_ID_SVC_PORT_ID }, { .name = "agg_port_id", .val = BCMBAL_FLOW_CFG_ID_AGG_PORT_ID }, { .name = "resolve_mac", .val = BCMBAL_FLOW_CFG_ID_RESOLVE_MAC }, { .name = "classifier", .val = BCMBAL_FLOW_CFG_ID_CLASSIFIER }, { .name = "action", .val = BCMBAL_FLOW_CFG_ID_ACTION }, { .name = "sla", .val = BCMBAL_FLOW_CFG_ID_SLA }, { .name = "cookie", .val = BCMBAL_FLOW_CFG_ID_COOKIE }, { .name = "priority", .val = BCMBAL_FLOW_CFG_ID_PRIORITY }, { .name = "group_id", .val = BCMBAL_FLOW_CFG_ID_GROUP_ID }, { .name = "queue", .val = BCMBAL_FLOW_CFG_ID_QUEUE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_cfg_id = { .name = "bcmbal_flow_cfg_id", .descr = "Identifiers for all properties contained in the flow_cfg group.", .size = sizeof(bcmbal_flow_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_flow_cfg_id_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_id_list_u32 = { .name = "bcmbal_flow_id_list_u32", .descr = "Variable-length list of flow_id", .size = sizeof(bcmbal_flow_id_list_u32), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint32_t, .len_size = 4, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_flow_id) } } };
+bcmcli_enum_val bcmbal_flow_ind_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_FLOW_IND_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_FLOW_IND_ID_OPER_STATUS }, { .name = "access_int_id", .val = BCMBAL_FLOW_IND_ID_ACCESS_INT_ID }, { .name = "network_int_id", .val = BCMBAL_FLOW_IND_ID_NETWORK_INT_ID }, { .name = "sub_term_id", .val = BCMBAL_FLOW_IND_ID_SUB_TERM_ID }, { .name = "svc_port_id", .val = BCMBAL_FLOW_IND_ID_SVC_PORT_ID }, { .name = "agg_port_id", .val = BCMBAL_FLOW_IND_ID_AGG_PORT_ID }, { .name = "resolve_mac", .val = BCMBAL_FLOW_IND_ID_RESOLVE_MAC }, { .name = "base_tc_id", .val = BCMBAL_FLOW_IND_ID_BASE_TC_ID }, { .name = "classifier", .val = BCMBAL_FLOW_IND_ID_CLASSIFIER }, { .name = "action", .val = BCMBAL_FLOW_IND_ID_ACTION }, { .name = "sla", .val = BCMBAL_FLOW_IND_ID_SLA }, { .name = "cookie", .val = BCMBAL_FLOW_IND_ID_COOKIE }, { .name = "priority", .val = BCMBAL_FLOW_IND_ID_PRIORITY }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_ind_id = { .name = "bcmbal_flow_ind_id", .descr = "Identifiers for all properties contained in the flow_ind group.", .size = sizeof(bcmbal_flow_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_flow_ind_id_string_table } };
+bcmcli_enum_val bcmbal_flow_key_id_string_table[] = { { .name = "flow_id", .val = BCMBAL_FLOW_KEY_ID_FLOW_ID }, { .name = "flow_type", .val = BCMBAL_FLOW_KEY_ID_FLOW_TYPE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_key_id = { .name = "bcmbal_flow_key_id", .descr = "Identifiers for all properties contained in the flow_key group.", .size = sizeof(bcmbal_flow_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_flow_key_id_string_table } };
+bcmcli_enum_val bcmbal_flow_stat_id_string_table[] = { { .name = "rx_packets", .val = BCMBAL_FLOW_STAT_ID_RX_PACKETS }, { .name = "rx_bytes", .val = BCMBAL_FLOW_STAT_ID_RX_BYTES }, { .name = "tx_packets", .val = BCMBAL_FLOW_STAT_ID_TX_PACKETS }, { .name = "tx_bytes", .val = BCMBAL_FLOW_STAT_ID_TX_BYTES }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_stat_id = { .name = "bcmbal_flow_stat_id", .descr = "Identifiers for all properties contained in the flow_stat group.", .size = sizeof(bcmbal_flow_stat_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_flow_stat_id_string_table } };
+bcmcli_enum_val bcmbal_flow_type_string_table[] = { { .name = "upstream", .val = BCMBAL_FLOW_TYPE_UPSTREAM }, { .name = "downstream", .val = BCMBAL_FLOW_TYPE_DOWNSTREAM }, { .name = "broadcast", .val = BCMBAL_FLOW_TYPE_BROADCAST }, { .name = "multicast", .val = BCMBAL_FLOW_TYPE_MULTICAST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_type = { .name = "bcmbal_flow_type", .descr = "Flow Type", .size = sizeof(bcmbal_flow_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_flow_type_string_table } };
+bcmcli_enum_val bcmbal_group_cfg_id_string_table[] = { { .name = "members_cmd", .val = BCMBAL_GROUP_CFG_ID_MEMBERS_CMD }, { .name = "members", .val = BCMBAL_GROUP_CFG_ID_MEMBERS }, { .name = "cookie", .val = BCMBAL_GROUP_CFG_ID_COOKIE }, { .name = "flows", .val = BCMBAL_GROUP_CFG_ID_FLOWS }, { .name = "owner", .val = BCMBAL_GROUP_CFG_ID_OWNER }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_cfg_id = { .name = "bcmbal_group_cfg_id", .descr = "Identifiers for all properties contained in the group_cfg group.", .size = sizeof(bcmbal_group_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_group_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_group_key_id_string_table[] = { { .name = "group_id", .val = BCMBAL_GROUP_KEY_ID_GROUP_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_key_id = { .name = "bcmbal_group_key_id", .descr = "Identifiers for all properties contained in the group_key group.", .size = sizeof(bcmbal_group_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_group_key_id_string_table } };
+bcmcli_enum_val bcmbal_group_member_cmd_string_table[] = { { .name = "add_members", .val = BCMBAL_GROUP_MEMBER_CMD_ADD_MEMBERS }, { .name = "rem_members", .val = BCMBAL_GROUP_MEMBER_CMD_REM_MEMBERS }, { .name = "set_members", .val = BCMBAL_GROUP_MEMBER_CMD_SET_MEMBERS }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_member_cmd = { .name = "bcmbal_group_member_cmd", .descr = "Member operation type", .size = sizeof(bcmbal_group_member_cmd), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_group_member_cmd_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_queue_ref_fields[] = { { .name = "sched_id", .descr = "Scheduler (tm_sched) ID", .offset = offsetof(bcmbal_tm_queue_ref, sched_id), .type = &type_descr_uint32_t }, { .name = "queue_id", .descr = "Queue ID", .offset = offsetof(bcmbal_tm_queue_ref, queue_id), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_ref = { .name = "bcmbal_tm_queue_ref", .descr = "Queue Reference", .size = sizeof(bcmbal_tm_queue_ref), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_queue_ref_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_queue_ref_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_group_member_info_fields[] = { { .name = "intf_id", .descr = "Access interface id for this member", .offset = offsetof(bcmbal_group_member_info, intf_id), .type = &type_descr_uint32_t }, { .name = "svc_port_id", .descr = "The multicast \"GEM\" for this member", .offset = offsetof(bcmbal_group_member_info, svc_port_id), .type = &type_descr_uint16_t }, { .name = "action", .descr = "VLAN actions", .offset = offsetof(bcmbal_group_member_info, action), .type = &type_descr_bcmbal_action }, { .name = "queue", .descr = "Egress queue", .offset = offsetof(bcmbal_group_member_info, queue), .type = &type_descr_bcmbal_tm_queue_ref } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_member_info = { .name = "bcmbal_group_member_info", .descr = "Group Member Info", .size = sizeof(bcmbal_group_member_info), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_group_member_info_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_group_member_info_fields } } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_member_info_list_u16 = { .name = "bcmbal_group_member_info_list_u16", .descr = "Variable-length list of group_member_info", .size = sizeof(bcmbal_group_member_info_list_u16), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_bcmbal_group_member_info, .len_size = 2, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_group_member_info) } } };
+bcmcli_enum_val bcmbal_group_owner_string_table[] = { { .name = "none", .val = BCMBAL_GROUP_OWNER_NONE }, { .name = "multicast", .val = BCMBAL_GROUP_OWNER_MULTICAST }, { .name = "unicast", .val = BCMBAL_GROUP_OWNER_UNICAST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_owner = { .name = "bcmbal_group_owner", .descr = "owner of the group", .size = sizeof(bcmbal_group_owner), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_group_owner_string_table } };
+bcmcli_enum_val bcmbal_interface_cfg_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_INTERFACE_CFG_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_INTERFACE_CFG_ID_OPER_STATUS }, { .name = "min_data_agg_port_id", .val = BCMBAL_INTERFACE_CFG_ID_MIN_DATA_AGG_PORT_ID }, { .name = "min_data_svc_port_id", .val = BCMBAL_INTERFACE_CFG_ID_MIN_DATA_SVC_PORT_ID }, { .name = "transceiver_type", .val = BCMBAL_INTERFACE_CFG_ID_TRANSCEIVER_TYPE }, { .name = "ds_miss_mode", .val = BCMBAL_INTERFACE_CFG_ID_DS_MISS_MODE }, { .name = "mtu", .val = BCMBAL_INTERFACE_CFG_ID_MTU }, { .name = "flow_control", .val = BCMBAL_INTERFACE_CFG_ID_FLOW_CONTROL }, { .name = "ds_tm", .val = BCMBAL_INTERFACE_CFG_ID_DS_TM }, { .name = "us_tm", .val = BCMBAL_INTERFACE_CFG_ID_US_TM }, { .name = "sub_term_id_list", .val = BCMBAL_INTERFACE_CFG_ID_SUB_TERM_ID_LIST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_cfg_id = { .name = "bcmbal_interface_cfg_id", .descr = "Identifiers for all properties contained in the interface_cfg group.", .size = sizeof(bcmbal_interface_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_interface_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_interface_ind_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_INTERFACE_IND_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_INTERFACE_IND_ID_OPER_STATUS }, { .name = "min_data_agg_port_id", .val = BCMBAL_INTERFACE_IND_ID_MIN_DATA_AGG_PORT_ID }, { .name = "min_data_svc_port_id", .val = BCMBAL_INTERFACE_IND_ID_MIN_DATA_SVC_PORT_ID }, { .name = "transceiver_type", .val = BCMBAL_INTERFACE_IND_ID_TRANSCEIVER_TYPE }, { .name = "ds_miss_mode", .val = BCMBAL_INTERFACE_IND_ID_DS_MISS_MODE }, { .name = "mtu", .val = BCMBAL_INTERFACE_IND_ID_MTU }, { .name = "flow_control", .val = BCMBAL_INTERFACE_IND_ID_FLOW_CONTROL }, { .name = "ds_tm", .val = BCMBAL_INTERFACE_IND_ID_DS_TM }, { .name = "us_tm", .val = BCMBAL_INTERFACE_IND_ID_US_TM }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_ind_id = { .name = "bcmbal_interface_ind_id", .descr = "Identifiers for all properties contained in the interface_ind group.", .size = sizeof(bcmbal_interface_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_interface_ind_id_string_table } };
+bcmcli_enum_val bcmbal_interface_key_id_string_table[] = { { .name = "intf_id", .val = BCMBAL_INTERFACE_KEY_ID_INTF_ID }, { .name = "intf_type", .val = BCMBAL_INTERFACE_KEY_ID_INTF_TYPE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_key_id = { .name = "bcmbal_interface_key_id", .descr = "Identifiers for all properties contained in the interface_key group.", .size = sizeof(bcmbal_interface_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_interface_key_id_string_table } };
+bcmcli_enum_val bcmbal_interface_stat_id_string_table[] = { { .name = "rx_packets", .val = BCMBAL_INTERFACE_STAT_ID_RX_PACKETS }, { .name = "rx_bytes", .val = BCMBAL_INTERFACE_STAT_ID_RX_BYTES }, { .name = "tx_packets", .val = BCMBAL_INTERFACE_STAT_ID_TX_PACKETS }, { .name = "tx_bytes", .val = BCMBAL_INTERFACE_STAT_ID_TX_BYTES }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_stat_id = { .name = "bcmbal_interface_stat_id", .descr = "Identifiers for all properties contained in the interface_stat group.", .size = sizeof(bcmbal_interface_stat_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_interface_stat_id_string_table } };
+bcmcli_enum_val bcmbal_intf_type_string_table[] = { { .name = "nni", .val = BCMBAL_INTF_TYPE_NNI }, { .name = "pon", .val = BCMBAL_INTF_TYPE_PON }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_intf_type = { .name = "bcmbal_intf_type", .descr = "Interface type", .size = sizeof(bcmbal_intf_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_intf_type_string_table } };
+bcmcli_enum_val bcmbal_iwf_mode_string_table[] = { { .name = "direct_mapping", .val = BCMBAL_IWF_MODE_DIRECT_MAPPING }, { .name = "per_flow", .val = BCMBAL_IWF_MODE_PER_FLOW }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_iwf_mode = { .name = "bcmbal_iwf_mode", .descr = "Interworking Function Mode", .size = sizeof(bcmbal_iwf_mode), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_iwf_mode_string_table } };
+bcmcli_enum_val bcmbal_packet_cfg_id_string_table[] = { { .name = "flow_id", .val = BCMBAL_PACKET_CFG_ID_FLOW_ID }, { .name = "flow_type", .val = BCMBAL_PACKET_CFG_ID_FLOW_TYPE }, { .name = "intf_id", .val = BCMBAL_PACKET_CFG_ID_INTF_ID }, { .name = "intf_type", .val = BCMBAL_PACKET_CFG_ID_INTF_TYPE }, { .name = "svc_port", .val = BCMBAL_PACKET_CFG_ID_SVC_PORT }, { .name = "flow_cookie", .val = BCMBAL_PACKET_CFG_ID_FLOW_COOKIE }, { .name = "pkt", .val = BCMBAL_PACKET_CFG_ID_PKT }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_cfg_id = { .name = "bcmbal_packet_cfg_id", .descr = "Identifiers for all properties contained in the packet_cfg group.", .size = sizeof(bcmbal_packet_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_packet_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_packet_ind_id_string_table[] = { { .name = "flow_id", .val = BCMBAL_PACKET_IND_ID_FLOW_ID }, { .name = "flow_type", .val = BCMBAL_PACKET_IND_ID_FLOW_TYPE }, { .name = "intf_id", .val = BCMBAL_PACKET_IND_ID_INTF_ID }, { .name = "intf_type", .val = BCMBAL_PACKET_IND_ID_INTF_TYPE }, { .name = "svc_port", .val = BCMBAL_PACKET_IND_ID_SVC_PORT }, { .name = "flow_cookie", .val = BCMBAL_PACKET_IND_ID_FLOW_COOKIE }, { .name = "pkt", .val = BCMBAL_PACKET_IND_ID_PKT }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_ind_id = { .name = "bcmbal_packet_ind_id", .descr = "Identifiers for all properties contained in the packet_ind group.", .size = sizeof(bcmbal_packet_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_packet_ind_id_string_table } };
+bcmcli_enum_val bcmbal_packet_key_id_string_table[] = { { .name = "reserved", .val = BCMBAL_PACKET_KEY_ID_RESERVED }, { .name = "packet_send_dest", .val = BCMBAL_PACKET_KEY_ID_PACKET_SEND_DEST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_key_id = { .name = "bcmbal_packet_key_id", .descr = "Identifiers for all properties contained in the packet_key group.", .size = sizeof(bcmbal_packet_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_packet_key_id_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint8_t_arr_10 = { .name = "uint8_t[10]", .descr = "Array of 10 elements of type uint8_t", .size = sizeof(uint8_t[10]), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED, .x = { .arr_fixed = { .elem_type = &type_descr_uint8_t, .size = 10 } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_password_fields[] = { { .name = "arr", .descr = "Array", .offset = offsetof(bcmbal_password, arr), .type = &type_descr_uint8_t_arr_10 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_password = { .name = "bcmbal_password", .descr = "Password", .size = sizeof(bcmbal_password), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_password_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_password_fields } } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint8_t_arr_36 = { .name = "uint8_t[36]", .descr = "Array of 36 elements of type uint8_t", .size = sizeof(uint8_t[36]), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED, .x = { .arr_fixed = { .elem_type = &type_descr_uint8_t, .size = 36 } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_registration_id_fields[] = { { .name = "arr", .descr = "ONU registration ID", .offset = offsetof(bcmbal_registration_id, arr), .type = &type_descr_uint8_t_arr_36 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_registration_id = { .name = "bcmbal_registration_id", .descr = "Registration id", .size = sizeof(bcmbal_registration_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_registration_id_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_registration_id_fields } } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_uint8_t_arr_4 = { .name = "uint8_t[4]", .descr = "Array of 4 elements of type uint8_t", .size = sizeof(uint8_t[4]), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED, .x = { .arr_fixed = { .elem_type = &type_descr_uint8_t, .size = 4 } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_serial_number_fields[] = { { .name = "vendor_id", .descr = "vendor id", .offset = offsetof(bcmbal_serial_number, vendor_id), .type = &type_descr_uint8_t_arr_4 }, { .name = "vendor_specific", .descr = "vendor specific", .offset = offsetof(bcmbal_serial_number, vendor_specific), .type = &type_descr_uint8_t_arr_4 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_serial_number = { .name = "bcmbal_serial_number", .descr = "Serial number", .size = sizeof(bcmbal_serial_number), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_serial_number_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_serial_number_fields } } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_service_port_id_list_u8 = { .name = "bcmbal_service_port_id_list_u8", .descr = "Variable-length list of service_port_id", .size = sizeof(bcmbal_service_port_id_list_u8), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint16_t, .len_size = 1, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_service_port_id) } } };
+bcmcli_enum_val bcmbal_sla_id_string_table[] = { { .name = "none", .val = BCMBAL_SLA_ID_NONE }, { .name = "min_rate", .val = BCMBAL_SLA_ID_MIN_RATE }, { .name = "max_rate", .val = BCMBAL_SLA_ID_MAX_RATE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_sla_id = { .name = "bcmbal_sla_id", .descr = "SLA ID", .size = sizeof(bcmbal_sla_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_sla_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_sla_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_sla, presence_mask), .type = &type_descr_bcmbal_sla_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "min_rate", .descr = "The minimal rate for this flow, in kilobits per second (optional)", .offset = offsetof(bcmbal_sla, min_rate), .type = &type_descr_uint32_t }, { .name = "max_rate", .descr = "The maximum rate for this flow, in kilobits per second (optional)", .offset = offsetof(bcmbal_sla, max_rate), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_sla = { .name = "bcmbal_sla", .descr = "SLA", .size = sizeof(bcmbal_sla), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_sla_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_sla_fields } } };
+bcmcli_enum_val bcmbal_state_string_table[] = { { .name = "up", .val = BCMBAL_STATE_UP }, { .name = "down", .val = BCMBAL_STATE_DOWN }, { .name = "testing", .val = BCMBAL_STATE_TESTING }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_state = { .name = "bcmbal_state", .descr = "Admin state values for access terminal object", .size = sizeof(bcmbal_state), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_state_string_table } };
+bcmcli_enum_val bcmbal_status_string_table[] = { { .name = "up", .val = BCMBAL_STATUS_UP }, { .name = "down", .val = BCMBAL_STATUS_DOWN }, { .name = "testing", .val = BCMBAL_STATUS_TESTING }, { .name = "not_present", .val = BCMBAL_STATUS_NOT_PRESENT }, { .name = "lower_layer_down", .val = BCMBAL_STATUS_LOWER_LAYER_DOWN }, { .name = "unknown", .val = BCMBAL_STATUS_UNKNOWN }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_status = { .name = "bcmbal_status", .descr = "Oper status values", .size = sizeof(bcmbal_status), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_status_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_sub_id_list_u16 = { .name = "bcmbal_sub_id_list_u16", .descr = "Variable-length list of sub_id", .size = sizeof(bcmbal_sub_id_list_u16), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint32_t, .len_size = 2, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_sub_id) } } };
+bcmcli_enum_val bcmbal_subscriber_terminal_cfg_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_OPER_STATUS }, { .name = "serial_number", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SERIAL_NUMBER }, { .name = "password", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_PASSWORD }, { .name = "registration_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_REGISTRATION_ID }, { .name = "svc_port_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SVC_PORT_ID }, { .name = "mac_address", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_MAC_ADDRESS }, { .name = "ds_tm", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_DS_TM }, { .name = "us_tm", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_US_TM }, { .name = "svc_port_id_list", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SVC_PORT_ID_LIST }, { .name = "agg_port_id_list", .val = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_AGG_PORT_ID_LIST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_cfg_id = { .name = "bcmbal_subscriber_terminal_cfg_id", .descr = "Identifiers for all properties contained in the subscriber_terminal_cfg group.", .size = sizeof(bcmbal_subscriber_terminal_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_subscriber_terminal_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_subscriber_terminal_ind_id_string_table[] = { { .name = "admin_state", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_ADMIN_STATE }, { .name = "oper_status", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_OPER_STATUS }, { .name = "serial_number", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_SERIAL_NUMBER }, { .name = "password", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_PASSWORD }, { .name = "registration_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_REGISTRATION_ID }, { .name = "svc_port_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_SVC_PORT_ID }, { .name = "mac_address", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_MAC_ADDRESS }, { .name = "ds_tm", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_DS_TM }, { .name = "us_tm", .val = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_US_TM }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_ind_id = { .name = "bcmbal_subscriber_terminal_ind_id", .descr = "Identifiers for all properties contained in the subscriber_terminal_ind group.", .size = sizeof(bcmbal_subscriber_terminal_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_subscriber_terminal_ind_id_string_table } };
+bcmcli_enum_val bcmbal_subscriber_terminal_key_id_string_table[] = { { .name = "sub_term_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID }, { .name = "intf_id", .val = BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_key_id = { .name = "bcmbal_subscriber_terminal_key_id", .descr = "Identifiers for all properties contained in the subscriber_terminal_key group.", .size = sizeof(bcmbal_subscriber_terminal_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_subscriber_terminal_key_id_string_table } };
+bcmcli_enum_val bcmbal_subscriber_terminal_stat_id_string_table[] = { { .name = "rx_packets", .val = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_RX_PACKETS }, { .name = "rx_bytes", .val = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_RX_BYTES }, { .name = "tx_packets", .val = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_TX_PACKETS }, { .name = "tx_bytes", .val = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_TX_BYTES }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_stat_id = { .name = "bcmbal_subscriber_terminal_stat_id", .descr = "Identifiers for all properties contained in the subscriber_terminal_stat group.", .size = sizeof(bcmbal_subscriber_terminal_stat_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_subscriber_terminal_stat_id_string_table } };
+bcmcli_enum_val bcmbal_tm_bac_type_string_table[] = { { .name = "taildrop", .val = BCMBAL_TM_BAC_TYPE_TAILDROP }, { .name = "wtaildrop", .val = BCMBAL_TM_BAC_TYPE_WTAILDROP }, { .name = "red", .val = BCMBAL_TM_BAC_TYPE_RED }, { .name = "wred", .val = BCMBAL_TM_BAC_TYPE_WRED }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_bac_type = { .name = "bcmbal_tm_bac_type", .descr = "Buffer Admission Control Type", .size = sizeof(bcmbal_tm_bac_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_bac_type_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_red_fields[] = { { .name = "min_threshold", .descr = "Min threshold in percent of max queue size", .offset = offsetof(bcmbal_tm_red, min_threshold), .type = &type_descr_uint8_t }, { .name = "max_threshold", .descr = "Max threshold in percent of max queue size", .offset = offsetof(bcmbal_tm_red, max_threshold), .type = &type_descr_uint8_t }, { .name = "max_probability", .descr = "Discard probability for occupancy between min_threshold and max_threshold", .offset = offsetof(bcmbal_tm_red, max_probability), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_red = { .name = "bcmbal_tm_red", .descr = "Random Early Discard Configuration", .size = sizeof(bcmbal_tm_red), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_red_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_red_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_bac_fields[] = { { .name = "type", .descr = "Buffer Admission Control Type", .offset = offsetof(bcmbal_tm_bac, type), .type = &type_descr_bcmbal_tm_bac_type } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_bac_taildrop_fields[] = { { .name = "max_size", .descr = "max number of packets in the queue", .offset = offsetof(bcmbal_tm_bac, u.taildrop.max_size) - offsetof(bcmbal_tm_bac, u.taildrop.max_size), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_bac_taildrop = { .name = "bcmbal_tm_bac_taildrop", .descr = "tm_bac taildrop", .size = sizeof(((bcmbal_tm_bac *)0)->u.taildrop), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_bac_taildrop_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_bac_taildrop_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_bac_red_fields[] = { { .name = "red", .descr = "Random Early Discard configuration", .offset = offsetof(bcmbal_tm_bac, u.red.red) - offsetof(bcmbal_tm_bac, u.red.red), .type = &type_descr_bcmbal_tm_red } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_bac_red = { .name = "bcmbal_tm_bac_red", .descr = "tm_bac red", .size = sizeof(((bcmbal_tm_bac *)0)->u.red), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_bac_red_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_bac_red_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_bac_wred_fields[] = { { .name = "green", .descr = "Green Random Early Discard Configuration", .offset = offsetof(bcmbal_tm_bac, u.wred.green) - offsetof(bcmbal_tm_bac, u.wred.green), .type = &type_descr_bcmbal_tm_red }, { .name = "yellow", .descr = "Yellow Random Early Discard Configuration", .offset = offsetof(bcmbal_tm_bac, u.wred.yellow) - offsetof(bcmbal_tm_bac, u.wred.green), .type = &type_descr_bcmbal_tm_red }, { .name = "red", .descr = "Red Random Early Discard Configuration", .offset = offsetof(bcmbal_tm_bac, u.wred.red) - offsetof(bcmbal_tm_bac, u.wred.green), .type = &type_descr_bcmbal_tm_red } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_bac_wred = { .name = "bcmbal_tm_bac_wred", .descr = "tm_bac wred", .size = sizeof(((bcmbal_tm_bac *)0)->u.wred), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_bac_wred_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_bac_wred_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_bac_union_fields[] = { { .name = "u.taildrop", .descr = "", .offset = offsetof(bcmbal_tm_bac, u.taildrop), .type = &type_descr_bcmbal_tm_bac_taildrop }, { }, { .name = "u.red", .descr = "", .offset = offsetof(bcmbal_tm_bac, u.red), .type = &type_descr_bcmbal_tm_bac_red }, { .name = "u.wred", .descr = "", .offset = offsetof(bcmbal_tm_bac, u.wred), .type = &type_descr_bcmbal_tm_bac_wred }, { } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_bac = { .name = "bcmbal_tm_bac", .descr = "Queue Buffer Admission Control", .size = sizeof(bcmbal_tm_bac), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNION, .x = { .u = { .num_common_fields = sizeof(type_descr_bcmbal_tm_bac_fields) / sizeof(bcmbal_apicli_field_descr), .common_fields = type_descr_bcmbal_tm_bac_fields, .classifier_idx = 0, .union_fields = type_descr_bcmbal_tm_bac_union_fields } } };
+bcmcli_enum_val bcmbal_tm_creation_mode_string_table[] = { { .name = "manual", .val = BCMBAL_TM_CREATION_MODE_MANUAL }, { .name = "auto", .val = BCMBAL_TM_CREATION_MODE_AUTO }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_creation_mode = { .name = "bcmbal_tm_creation_mode", .descr = "TM Creation Mode", .size = sizeof(bcmbal_tm_creation_mode), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_creation_mode_string_table } };
+bcmcli_enum_val bcmbal_tm_queue_cfg_id_string_table[] = { { .name = "priority", .val = BCMBAL_TM_QUEUE_CFG_ID_PRIORITY }, { .name = "weight", .val = BCMBAL_TM_QUEUE_CFG_ID_WEIGHT }, { .name = "rate", .val = BCMBAL_TM_QUEUE_CFG_ID_RATE }, { .name = "bac", .val = BCMBAL_TM_QUEUE_CFG_ID_BAC }, { .name = "creation_mode", .val = BCMBAL_TM_QUEUE_CFG_ID_CREATION_MODE }, { .name = "ref_count", .val = BCMBAL_TM_QUEUE_CFG_ID_REF_COUNT }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_cfg_id = { .name = "bcmbal_tm_queue_cfg_id", .descr = "Identifiers for all properties contained in the tm_queue_cfg group.", .size = sizeof(bcmbal_tm_queue_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_queue_cfg_id_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_id_list_u8 = { .name = "bcmbal_tm_queue_id_list_u8", .descr = "Variable-length list of tm_queue_id", .size = sizeof(bcmbal_tm_queue_id_list_u8), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint8_t, .len_size = 1, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_tm_queue_id) } } };
+bcmcli_enum_val bcmbal_tm_queue_ind_id_string_table[] = { { .name = "ret", .val = BCMBAL_TM_QUEUE_IND_ID_RET }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_ind_id = { .name = "bcmbal_tm_queue_ind_id", .descr = "Identifiers for all properties contained in the tm_queue_ind group.", .size = sizeof(bcmbal_tm_queue_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_queue_ind_id_string_table } };
+bcmcli_enum_val bcmbal_tm_queue_key_id_string_table[] = { { .name = "sched_id", .val = BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID }, { .name = "sched_dir", .val = BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR }, { .name = "id", .val = BCMBAL_TM_QUEUE_KEY_ID_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_key_id = { .name = "bcmbal_tm_queue_key_id", .descr = "Identifiers for all properties contained in the tm_queue_key group.", .size = sizeof(bcmbal_tm_queue_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_queue_key_id_string_table } };
+bcmcli_enum_val bcmbal_tm_queue_stat_id_string_table[] = { { .name = "packets_ok", .val = BCMBAL_TM_QUEUE_STAT_ID_PACKETS_OK }, { .name = "bytes_ok", .val = BCMBAL_TM_QUEUE_STAT_ID_BYTES_OK }, { .name = "packets_discarded", .val = BCMBAL_TM_QUEUE_STAT_ID_PACKETS_DISCARDED }, { .name = "bytes_discarded", .val = BCMBAL_TM_QUEUE_STAT_ID_BYTES_DISCARDED }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_stat_id = { .name = "bcmbal_tm_queue_stat_id", .descr = "Identifiers for all properties contained in the tm_queue_stat group.", .size = sizeof(bcmbal_tm_queue_stat_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_queue_stat_id_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_cfg_id_string_table[] = { { .name = "owner", .val = BCMBAL_TM_SCHED_CFG_ID_OWNER }, { .name = "sched_type", .val = BCMBAL_TM_SCHED_CFG_ID_SCHED_TYPE }, { .name = "sched_parent", .val = BCMBAL_TM_SCHED_CFG_ID_SCHED_PARENT }, { .name = "sched_child_type", .val = BCMBAL_TM_SCHED_CFG_ID_SCHED_CHILD_TYPE }, { .name = "rate", .val = BCMBAL_TM_SCHED_CFG_ID_RATE }, { .name = "tcont_sla", .val = BCMBAL_TM_SCHED_CFG_ID_TCONT_SLA }, { .name = "creation_mode", .val = BCMBAL_TM_SCHED_CFG_ID_CREATION_MODE }, { .name = "queues", .val = BCMBAL_TM_SCHED_CFG_ID_QUEUES }, { .name = "sub_scheds", .val = BCMBAL_TM_SCHED_CFG_ID_SUB_SCHEDS }, { .name = "num_priorities", .val = BCMBAL_TM_SCHED_CFG_ID_NUM_PRIORITIES }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_cfg_id = { .name = "bcmbal_tm_sched_cfg_id", .descr = "Identifiers for all properties contained in the tm_sched_cfg group.", .size = sizeof(bcmbal_tm_sched_cfg_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_cfg_id_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_child_type_string_table[] = { { .name = "queue", .val = BCMBAL_TM_SCHED_CHILD_TYPE_QUEUE }, { .name = "sched", .val = BCMBAL_TM_SCHED_CHILD_TYPE_SCHED }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_child_type = { .name = "bcmbal_tm_sched_child_type", .descr = "Scheduling Level for the Children TM ", .size = sizeof(bcmbal_tm_sched_child_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_child_type_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_dir_string_table[] = { { .name = "us", .val = BCMBAL_TM_SCHED_DIR_US }, { .name = "ds", .val = BCMBAL_TM_SCHED_DIR_DS }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_dir = { .name = "bcmbal_tm_sched_dir", .descr = "Traffic Direction", .size = sizeof(bcmbal_tm_sched_dir), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_dir_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_id_list_u8 = { .name = "bcmbal_tm_sched_id_list_u8", .descr = "Variable-length list of tm_sched_id", .size = sizeof(bcmbal_tm_sched_id_list_u8), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint32_t, .len_size = 1, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(bcmbal_tm_sched_id) } } };
+bcmcli_enum_val bcmbal_tm_sched_ind_id_string_table[] = { { .name = "ret", .val = BCMBAL_TM_SCHED_IND_ID_RET }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_ind_id = { .name = "bcmbal_tm_sched_ind_id", .descr = "Identifiers for all properties contained in the tm_sched_ind group.", .size = sizeof(bcmbal_tm_sched_ind_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_ind_id_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_key_id_string_table[] = { { .name = "dir", .val = BCMBAL_TM_SCHED_KEY_ID_DIR }, { .name = "id", .val = BCMBAL_TM_SCHED_KEY_ID_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_key_id = { .name = "bcmbal_tm_sched_key_id", .descr = "Identifiers for all properties contained in the tm_sched_key group.", .size = sizeof(bcmbal_tm_sched_key_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_key_id_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_owner_type_string_table[] = { { .name = "undefined", .val = BCMBAL_TM_SCHED_OWNER_TYPE_UNDEFINED }, { .name = "interface", .val = BCMBAL_TM_SCHED_OWNER_TYPE_INTERFACE }, { .name = "sub_term", .val = BCMBAL_TM_SCHED_OWNER_TYPE_SUB_TERM }, { .name = "agg_port", .val = BCMBAL_TM_SCHED_OWNER_TYPE_AGG_PORT }, { .name = "uni", .val = BCMBAL_TM_SCHED_OWNER_TYPE_UNI }, { .name = "virtual", .val = BCMBAL_TM_SCHED_OWNER_TYPE_VIRTUAL }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_type = { .name = "bcmbal_tm_sched_owner_type", .descr = "TM Scheduler Owner Type", .size = sizeof(bcmbal_tm_sched_owner_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_owner_type_string_table } };
+bcmcli_enum_val bcmbal_tm_sched_owner_agg_port_id_string_table[] = { { .name = "none", .val = BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_NONE }, { .name = "intf_id", .val = BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_INTF_ID }, { .name = "sub_term_id", .val = BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_SUB_TERM_ID }, { .name = "agg_port_id", .val = BCMBAL_TM_SCHED_OWNER_AGG_PORT_ID_AGG_PORT_ID }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_agg_port_id = { .name = "bcmbal_tm_sched_owner_agg_port_id", .descr = "tm_sched_owner agg_port ID", .size = sizeof(bcmbal_tm_sched_owner_agg_port_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_tm_sched_owner_agg_port_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_fields[] = { { .name = "type", .descr = "Owner type", .offset = offsetof(bcmbal_tm_sched_owner, type), .type = &type_descr_bcmbal_tm_sched_owner_type } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_interface_fields[] = { { .name = "intf_type", .descr = "Interface Type", .offset = offsetof(bcmbal_tm_sched_owner, u.interface.intf_type) - offsetof(bcmbal_tm_sched_owner, u.interface.intf_type), .type = &type_descr_bcmbal_intf_type }, { .name = "intf_id", .descr = "Interface ID", .offset = offsetof(bcmbal_tm_sched_owner, u.interface.intf_id) - offsetof(bcmbal_tm_sched_owner, u.interface.intf_type), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_interface = { .name = "bcmbal_tm_sched_owner_interface", .descr = "tm_sched_owner interface", .size = sizeof(((bcmbal_tm_sched_owner *)0)->u.interface), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_owner_interface_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_owner_interface_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_sub_term_fields[] = { { .name = "intf_id", .descr = "PON interface id", .offset = offsetof(bcmbal_tm_sched_owner, u.sub_term.intf_id) - offsetof(bcmbal_tm_sched_owner, u.sub_term.intf_id), .type = &type_descr_uint32_t }, { .name = "sub_term_id", .descr = "Subscriber terminal ID", .offset = offsetof(bcmbal_tm_sched_owner, u.sub_term.sub_term_id) - offsetof(bcmbal_tm_sched_owner, u.sub_term.intf_id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_sub_term = { .name = "bcmbal_tm_sched_owner_sub_term", .descr = "tm_sched_owner subs_term", .size = sizeof(((bcmbal_tm_sched_owner *)0)->u.sub_term), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_owner_sub_term_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_owner_sub_term_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_agg_port_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_tm_sched_owner, u.agg_port.presence_mask) - offsetof(bcmbal_tm_sched_owner, u.agg_port.presence_mask), .type = &type_descr_bcmbal_tm_sched_owner_agg_port_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "intf_id", .descr = "PON interface id", .offset = offsetof(bcmbal_tm_sched_owner, u.agg_port.intf_id) - offsetof(bcmbal_tm_sched_owner, u.agg_port.presence_mask), .type = &type_descr_uint8_t }, { .name = "sub_term_id", .descr = "Subscriber terminal id", .offset = offsetof(bcmbal_tm_sched_owner, u.agg_port.sub_term_id) - offsetof(bcmbal_tm_sched_owner, u.agg_port.presence_mask), .type = &type_descr_uint32_t }, { .name = "agg_port_id", .descr = "Aggregation port id", .offset = offsetof(bcmbal_tm_sched_owner, u.agg_port.agg_port_id) - offsetof(bcmbal_tm_sched_owner, u.agg_port.presence_mask), .type = &type_descr_uint16_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_agg_port = { .name = "bcmbal_tm_sched_owner_agg_port", .descr = "tm_sched_owner agg_port", .size = sizeof(((bcmbal_tm_sched_owner *)0)->u.agg_port), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_owner_agg_port_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_owner_agg_port_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_uni_fields[] = { { .name = "intf_id", .descr = "PON interface id", .offset = offsetof(bcmbal_tm_sched_owner, u.uni.intf_id) - offsetof(bcmbal_tm_sched_owner, u.uni.intf_id), .type = &type_descr_uint8_t }, { .name = "sub_term_id", .descr = "Subscriber terminal id", .offset = offsetof(bcmbal_tm_sched_owner, u.uni.sub_term_id) - offsetof(bcmbal_tm_sched_owner, u.uni.intf_id), .type = &type_descr_uint32_t }, { .name = "idx", .descr = "Index at subscriber terminal", .offset = offsetof(bcmbal_tm_sched_owner, u.uni.idx) - offsetof(bcmbal_tm_sched_owner, u.uni.intf_id), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_uni = { .name = "bcmbal_tm_sched_owner_uni", .descr = "tm_sched_owner uni", .size = sizeof(((bcmbal_tm_sched_owner *)0)->u.uni), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_owner_uni_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_owner_uni_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_virtual_fields[] = { { .name = "idx", .descr = "Owner index", .offset = offsetof(bcmbal_tm_sched_owner, u.virtual.idx) - offsetof(bcmbal_tm_sched_owner, u.virtual.idx), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_virtual = { .name = "bcmbal_tm_sched_owner_virtual", .descr = "tm_sched_owner virtual", .size = sizeof(((bcmbal_tm_sched_owner *)0)->u.virtual), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_owner_virtual_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_owner_virtual_fields } } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner_union_fields[] = { { }, { .name = "u.interface", .descr = "", .offset = offsetof(bcmbal_tm_sched_owner, u.interface), .type = &type_descr_bcmbal_tm_sched_owner_interface }, { .name = "u.sub_term", .descr = "", .offset = offsetof(bcmbal_tm_sched_owner, u.sub_term), .type = &type_descr_bcmbal_tm_sched_owner_sub_term }, { .name = "u.agg_port", .descr = "", .offset = offsetof(bcmbal_tm_sched_owner, u.agg_port), .type = &type_descr_bcmbal_tm_sched_owner_agg_port }, { .name = "u.uni", .descr = "", .offset = offsetof(bcmbal_tm_sched_owner, u.uni), .type = &type_descr_bcmbal_tm_sched_owner_uni }, { .name = "u.virtual", .descr = "", .offset = offsetof(bcmbal_tm_sched_owner, u.virtual), .type = &type_descr_bcmbal_tm_sched_owner_virtual }, { } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_owner = { .name = "bcmbal_tm_sched_owner", .descr = "TM Scheduler Owner", .size = sizeof(bcmbal_tm_sched_owner), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_UNION, .x = { .u = { .num_common_fields = sizeof(type_descr_bcmbal_tm_sched_owner_fields) / sizeof(bcmbal_apicli_field_descr), .common_fields = type_descr_bcmbal_tm_sched_owner_fields, .classifier_idx = 0, .union_fields = type_descr_bcmbal_tm_sched_owner_union_fields } } };
+bcmcli_enum_val bcmbal_tm_sched_parent_id_string_table[] = { { .name = "none", .val = BCMBAL_TM_SCHED_PARENT_ID_NONE }, { .name = "sched_id", .val = BCMBAL_TM_SCHED_PARENT_ID_SCHED_ID }, { .name = "priority", .val = BCMBAL_TM_SCHED_PARENT_ID_PRIORITY }, { .name = "weight", .val = BCMBAL_TM_SCHED_PARENT_ID_WEIGHT }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_parent_id = { .name = "bcmbal_tm_sched_parent_id", .descr = "tm_sched_parent ID", .size = sizeof(bcmbal_tm_sched_parent_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_tm_sched_parent_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_parent_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_tm_sched_parent, presence_mask), .type = &type_descr_bcmbal_tm_sched_parent_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "sched_id", .descr = "Parent scheduler id", .offset = offsetof(bcmbal_tm_sched_parent, sched_id), .type = &type_descr_uint32_t }, { .name = "priority", .descr = "Priority", .offset = offsetof(bcmbal_tm_sched_parent, priority), .type = &type_descr_uint8_t }, { .name = "weight", .descr = "Weight", .offset = offsetof(bcmbal_tm_sched_parent, weight), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_parent = { .name = "bcmbal_tm_sched_parent", .descr = "Scheduling Parent Connect Point", .size = sizeof(bcmbal_tm_sched_parent), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_parent_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_parent_fields } } };
+bcmcli_enum_val bcmbal_tm_sched_type_string_table[] = { { .name = "none", .val = BCMBAL_TM_SCHED_TYPE_NONE }, { .name = "wfq", .val = BCMBAL_TM_SCHED_TYPE_WFQ }, { .name = "sp", .val = BCMBAL_TM_SCHED_TYPE_SP }, { .name = "sp_wfq", .val = BCMBAL_TM_SCHED_TYPE_SP_WFQ }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_type = { .name = "bcmbal_tm_sched_type", .descr = "Scheduler Type", .size = sizeof(bcmbal_tm_sched_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_tm_sched_type_string_table } };
+bcmcli_enum_val bcmbal_tm_shaping_id_string_table[] = { { .name = "none", .val = BCMBAL_TM_SHAPING_ID_NONE }, { .name = "sbr", .val = BCMBAL_TM_SHAPING_ID_SBR }, { .name = "pbr", .val = BCMBAL_TM_SHAPING_ID_PBR }, { .name = "burst", .val = BCMBAL_TM_SHAPING_ID_BURST }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_shaping_id = { .name = "bcmbal_tm_shaping_id", .descr = "tm_shaping ID", .size = sizeof(bcmbal_tm_shaping_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_tm_shaping_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_shaping_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_tm_shaping, presence_mask), .type = &type_descr_bcmbal_tm_shaping_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "sbr", .descr = "Sustained Bit Rate (kbps)", .offset = offsetof(bcmbal_tm_shaping, sbr), .type = &type_descr_uint32_t }, { .name = "pbr", .descr = "Peak Bit Rate (kbps)", .offset = offsetof(bcmbal_tm_shaping, pbr), .type = &type_descr_uint32_t }, { .name = "burst", .descr = "Max Burst Bytes at Peak Bit Rate", .offset = offsetof(bcmbal_tm_shaping, burst), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_shaping = { .name = "bcmbal_tm_shaping", .descr = "Shaping Parameters", .size = sizeof(bcmbal_tm_shaping), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_shaping_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_shaping_fields } } };
+bcmcli_enum_val bcmbal_tm_tcont_sla_id_string_table[] = { { .name = "none", .val = BCMBAL_TM_TCONT_SLA_ID_NONE }, { .name = "extra_bw_elig", .val = BCMBAL_TM_TCONT_SLA_ID_EXTRA_BW_ELIG }, { .name = "nrt_cbr", .val = BCMBAL_TM_TCONT_SLA_ID_NRT_CBR }, { .name = "rt_cbr", .val = BCMBAL_TM_TCONT_SLA_ID_RT_CBR }, { .name = "rt_profile", .val = BCMBAL_TM_TCONT_SLA_ID_RT_PROFILE }, { .name = "nrt_profile", .val = BCMBAL_TM_TCONT_SLA_ID_NRT_PROFILE }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_tcont_sla_id = { .name = "bcmbal_tm_tcont_sla_id", .descr = "tm_tcont_sla ID", .size = sizeof(bcmbal_tm_tcont_sla_id), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK, .x = { .e = bcmbal_tm_tcont_sla_id_string_table } };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_tcont_sla_fields[] = { { .name = "presence_mask", .descr = "Presence Mask", .offset = offsetof(bcmbal_tm_tcont_sla, presence_mask), .type = &type_descr_bcmbal_tm_tcont_sla_id, .flags = BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK }, { .name = "extra_bw_elig", .descr = "Extra BW eligibility type", .offset = offsetof(bcmbal_tm_tcont_sla, extra_bw_elig), .type = &type_descr_bcmbal_extra_bw_eligibility_type }, { .name = "nrt_cbr", .descr = "NRT CBR", .offset = offsetof(bcmbal_tm_tcont_sla, nrt_cbr), .type = &type_descr_uint8_t }, { .name = "rt_cbr", .descr = "RT_CBR", .offset = offsetof(bcmbal_tm_tcont_sla, rt_cbr), .type = &type_descr_uint8_t }, { .name = "rt_profile", .descr = "RT Profile", .offset = offsetof(bcmbal_tm_tcont_sla, rt_profile), .type = &type_descr_uint8_t }, { .name = "nrt_profile", .descr = "NRT Profile", .offset = offsetof(bcmbal_tm_tcont_sla, nrt_profile), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_tcont_sla = { .name = "bcmbal_tm_tcont_sla", .descr = "ITU-PON Extended SLA Parameters", .size = sizeof(bcmbal_tm_tcont_sla), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_tcont_sla_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_tcont_sla_fields } } };
+bcmcli_enum_val bcmbal_trx_type_string_table[] = { { .name = "gpon_sps_43_48", .val = BCMBAL_TRX_TYPE_GPON_SPS_43_48 }, { .name = "gpon_sps_sog_4321", .val = BCMBAL_TRX_TYPE_GPON_SPS_SOG_4321 }, { .name = "gpon_lte_3680_m", .val = BCMBAL_TRX_TYPE_GPON_LTE_3680_M }, { .name = "gpon_source_photonics", .val = BCMBAL_TRX_TYPE_GPON_SOURCE_PHOTONICS }, { .name = "gpon_lte_3680_p", .val = BCMBAL_TRX_TYPE_GPON_LTE_3680_P }, { .name = "xgpon_lth_7222_pc", .val = BCMBAL_TRX_TYPE_XGPON_LTH_7222_PC }, { .name = "xgpon_lth_7226_pc", .val = BCMBAL_TRX_TYPE_XGPON_LTH_7226_PC }, { .name = "xgpon_lth_5302_pc", .val = BCMBAL_TRX_TYPE_XGPON_LTH_5302_PC }, BCMCLI_ENUM_LAST };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_trx_type = { .name = "bcmbal_trx_type", .descr = "Transceiver types", .size = sizeof(bcmbal_trx_type), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ENUM, .x = { .e = bcmbal_trx_type_string_table } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_u8_list_u32 = { .name = "bcmbal_u8_list_u32", .descr = "Variable-length list of U8", .size = sizeof(bcmbal_u8_list_u32), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN, .x = { .arr_dyn = { .elem_type = &type_descr_uint8_t, .len_size = 4, .max_size = DEFAULT_DYN_ARR_MAX_SIZE / sizeof(uint8_t) } } };
+
+/* ==== Object: access_terminal ==== */
+
+/* Group: access_terminal - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_key_access_term_id = { .name = "access_term_id", .descr = "Reserved (set to 0)", .access = 0, .property = BCMBAL_ACCESS_TERMINAL_KEY_ID_ACCESS_TERM_ID, .offset = offsetof(bcmbal_access_terminal_key, access_term_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR access_terminal_key_prop_array[] = { &prop_descr_access_terminal_key_access_term_id };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_access_terminal_key_fields[] = { { .name = "access_term_id", .descr = "Reserved (set to 0)", .offset = offsetof(bcmbal_access_terminal_key, access_term_id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_key = { .name = "bcmbal_access_terminal_key", .descr = "key", .size = sizeof(bcmbal_access_terminal_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_access_terminal_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_access_terminal_key_fields } } };
+
+/* Group: access_terminal - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_cfg_admin_state = { .name = "admin_state", .descr = "Administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_ACCESS_TERMINAL_CFG_ID_ADMIN_STATE, .offset = offsetof(bcmbal_access_terminal_cfg_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_cfg_oper_status = { .name = "oper_status", .descr = "Operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_ACCESS_TERMINAL_CFG_ID_OPER_STATUS, .offset = offsetof(bcmbal_access_terminal_cfg_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_cfg_iwf_mode = { .name = "iwf_mode", .descr = "The interworking mode", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_ACCESS_TERMINAL_CFG_ID_IWF_MODE, .offset = offsetof(bcmbal_access_terminal_cfg_data, iwf_mode), .type = &type_descr_bcmbal_iwf_mode };
+static bcmbal_apicli_prop_descr * BCM_DESCR access_terminal_cfg_prop_array[] = { &prop_descr_access_terminal_cfg_admin_state, &prop_descr_access_terminal_cfg_oper_status, &prop_descr_access_terminal_cfg_iwf_mode };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_access_terminal_cfg_data_fields[] = { { .name = "admin_state", .descr = "Administrative state", .offset = offsetof(bcmbal_access_terminal_cfg_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Operational status", .offset = offsetof(bcmbal_access_terminal_cfg_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "iwf_mode", .descr = "The interworking mode", .offset = offsetof(bcmbal_access_terminal_cfg_data, iwf_mode), .type = &type_descr_bcmbal_iwf_mode } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_cfg_data = { .name = "bcmbal_access_terminal_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_access_terminal_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_access_terminal_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_access_terminal_cfg_data_fields } } };
+
+/* Group: access_terminal - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_ind_admin_state = { .name = "admin_state", .descr = "Current administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_ACCESS_TERMINAL_IND_ID_ADMIN_STATE, .offset = offsetof(bcmbal_access_terminal_ind_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_ind_oper_status = { .name = "oper_status", .descr = "Current operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_ACCESS_TERMINAL_IND_ID_OPER_STATUS, .offset = offsetof(bcmbal_access_terminal_ind_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_access_terminal_ind_iwf_mode = { .name = "iwf_mode", .descr = "The interworking mode", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_ACCESS_TERMINAL_IND_ID_IWF_MODE, .offset = offsetof(bcmbal_access_terminal_ind_data, iwf_mode), .type = &type_descr_bcmbal_iwf_mode };
+static bcmbal_apicli_prop_descr * BCM_DESCR access_terminal_ind_prop_array[] = { &prop_descr_access_terminal_ind_admin_state, &prop_descr_access_terminal_ind_oper_status, &prop_descr_access_terminal_ind_iwf_mode };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_access_terminal_ind_data_fields[] = { { .name = "admin_state", .descr = "Current administrative state", .offset = offsetof(bcmbal_access_terminal_ind_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Current operational status", .offset = offsetof(bcmbal_access_terminal_ind_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "iwf_mode", .descr = "The interworking mode", .offset = offsetof(bcmbal_access_terminal_ind_data, iwf_mode), .type = &type_descr_bcmbal_iwf_mode } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_access_terminal_ind_data = { .name = "bcmbal_access_terminal_ind_data", .descr = "Access Terminal Indication", .size = sizeof(bcmbal_access_terminal_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_access_terminal_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_access_terminal_ind_data_fields } } };
+
+/* ==== Object: flow ==== */
+
+/* Group: flow - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_admin_state = { .name = "admin_state", .descr = "Administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_ADMIN_STATE, .offset = offsetof(bcmbal_flow_cfg_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_oper_status = { .name = "oper_status", .descr = "Operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_FLOW_CFG_ID_OPER_STATUS, .offset = offsetof(bcmbal_flow_cfg_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_access_int_id = { .name = "access_int_id", .descr = "The ID of the subscriber side interface; i.e. PON", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_ACCESS_INT_ID, .offset = offsetof(bcmbal_flow_cfg_data, access_int_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_network_int_id = { .name = "network_int_id", .descr = "The ID of the network side interface; i.e. NNI", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_NETWORK_INT_ID, .offset = offsetof(bcmbal_flow_cfg_data, network_int_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_sub_term_id = { .name = "sub_term_id", .descr = "The ID of the subsccriber terminal device", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_SUB_TERM_ID, .offset = offsetof(bcmbal_flow_cfg_data, sub_term_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_sub_term_uni_idx = { .name = "sub_term_uni_idx", .descr = "The index of the subsccriber terminal uni port the flow is related to", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_SUB_TERM_UNI_IDX, .offset = offsetof(bcmbal_flow_cfg_data, sub_term_uni_idx), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_svc_port_id = { .name = "svc_port_id", .descr = "The ID of the service port (for GPON/XGPON - GEM ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_SVC_PORT_ID, .offset = offsetof(bcmbal_flow_cfg_data, svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_agg_port_id = { .name = "agg_port_id", .descr = "The ID of the aggregate port (for GPON/XGPON - ALLOC ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_AGG_PORT_ID, .offset = offsetof(bcmbal_flow_cfg_data, agg_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_resolve_mac = { .name = "resolve_mac", .descr = "A flag indicating if the MAC address table should be used in DS GEM resolution", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_RESOLVE_MAC, .offset = offsetof(bcmbal_flow_cfg_data, resolve_mac), .type = &type_descr_bcmos_bool };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_classifier = { .name = "classifier", .descr = "The classifier for this flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_CLASSIFIER, .offset = offsetof(bcmbal_flow_cfg_data, classifier), .type = &type_descr_bcmbal_classifier };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_action = { .name = "action", .descr = "The action associated with the flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_ACTION, .offset = offsetof(bcmbal_flow_cfg_data, action), .type = &type_descr_bcmbal_action };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_sla = { .name = "sla", .descr = "SLA parameters for this flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_SLA, .offset = offsetof(bcmbal_flow_cfg_data, sla), .type = &type_descr_bcmbal_sla };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_cookie = { .name = "cookie", .descr = "Application cookie", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_COOKIE, .offset = offsetof(bcmbal_flow_cfg_data, cookie), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_priority = { .name = "priority", .descr = "Priority", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_PRIORITY, .offset = offsetof(bcmbal_flow_cfg_data, priority), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_group_id = { .name = "group_id", .descr = "RW - The multicast group associated with this flow, valid for type MULTICAST only", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_GROUP_ID, .offset = offsetof(bcmbal_flow_cfg_data, group_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_cfg_queue = { .name = "queue", .descr = "Egress queue", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_CFG_ID_QUEUE, .offset = offsetof(bcmbal_flow_cfg_data, queue), .type = &type_descr_bcmbal_tm_queue_ref };
+static bcmbal_apicli_prop_descr * BCM_DESCR flow_cfg_prop_array[] = { &prop_descr_flow_cfg_admin_state, &prop_descr_flow_cfg_oper_status, &prop_descr_flow_cfg_access_int_id, &prop_descr_flow_cfg_network_int_id, &prop_descr_flow_cfg_sub_term_id, &prop_descr_flow_cfg_sub_term_uni_idx, &prop_descr_flow_cfg_svc_port_id, &prop_descr_flow_cfg_agg_port_id, &prop_descr_flow_cfg_resolve_mac, &prop_descr_flow_cfg_classifier, &prop_descr_flow_cfg_action, &prop_descr_flow_cfg_sla, &prop_descr_flow_cfg_cookie, &prop_descr_flow_cfg_priority, &prop_descr_flow_cfg_group_id, &prop_descr_flow_cfg_queue };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_flow_cfg_data_fields[] = { { .name = "admin_state", .descr = "Administrative state", .offset = offsetof(bcmbal_flow_cfg_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Operational status", .offset = offsetof(bcmbal_flow_cfg_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "access_int_id", .descr = "The ID of the subscriber side interface; i.e. PON", .offset = offsetof(bcmbal_flow_cfg_data, access_int_id), .type = &type_descr_uint32_t }, { .name = "network_int_id", .descr = "The ID of the network side interface; i.e. NNI", .offset = offsetof(bcmbal_flow_cfg_data, network_int_id), .type = &type_descr_uint32_t }, { .name = "sub_term_id", .descr = "The ID of the subsccriber terminal device", .offset = offsetof(bcmbal_flow_cfg_data, sub_term_id), .type = &type_descr_uint32_t }, { .name = "sub_term_uni_idx", .descr = "The index of the subsccriber terminal uni port the flow is related to", .offset = offsetof(bcmbal_flow_cfg_data, sub_term_uni_idx), .type = &type_descr_uint8_t }, { .name = "svc_port_id", .descr = "The ID of the service port (for GPON/XGPON - GEM ID)", .offset = offsetof(bcmbal_flow_cfg_data, svc_port_id), .type = &type_descr_uint16_t }, { .name = "agg_port_id", .descr = "The ID of the aggregate port (for GPON/XGPON - ALLOC ID)", .offset = offsetof(bcmbal_flow_cfg_data, agg_port_id), .type = &type_descr_uint16_t }, { .name = "resolve_mac", .descr = "A flag indicating if the MAC address table should be used in DS GEM resolution", .offset = offsetof(bcmbal_flow_cfg_data, resolve_mac), .type = &type_descr_bcmos_bool }, { .name = "classifier", .descr = "The classifier for this flow", .offset = offsetof(bcmbal_flow_cfg_data, classifier), .type = &type_descr_bcmbal_classifier }, { .name = "action", .descr = "The action associated with the flow", .offset = offsetof(bcmbal_flow_cfg_data, action), .type = &type_descr_bcmbal_action }, { .name = "sla", .descr = "SLA parameters for this flow", .offset = offsetof(bcmbal_flow_cfg_data, sla), .type = &type_descr_bcmbal_sla }, { .name = "cookie", .descr = "Application cookie", .offset = offsetof(bcmbal_flow_cfg_data, cookie), .type = &type_descr_uint64_t }, { .name = "priority", .descr = "Priority", .offset = offsetof(bcmbal_flow_cfg_data, priority), .type = &type_descr_uint16_t }, { .name = "group_id", .descr = "RW - The multicast group associated with this flow, valid for type MULTICAST only", .offset = offsetof(bcmbal_flow_cfg_data, group_id), .type = &type_descr_uint32_t }, { .name = "queue", .descr = "Egress queue", .offset = offsetof(bcmbal_flow_cfg_data, queue), .type = &type_descr_bcmbal_tm_queue_ref } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_cfg_data = { .name = "bcmbal_flow_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_flow_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_flow_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_flow_cfg_data_fields } } };
+
+/* Group: flow - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_key_flow_id = { .name = "flow_id", .descr = "The ID of the flow object instance being referenced", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_KEY_ID_FLOW_ID, .offset = offsetof(bcmbal_flow_key, flow_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_key_flow_type = { .name = "flow_type", .descr = "The type of the flow, Upstream, Downstream, Broadcast or Multicast", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_KEY_ID_FLOW_TYPE, .offset = offsetof(bcmbal_flow_key, flow_type), .type = &type_descr_bcmbal_flow_type };
+static bcmbal_apicli_prop_descr * BCM_DESCR flow_key_prop_array[] = { &prop_descr_flow_key_flow_id, &prop_descr_flow_key_flow_type };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_flow_key_fields[] = { { .name = "flow_id", .descr = "The ID of the flow object instance being referenced", .offset = offsetof(bcmbal_flow_key, flow_id), .type = &type_descr_uint32_t }, { .name = "flow_type", .descr = "The type of the flow, Upstream, Downstream, Broadcast or Multicast", .offset = offsetof(bcmbal_flow_key, flow_type), .type = &type_descr_bcmbal_flow_type } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_key = { .name = "bcmbal_flow_key", .descr = "key", .size = sizeof(bcmbal_flow_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_flow_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_flow_key_fields } } };
+
+/* Group: flow - stat */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_stat_rx_packets = { .name = "rx_packets", .descr = "Received packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_STAT_ID_RX_PACKETS, .offset = offsetof(bcmbal_flow_stat_data, rx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_stat_rx_bytes = { .name = "rx_bytes", .descr = "Received bytes", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_STAT_ID_RX_BYTES, .offset = offsetof(bcmbal_flow_stat_data, rx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_stat_tx_packets = { .name = "tx_packets", .descr = "Transmitted packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_STAT_ID_TX_PACKETS, .offset = offsetof(bcmbal_flow_stat_data, tx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_stat_tx_bytes = { .name = "tx_bytes", .descr = "Transmitted bytes", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_STAT_ID_TX_BYTES, .offset = offsetof(bcmbal_flow_stat_data, tx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR flow_stat_prop_array[] = { &prop_descr_flow_stat_rx_packets, &prop_descr_flow_stat_rx_bytes, &prop_descr_flow_stat_tx_packets, &prop_descr_flow_stat_tx_bytes };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_flow_stat_data_fields[] = { { .name = "rx_packets", .descr = "Received packets", .offset = offsetof(bcmbal_flow_stat_data, rx_packets), .type = &type_descr_uint64_t }, { .name = "rx_bytes", .descr = "Received bytes", .offset = offsetof(bcmbal_flow_stat_data, rx_bytes), .type = &type_descr_uint64_t }, { .name = "tx_packets", .descr = "Transmitted packets", .offset = offsetof(bcmbal_flow_stat_data, tx_packets), .type = &type_descr_uint64_t }, { .name = "tx_bytes", .descr = "Transmitted bytes", .offset = offsetof(bcmbal_flow_stat_data, tx_bytes), .type = &type_descr_uint64_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_stat_data = { .name = "bcmbal_flow_stat_data", .descr = "stat", .size = sizeof(bcmbal_flow_stat_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_flow_stat_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_flow_stat_data_fields } } };
+
+/* Group: flow - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_admin_state = { .name = "admin_state", .descr = "Administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_ADMIN_STATE, .offset = offsetof(bcmbal_flow_ind_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_oper_status = { .name = "oper_status", .descr = "Operational Status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_OPER_STATUS, .offset = offsetof(bcmbal_flow_ind_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_access_int_id = { .name = "access_int_id", .descr = "The ID of the subscriber side interface; i.e. PON", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_ACCESS_INT_ID, .offset = offsetof(bcmbal_flow_ind_data, access_int_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_network_int_id = { .name = "network_int_id", .descr = "The ID of the network side interface; i.e. NNI", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_NETWORK_INT_ID, .offset = offsetof(bcmbal_flow_ind_data, network_int_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_sub_term_id = { .name = "sub_term_id", .descr = "The ID of the subsccriber terminal device", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_SUB_TERM_ID, .offset = offsetof(bcmbal_flow_ind_data, sub_term_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_svc_port_id = { .name = "svc_port_id", .descr = "The ID of the service port (for GPON/XGPON - GEM ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_SVC_PORT_ID, .offset = offsetof(bcmbal_flow_ind_data, svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_agg_port_id = { .name = "agg_port_id", .descr = "The ID of the aggregate port (for GPON/XGPON - ALLOC ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_AGG_PORT_ID, .offset = offsetof(bcmbal_flow_ind_data, agg_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_resolve_mac = { .name = "resolve_mac", .descr = "A flag indicating if the MAC address table should be used in DS GEM resolution", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_RESOLVE_MAC, .offset = offsetof(bcmbal_flow_ind_data, resolve_mac), .type = &type_descr_bcmos_bool };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_base_tc_id = { .name = "base_tc_id", .descr = "The base index of the TC object(s) to be used for this flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_BASE_TC_ID, .offset = offsetof(bcmbal_flow_ind_data, base_tc_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_classifier = { .name = "classifier", .descr = "The classifier for this flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_CLASSIFIER, .offset = offsetof(bcmbal_flow_ind_data, classifier), .type = &type_descr_bcmbal_classifier };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_action = { .name = "action", .descr = "The action associated with the flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_ACTION, .offset = offsetof(bcmbal_flow_ind_data, action), .type = &type_descr_bcmbal_action };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_sla = { .name = "sla", .descr = "SLA parameters for this flow", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_SLA, .offset = offsetof(bcmbal_flow_ind_data, sla), .type = &type_descr_bcmbal_sla };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_cookie = { .name = "cookie", .descr = "Application cookie", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_COOKIE, .offset = offsetof(bcmbal_flow_ind_data, cookie), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_flow_ind_priority = { .name = "priority", .descr = "Priority", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_FLOW_IND_ID_PRIORITY, .offset = offsetof(bcmbal_flow_ind_data, priority), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR flow_ind_prop_array[] = { &prop_descr_flow_ind_admin_state, &prop_descr_flow_ind_oper_status, &prop_descr_flow_ind_access_int_id, &prop_descr_flow_ind_network_int_id, &prop_descr_flow_ind_sub_term_id, &prop_descr_flow_ind_svc_port_id, &prop_descr_flow_ind_agg_port_id, &prop_descr_flow_ind_resolve_mac, &prop_descr_flow_ind_base_tc_id, &prop_descr_flow_ind_classifier, &prop_descr_flow_ind_action, &prop_descr_flow_ind_sla, &prop_descr_flow_ind_cookie, &prop_descr_flow_ind_priority };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_flow_ind_data_fields[] = { { .name = "admin_state", .descr = "Administrative state", .offset = offsetof(bcmbal_flow_ind_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Operational Status", .offset = offsetof(bcmbal_flow_ind_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "access_int_id", .descr = "The ID of the subscriber side interface; i.e. PON", .offset = offsetof(bcmbal_flow_ind_data, access_int_id), .type = &type_descr_uint16_t }, { .name = "network_int_id", .descr = "The ID of the network side interface; i.e. NNI", .offset = offsetof(bcmbal_flow_ind_data, network_int_id), .type = &type_descr_uint16_t }, { .name = "sub_term_id", .descr = "The ID of the subsccriber terminal device", .offset = offsetof(bcmbal_flow_ind_data, sub_term_id), .type = &type_descr_uint32_t }, { .name = "svc_port_id", .descr = "The ID of the service port (for GPON/XGPON - GEM ID)", .offset = offsetof(bcmbal_flow_ind_data, svc_port_id), .type = &type_descr_uint16_t }, { .name = "agg_port_id", .descr = "The ID of the aggregate port (for GPON/XGPON - ALLOC ID)", .offset = offsetof(bcmbal_flow_ind_data, agg_port_id), .type = &type_descr_uint16_t }, { .name = "resolve_mac", .descr = "A flag indicating if the MAC address table should be used in DS GEM resolution", .offset = offsetof(bcmbal_flow_ind_data, resolve_mac), .type = &type_descr_bcmos_bool }, { .name = "base_tc_id", .descr = "The base index of the TC object(s) to be used for this flow", .offset = offsetof(bcmbal_flow_ind_data, base_tc_id), .type = &type_descr_uint16_t }, { .name = "classifier", .descr = "The classifier for this flow", .offset = offsetof(bcmbal_flow_ind_data, classifier), .type = &type_descr_bcmbal_classifier }, { .name = "action", .descr = "The action associated with the flow", .offset = offsetof(bcmbal_flow_ind_data, action), .type = &type_descr_bcmbal_action }, { .name = "sla", .descr = "SLA parameters for this flow", .offset = offsetof(bcmbal_flow_ind_data, sla), .type = &type_descr_bcmbal_sla }, { .name = "cookie", .descr = "Application cookie", .offset = offsetof(bcmbal_flow_ind_data, cookie), .type = &type_descr_uint32_t }, { .name = "priority", .descr = "Priority", .offset = offsetof(bcmbal_flow_ind_data, priority), .type = &type_descr_uint16_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_flow_ind_data = { .name = "bcmbal_flow_ind_data", .descr = "Flow Indication", .size = sizeof(bcmbal_flow_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_flow_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_flow_ind_data_fields } } };
+
+/* ==== Object: group ==== */
+
+/* Group: group - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_cfg_members_cmd = { .name = "members_cmd", .descr = "Membership operation commands", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_GROUP_CFG_ID_MEMBERS_CMD, .offset = offsetof(bcmbal_group_cfg_data, members_cmd), .type = &type_descr_bcmbal_group_member_cmd };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_cfg_members = { .name = "members", .descr = "The list of members associated with this group", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_GROUP_CFG_ID_MEMBERS, .offset = offsetof(bcmbal_group_cfg_data, members), .type = &type_descr_bcmbal_group_member_info_list_u16 };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_cfg_cookie = { .name = "cookie", .descr = "Application cookie", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_GROUP_CFG_ID_COOKIE, .offset = offsetof(bcmbal_group_cfg_data, cookie), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_cfg_flows = { .name = "flows", .descr = "List of flows associated with this group", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_GROUP_CFG_ID_FLOWS, .offset = offsetof(bcmbal_group_cfg_data, flows), .type = &type_descr_bcmbal_flow_id_list_u32 };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_cfg_owner = { .name = "owner", .descr = "Owner of the group", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_GROUP_CFG_ID_OWNER, .offset = offsetof(bcmbal_group_cfg_data, owner), .type = &type_descr_bcmbal_group_owner };
+static bcmbal_apicli_prop_descr * BCM_DESCR group_cfg_prop_array[] = { &prop_descr_group_cfg_members_cmd, &prop_descr_group_cfg_members, &prop_descr_group_cfg_cookie, &prop_descr_group_cfg_flows, &prop_descr_group_cfg_owner };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_group_cfg_data_fields[] = { { .name = "members_cmd", .descr = "Membership operation commands", .offset = offsetof(bcmbal_group_cfg_data, members_cmd), .type = &type_descr_bcmbal_group_member_cmd }, { .name = "members", .descr = "The list of members associated with this group", .offset = offsetof(bcmbal_group_cfg_data, members), .type = &type_descr_bcmbal_group_member_info_list_u16 }, { .name = "cookie", .descr = "Application cookie", .offset = offsetof(bcmbal_group_cfg_data, cookie), .type = &type_descr_uint64_t }, { .name = "flows", .descr = "List of flows associated with this group", .offset = offsetof(bcmbal_group_cfg_data, flows), .type = &type_descr_bcmbal_flow_id_list_u32 }, { .name = "owner", .descr = "Owner of the group", .offset = offsetof(bcmbal_group_cfg_data, owner), .type = &type_descr_bcmbal_group_owner } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_cfg_data = { .name = "bcmbal_group_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_group_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_group_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_group_cfg_data_fields } } };
+
+/* Group: group - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_group_key_group_id = { .name = "group_id", .descr = "The ID of the group object instance being referenced", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_GROUP_KEY_ID_GROUP_ID, .offset = offsetof(bcmbal_group_key, group_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR group_key_prop_array[] = { &prop_descr_group_key_group_id };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_group_key_fields[] = { { .name = "group_id", .descr = "The ID of the group object instance being referenced", .offset = offsetof(bcmbal_group_key, group_id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_group_key = { .name = "bcmbal_group_key", .descr = "key", .size = sizeof(bcmbal_group_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_group_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_group_key_fields } } };
+
+/* ==== Object: interface ==== */
+
+/* Group: interface - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_key_intf_id = { .name = "intf_id", .descr = "intf_id", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_KEY_ID_INTF_ID, .offset = offsetof(bcmbal_interface_key, intf_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_key_intf_type = { .name = "intf_type", .descr = "intf_type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_KEY_ID_INTF_TYPE, .offset = offsetof(bcmbal_interface_key, intf_type), .type = &type_descr_bcmbal_intf_type };
+static bcmbal_apicli_prop_descr * BCM_DESCR interface_key_prop_array[] = { &prop_descr_interface_key_intf_id, &prop_descr_interface_key_intf_type };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_interface_key_fields[] = { { .name = "intf_id", .descr = "intf_id", .offset = offsetof(bcmbal_interface_key, intf_id), .type = &type_descr_uint32_t }, { .name = "intf_type", .descr = "intf_type", .offset = offsetof(bcmbal_interface_key, intf_type), .type = &type_descr_bcmbal_intf_type } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_key = { .name = "bcmbal_interface_key", .descr = "key", .size = sizeof(bcmbal_interface_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_interface_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_interface_key_fields } } };
+
+/* Group: interface - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_admin_state = { .name = "admin_state", .descr = "Administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_ADMIN_STATE, .offset = offsetof(bcmbal_interface_cfg_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_oper_status = { .name = "oper_status", .descr = "Operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_INTERFACE_CFG_ID_OPER_STATUS, .offset = offsetof(bcmbal_interface_cfg_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_min_data_agg_port_id = { .name = "min_data_agg_port_id", .descr = "The minimum agg_port_id that is allowed in the system", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_MIN_DATA_AGG_PORT_ID, .offset = offsetof(bcmbal_interface_cfg_data, min_data_agg_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_min_data_svc_port_id = { .name = "min_data_svc_port_id", .descr = "The minimum svc_port_id that is allowed in the system", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_MIN_DATA_SVC_PORT_ID, .offset = offsetof(bcmbal_interface_cfg_data, min_data_svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_transceiver_type = { .name = "transceiver_type", .descr = "The transceiver type used on an interface", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_TRANSCEIVER_TYPE, .offset = offsetof(bcmbal_interface_cfg_data, transceiver_type), .type = &type_descr_bcmbal_trx_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_ds_miss_mode = { .name = "ds_miss_mode", .descr = "Defines the action to take for unknown downstream packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_DS_MISS_MODE, .offset = offsetof(bcmbal_interface_cfg_data, ds_miss_mode), .type = &type_descr_bcmbal_ds_miss_mode };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_mtu = { .name = "mtu", .descr = "The MTU for an interface", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_MTU, .offset = offsetof(bcmbal_interface_cfg_data, mtu), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_flow_control = { .name = "flow_control", .descr = "Flow control enable or disable", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_FLOW_CONTROL, .offset = offsetof(bcmbal_interface_cfg_data, flow_control), .type = &type_descr_bcmbal_control };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_ds_tm = { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_DS_TM, .offset = offsetof(bcmbal_interface_cfg_data, ds_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_us_tm = { .name = "us_tm", .descr = "Upstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_CFG_ID_US_TM, .offset = offsetof(bcmbal_interface_cfg_data, us_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_cfg_sub_term_id_list = { .name = "sub_term_id_list", .descr = "A list of subscriber terminal ids configured on this interface", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_INTERFACE_CFG_ID_SUB_TERM_ID_LIST, .offset = offsetof(bcmbal_interface_cfg_data, sub_term_id_list), .type = &type_descr_bcmbal_sub_id_list_u16 };
+static bcmbal_apicli_prop_descr * BCM_DESCR interface_cfg_prop_array[] = { &prop_descr_interface_cfg_admin_state, &prop_descr_interface_cfg_oper_status, &prop_descr_interface_cfg_min_data_agg_port_id, &prop_descr_interface_cfg_min_data_svc_port_id, &prop_descr_interface_cfg_transceiver_type, &prop_descr_interface_cfg_ds_miss_mode, &prop_descr_interface_cfg_mtu, &prop_descr_interface_cfg_flow_control, &prop_descr_interface_cfg_ds_tm, &prop_descr_interface_cfg_us_tm, &prop_descr_interface_cfg_sub_term_id_list };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_interface_cfg_data_fields[] = { { .name = "admin_state", .descr = "Administrative state", .offset = offsetof(bcmbal_interface_cfg_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Operational status", .offset = offsetof(bcmbal_interface_cfg_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "min_data_agg_port_id", .descr = "The minimum agg_port_id that is allowed in the system", .offset = offsetof(bcmbal_interface_cfg_data, min_data_agg_port_id), .type = &type_descr_uint16_t }, { .name = "min_data_svc_port_id", .descr = "The minimum svc_port_id that is allowed in the system", .offset = offsetof(bcmbal_interface_cfg_data, min_data_svc_port_id), .type = &type_descr_uint16_t }, { .name = "transceiver_type", .descr = "The transceiver type used on an interface", .offset = offsetof(bcmbal_interface_cfg_data, transceiver_type), .type = &type_descr_bcmbal_trx_type }, { .name = "ds_miss_mode", .descr = "Defines the action to take for unknown downstream packets", .offset = offsetof(bcmbal_interface_cfg_data, ds_miss_mode), .type = &type_descr_bcmbal_ds_miss_mode }, { .name = "mtu", .descr = "The MTU for an interface", .offset = offsetof(bcmbal_interface_cfg_data, mtu), .type = &type_descr_uint16_t }, { .name = "flow_control", .descr = "Flow control enable or disable", .offset = offsetof(bcmbal_interface_cfg_data, flow_control), .type = &type_descr_bcmbal_control }, { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .offset = offsetof(bcmbal_interface_cfg_data, ds_tm), .type = &type_descr_uint32_t }, { .name = "us_tm", .descr = "Upstream scheduler and shaper", .offset = offsetof(bcmbal_interface_cfg_data, us_tm), .type = &type_descr_uint32_t }, { .name = "sub_term_id_list", .descr = "A list of subscriber terminal ids configured on this interface", .offset = offsetof(bcmbal_interface_cfg_data, sub_term_id_list), .type = &type_descr_bcmbal_sub_id_list_u16 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_cfg_data = { .name = "bcmbal_interface_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_interface_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_interface_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_interface_cfg_data_fields } } };
+
+/* Group: interface - stat */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_stat_rx_packets = { .name = "rx_packets", .descr = "Recieved packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_STAT_ID_RX_PACKETS, .offset = offsetof(bcmbal_interface_stat_data, rx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_stat_rx_bytes = { .name = "rx_bytes", .descr = "Received bytes", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_STAT_ID_RX_BYTES, .offset = offsetof(bcmbal_interface_stat_data, rx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_stat_tx_packets = { .name = "tx_packets", .descr = "Transmitted packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_STAT_ID_TX_PACKETS, .offset = offsetof(bcmbal_interface_stat_data, tx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_stat_tx_bytes = { .name = "tx_bytes", .descr = "Transmitted bytes", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_STAT_ID_TX_BYTES, .offset = offsetof(bcmbal_interface_stat_data, tx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR interface_stat_prop_array[] = { &prop_descr_interface_stat_rx_packets, &prop_descr_interface_stat_rx_bytes, &prop_descr_interface_stat_tx_packets, &prop_descr_interface_stat_tx_bytes };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_interface_stat_data_fields[] = { { .name = "rx_packets", .descr = "Recieved packets", .offset = offsetof(bcmbal_interface_stat_data, rx_packets), .type = &type_descr_uint64_t }, { .name = "rx_bytes", .descr = "Received bytes", .offset = offsetof(bcmbal_interface_stat_data, rx_bytes), .type = &type_descr_uint64_t }, { .name = "tx_packets", .descr = "Transmitted packets", .offset = offsetof(bcmbal_interface_stat_data, tx_packets), .type = &type_descr_uint64_t }, { .name = "tx_bytes", .descr = "Transmitted bytes", .offset = offsetof(bcmbal_interface_stat_data, tx_bytes), .type = &type_descr_uint64_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_stat_data = { .name = "bcmbal_interface_stat_data", .descr = "stat", .size = sizeof(bcmbal_interface_stat_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_interface_stat_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_interface_stat_data_fields } } };
+
+/* Group: interface - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_admin_state = { .name = "admin_state", .descr = "Current administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_ADMIN_STATE, .offset = offsetof(bcmbal_interface_ind_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_oper_status = { .name = "oper_status", .descr = "Current operational state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_OPER_STATUS, .offset = offsetof(bcmbal_interface_ind_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_min_data_agg_port_id = { .name = "min_data_agg_port_id", .descr = "The minimum agg_port_id that is allowed in the system", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_MIN_DATA_AGG_PORT_ID, .offset = offsetof(bcmbal_interface_ind_data, min_data_agg_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_min_data_svc_port_id = { .name = "min_data_svc_port_id", .descr = "The minimum svc_port_id that is allowed in the system", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_MIN_DATA_SVC_PORT_ID, .offset = offsetof(bcmbal_interface_ind_data, min_data_svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_transceiver_type = { .name = "transceiver_type", .descr = "The transceiver type used on an interface", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_TRANSCEIVER_TYPE, .offset = offsetof(bcmbal_interface_ind_data, transceiver_type), .type = &type_descr_bcmbal_trx_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_ds_miss_mode = { .name = "ds_miss_mode", .descr = "Defines the action to take for DS unknown packets", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_DS_MISS_MODE, .offset = offsetof(bcmbal_interface_ind_data, ds_miss_mode), .type = &type_descr_bcmbal_ds_miss_mode };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_mtu = { .name = "mtu", .descr = "The MTU for an interface", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_MTU, .offset = offsetof(bcmbal_interface_ind_data, mtu), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_flow_control = { .name = "flow_control", .descr = "Flow control enable or disable", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_FLOW_CONTROL, .offset = offsetof(bcmbal_interface_ind_data, flow_control), .type = &type_descr_bcmbal_control };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_ds_tm = { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_DS_TM, .offset = offsetof(bcmbal_interface_ind_data, ds_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_interface_ind_us_tm = { .name = "us_tm", .descr = "Upstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_INTERFACE_IND_ID_US_TM, .offset = offsetof(bcmbal_interface_ind_data, us_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR interface_ind_prop_array[] = { &prop_descr_interface_ind_admin_state, &prop_descr_interface_ind_oper_status, &prop_descr_interface_ind_min_data_agg_port_id, &prop_descr_interface_ind_min_data_svc_port_id, &prop_descr_interface_ind_transceiver_type, &prop_descr_interface_ind_ds_miss_mode, &prop_descr_interface_ind_mtu, &prop_descr_interface_ind_flow_control, &prop_descr_interface_ind_ds_tm, &prop_descr_interface_ind_us_tm };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_interface_ind_data_fields[] = { { .name = "admin_state", .descr = "Current administrative state", .offset = offsetof(bcmbal_interface_ind_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Current operational state", .offset = offsetof(bcmbal_interface_ind_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "min_data_agg_port_id", .descr = "The minimum agg_port_id that is allowed in the system", .offset = offsetof(bcmbal_interface_ind_data, min_data_agg_port_id), .type = &type_descr_uint16_t }, { .name = "min_data_svc_port_id", .descr = "The minimum svc_port_id that is allowed in the system", .offset = offsetof(bcmbal_interface_ind_data, min_data_svc_port_id), .type = &type_descr_uint16_t }, { .name = "transceiver_type", .descr = "The transceiver type used on an interface", .offset = offsetof(bcmbal_interface_ind_data, transceiver_type), .type = &type_descr_bcmbal_trx_type }, { .name = "ds_miss_mode", .descr = "Defines the action to take for DS unknown packets", .offset = offsetof(bcmbal_interface_ind_data, ds_miss_mode), .type = &type_descr_bcmbal_ds_miss_mode }, { .name = "mtu", .descr = "The MTU for an interface", .offset = offsetof(bcmbal_interface_ind_data, mtu), .type = &type_descr_uint16_t }, { .name = "flow_control", .descr = "Flow control enable or disable", .offset = offsetof(bcmbal_interface_ind_data, flow_control), .type = &type_descr_bcmbal_control }, { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .offset = offsetof(bcmbal_interface_ind_data, ds_tm), .type = &type_descr_uint32_t }, { .name = "us_tm", .descr = "Upstream scheduler and shaper", .offset = offsetof(bcmbal_interface_ind_data, us_tm), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_interface_ind_data = { .name = "bcmbal_interface_ind_data", .descr = "Interface Indication", .size = sizeof(bcmbal_interface_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_interface_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_interface_ind_data_fields } } };
+
+/* ==== Object: packet ==== */
+
+/* Group: packet - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_flow_id = { .name = "flow_id", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_FLOW_ID, .offset = offsetof(bcmbal_packet_cfg_data, flow_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_flow_type = { .name = "flow_type", .descr = "Flow Type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_FLOW_TYPE, .offset = offsetof(bcmbal_packet_cfg_data, flow_type), .type = &type_descr_bcmbal_flow_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_intf_id = { .name = "intf_id", .descr = "Interface ID", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_INTF_ID, .offset = offsetof(bcmbal_packet_cfg_data, intf_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_intf_type = { .name = "intf_type", .descr = "Interface Type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_INTF_TYPE, .offset = offsetof(bcmbal_packet_cfg_data, intf_type), .type = &type_descr_bcmbal_intf_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_svc_port = { .name = "svc_port", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_SVC_PORT, .offset = offsetof(bcmbal_packet_cfg_data, svc_port), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_flow_cookie = { .name = "flow_cookie", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_FLOW_COOKIE, .offset = offsetof(bcmbal_packet_cfg_data, flow_cookie), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_cfg_pkt = { .name = "pkt", .descr = "Packet Data", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_CFG_ID_PKT, .offset = offsetof(bcmbal_packet_cfg_data, pkt), .type = &type_descr_bcmbal_u8_list_u32 };
+static bcmbal_apicli_prop_descr * BCM_DESCR packet_cfg_prop_array[] = { &prop_descr_packet_cfg_flow_id, &prop_descr_packet_cfg_flow_type, &prop_descr_packet_cfg_intf_id, &prop_descr_packet_cfg_intf_type, &prop_descr_packet_cfg_svc_port, &prop_descr_packet_cfg_flow_cookie, &prop_descr_packet_cfg_pkt };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_packet_cfg_data_fields[] = { { .name = "flow_id", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_cfg_data, flow_id), .type = &type_descr_uint32_t }, { .name = "flow_type", .descr = "Flow Type", .offset = offsetof(bcmbal_packet_cfg_data, flow_type), .type = &type_descr_bcmbal_flow_type }, { .name = "intf_id", .descr = "Interface ID", .offset = offsetof(bcmbal_packet_cfg_data, intf_id), .type = &type_descr_uint32_t }, { .name = "intf_type", .descr = "Interface Type", .offset = offsetof(bcmbal_packet_cfg_data, intf_type), .type = &type_descr_bcmbal_intf_type }, { .name = "svc_port", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_cfg_data, svc_port), .type = &type_descr_uint16_t }, { .name = "flow_cookie", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_cfg_data, flow_cookie), .type = &type_descr_uint64_t }, { .name = "pkt", .descr = "Packet Data", .offset = offsetof(bcmbal_packet_cfg_data, pkt), .type = &type_descr_bcmbal_u8_list_u32 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_cfg_data = { .name = "bcmbal_packet_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_packet_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_packet_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_packet_cfg_data_fields } } };
+
+/* Group: packet - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_key_reserved = { .name = "reserved", .descr = "Reserved key field", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_KEY_ID_RESERVED, .offset = offsetof(bcmbal_packet_key, reserved), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_key_packet_send_dest = { .name = "packet_send_dest", .descr = "Packet destination", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_KEY_ID_PACKET_SEND_DEST, .offset = offsetof(bcmbal_packet_key, packet_send_dest), .type = &type_descr_bcmbal_dest };
+static bcmbal_apicli_prop_descr * BCM_DESCR packet_key_prop_array[] = { &prop_descr_packet_key_reserved, &prop_descr_packet_key_packet_send_dest };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_packet_key_fields[] = { { .name = "reserved", .descr = "Reserved key field", .offset = offsetof(bcmbal_packet_key, reserved), .type = &type_descr_uint32_t }, { .name = "packet_send_dest", .descr = "Packet destination", .offset = offsetof(bcmbal_packet_key, packet_send_dest), .type = &type_descr_bcmbal_dest } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_key = { .name = "bcmbal_packet_key", .descr = "key", .size = sizeof(bcmbal_packet_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_packet_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_packet_key_fields } } };
+
+/* Group: packet - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_flow_id = { .name = "flow_id", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_FLOW_ID, .offset = offsetof(bcmbal_packet_ind_data, flow_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_flow_type = { .name = "flow_type", .descr = "Flow Type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_FLOW_TYPE, .offset = offsetof(bcmbal_packet_ind_data, flow_type), .type = &type_descr_bcmbal_flow_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_intf_id = { .name = "intf_id", .descr = "Interface ID", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_INTF_ID, .offset = offsetof(bcmbal_packet_ind_data, intf_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_intf_type = { .name = "intf_type", .descr = "Interface Type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_INTF_TYPE, .offset = offsetof(bcmbal_packet_ind_data, intf_type), .type = &type_descr_bcmbal_intf_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_svc_port = { .name = "svc_port", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_SVC_PORT, .offset = offsetof(bcmbal_packet_ind_data, svc_port), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_flow_cookie = { .name = "flow_cookie", .descr = "N/A for sending a packet", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_FLOW_COOKIE, .offset = offsetof(bcmbal_packet_ind_data, flow_cookie), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_packet_ind_pkt = { .name = "pkt", .descr = "Packet Data", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_PACKET_IND_ID_PKT, .offset = offsetof(bcmbal_packet_ind_data, pkt), .type = &type_descr_bcmbal_u8_list_u32 };
+static bcmbal_apicli_prop_descr * BCM_DESCR packet_ind_prop_array[] = { &prop_descr_packet_ind_flow_id, &prop_descr_packet_ind_flow_type, &prop_descr_packet_ind_intf_id, &prop_descr_packet_ind_intf_type, &prop_descr_packet_ind_svc_port, &prop_descr_packet_ind_flow_cookie, &prop_descr_packet_ind_pkt };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_packet_ind_data_fields[] = { { .name = "flow_id", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_ind_data, flow_id), .type = &type_descr_uint32_t }, { .name = "flow_type", .descr = "Flow Type", .offset = offsetof(bcmbal_packet_ind_data, flow_type), .type = &type_descr_bcmbal_flow_type }, { .name = "intf_id", .descr = "Interface ID", .offset = offsetof(bcmbal_packet_ind_data, intf_id), .type = &type_descr_uint32_t }, { .name = "intf_type", .descr = "Interface Type", .offset = offsetof(bcmbal_packet_ind_data, intf_type), .type = &type_descr_bcmbal_intf_type }, { .name = "svc_port", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_ind_data, svc_port), .type = &type_descr_uint16_t }, { .name = "flow_cookie", .descr = "N/A for sending a packet", .offset = offsetof(bcmbal_packet_ind_data, flow_cookie), .type = &type_descr_uint64_t }, { .name = "pkt", .descr = "Packet Data", .offset = offsetof(bcmbal_packet_ind_data, pkt), .type = &type_descr_bcmbal_u8_list_u32 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_packet_ind_data = { .name = "bcmbal_packet_ind_data", .descr = "Packet indication", .size = sizeof(bcmbal_packet_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_packet_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_packet_ind_data_fields } } };
+
+/* ==== Object: subscriber_terminal ==== */
+
+/* Group: subscriber_terminal - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_key_sub_term_id = { .name = "sub_term_id", .descr = "sub_term_id", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_SUB_TERM_ID, .offset = offsetof(bcmbal_subscriber_terminal_key, sub_term_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_key_intf_id = { .name = "intf_id", .descr = "intf_id", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_KEY_ID_INTF_ID, .offset = offsetof(bcmbal_subscriber_terminal_key, intf_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR subscriber_terminal_key_prop_array[] = { &prop_descr_subscriber_terminal_key_sub_term_id, &prop_descr_subscriber_terminal_key_intf_id };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_key_fields[] = { { .name = "sub_term_id", .descr = "sub_term_id", .offset = offsetof(bcmbal_subscriber_terminal_key, sub_term_id), .type = &type_descr_uint32_t }, { .name = "intf_id", .descr = "intf_id", .offset = offsetof(bcmbal_subscriber_terminal_key, intf_id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_key = { .name = "bcmbal_subscriber_terminal_key", .descr = "key", .size = sizeof(bcmbal_subscriber_terminal_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_subscriber_terminal_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_subscriber_terminal_key_fields } } };
+
+/* Group: subscriber_terminal - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_admin_state = { .name = "admin_state", .descr = "Administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_ADMIN_STATE, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_oper_status = { .name = "oper_status", .descr = "Operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_OPER_STATUS, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_serial_number = { .name = "serial_number", .descr = "The serial number of an  ITU PON (GPON/XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SERIAL_NUMBER, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, serial_number), .type = &type_descr_bcmbal_serial_number };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_password = { .name = "password", .descr = "The password of a GPON subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_PASSWORD, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, password), .type = &type_descr_bcmbal_password };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_registration_id = { .name = "registration_id", .descr = "ONU registration ID of an  ITU PON (XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_REGISTRATION_ID, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, registration_id), .type = &type_descr_bcmbal_registration_id };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_svc_port_id = { .name = "svc_port_id", .descr = "The management service port ID (for PON, the ONU ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SVC_PORT_ID, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_mac_address = { .name = "mac_address", .descr = "The Ethernet MAC address of an EPON subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_MAC_ADDRESS, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, mac_address), .type = &type_descr_bcmos_mac_address };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_ds_tm = { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_DS_TM, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, ds_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_us_tm = { .name = "us_tm", .descr = "Upstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_US_TM, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, us_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_svc_port_id_list = { .name = "svc_port_id_list", .descr = "A list of bearer traffic svc_port_ids associated with this subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_SVC_PORT_ID_LIST, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, svc_port_id_list), .type = &type_descr_bcmbal_service_port_id_list_u8 };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_cfg_agg_port_id_list = { .name = "agg_port_id_list", .descr = "A list of aggr_port_ids associated with this subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_SUBSCRIBER_TERMINAL_CFG_ID_AGG_PORT_ID_LIST, .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, agg_port_id_list), .type = &type_descr_bcmbal_aggregation_port_id_list_u8 };
+static bcmbal_apicli_prop_descr * BCM_DESCR subscriber_terminal_cfg_prop_array[] = { &prop_descr_subscriber_terminal_cfg_admin_state, &prop_descr_subscriber_terminal_cfg_oper_status, &prop_descr_subscriber_terminal_cfg_serial_number, &prop_descr_subscriber_terminal_cfg_password, &prop_descr_subscriber_terminal_cfg_registration_id, &prop_descr_subscriber_terminal_cfg_svc_port_id, &prop_descr_subscriber_terminal_cfg_mac_address, &prop_descr_subscriber_terminal_cfg_ds_tm, &prop_descr_subscriber_terminal_cfg_us_tm, &prop_descr_subscriber_terminal_cfg_svc_port_id_list, &prop_descr_subscriber_terminal_cfg_agg_port_id_list };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_cfg_data_fields[] = { { .name = "admin_state", .descr = "Administrative state", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Operational status", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "serial_number", .descr = "The serial number of an  ITU PON (GPON/XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, serial_number), .type = &type_descr_bcmbal_serial_number }, { .name = "password", .descr = "The password of a GPON subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, password), .type = &type_descr_bcmbal_password }, { .name = "registration_id", .descr = "ONU registration ID of an  ITU PON (XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, registration_id), .type = &type_descr_bcmbal_registration_id }, { .name = "svc_port_id", .descr = "The management service port ID (for PON, the ONU ID)", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, svc_port_id), .type = &type_descr_uint16_t }, { .name = "mac_address", .descr = "The Ethernet MAC address of an EPON subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, mac_address), .type = &type_descr_bcmos_mac_address }, { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, ds_tm), .type = &type_descr_uint32_t }, { .name = "us_tm", .descr = "Upstream scheduler and shaper", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, us_tm), .type = &type_descr_uint32_t }, { .name = "svc_port_id_list", .descr = "A list of bearer traffic svc_port_ids associated with this subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, svc_port_id_list), .type = &type_descr_bcmbal_service_port_id_list_u8 }, { .name = "agg_port_id_list", .descr = "A list of aggr_port_ids associated with this subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_cfg_data, agg_port_id_list), .type = &type_descr_bcmbal_aggregation_port_id_list_u8 } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_cfg_data = { .name = "bcmbal_subscriber_terminal_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_subscriber_terminal_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_subscriber_terminal_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_subscriber_terminal_cfg_data_fields } } };
+
+/* Group: subscriber_terminal - stat */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_stat_rx_packets = { .name = "rx_packets", .descr = "Received packets on specified object", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_RX_PACKETS, .offset = offsetof(bcmbal_subscriber_terminal_stat_data, rx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_stat_rx_bytes = { .name = "rx_bytes", .descr = "Received bytes on specified object", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_RX_BYTES, .offset = offsetof(bcmbal_subscriber_terminal_stat_data, rx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_stat_tx_packets = { .name = "tx_packets", .descr = "Transmitted packets on specified object", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_TX_PACKETS, .offset = offsetof(bcmbal_subscriber_terminal_stat_data, tx_packets), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_stat_tx_bytes = { .name = "tx_bytes", .descr = "Transmittted bytes on specified object", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_STAT_ID_TX_BYTES, .offset = offsetof(bcmbal_subscriber_terminal_stat_data, tx_bytes), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR subscriber_terminal_stat_prop_array[] = { &prop_descr_subscriber_terminal_stat_rx_packets, &prop_descr_subscriber_terminal_stat_rx_bytes, &prop_descr_subscriber_terminal_stat_tx_packets, &prop_descr_subscriber_terminal_stat_tx_bytes };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_stat_data_fields[] = { { .name = "rx_packets", .descr = "Received packets on specified object", .offset = offsetof(bcmbal_subscriber_terminal_stat_data, rx_packets), .type = &type_descr_uint64_t }, { .name = "rx_bytes", .descr = "Received bytes on specified object", .offset = offsetof(bcmbal_subscriber_terminal_stat_data, rx_bytes), .type = &type_descr_uint64_t }, { .name = "tx_packets", .descr = "Transmitted packets on specified object", .offset = offsetof(bcmbal_subscriber_terminal_stat_data, tx_packets), .type = &type_descr_uint64_t }, { .name = "tx_bytes", .descr = "Transmittted bytes on specified object", .offset = offsetof(bcmbal_subscriber_terminal_stat_data, tx_bytes), .type = &type_descr_uint64_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_stat_data = { .name = "bcmbal_subscriber_terminal_stat_data", .descr = "stat", .size = sizeof(bcmbal_subscriber_terminal_stat_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_subscriber_terminal_stat_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_subscriber_terminal_stat_data_fields } } };
+
+/* Group: subscriber_terminal - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_admin_state = { .name = "admin_state", .descr = "Current administrative state", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_ADMIN_STATE, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, admin_state), .type = &type_descr_bcmbal_state };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_oper_status = { .name = "oper_status", .descr = "Current operational status", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_OPER_STATUS, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, oper_status), .type = &type_descr_bcmbal_status };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_serial_number = { .name = "serial_number", .descr = "The serial number of an  ITU PON (GPON/XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_SERIAL_NUMBER, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, serial_number), .type = &type_descr_bcmbal_serial_number };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_password = { .name = "password", .descr = "The password of a GPON subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_PASSWORD, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, password), .type = &type_descr_bcmbal_password };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_registration_id = { .name = "registration_id", .descr = "ONU registration ID of an  ITU PON (XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_REGISTRATION_ID, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, registration_id), .type = &type_descr_bcmbal_registration_id };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_svc_port_id = { .name = "svc_port_id", .descr = "The service port ID (for PON, the ONU ID)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_SVC_PORT_ID, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, svc_port_id), .type = &type_descr_uint16_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_mac_address = { .name = "mac_address", .descr = "The Ethernet MAC address of an epon subscriber terminal", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_MAC_ADDRESS, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, mac_address), .type = &type_descr_bcmos_mac_address };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_ds_tm = { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_DS_TM, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, ds_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_subscriber_terminal_ind_us_tm = { .name = "us_tm", .descr = "Upstream scheduler and shaper", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_SUBSCRIBER_TERMINAL_IND_ID_US_TM, .offset = offsetof(bcmbal_subscriber_terminal_ind_data, us_tm), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR subscriber_terminal_ind_prop_array[] = { &prop_descr_subscriber_terminal_ind_admin_state, &prop_descr_subscriber_terminal_ind_oper_status, &prop_descr_subscriber_terminal_ind_serial_number, &prop_descr_subscriber_terminal_ind_password, &prop_descr_subscriber_terminal_ind_registration_id, &prop_descr_subscriber_terminal_ind_svc_port_id, &prop_descr_subscriber_terminal_ind_mac_address, &prop_descr_subscriber_terminal_ind_ds_tm, &prop_descr_subscriber_terminal_ind_us_tm };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_ind_data_fields[] = { { .name = "admin_state", .descr = "Current administrative state", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, admin_state), .type = &type_descr_bcmbal_state }, { .name = "oper_status", .descr = "Current operational status", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, oper_status), .type = &type_descr_bcmbal_status }, { .name = "serial_number", .descr = "The serial number of an  ITU PON (GPON/XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, serial_number), .type = &type_descr_bcmbal_serial_number }, { .name = "password", .descr = "The password of a GPON subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, password), .type = &type_descr_bcmbal_password }, { .name = "registration_id", .descr = "ONU registration ID of an  ITU PON (XG-PON1/XGS-PON/NG-PON2) subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, registration_id), .type = &type_descr_bcmbal_registration_id }, { .name = "svc_port_id", .descr = "The service port ID (for PON, the ONU ID)", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, svc_port_id), .type = &type_descr_uint16_t }, { .name = "mac_address", .descr = "The Ethernet MAC address of an epon subscriber terminal", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, mac_address), .type = &type_descr_bcmos_mac_address }, { .name = "ds_tm", .descr = "Downstream scheduler and shaper", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, ds_tm), .type = &type_descr_uint32_t }, { .name = "us_tm", .descr = "Upstream scheduler and shaper", .offset = offsetof(bcmbal_subscriber_terminal_ind_data, us_tm), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_subscriber_terminal_ind_data = { .name = "bcmbal_subscriber_terminal_ind_data", .descr = "Subscriber Terminal Indication", .size = sizeof(bcmbal_subscriber_terminal_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_subscriber_terminal_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_subscriber_terminal_ind_data_fields } } };
+
+/* ==== Object: tm_queue ==== */
+
+/* Group: tm_queue - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_key_sched_id = { .name = "sched_id", .descr = "Scheduler that owns the queue", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_KEY_ID_SCHED_ID, .offset = offsetof(bcmbal_tm_queue_key, sched_id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_key_sched_dir = { .name = "sched_dir", .descr = "sched dir", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_KEY_ID_SCHED_DIR, .offset = offsetof(bcmbal_tm_queue_key, sched_dir), .type = &type_descr_bcmbal_tm_sched_dir };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_key_id = { .name = "id", .descr = "Queue id", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_KEY_ID_ID, .offset = offsetof(bcmbal_tm_queue_key, id), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_queue_key_prop_array[] = { &prop_descr_tm_queue_key_sched_id, &prop_descr_tm_queue_key_sched_dir, &prop_descr_tm_queue_key_id };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_queue_key_fields[] = { { .name = "sched_id", .descr = "Scheduler that owns the queue", .offset = offsetof(bcmbal_tm_queue_key, sched_id), .type = &type_descr_uint32_t }, { .name = "sched_dir", .descr = "sched dir", .offset = offsetof(bcmbal_tm_queue_key, sched_dir), .type = &type_descr_bcmbal_tm_sched_dir }, { .name = "id", .descr = "Queue id", .offset = offsetof(bcmbal_tm_queue_key, id), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_key = { .name = "bcmbal_tm_queue_key", .descr = "key", .size = sizeof(bcmbal_tm_queue_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_queue_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_queue_key_fields } } };
+
+/* Group: tm_queue - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_priority = { .name = "priority", .descr = "Scheduling priority", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_CFG_ID_PRIORITY, .offset = offsetof(bcmbal_tm_queue_cfg_data, priority), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_weight = { .name = "weight", .descr = "Scheduling weight", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_CFG_ID_WEIGHT, .offset = offsetof(bcmbal_tm_queue_cfg_data, weight), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_rate = { .name = "rate", .descr = "Rate shaping parameters", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_CFG_ID_RATE, .offset = offsetof(bcmbal_tm_queue_cfg_data, rate), .type = &type_descr_bcmbal_tm_shaping };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_bac = { .name = "bac", .descr = "Buffer admission control", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_CFG_ID_BAC, .offset = offsetof(bcmbal_tm_queue_cfg_data, bac), .type = &type_descr_bcmbal_tm_bac };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_creation_mode = { .name = "creation_mode", .descr = "Creation mode", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_TM_QUEUE_CFG_ID_CREATION_MODE, .offset = offsetof(bcmbal_tm_queue_cfg_data, creation_mode), .type = &type_descr_bcmbal_tm_creation_mode };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_cfg_ref_count = { .name = "ref_count", .descr = "reference count (flows)", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_TM_QUEUE_CFG_ID_REF_COUNT, .offset = offsetof(bcmbal_tm_queue_cfg_data, ref_count), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_queue_cfg_prop_array[] = { &prop_descr_tm_queue_cfg_priority, &prop_descr_tm_queue_cfg_weight, &prop_descr_tm_queue_cfg_rate, &prop_descr_tm_queue_cfg_bac, &prop_descr_tm_queue_cfg_creation_mode, &prop_descr_tm_queue_cfg_ref_count };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_queue_cfg_data_fields[] = { { .name = "priority", .descr = "Scheduling priority", .offset = offsetof(bcmbal_tm_queue_cfg_data, priority), .type = &type_descr_uint8_t }, { .name = "weight", .descr = "Scheduling weight", .offset = offsetof(bcmbal_tm_queue_cfg_data, weight), .type = &type_descr_uint8_t }, { .name = "rate", .descr = "Rate shaping parameters", .offset = offsetof(bcmbal_tm_queue_cfg_data, rate), .type = &type_descr_bcmbal_tm_shaping }, { .name = "bac", .descr = "Buffer admission control", .offset = offsetof(bcmbal_tm_queue_cfg_data, bac), .type = &type_descr_bcmbal_tm_bac }, { .name = "creation_mode", .descr = "Creation mode", .offset = offsetof(bcmbal_tm_queue_cfg_data, creation_mode), .type = &type_descr_bcmbal_tm_creation_mode }, { .name = "ref_count", .descr = "reference count (flows)", .offset = offsetof(bcmbal_tm_queue_cfg_data, ref_count), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_cfg_data = { .name = "bcmbal_tm_queue_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_tm_queue_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_queue_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_queue_cfg_data_fields } } };
+
+/* Group: tm_queue - stat */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_stat_packets_ok = { .name = "packets_ok", .descr = "Packets transmitted succewssfully", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_STAT_ID_PACKETS_OK, .offset = offsetof(bcmbal_tm_queue_stat_data, packets_ok), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_stat_bytes_ok = { .name = "bytes_ok", .descr = "Bytes transmitted successfully", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_STAT_ID_BYTES_OK, .offset = offsetof(bcmbal_tm_queue_stat_data, bytes_ok), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_stat_packets_discarded = { .name = "packets_discarded", .descr = "Packets discarded", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_STAT_ID_PACKETS_DISCARDED, .offset = offsetof(bcmbal_tm_queue_stat_data, packets_discarded), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_stat_bytes_discarded = { .name = "bytes_discarded", .descr = "Bytes discarded", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_STAT_ID_BYTES_DISCARDED, .offset = offsetof(bcmbal_tm_queue_stat_data, bytes_discarded), .type = &type_descr_uint64_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_queue_stat_prop_array[] = { &prop_descr_tm_queue_stat_packets_ok, &prop_descr_tm_queue_stat_bytes_ok, &prop_descr_tm_queue_stat_packets_discarded, &prop_descr_tm_queue_stat_bytes_discarded };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_queue_stat_data_fields[] = { { .name = "packets_ok", .descr = "Packets transmitted succewssfully", .offset = offsetof(bcmbal_tm_queue_stat_data, packets_ok), .type = &type_descr_uint64_t }, { .name = "bytes_ok", .descr = "Bytes transmitted successfully", .offset = offsetof(bcmbal_tm_queue_stat_data, bytes_ok), .type = &type_descr_uint64_t }, { .name = "packets_discarded", .descr = "Packets discarded", .offset = offsetof(bcmbal_tm_queue_stat_data, packets_discarded), .type = &type_descr_uint64_t }, { .name = "bytes_discarded", .descr = "Bytes discarded", .offset = offsetof(bcmbal_tm_queue_stat_data, bytes_discarded), .type = &type_descr_uint64_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_stat_data = { .name = "bcmbal_tm_queue_stat_data", .descr = "stat", .size = sizeof(bcmbal_tm_queue_stat_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_queue_stat_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_queue_stat_data_fields } } };
+
+/* Group: tm_queue - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_queue_ind_ret = { .name = "ret", .descr = "ret", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_QUEUE_IND_ID_RET, .offset = offsetof(bcmbal_tm_queue_ind_data, ret), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_queue_ind_prop_array[] = { &prop_descr_tm_queue_ind_ret };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_queue_ind_data_fields[] = { { .name = "ret", .descr = "ret", .offset = offsetof(bcmbal_tm_queue_ind_data, ret), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_queue_ind_data = { .name = "bcmbal_tm_queue_ind_data", .descr = "Tm Queue Indication", .size = sizeof(bcmbal_tm_queue_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_queue_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_queue_ind_data_fields } } };
+
+/* ==== Object: tm_sched ==== */
+
+/* Group: tm_sched - key */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_key_dir = { .name = "dir", .descr = "Traffic direction", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_KEY_ID_DIR, .offset = offsetof(bcmbal_tm_sched_key, dir), .type = &type_descr_bcmbal_tm_sched_dir };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_key_id = { .name = "id", .descr = "ID", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_KEY_ID_ID, .offset = offsetof(bcmbal_tm_sched_key, id), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_sched_key_prop_array[] = { &prop_descr_tm_sched_key_dir, &prop_descr_tm_sched_key_id };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_key_fields[] = { { .name = "dir", .descr = "Traffic direction", .offset = offsetof(bcmbal_tm_sched_key, dir), .type = &type_descr_bcmbal_tm_sched_dir }, { .name = "id", .descr = "ID", .offset = offsetof(bcmbal_tm_sched_key, id), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_key = { .name = "bcmbal_tm_sched_key", .descr = "key", .size = sizeof(bcmbal_tm_sched_key), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_key_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_key_fields } } };
+
+/* Group: tm_sched - cfg */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_owner = { .name = "owner", .descr = "owner", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_OWNER, .offset = offsetof(bcmbal_tm_sched_cfg_data, owner), .type = &type_descr_bcmbal_tm_sched_owner };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_sched_type = { .name = "sched_type", .descr = "Scheduler type", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_SCHED_TYPE, .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_type), .type = &type_descr_bcmbal_tm_sched_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_sched_parent = { .name = "sched_parent", .descr = "Scheduling parameters for parent scheduler", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_SCHED_PARENT, .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_parent), .type = &type_descr_bcmbal_tm_sched_parent };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_sched_child_type = { .name = "sched_child_type", .descr = "Scheduling level for children tm ", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_SCHED_CHILD_TYPE, .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_child_type), .type = &type_descr_bcmbal_tm_sched_child_type };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_rate = { .name = "rate", .descr = "Rate shaping parameters", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_RATE, .offset = offsetof(bcmbal_tm_sched_cfg_data, rate), .type = &type_descr_bcmbal_tm_shaping };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_tcont_sla = { .name = "tcont_sla", .descr = "Additional SLA parameters for agg_port owner", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_TCONT_SLA, .offset = offsetof(bcmbal_tm_sched_cfg_data, tcont_sla), .type = &type_descr_bcmbal_tm_tcont_sla };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_creation_mode = { .name = "creation_mode", .descr = "Creation mode", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_TM_SCHED_CFG_ID_CREATION_MODE, .offset = offsetof(bcmbal_tm_sched_cfg_data, creation_mode), .type = &type_descr_bcmbal_tm_creation_mode };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_queues = { .name = "queues", .descr = "Subsidiary queues", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_TM_SCHED_CFG_ID_QUEUES, .offset = offsetof(bcmbal_tm_sched_cfg_data, queues), .type = &type_descr_bcmbal_tm_queue_id_list_u8 };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_sub_scheds = { .name = "sub_scheds", .descr = "Subsidiary schedulers", .access = BCMBAL_APICLI_PROP_ACCESS_ID_R, .property = BCMBAL_TM_SCHED_CFG_ID_SUB_SCHEDS, .offset = offsetof(bcmbal_tm_sched_cfg_data, sub_scheds), .type = &type_descr_bcmbal_tm_sched_id_list_u8 };
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_cfg_num_priorities = { .name = "num_priorities", .descr = "Max number of strict priority scheduling elements", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_CFG_ID_NUM_PRIORITIES, .offset = offsetof(bcmbal_tm_sched_cfg_data, num_priorities), .type = &type_descr_uint8_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_sched_cfg_prop_array[] = { &prop_descr_tm_sched_cfg_owner, &prop_descr_tm_sched_cfg_sched_type, &prop_descr_tm_sched_cfg_sched_parent, &prop_descr_tm_sched_cfg_sched_child_type, &prop_descr_tm_sched_cfg_rate, &prop_descr_tm_sched_cfg_tcont_sla, &prop_descr_tm_sched_cfg_creation_mode, &prop_descr_tm_sched_cfg_queues, &prop_descr_tm_sched_cfg_sub_scheds, &prop_descr_tm_sched_cfg_num_priorities };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_cfg_data_fields[] = { { .name = "owner", .descr = "owner", .offset = offsetof(bcmbal_tm_sched_cfg_data, owner), .type = &type_descr_bcmbal_tm_sched_owner }, { .name = "sched_type", .descr = "Scheduler type", .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_type), .type = &type_descr_bcmbal_tm_sched_type }, { .name = "sched_parent", .descr = "Scheduling parameters for parent scheduler", .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_parent), .type = &type_descr_bcmbal_tm_sched_parent }, { .name = "sched_child_type", .descr = "Scheduling level for children tm ", .offset = offsetof(bcmbal_tm_sched_cfg_data, sched_child_type), .type = &type_descr_bcmbal_tm_sched_child_type }, { .name = "rate", .descr = "Rate shaping parameters", .offset = offsetof(bcmbal_tm_sched_cfg_data, rate), .type = &type_descr_bcmbal_tm_shaping }, { .name = "tcont_sla", .descr = "Additional SLA parameters for agg_port owner", .offset = offsetof(bcmbal_tm_sched_cfg_data, tcont_sla), .type = &type_descr_bcmbal_tm_tcont_sla }, { .name = "creation_mode", .descr = "Creation mode", .offset = offsetof(bcmbal_tm_sched_cfg_data, creation_mode), .type = &type_descr_bcmbal_tm_creation_mode }, { .name = "queues", .descr = "Subsidiary queues", .offset = offsetof(bcmbal_tm_sched_cfg_data, queues), .type = &type_descr_bcmbal_tm_queue_id_list_u8 }, { .name = "sub_scheds", .descr = "Subsidiary schedulers", .offset = offsetof(bcmbal_tm_sched_cfg_data, sub_scheds), .type = &type_descr_bcmbal_tm_sched_id_list_u8 }, { .name = "num_priorities", .descr = "Max number of strict priority scheduling elements", .offset = offsetof(bcmbal_tm_sched_cfg_data, num_priorities), .type = &type_descr_uint8_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_cfg_data = { .name = "bcmbal_tm_sched_cfg_data", .descr = "cfg", .size = sizeof(bcmbal_tm_sched_cfg_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_cfg_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_cfg_data_fields } } };
+
+/* Group: tm_sched - ind */
+static bcmbal_apicli_prop_descr BCM_DESCR prop_descr_tm_sched_ind_ret = { .name = "ret", .descr = "ret", .access = BCMBAL_APICLI_PROP_ACCESS_ID_RW, .property = BCMBAL_TM_SCHED_IND_ID_RET, .offset = offsetof(bcmbal_tm_sched_ind_data, ret), .type = &type_descr_uint32_t };
+static bcmbal_apicli_prop_descr * BCM_DESCR tm_sched_ind_prop_array[] = { &prop_descr_tm_sched_ind_ret };
+static bcmbal_apicli_field_descr BCM_DESCR type_descr_bcmbal_tm_sched_ind_data_fields[] = { { .name = "ret", .descr = "ret", .offset = offsetof(bcmbal_tm_sched_ind_data, ret), .type = &type_descr_uint32_t } };
+static bcmbal_apicli_type_descr BCM_DESCR type_descr_bcmbal_tm_sched_ind_data = { .name = "bcmbal_tm_sched_ind_data", .descr = "Tm Sched Indication", .size = sizeof(bcmbal_tm_sched_ind_data), .base_type = BCMBAL_APICLI_BASE_TYPE_ID_STRUCT, .x = { .s = { .num_fields = sizeof(type_descr_bcmbal_tm_sched_ind_data_fields) / sizeof(bcmbal_apicli_field_descr), .fields = type_descr_bcmbal_tm_sched_ind_data_fields } } };
+
+/* ==== API Helper Function Implementations ==== */
+bcmos_errno bcmbal_apicli_object_struct_size(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, uint32_t *key_size, uint32_t *key_offset, uint32_t *data_size, uint32_t *data_offset)
+{
+    if (((key_size == NULL) || (key_offset == NULL)) || ((data_size == NULL) || (data_offset == NULL)))
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    switch (obj)
+    {
+        case BCMBAL_OBJ_ID_ACCESS_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_access_terminal_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_access_terminal_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_access_terminal_key);
+                            *key_offset = offsetof(bcmbal_access_terminal_cfg, key);
+                            *data_size = sizeof(bcmbal_access_terminal_cfg_data);
+                            *data_offset = offsetof(bcmbal_access_terminal_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_ACCESS_TERMINAL_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_access_terminal_key);
+                            *key_offset = offsetof(bcmbal_access_terminal_ind, key);
+                            *data_size = sizeof(bcmbal_access_terminal_ind_data);
+                            *data_offset = offsetof(bcmbal_access_terminal_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_FLOW:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_flow_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_flow_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_flow_key);
+                            *key_offset = offsetof(bcmbal_flow_cfg, key);
+                            *data_size = sizeof(bcmbal_flow_cfg_data);
+                            *data_offset = offsetof(bcmbal_flow_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_flow_key);
+                            *key_offset = offsetof(bcmbal_flow_stat, key);
+                            *data_size = sizeof(bcmbal_flow_stat_data);
+                            *data_offset = offsetof(bcmbal_flow_stat, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_FLOW_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_flow_key);
+                            *key_offset = offsetof(bcmbal_flow_ind, key);
+                            *data_size = sizeof(bcmbal_flow_ind_data);
+                            *data_offset = offsetof(bcmbal_flow_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_GROUP:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_group_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_group_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_group_key);
+                            *key_offset = offsetof(bcmbal_group_cfg, key);
+                            *data_size = sizeof(bcmbal_group_cfg_data);
+                            *data_offset = offsetof(bcmbal_group_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_INTERFACE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_interface_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_interface_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_interface_key);
+                            *key_offset = offsetof(bcmbal_interface_cfg, key);
+                            *data_size = sizeof(bcmbal_interface_cfg_data);
+                            *data_offset = offsetof(bcmbal_interface_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_interface_key);
+                            *key_offset = offsetof(bcmbal_interface_stat, key);
+                            *data_size = sizeof(bcmbal_interface_stat_data);
+                            *data_offset = offsetof(bcmbal_interface_stat, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_INTERFACE_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_interface_key);
+                            *key_offset = offsetof(bcmbal_interface_ind, key);
+                            *data_size = sizeof(bcmbal_interface_ind_data);
+                            *data_offset = offsetof(bcmbal_interface_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_PACKET:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_packet_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_packet_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_packet_key);
+                            *key_offset = offsetof(bcmbal_packet_cfg, key);
+                            *data_size = sizeof(bcmbal_packet_cfg_data);
+                            *data_offset = offsetof(bcmbal_packet_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_PACKET_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_packet_key);
+                            *key_offset = offsetof(bcmbal_packet_ind, key);
+                            *data_size = sizeof(bcmbal_packet_ind_data);
+                            *data_offset = offsetof(bcmbal_packet_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_subscriber_terminal_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_subscriber_terminal_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_subscriber_terminal_key);
+                            *key_offset = offsetof(bcmbal_subscriber_terminal_cfg, key);
+                            *data_size = sizeof(bcmbal_subscriber_terminal_cfg_data);
+                            *data_offset = offsetof(bcmbal_subscriber_terminal_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_subscriber_terminal_key);
+                            *key_offset = offsetof(bcmbal_subscriber_terminal_stat, key);
+                            *data_size = sizeof(bcmbal_subscriber_terminal_stat_data);
+                            *data_offset = offsetof(bcmbal_subscriber_terminal_stat, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_SUBSCRIBER_TERMINAL_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_subscriber_terminal_key);
+                            *key_offset = offsetof(bcmbal_subscriber_terminal_ind, key);
+                            *data_size = sizeof(bcmbal_subscriber_terminal_ind_data);
+                            *data_offset = offsetof(bcmbal_subscriber_terminal_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_QUEUE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_tm_queue_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_tm_queue_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_tm_queue_key);
+                            *key_offset = offsetof(bcmbal_tm_queue_cfg, key);
+                            *data_size = sizeof(bcmbal_tm_queue_cfg_data);
+                            *data_offset = offsetof(bcmbal_tm_queue_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_tm_queue_key);
+                            *key_offset = offsetof(bcmbal_tm_queue_stat, key);
+                            *data_size = sizeof(bcmbal_tm_queue_stat_data);
+                            *data_offset = offsetof(bcmbal_tm_queue_stat, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_QUEUE_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_tm_queue_key);
+                            *key_offset = offsetof(bcmbal_tm_queue_ind, key);
+                            *data_size = sizeof(bcmbal_tm_queue_ind_data);
+                            *data_offset = offsetof(bcmbal_tm_queue_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_SCHED:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_tm_sched_key);
+                            *key_offset = 0;
+                            *data_size = sizeof(bcmbal_tm_sched_key);
+                            *data_offset = 0;
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *key_size = sizeof(bcmbal_tm_sched_key);
+                            *key_offset = offsetof(bcmbal_tm_sched_cfg, key);
+                            *data_size = sizeof(bcmbal_tm_sched_cfg_data);
+                            *data_offset = offsetof(bcmbal_tm_sched_cfg, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_SCHED_AUTO_ID_IND:
+                            *key_size = sizeof(bcmbal_tm_sched_key);
+                            *key_offset = offsetof(bcmbal_tm_sched_ind, key);
+                            *data_size = sizeof(bcmbal_tm_sched_ind_data);
+                            *data_offset = offsetof(bcmbal_tm_sched_ind, data);
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        default:
+            return BCM_ERR_RANGE;
+    }
+
+    return BCM_ERR_INTERNAL;    /**<  should never happen. */
+}
+
+bcmos_errno bcmbal_apicli_object_subgroup_name(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, const char **name, const char **descr)
+{
+    switch (obj)
+    {
+        case BCMBAL_OBJ_ID_ACCESS_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_ACCESS_TERMINAL_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Access Terminal Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_FLOW:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "stat";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "stat";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_FLOW_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Flow Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_GROUP:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_INTERFACE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "stat";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "stat";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_INTERFACE_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Interface Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_PACKET:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_PACKET_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Packet indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "stat";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "stat";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_SUBSCRIBER_TERMINAL_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Subscriber Terminal Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_QUEUE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "stat";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "stat";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_QUEUE_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Tm Queue Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        case BCMBAL_OBJ_ID_TM_SCHED:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "key";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "key";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            if (name != NULL)
+                            {
+                                *name = "cfg";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "cfg";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_SCHED_AUTO_ID_IND:
+                            if (name != NULL)
+                            {
+                                *name = "ind";
+                            }
+
+                            if (descr != NULL)
+                            {
+                                *descr = "Tm Sched Indication";
+                            }
+
+                            return BCM_ERR_OK;
+                        default:
+                            return BCM_ERR_RANGE;
+                    }
+
+                default:
+                    return BCM_ERR_RANGE;
+            }
+
+        default:
+            return BCM_ERR_RANGE;
+    }
+
+    return BCM_ERR_INTERNAL;    /**<  should never happen. */
+}
+
+static bcmbal_apicli_prop_descr **obj_get_prop_array(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, uint32_t *size)
+{
+    switch (obj)
+    {
+        case BCMBAL_OBJ_ID_ACCESS_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(access_terminal_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return access_terminal_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(access_terminal_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return access_terminal_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_ACCESS_TERMINAL_AUTO_ID_IND:
+                            *size = sizeof(access_terminal_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return access_terminal_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_FLOW:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(flow_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return flow_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(flow_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return flow_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(flow_stat_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return flow_stat_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_FLOW_AUTO_ID_IND:
+                            *size = sizeof(flow_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return flow_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_GROUP:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(group_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return group_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(group_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return group_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_INTERFACE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(interface_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return interface_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(interface_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return interface_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(interface_stat_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return interface_stat_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_INTERFACE_AUTO_ID_IND:
+                            *size = sizeof(interface_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return interface_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_PACKET:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(packet_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return packet_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(packet_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return packet_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_PACKET_AUTO_ID_IND:
+                            *size = sizeof(packet_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return packet_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_SUBSCRIBER_TERMINAL:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(subscriber_terminal_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return subscriber_terminal_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(subscriber_terminal_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return subscriber_terminal_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(subscriber_terminal_stat_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return subscriber_terminal_stat_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_SUBSCRIBER_TERMINAL_AUTO_ID_IND:
+                            *size = sizeof(subscriber_terminal_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return subscriber_terminal_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_TM_QUEUE:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(tm_queue_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_queue_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(tm_queue_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_queue_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_STAT:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(tm_queue_stat_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_queue_stat_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_QUEUE_AUTO_ID_IND:
+                            *size = sizeof(tm_queue_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_queue_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        case BCMBAL_OBJ_ID_TM_SCHED:
+            switch (group)
+            {
+                case BCMBAL_MGT_GROUP_KEY:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(tm_sched_key_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_sched_key_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_CFG:
+                    switch (subgroup)
+                    {
+                        case 0:
+                            *size = sizeof(tm_sched_cfg_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_sched_cfg_prop_array;
+                        default:
+                            break;
+                    }
+
+                case BCMBAL_MGT_GROUP_AUTO:
+                    switch (subgroup)
+                    {
+                        case BCMBAL_TM_SCHED_AUTO_ID_IND:
+                            *size = sizeof(tm_sched_ind_prop_array) / sizeof(bcmbal_apicli_prop_descr *);
+                            return tm_sched_ind_prop_array;
+                        default:
+                            break;
+                    }
+
+                default:
+                    break;
+            }
+
+        default:
+            break;
+    }
+
+    return NULL;
+}
+
+bcmos_errno bcmbal_apicli_object_name(bcmbal_obj_id obj, const char **name, const char **descr)
+{
+    if (obj >= BCMBAL_OBJ_ID__NUM_OF)
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    if (object_name[obj] == NULL)
+    {
+        return BCM_ERR_NOENT;
+    }
+
+    if (name != NULL)
+    {
+        *name = object_name[obj];
+    }
+
+    if (descr != NULL)
+    {
+        *descr = object_descr[obj];
+    }
+
+    return BCM_ERR_OK;
+}
+
+bcmos_errno bcmbal_apicli_object_property(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, uint16_t prop, const bcmbal_apicli_prop_descr **descr)
+{
+    bcmbal_apicli_prop_descr **prop_array = NULL;
+    uint32_t prop_array_size = 0;
+    if (descr == NULL)
+    {
+        return BCM_ERR_PARM;
+    }
+
+    prop_array = obj_get_prop_array(obj, group, subgroup, &prop_array_size);
+    if ((prop_array == NULL) || (prop >= prop_array_size))
+    {
+        return BCM_ERR_RANGE;
+    }
+
+    if (prop_array[prop] == NULL)
+    {
+        return BCM_ERR_NOENT;
+    }
+
+    *descr = prop_array[prop];
+    return BCM_ERR_OK;
+}
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.h b/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.h
new file mode 100644
index 0000000..07e922a
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_helpers.h
@@ -0,0 +1,221 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+ */
+#ifndef BCMBAL_APICLI_HELPERS_H_
+#define BCMBAL_APICLI_HELPERS_H_
+
+#include <bcmcli.h>
+#include <bal_api.h>
+#include "bal_api_cli_types.h"
+
+/* Mac name length */
+#define BCMBAL_APICLI_MAX_PARM_NAME_LENGTH  BCMCLI_MAX_SEARCH_SUBSTR_LENGTH
+
+/* Max help string length */
+#define BCMBAL_APICLI_MAX_PARM_HELP_LENGTH  128
+
+typedef enum bcmbal_apicli_field_descr_flags
+{
+    BCMBAL_APICLI_FIELD_DESCR_FLAGS_NONE            = 0,
+    BCMBAL_APICLI_FIELD_DESCR_FLAGS_PRESENCE_MASK   = (1 << 0)  /* field is a 'presence mask' for a structure */
+} bcmbal_apicli_field_descr_flags;
+
+typedef struct bcmbal_apicli_type_descr bcmbal_apicli_type_descr;
+
+/* Structure field descriptor */
+typedef struct bcmbal_apicli_field_descr
+{
+    const char *name;               /* Field name */
+    const char *descr;              /* Field description */
+    const char *cli_name;           /* Short CLI name. can be missing */
+    bcmbal_apicli_type_descr *type; /* Field type */
+    uint16_t offset;                /* Offset from the beginning of the type structure */
+    bcmbal_apicli_field_descr_flags flags;
+} bcmbal_apicli_field_descr;
+
+/* Data type descriptor */
+struct bcmbal_apicli_type_descr
+{
+    const char *name;                       /* Type name */
+    const char *descr;                      /* Type description. can be missing */
+    const char *cli_name;                   /* Short CLI name. can be missing */
+    bcmbal_apicli_base_type_id base_type;   /* Base type: snum, unum, string, ip, enum, etc. */
+    uint32_t min_val;                       /* Min value for range check */
+    uint32_t max_val;                       /* Max value for range check */
+    uint16_t size;                  /* Size */
+
+    /* The following union is qualified by the base_type and contains additional
+     * info for array, enum, struct, union */
+    union
+    {
+        bcmcli_enum_val *e;         /* enum value array Contains num_elements+1 values. The last value has name=NULL */
+        struct
+        {
+            uint16_t num_fields;    /* number of elements in the following structure */
+            bcmbal_apicli_field_descr *fields;          /* Structure field array. Contains num_elements values */
+        } s;
+        struct
+        {
+            uint16_t num_common_fields;                 /* number of non-union fields at the start of the struct */
+            bcmbal_apicli_field_descr *common_fields;   /* common field array. Contains num_elements values */
+            uint16_t classifier_idx;                    /* index of the classifier field within common_fields */
+            bcmbal_apicli_field_descr *union_fields;    /* sub-struct fields under the union (name == NULL if no fields present)
+                                                         (one per enum entry in the classifier type, plus one for default) */
+        } u;
+        struct
+        {
+            bcmbal_apicli_type_descr *elem_type;        /* Array element type */
+            uint8_t len_size;                       /* Byte width of array length field (at start of struct) */
+            uint16_t max_size;                      /* Max array size */
+        } arr_dyn;
+        struct
+        {
+            bcmbal_apicli_type_descr *elem_type;    /* Array element type */
+            uint16_t size;  /* Fixed array size */
+        } arr_fixed;
+    } x;
+};
+
+/* Property descriptor.
+ * The 1st 5 fields are exactly the same as in bcmbal_apicli_field_descr
+ * ToDo: replace with bcmbal_apicli_field_descr substructure.
+ * Requires changes in code generator
+ */
+typedef struct
+{
+    const char *name;                       /* C name */
+    const char *descr;                      /* Property description */
+    const char *cli_name;                   /* CLI name */
+    bcmbal_apicli_type_descr *type;         /* Type reference */
+    uint16_t offset;                        /* Offset in generated per-group structure */
+    uint16_t property;                      /* Property id in per-object management group */
+    bcmbal_apicli_prop_access_id access;    /* Access */
+} bcmbal_apicli_prop_descr;
+
+/* All APIs return
+ * BCM_ERR_OK - ok
+ * BCM_ERR_NOENT - if id is in range, but doesn't correspond to any value (a hole)
+ * BCM_ERR_RANGE - id is out of range
+ */
+
+/* Get object name by id */
+bcmos_errno bcmbal_apicli_object_name(bcmbal_obj_id obj, const char **name, const char **descr);
+
+/* Get object structure size */
+bcmos_errno bcmbal_apicli_object_struct_size(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, uint32_t *key_size, uint32_t *key_offset, uint32_t *data_size, uint32_t *data_offset);
+
+/* Get object subgroup (e.g. specific indication) name and description */
+bcmos_errno bcmbal_apicli_object_subgroup_name(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, const char **name, const char **descr);
+
+/* Get property by object, mgt_group, subgroup (e.g. specific indication), property_id */
+bcmos_errno bcmbal_apicli_object_property(bcmbal_obj_id obj, bcmbal_mgt_group group, uint16_t subgroup, uint16_t prop, const bcmbal_apicli_prop_descr **descr);
+
+/* Get the number of subgroups present for a given group */
+static inline uint16_t bcmbal_apicli_get_subgroup_count(bcmbal_obj_id obj, bcmbal_mgt_group group)
+{
+    uint16_t count = 0;
+    uint32_t dummy;
+    while (bcmbal_apicli_object_struct_size(obj, group, count, &dummy, &dummy, &dummy, &dummy) != BCM_ERR_RANGE)
+    {
+        ++count;
+    }
+
+    return count;
+}
+
+/* Dump a single property */
+bcmos_errno bcmbal_apicli_dump_prop(bcmcli_session *session, const bcmbal_apicli_prop_descr *pd, void *prop_data);
+
+/* Dump a single property value in C initializer format */
+bcmos_errno bcmbal_apicli_dump_prop_initializer(bcmcli_session *session, const bcmbal_apicli_prop_descr *pd, void *prop_data);
+
+/* Dump message */
+bcmos_errno bcmbal_apicli_msg_dump(bcmcli_session *session, bcmbal_obj *msg);
+
+/* Message group name */
+const char *bcmbal_apicli_mgt_group_to_str(bcmbal_mgt_group group);
+
+/* Convert an enum value to the corresponding string */
+#define BCMOLT_ENUM_STRING_VAL(enum_name, value)    bcmcli_enum_stringval(enum_name ## _string_table, (value))
+
+/* Enum string tables */
+extern bcmcli_enum_val bcmbal_access_terminal_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_access_terminal_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_access_terminal_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_action_id_string_table[];
+extern bcmcli_enum_val bcmbal_action_cmd_id_string_table[];
+extern bcmcli_enum_val bcmbal_classifier_id_string_table[];
+extern bcmcli_enum_val bcmbal_pkt_tag_type_string_table[];
+extern bcmcli_enum_val bcmbal_control_string_table[];
+extern bcmcli_enum_val bcmbal_dest_type_string_table[];
+extern bcmcli_enum_val bcmbal_ds_miss_mode_string_table[];
+extern bcmcli_enum_val bcmbal_extra_bw_eligibility_type_string_table[];
+extern bcmcli_enum_val bcmbal_flow_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_flow_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_flow_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_flow_stat_id_string_table[];
+extern bcmcli_enum_val bcmbal_flow_type_string_table[];
+extern bcmcli_enum_val bcmbal_group_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_group_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_group_member_cmd_string_table[];
+extern bcmcli_enum_val bcmbal_group_owner_string_table[];
+extern bcmcli_enum_val bcmbal_interface_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_interface_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_interface_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_interface_stat_id_string_table[];
+extern bcmcli_enum_val bcmbal_intf_type_string_table[];
+extern bcmcli_enum_val bcmbal_iwf_mode_string_table[];
+extern bcmcli_enum_val bcmbal_packet_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_packet_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_packet_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_sla_id_string_table[];
+extern bcmcli_enum_val bcmbal_state_string_table[];
+extern bcmcli_enum_val bcmbal_status_string_table[];
+extern bcmcli_enum_val bcmbal_subscriber_terminal_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_subscriber_terminal_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_subscriber_terminal_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_subscriber_terminal_stat_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_bac_type_string_table[];
+extern bcmcli_enum_val bcmbal_tm_creation_mode_string_table[];
+extern bcmcli_enum_val bcmbal_tm_queue_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_queue_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_queue_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_queue_stat_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_cfg_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_child_type_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_dir_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_ind_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_key_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_owner_type_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_owner_agg_port_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_parent_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_sched_type_string_table[];
+extern bcmcli_enum_val bcmbal_tm_shaping_id_string_table[];
+extern bcmcli_enum_val bcmbal_tm_tcont_sla_id_string_table[];
+extern bcmcli_enum_val bcmbal_trx_type_string_table[];
+#endif /* BCMBAL_APICLI_HELPERS_H_ */
diff --git a/bal_release/src/lib/libbalapicli/bal_api_cli_types.h b/bal_release/src/lib/libbalapicli/bal_api_cli_types.h
new file mode 100644
index 0000000..8e38a6c
--- /dev/null
+++ b/bal_release/src/lib/libbalapicli/bal_api_cli_types.h
@@ -0,0 +1,60 @@
+/*
+<:copyright-BRCM:2016:DUAL/GPL:standard
+
+   Broadcom Proprietary and Confidential.(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.
+
+:>
+ */
+
+#ifndef BCMBAL_APICLI_TYPES_H_
+#define BCMBAL_APICLI_TYPES_H_
+
+/* Property access */
+typedef enum
+{
+    BCMBAL_APICLI_PROP_ACCESS_ID_R = 0x1,   /* Read access */
+    BCMBAL_APICLI_PROP_ACCESS_ID_W = 0x2,   /* Write access */
+    BCMBAL_APICLI_PROP_ACCESS_ID_RW = 0x3,  /* Read-write */
+} bcmbal_apicli_prop_access_id;
+
+/* Base data types */
+typedef enum
+{
+    BCMBAL_APICLI_BASE_TYPE_ID_SNUM,       /* signed number */
+    BCMBAL_APICLI_BASE_TYPE_ID_UNUM,       /* unsigned number */
+    BCMBAL_APICLI_BASE_TYPE_ID_UNUM_HEX,   /* unsigned number printed in hex */
+    BCMBAL_APICLI_BASE_TYPE_ID_FLOAT,      /* floating-point number */
+    BCMBAL_APICLI_BASE_TYPE_ID_BOOL,       /* boolean (zero=no, nonzero=yes) */
+    BCMBAL_APICLI_BASE_TYPE_ID_STRING,     /* string */
+    BCMBAL_APICLI_BASE_TYPE_ID_IPV4,       /* IPv4 address */
+    BCMBAL_APICLI_BASE_TYPE_ID_MAC,        /* MAC address */
+    BCMBAL_APICLI_BASE_TYPE_ID_ENUM,       /* enum */
+    BCMBAL_APICLI_BASE_TYPE_ID_ENUM_MASK,  /* bitmask enum */
+    BCMBAL_APICLI_BASE_TYPE_ID_STRUCT,     /* struct */
+    BCMBAL_APICLI_BASE_TYPE_ID_UNION,      /* union */
+    BCMBAL_APICLI_BASE_TYPE_ID_ARR_DYN,    /* dynamically-sized array */
+    BCMBAL_APICLI_BASE_TYPE_ID_ARR_FIXED,  /* fixed-size array */
+} bcmbal_apicli_base_type_id;
+
+#endif /* BCMBAL_APICLI_TYPES_H_ */